From 00f842d9bf0c816340e1ce7025ec0fb327628281 Mon Sep 17 00:00:00 2001 From: Lai Power Date: Tue, 7 Apr 2020 13:03:04 +0000 Subject: [PATCH] Initial commit --- .gitignore | 68 + wp-content/index.php | 2 + wp-content/mu-plugins/LICENSE.md | 7 + wp-content/mu-plugins/README.md | 95 + wp-content/mu-plugins/VERSION | 1 + wp-content/mu-plugins/Vagrantfile | 28 + wp-content/mu-plugins/build.xml | 95 + wp-content/mu-plugins/composer.json | 41 + wp-content/mu-plugins/docker-compose.yml | 67 + .../dockersetup/Dockerfile_wordpress | 9 + .../mu-plugins/dockersetup/ldap/environment | 0 .../mu-plugins/langs/wp_mail_smtp-he_IL.mo | Bin 0 -> 9539 bytes .../mu-plugins/langs/wp_mail_smtp-ja.mo | Bin 0 -> 4457 bytes wp-content/mu-plugins/phpunit.travis.xml | 28 + wp-content/mu-plugins/phpunit.xml.dist | 42 + wp-content/mu-plugins/readme.txt | 111 + wp-content/mu-plugins/screenshot-1.png | Bin 0 -> 223801 bytes wp-content/mu-plugins/screenshot-2.png | Bin 0 -> 205475 bytes wp-content/mu-plugins/screenshot-3.png | Bin 0 -> 127295 bytes wp-content/mu-plugins/screenshot-4.png | Bin 0 -> 51370 bytes wp-content/mu-plugins/src/LdapList.php | 87 + wp-content/mu-plugins/tests/LDAPBaseTest.php | 134 + .../mu-plugins/tests/LDAPListBaseTest.php | 66 + wp-content/mu-plugins/tests/LdapTest.php | 183 + wp-content/mu-plugins/view/admin.phtml | 420 + wp-content/plugins/activitypub/LICENSE | 21 + .../plugins/activitypub/activitypub.php | 100 + .../includes/class-activity-dispatcher.php | 83 + .../includes/class-activitypub.php | 179 + .../activitypub/includes/class-admin.php | 149 + .../activitypub/includes/class-debug.php | 30 + .../activitypub/includes/class-hashtag.php | 96 + .../includes/class-health-check.php | 12 + .../activitypub/includes/class-signature.php | 105 + .../activitypub/includes/functions.php | 336 + .../includes/model/class-activity.php | 95 + .../activitypub/includes/model/class-post.php | 320 + .../includes/peer/class-followers.php | 80 + .../includes/rest/class-followers.php | 96 + .../includes/rest/class-following.php | 96 + .../activitypub/includes/rest/class-inbox.php | 271 + .../includes/rest/class-nodeinfo.php | 191 + .../includes/rest/class-ostatus.php | 30 + .../includes/rest/class-outbox.php | 126 + .../includes/rest/class-server.php | 31 + .../includes/rest/class-webfinger.php | 119 + .../includes/table/followers-list.php | 36 + .../activitypub/languages/activitypub.pot | 307 + wp-content/plugins/activitypub/readme.txt | 276 + .../activitypub/templates/followers-list.php | 15 + .../activitypub/templates/json-author.php | 113 + .../activitypub/templates/json-post.php | 36 + .../activitypub/templates/settings.php | 126 + .../plugins/authLdap-2.3.1/.ci/50-init.ldif | 83 + .../authLdap-2.3.1/.ci/OpenLDAP/slapd.conf | 42 + .../authLdap-2.3.1/.ci/OpenLDAP_run.sh | 16 + .../authLdap-2.3.1/.ci/ldif/example.com.ldif | 6 + .../.ci/ldif/examplespace.com.ldif | 6 + .../.ci/ldif/manager.example.com.ldif | 3 + .../.ci/ldif/test.example.com.ldif | 3 + .../.ci/ldif/user1.example.com.ldif | 5 + .../.ci/ldif/user2.example.com.ldif | 16 + .../.ci/ldif/user3.example.com.ldif | 14 + .../.ci/ldif/user4.example.com.ldif | 13 + .../.ci/ldif/user5.example.com.ldif | 13 + .../authLdap-2.3.1/.ci/load_fixtures.sh | 13 + wp-content/plugins/authLdap-2.3.1/.ci/php.ini | 1 + wp-content/plugins/authLdap-2.3.1/.gitignore | 3 + .../plugins/authLdap-2.3.1/.rsyncIgnore | 26 + .../plugins/authLdap-2.3.1/.svnAccess.dist | 2 + .../plugins/authLdap-2.3.1/.travis.after.sh | 6 + .../plugins/authLdap-2.3.1/.travis.install.sh | 9 + wp-content/plugins/authLdap-2.3.1/.travis.yml | 42 + wp-content/plugins/authLdap-2.3.1/LICENSE.md | 7 + wp-content/plugins/authLdap-2.3.1/README.md | 95 + wp-content/plugins/authLdap-2.3.1/VERSION | 1 + wp-content/plugins/authLdap-2.3.1/Vagrantfile | 28 + .../plugins/authLdap-2.3.1/authLdap.css | 9 + .../plugins/authLdap-2.3.1/authLdap.php | 835 ++ wp-content/plugins/authLdap-2.3.1/build.xml | 95 + .../plugins/authLdap-2.3.1/composer.json | 41 + .../plugins/authLdap-2.3.1/docker-compose.yml | 67 + .../dockersetup/Dockerfile_wordpress | 9 + .../dockersetup/ldap/environment | 0 wp-content/plugins/authLdap-2.3.1/ldap.php | 280 + .../plugins/authLdap-2.3.1/phpunit.travis.xml | 28 + .../plugins/authLdap-2.3.1/phpunit.xml.dist | 42 + wp-content/plugins/authLdap-2.3.1/readme.txt | 111 + .../plugins/authLdap-2.3.1/src/LdapList.php | 87 + .../authLdap-2.3.1/tests/LDAPBaseTest.php | 134 + .../authLdap-2.3.1/tests/LDAPListBaseTest.php | 66 + .../plugins/authLdap-2.3.1/tests/LdapTest.php | 183 + .../plugins/authLdap-2.3.1/view/admin.phtml | 420 + .../disable-core-update.php | 36 + .../disable-wordpress-core-update/readme.txt | 58 + wp-content/plugins/gitium/functions.php | 420 + wp-content/plugins/gitium/gitium-webhook.php | 49 + wp-content/plugins/gitium/gitium.php | 374 + wp-content/plugins/gitium/img/gitium.png | Bin 0 -> 540 bytes wp-content/plugins/gitium/img/gitium.svg | 26 + .../plugins/gitium/inc/class-git-wrapper.php | 667 ++ .../plugins/gitium/inc/class-gitium-admin.php | 53 + .../plugins/gitium/inc/class-gitium-help.php | 107 + .../gitium/inc/class-gitium-menu-bubble.php | 55 + .../plugins/gitium/inc/class-gitium-menu.php | 97 + .../gitium/inc/class-gitium-requirements.php | 117 + .../inc/class-gitium-submenu-commits.php | 94 + .../inc/class-gitium-submenu-configure.php | 253 + .../inc/class-gitium-submenu-settings.php | 139 + .../inc/class-gitium-submenu-status.php | 236 + wp-content/plugins/gitium/inc/ssh-git | 8 + .../plugins/gitium/languages/gitium-es_ES.mo | Bin 0 -> 13284 bytes .../plugins/gitium/languages/gitium-es_ES.po | 546 ++ .../plugins/gitium/languages/gitium-sr_RS.mo | Bin 0 -> 12978 bytes .../plugins/gitium/languages/gitium-sr_RS.po | 538 ++ .../plugins/gitium/languages/gitium.pot | 489 ++ wp-content/plugins/gitium/readme.txt | 239 + .../gp-premium/backgrounds/functions/css.php | 61 + .../backgrounds/functions/functions.php | 1315 +++ .../functions/secondary-nav-backgrounds.php | 424 + .../backgrounds/generate-backgrounds.php | 19 + .../gp-premium/blog/functions/columns.php | 157 + .../blog/functions/css/style-min.css | 1 + .../gp-premium/blog/functions/css/style.css | 224 + .../gp-premium/blog/functions/customizer.php | 1115 +++ .../gp-premium/blog/functions/defaults.php | 55 + .../blog/functions/generate-blog.php | 540 ++ .../gp-premium/blog/functions/images.php | 286 + .../gp-premium/blog/functions/js/controls.js | 95 + .../blog/functions/js/customizer.js | 78 + .../functions/js/infinite-scroll.pkgd.min.js | 12 + .../gp-premium/blog/functions/js/scripts.js | 80 + .../blog/functions/js/scripts.min.js | 1 + .../gp-premium/blog/functions/migrate.php | 122 + .../plugins/gp-premium/blog/generate-blog.php | 17 + wp-content/plugins/gp-premium/changelog.txt | 516 ++ .../gp-premium/colors/functions/functions.php | 1554 ++++ .../colors/functions/js/customizer.js | 613 ++ .../functions/js/menu-plus-customizer.js | 102 + .../colors/functions/js/wc-customizer.js | 161 + .../colors/functions/secondary-nav-colors.php | 384 + .../colors/functions/slideout-nav-colors.php | 378 + .../colors/functions/woocommerce-colors.php | 882 ++ .../gp-premium/colors/generate-colors.php | 19 + .../copyright/functions/functions.php | 210 + .../copyright/functions/js/customizer.js | 20 + .../copyright/generate-copyright.php | 19 + .../disable-elements/functions/functions.php | 357 + .../generate-disable-elements.php | 19 + .../elements/assets/admin/balloon.css | 337 + .../elements/assets/admin/metabox.css | 446 + .../elements/assets/admin/metabox.js | 386 + .../elements/assets/admin/spinner.gif | Bin 0 -> 4162 bytes .../assets/admin/wp-color-picker-alpha.min.js | 11 + .../gp-premium/elements/assets/js/parallax.js | 17 + .../elements/assets/js/parallax.min.js | 1 + .../gp-premium/elements/class-conditions.php | 367 + .../elements/class-elements-helper.php | 108 + .../gp-premium/elements/class-hero.php | 913 ++ .../gp-premium/elements/class-hooks.php | 189 + .../gp-premium/elements/class-layout.php | 296 + .../gp-premium/elements/class-metabox.php | 2152 +++++ .../gp-premium/elements/class-post-type.php | 277 + .../plugins/gp-premium/elements/elements.php | 99 + .../plugins/gp-premium/general/icons.php | 80 + .../gp-premium/general/icons/gp-premium.eot | Bin 0 -> 3020 bytes .../gp-premium/general/icons/gp-premium.svg | 20 + .../gp-premium/general/icons/gp-premium.ttf | Bin 0 -> 2856 bytes .../gp-premium/general/icons/gp-premium.woff | Bin 0 -> 2932 bytes .../gp-premium/general/icons/icons.css | 10 + .../gp-premium/general/icons/icons.min.css | 1 + .../gp-premium/general/js/smooth-scroll.js | 741 ++ .../general/js/smooth-scroll.min.js | 1 + .../gp-premium/general/smooth-scroll.php | 94 + wp-content/plugins/gp-premium/gp-premium.php | 285 + .../hooks/functions/assets/css/hooks.css | 66 + .../hooks/functions/assets/js/admin.js | 38 + .../functions/assets/js/jquery.cookie.js | 165 + .../gp-premium/hooks/functions/functions.php | 534 ++ .../gp-premium/hooks/functions/hooks.php | 171 + .../gp-premium/hooks/generate-hooks.php | 19 + .../import-export/functions/functions.php | 358 + .../gp-premium/import-export/generate-ie.php | 19 + .../plugins/gp-premium/inc/activation.php | 597 ++ .../gp-premium/inc/assets/dashboard.css | 204 + .../gp-premium/inc/assets/dashboard.js | 37 + .../plugins/gp-premium/inc/dashboard.php | 42 + .../plugins/gp-premium/inc/deprecated.php | 663 ++ .../plugins/gp-premium/inc/functions.php | 25 + wp-content/plugins/gp-premium/inc/reset.php | 247 + .../gp-premium/langs/gp-premium-cs_CZ.mo | Bin 0 -> 15290 bytes .../gp-premium/langs/gp-premium-cs_CZ.po | 3576 ++++++++ .../gp-premium/langs/gp-premium-da_DK.mo | Bin 0 -> 7126 bytes .../gp-premium/langs/gp-premium-da_DK.po | 3068 +++++++ .../gp-premium/langs/gp-premium-de_DE.mo | Bin 0 -> 36268 bytes .../gp-premium/langs/gp-premium-de_De.po | 3840 +++++++++ .../gp-premium/langs/gp-premium-fr_FR.mo | Bin 0 -> 7860 bytes .../gp-premium/langs/gp-premium-fr_FR.po | 3304 ++++++++ .../gp-premium/langs/gp-premium-it_IT.mo | Bin 0 -> 17133 bytes .../gp-premium/langs/gp-premium-it_IT.po | 3486 ++++++++ .../gp-premium/langs/gp-premium-pl_PL.mo | Bin 0 -> 11410 bytes .../gp-premium/langs/gp-premium-pl_PL.po | 3285 ++++++++ .../gp-premium/langs/gp-premium-pt_BR.mo | Bin 0 -> 20464 bytes .../gp-premium/langs/gp-premium-pt_BR.po | 3232 ++++++++ .../gp-premium/langs/gp-premium-pt_PT.mo | Bin 0 -> 44485 bytes .../gp-premium/langs/gp-premium-pt_PT.po | 3077 +++++++ .../gp-premium/langs/gp-premium-ru_RU.mo | Bin 0 -> 18888 bytes .../gp-premium/langs/gp-premium-ru_RU.po | 3399 ++++++++ .../gp-premium/langs/gp-premium-sk_SK.mo | Bin 0 -> 2503 bytes .../gp-premium/langs/gp-premium-sk_SK.po | 2682 ++++++ .../gp-premium/langs/gp-premium-sv_SE.mo | Bin 0 -> 2730 bytes .../gp-premium/langs/gp-premium-sv_SE.po | 2560 ++++++ .../gp-premium/langs/gp-premium-zh_CN.mo | Bin 0 -> 14368 bytes .../gp-premium/langs/gp-premium-zh_CN.po | 3001 +++++++ .../plugins/gp-premium/langs/gp-premium.pot | 3043 +++++++ .../library/EDD_SL_Plugin_Updater.php | 572 ++ .../batch-processing/wp-async-request.php | 163 + .../wp-background-process.php | 506 ++ .../gp-premium/library/class-make-css.php | 202 + .../gp-premium/library/customizer-helpers.php | 249 + .../library/customizer/active-callbacks.php | 584 ++ .../controls/class-action-button-control.php | 39 + .../controls/class-alpha-color-control.php | 76 + .../controls/class-backgrounds-control.php | 146 + .../controls/class-control-toggle.php | 37 + .../controls/class-copyright-control.php | 51 + .../customizer/controls/class-deprecated.php | 396 + .../controls/class-information-control.php | 31 + .../controls/class-range-slider-control.php | 165 + .../controls/class-refresh-button-control.php | 24 + .../class-section-shortcuts-control.php | 114 + .../controls/class-spacing-control.php | 165 + .../controls/class-title-control.php | 32 + .../controls/class-typography-control.php | 187 + .../controls/css/alpha-color-picker.css | 33 + .../css/control-toggle-customizer.css | 21 + .../controls/css/section-shortcuts.css | 38 + .../customizer/controls/css/selectWoo.min.css | 1 + .../controls/css/slider-customizer.css | 144 + .../controls/css/spacing-customizer.css | 105 + .../controls/css/title-customizer.css | 9 + .../controls/css/transparency-grid.png | Bin 0 -> 2343 bytes .../controls/css/typography-customizer.css | 64 + .../controls/js/alpha-color-picker.js | 277 + .../controls/js/backgrounds-customizer.js | 34 + .../customizer/controls/js/button-actions.js | 29 + .../controls/js/control-toggle-customizer.js | 32 + .../controls/js/copyright-customizer.js | 12 + .../controls/js/generatepress-controls.js | 169 + .../controls/js/section-shortcuts.js | 46 + .../customizer/controls/js/selectWoo.min.js | 1 + .../controls/js/slider-customizer.js | 134 + .../controls/js/spacing-customizer.js | 200 + .../controls/js/typography-customizer.js | 151 + .../library/customizer/deprecated.php | 324 + .../library/customizer/sanitize.php | 131 + .../image-processing-queue.php | 17 + .../includes/class-image-processing-queue.php | 277 + .../includes/class-ipq-process.php | 97 + .../includes/ipq-template-functions.php | 47 + .../library/select2/select2.full.min.js | 1 + .../library/select2/select2.min.css | 1 + .../menu-plus/functions/css/menu-logo.css | 82 + .../menu-plus/functions/css/menu-logo.min.css | 1 + .../functions/css/navigation-branding.css | 149 + .../functions/css/navigation-branding.min.css | 1 + .../menu-plus/functions/css/offside.css | 404 + .../menu-plus/functions/css/offside.min.css | 1 + .../menu-plus/functions/css/sticky.css | 75 + .../menu-plus/functions/css/sticky.min.css | 1 + .../functions/generate-menu-plus.php | 1896 +++++ .../menu-plus/functions/js/offside.js | 605 ++ .../menu-plus/functions/js/offside.min.js | 1 + .../menu-plus/functions/js/sticky.js | 646 ++ .../menu-plus/functions/js/sticky.min.js | 1 + .../menu-plus/generate-menu-plus.php | 28 + .../page-header/functions/css/metabox.css | 315 + .../page-header/functions/css/page-header.css | 115 + .../functions/css/page-header.min.css | 1 + .../page-header/functions/functions.php | 1248 +++ .../functions/global-locations.php | 220 + .../page-header/functions/js/full-height.js | 66 + .../functions/js/full-height.min.js | 1 + .../functions/js/jquery.vide.min.js | 9 + .../page-header/functions/js/lc_switch.js | 149 + .../page-header/functions/js/metabox.js | 220 + .../page-header/functions/js/parallax.js | 17 + .../page-header/functions/js/parallax.min.js | 1 + .../functions/js/wp-color-picker-alpha.min.js | 340 + .../page-header/functions/metabox.php | 773 ++ .../page-header/functions/page-header.php | 184 + .../page-header/functions/post-image.php | 60 + .../page-header/functions/post-type.php | 236 + .../page-header/generate-page-header.php | 27 + .../secondary-nav/functions/css.php | 66 + .../secondary-nav/functions/css/mobile.css | 103 + .../functions/css/mobile.min.css | 1 + .../secondary-nav/functions/css/style.css | 349 + .../secondary-nav/functions/css/style.min.css | 1 + .../secondary-nav/functions/functions.php | 1090 +++ .../secondary-nav/functions/js/customizer.js | 148 + .../secondary-nav/generate-secondary-nav.php | 19 + .../sections/functions/css/style.css | 57 + .../sections/functions/css/style.min.css | 1 + .../sections/functions/generate-sections.php | 329 + .../sections/functions/js/parallax.js | 17 + .../sections/functions/js/parallax.min.js | 1 + .../css/generate-sections-metabox.css | 351 + .../functions/metaboxes/css/lc_switch.css | 101 + .../js/generate-sections-metabox-4.9.js | 835 ++ .../metaboxes/js/generate-sections-metabox.js | 846 ++ .../metaboxes/js/wp-color-picker-alpha.min.js | 340 + .../functions/metaboxes/metabox-functions.php | 391 + .../metaboxes/views/sections-template.php | 279 + .../functions/metaboxes/views/sections.php | 13 + .../metaboxes/views/use-sections.php | 17 + .../sections/functions/templates/template.php | 122 + .../gp-premium/sections/generate-sections.php | 19 + .../gp-premium/sites/assets/css/admin.css | 835 ++ .../gp-premium/sites/assets/css/loading.svg | 6 + .../sites/assets/images/screenshot.png | Bin 0 -> 23276 bytes .../gp-premium/sites/assets/js/admin.js | 913 ++ .../gp-premium/sites/assets/js/blazy.min.js | 6 + .../gp-premium/sites/assets/js/download.js | 167 + .../class-beaver-builder-batch-processing.php | 156 + .../sites/classes/class-content-importer.php | 36 + .../sites/classes/class-site-helper.php | 990 +++ .../sites/classes/class-site-import-image.php | 192 + .../sites/classes/class-site-restore.php | 246 + .../classes/class-site-widget-importer.php | 259 + .../gp-premium/sites/classes/class-site.php | 1091 +++ .../class-sites-background-process.php | 34 + .../libs/wxr-importer/WPImporterLogger.php | 138 + .../sites/libs/wxr-importer/WXRImportInfo.php | 16 + .../sites/libs/wxr-importer/WXRImporter.php | 2307 ++++++ wp-content/plugins/gp-premium/sites/sites.php | 750 ++ .../functions/customizer/content-spacing.php | 229 + .../functions/customizer/footer-spacing.php | 190 + .../functions/customizer/header-spacing.php | 122 + .../functions/customizer/js/customizer.js | 551 ++ .../customizer/navigation-spacing.php | 269 + .../customizer/secondary-nav-spacing.php | 147 + .../functions/customizer/sidebar-spacing.php | 196 + .../functions/customizer/top-bar-spacing.php | 69 + .../spacing/functions/functions.php | 298 + .../spacing/functions/migration.php | 102 + .../gp-premium/spacing/generate-spacing.php | 19 + .../typography/functions/functions.php | 3037 +++++++ .../typography/functions/google-fonts.json | 6835 +++++++++++++++ .../typography/functions/js/customizer.js | 247 + .../typography/functions/migration.php | 360 + .../functions/secondary-nav-fonts.php | 177 + .../functions/slideout-nav-fonts.php | 150 + .../functions/woocommerce-fonts.php | 180 + .../gp-premium/typography/generate-fonts.php | 19 + .../functions/css/woocommerce-mobile.css | 214 + .../functions/css/woocommerce-mobile.min.css | 1 + .../functions/css/woocommerce-tablet.css | 59 + .../functions/css/woocommerce-tablet.min.css | 1 + .../woocommerce/functions/css/woocommerce.css | 1289 +++ .../functions/css/woocommerce.min.css | 1 + .../functions/customizer/customizer.php | 1031 +++ .../functions/customizer/js/customizer.js | 6 + .../woocommerce/functions/functions.php | 1229 +++ .../woocommerce/functions/js/woocommerce.js | 285 + .../functions/js/woocommerce.min.js | 1 + .../gp-premium/woocommerce/woocommerce.php | 11 + wp-content/plugins/gp-premium/wpml-config.xml | 110 + wp-content/plugins/index.php | 2 + wp-content/plugins/menu-icons/CHANGELOG.md | 37 + wp-content/plugins/menu-icons/LICENSE | 339 + .../menu-icons/assets/banner-1544x500.jpg | Bin 0 -> 48202 bytes .../menu-icons/assets/banner-772x250.jpg | Bin 0 -> 48202 bytes .../menu-icons/assets/screenshot-1.png | Bin 0 -> 31926 bytes .../menu-icons/assets/screenshot-2.png | Bin 0 -> 62644 bytes .../menu-icons/assets/screenshot-3.png | Bin 0 -> 27261 bytes .../menu-icons/assets/screenshot-4.png | Bin 0 -> 24161 bytes .../menu-icons/assets/screenshot-5.png | Bin 0 -> 106845 bytes .../menu-icons/assets/screenshot-6.png | Bin 0 -> 103898 bytes .../menu-icons/assets/screenshot-7.png | Bin 0 -> 37940 bytes .../menu-icons/assets/screenshot-8.png | Bin 0 -> 43800 bytes wp-content/plugins/menu-icons/css/admin.css | 185 + .../plugins/menu-icons/css/admin.min.css | 1 + wp-content/plugins/menu-icons/css/extra.css | 74 + .../plugins/menu-icons/css/extra.min.css | 1 + .../plugins/menu-icons/includes/front.php | 430 + .../menu-icons/includes/library/compat.php | 23 + .../includes/library/form-fields.php | 575 ++ .../menu-icons/includes/library/functions.php | 111 + .../menu-icons/includes/media-template.php | 127 + .../plugins/menu-icons/includes/meta.php | 154 + .../plugins/menu-icons/includes/picker.php | 302 + .../plugins/menu-icons/includes/settings.php | 746 ++ .../menu-icons/includes/type-fonts.php | 24 + .../plugins/menu-icons/includes/type.php | 107 + wp-content/plugins/menu-icons/js/admin.js | 699 ++ wp-content/plugins/menu-icons/js/admin.min.js | 699 ++ wp-content/plugins/menu-icons/js/src/index.js | 2 + .../plugins/menu-icons/js/src/media/index.js | 9 + .../js/src/media/models/item-setting-field.js | 16 + .../js/src/media/models/item-settings.js | 11 + .../menu-icons/js/src/media/models/item.js | 27 + .../menu-icons/js/src/media/views/frame.js | 46 + .../js/src/media/views/item-preview.js | 51 + .../js/src/media/views/item-setting-field.js | 38 + .../js/src/media/views/item-settings.js | 30 + .../menu-icons/js/src/media/views/sidebar.js | 101 + .../plugins/menu-icons/js/src/picker.js | 190 + .../plugins/menu-icons/js/src/settings.js | 59 + .../menu-icons/languages/menu-icons.pot | 4083 +++++++++ wp-content/plugins/menu-icons/mailin.php | 867 ++ wp-content/plugins/menu-icons/menu-icons.php | 179 + wp-content/plugins/menu-icons/readme.md | 373 + wp-content/plugins/menu-icons/readme.txt | 373 + .../plugins/menu-icons/vendor/autoload.php | 7 + .../vendor/codeinwp/icon-picker/LICENSE | 339 + .../icon-picker/assets/screenshot-1.png | Bin 0 -> 570363 bytes .../icon-picker/assets/screenshot-2.png | Bin 0 -> 214272 bytes .../codeinwp/icon-picker/css/icon-picker.css | 79 + .../icon-picker/css/icon-picker.min.css | 1 + .../icon-picker/css/types/Elusive-Icons.eot | Bin 0 -> 61828 bytes .../icon-picker/css/types/Elusive-Icons.svg | 309 + .../icon-picker/css/types/Elusive-Icons.ttf | Bin 0 -> 61640 bytes .../icon-picker/css/types/Elusive-Icons.woff | Bin 0 -> 61716 bytes .../icon-picker/css/types/Genericons.eot | Bin 0 -> 22374 bytes .../icon-picker/css/types/Genericons.svg | 537 ++ .../icon-picker/css/types/Genericons.ttf | Bin 0 -> 22188 bytes .../icon-picker/css/types/Genericons.woff | Bin 0 -> 13988 bytes .../icon-picker/css/types/elusive.css | 922 ++ .../icon-picker/css/types/elusive.min.css | 1 + .../icon-picker/css/types/font-awesome.css | 2337 ++++++ .../css/types/font-awesome.min.css | 4 + .../css/types/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../css/types/fontawesome-webfont.svg | 2671 ++++++ .../css/types/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../css/types/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../css/types/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../css/types/foundation-icons.css | 594 ++ .../css/types/foundation-icons.eot | Bin 0 -> 54568 bytes .../css/types/foundation-icons.min.css | 1 + .../css/types/foundation-icons.svg | 970 +++ .../css/types/foundation-icons.ttf | Bin 0 -> 56976 bytes .../css/types/foundation-icons.woff | Bin 0 -> 32020 bytes .../icon-picker/css/types/genericons.css | 262 + .../icon-picker/css/types/genericons.min.css | 1 + .../codeinwp/icon-picker/icon-picker.php | 340 + .../icon-picker/includes/fields/base.php | 104 + .../icon-picker/includes/fields/cmb.php | 48 + .../icon-picker/includes/fontpack.php | 285 + .../codeinwp/icon-picker/includes/loader.php | 335 + .../icon-picker/includes/registry.php | 178 + .../icon-picker/includes/types/base.php | 152 + .../icon-picker/includes/types/dashicons.php | 1229 +++ .../icon-picker/includes/types/elusive.php | 1554 ++++ .../icon-picker/includes/types/fa.php | 3676 ++++++++ .../icon-picker/includes/types/font.php | 205 + .../icon-picker/includes/types/fontello.php | 55 + .../includes/types/foundation-icons.php | 1518 ++++ .../icon-picker/includes/types/genericon.php | 856 ++ .../icon-picker/includes/types/image.php | 126 + .../icon-picker/includes/types/svg.php | 124 + .../codeinwp/icon-picker/js/icon-picker.js | 1008 +++ .../icon-picker/js/icon-picker.min.js | 1 + .../icon-picker/js/src/icon-picker.js | 101 + .../js/src/media/controllers/font.js | 69 + .../js/src/media/controllers/img.js | 148 + .../js/src/media/controllers/mixin.js | 35 + .../icon-picker/js/src/media/manifest.js | 16 + .../icon-picker/js/src/media/models/fonts.js | 77 + .../icon-picker/js/src/media/models/target.js | 18 + .../icon-picker/js/src/media/views/browser.js | 15 + .../js/src/media/views/font-browser.js | 63 + .../js/src/media/views/font-filter.js | 33 + .../js/src/media/views/font-item.js | 30 + .../js/src/media/views/font-library.js | 100 + .../icon-picker/js/src/media/views/frame.js | 118 + .../js/src/media/views/img-browser.js | 6 + .../icon-picker/js/src/media/views/sidebar.js | 29 + .../js/src/media/views/svg-item.js | 8 + .../icon-picker/languages/icon-picker.pot | 3460 ++++++++ .../codeinwp/icon-picker/phpcs.ruleset.xml | 17 + .../vendor/codeinwp/icon-picker/readme.md | 85 + .../vendor/codeinwp/icon-picker/readme.txt | 71 + .../codeinwp/menu-item-custom-fields/LICENSE | 339 + .../doc/menu-item-custom-fields-example.php | 138 + .../menu-item-custom-fields.php | 61 + .../menu-item-custom-fields/phpcs.ruleset.xml | 18 + .../menu-item-custom-fields/readme.md | 66 + .../menu-item-custom-fields/readme.txt | 60 + .../walker-nav-menu-edit.php | 81 + .../codeinwp/themeisle-sdk/CHANGELOG.md | 159 + .../vendor/codeinwp/themeisle-sdk/LICENSE | 674 ++ .../vendor/codeinwp/themeisle-sdk/index.php | 3 + .../vendor/codeinwp/themeisle-sdk/load.php | 72 + .../src/Common/Abstract_module.php | 66 + .../src/Common/Module_factory.php | 108 + .../codeinwp/themeisle-sdk/src/Loader.php | 126 + .../src/Modules/Dashboard_widget.php | 466 ++ .../themeisle-sdk/src/Modules/Endpoint.php | 358 + .../themeisle-sdk/src/Modules/Licenser.php | 798 ++ .../themeisle-sdk/src/Modules/Logger.php | 177 + .../src/Modules/Notification.php | 459 + .../src/Modules/Recommendation.php | 374 + .../themeisle-sdk/src/Modules/Review.php | 117 + .../themeisle-sdk/src/Modules/Rollback.php | 376 + .../themeisle-sdk/src/Modules/Translate.php | 918 ++ .../src/Modules/Uninstall_feedback.php | 850 ++ .../codeinwp/themeisle-sdk/src/Product.php | 418 + .../vendor/codeinwp/themeisle-sdk/start.php | 49 + .../vendor/composer/ClassLoader.php | 413 + .../menu-icons/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 9 + .../vendor/composer/autoload_files.php | 12 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 9 + .../vendor/composer/autoload_real.php | 59 + .../menu-icons/vendor/composer/installed.json | 120 + .../plugins/simple-local-avatars/readme.txt | 122 + .../simple-local-avatars/screenshot-1.png | Bin 0 -> 76478 bytes .../simple-local-avatars.dev.js | 76 + .../simple-local-avatars.js | 1 + .../simple-local-avatars.php | 661 ++ .../static-html-output-plugin-ja_UTF.mo | Bin 0 -> 1716 bytes .../static-html-output-plugin-ja_UTF.po | 74 + .../static-html-output-plugin-sp_UTF.mo | Bin 0 -> 1780 bytes .../static-html-output-plugin-sp_UTF.po | 74 + .../languages/static-html-output-plugin.pot | 47 + .../CSSParser/CSSList/AtRuleBlockList.php | 2 + .../plugin/CSSParser/CSSList/CSSBlockList.php | 2 + .../plugin/CSSParser/CSSList/CSSList.php | 2 + .../plugin/CSSParser/CSSList/Document.php | 2 + .../plugin/CSSParser/CSSList/KeyFrame.php | 2 + .../plugin/CSSParser/Comment/Comment.php | 2 + .../plugin/CSSParser/Comment/Commentable.php | 2 + .../plugin/CSSParser/OutputFormat.php | 2 + .../plugin/CSSParser/Parser.php | 2 + .../CSSParser/Parsing/OutputException.php | 2 + .../CSSParser/Parsing/SourceException.php | 2 + .../Parsing/UnexpectedTokenException.php | 2 + .../plugin/CSSParser/Property/AtRule.php | 2 + .../CSSParser/Property/CSSNamespace.php | 2 + .../plugin/CSSParser/Property/Charset.php | 2 + .../plugin/CSSParser/Property/Import.php | 2 + .../plugin/CSSParser/Property/Selector.php | 25 + .../plugin/CSSParser/Renderable.php | 2 + .../plugin/CSSParser/Rule/Rule.php | 2 + .../plugin/CSSParser/RuleSet/AtRuleSet.php | 2 + .../CSSParser/RuleSet/DeclarationBlock.php | 2 + .../plugin/CSSParser/RuleSet/RuleSet.php | 2 + .../plugin/CSSParser/Settings.php | 2 + .../plugin/CSSParser/Value/CSSFunction.php | 2 + .../plugin/CSSParser/Value/CSSString.php | 2 + .../plugin/CSSParser/Value/CalcFunction.php | 2 + .../CSSParser/Value/CalcRuleValueList.php | 2 + .../plugin/CSSParser/Value/Color.php | 2 + .../plugin/CSSParser/Value/LineName.php | 2 + .../plugin/CSSParser/Value/PrimitiveValue.php | 2 + .../plugin/CSSParser/Value/RuleValueList.php | 2 + .../plugin/CSSParser/Value/Size.php | 2 + .../plugin/CSSParser/Value/URL.php | 2 + .../plugin/CSSParser/Value/Value.php | 2 + .../plugin/CSSParser/Value/ValueList.php | 2 + .../plugin/FTP/FtpClient.php | 2 + .../plugin/FTP/FtpException.php | 2 + .../plugin/FTP/FtpWrapper.php | 2 + .../plugin/URL2/URL2.php | 2 + .../plugin/WP2Static.php | 2 + .../plugin/WP2Static/Archive.php | 2 + .../plugin/WP2Static/ArchiveProcessor.php | 2 + .../plugin/WP2Static/CSSProcessor.php | 2 + .../plugin/WP2Static/DBSettings.php | 2 + .../plugin/WP2Static/Deployer.php | 2 + .../plugin/WP2Static/Dispatcher.php | 2 + .../plugin/WP2Static/Exporter.php | 2 + .../plugin/WP2Static/FileCopier.php | 2 + .../plugin/WP2Static/FileWriter.php | 2 + .../plugin/WP2Static/FilesHelper.php | 14 + .../plugin/WP2Static/HTMLProcessor.php | 2 + .../plugin/WP2Static/MimeTypes.php | 2 + .../plugin/WP2Static/Options.php | 2 + .../plugin/WP2Static/PostSettings.php | 2 + .../plugin/WP2Static/ProgressLog.php | 2 + .../plugin/WP2Static/Request.php | 2 + .../plugin/WP2Static/SiteCrawler.php | 2 + .../plugin/WP2Static/SitePublisher.php | 2 + .../plugin/WP2Static/TXTProcessor.php | 2 + .../plugin/WP2Static/TemplateHelper.php | 17 + .../plugin/WP2Static/View.php | 2 + .../plugin/WP2Static/WP2Static.php | 2 + .../plugin/WP2Static/WPSite.php | 2 + .../plugin/WP2Static/WsLog.php | 2 + .../plugin/deployers/Bitbucket.php | 2 + .../plugin/deployers/BunnyCDN.php | 2 + .../plugin/deployers/FTP.php | 2 + .../plugin/deployers/GitHub.php | 14 + .../plugin/deployers/GitLab.php | 16 + .../plugin/deployers/Netlify.php | 2 + .../plugin/deployers/S3.php | 8 + .../plugin/wp2static-wp-cli-commands.php | 2 + .../static-html-output-plugin/readme.txt | 1009 +++ .../views/bitbucket_settings_block.phtml | 58 + .../views/bunnycdn_settings_block.phtml | 64 + .../views/folder_settings_block.phtml | 44 + .../views/ftp_settings_block.phtml | 82 + .../views/github_settings_block.phtml | 66 + .../views/gitlab_settings_block.phtml | 56 + .../views/message.phtml | 17 + .../views/netlify_settings_block.phtml | 59 + .../views/options-page-js.phtml | 1256 +++ .../views/options-page.phtml | 174 + .../views/s3_settings_block.phtml | 112 + .../views/tab_advanced.phtml | 139 + .../views/tab_crawling.phtml | 138 + .../views/tab_export.phtml | 47 + .../views/tab_help.phtml | 67 + .../views/tab_logs.phtml | 30 + .../views/tab_love.phtml | 81 + .../views/tab_processing.phtml | 109 + .../views/zip_settings_block.phtml | 46 + .../static-html-output-plugin/wp2static.css | 164 + .../static-html-output-plugin/wp2static.php | 98 + .../assets/css/smtp-about.min.css | 3 + .../assets/css/smtp-admin.min.css | 3 + .../assets/images/about/icon-full.svg | 1 + .../assets/images/about/icon-none.svg | 1 + .../assets/images/about/icon-partial.svg | 1 + .../assets/images/about/plugin-mi.png | Bin 0 -> 7244 bytes .../assets/images/about/plugin-om.png | Bin 0 -> 46309 bytes .../assets/images/about/plugin-rp.png | Bin 0 -> 2190 bytes .../assets/images/about/plugin-wpf.png | Bin 0 -> 25007 bytes .../wp-mail-smtp/assets/images/about/team.jpg | Bin 0 -> 302513 bytes .../assets/images/control/admin.png | Bin 0 -> 1402 bytes .../assets/images/control/comments.png | Bin 0 -> 871 bytes .../assets/images/control/personal.png | Bin 0 -> 1536 bytes .../assets/images/control/update.png | Bin 0 -> 1257 bytes .../assets/images/control/user_new.png | Bin 0 -> 1143 bytes .../assets/images/control/users.png | Bin 0 -> 1215 bytes .../assets/images/email/icon-check.png | Bin 0 -> 2291 bytes .../assets/images/email/signature.png | Bin 0 -> 11399 bytes .../assets/images/email/wp-mail-smtp.png | Bin 0 -> 24087 bytes .../assets/images/email/wpforms-pro.png | Bin 0 -> 5598 bytes .../wp-mail-smtp/assets/images/logo.svg | 1 + .../assets/images/logs/archive.png | Bin 0 -> 69843 bytes .../assets/images/logs/single.png | Bin 0 -> 90210 bytes .../wp-mail-smtp/assets/images/menu-icon.svg | 1 + .../assets/images/providers/aws.svg | 1 + .../assets/images/providers/google.svg | 1 + .../assets/images/providers/mailgun.svg | 1 + .../assets/images/providers/microsoft.svg | 1 + .../assets/images/providers/pepipost-smtp.png | Bin 0 -> 3236 bytes .../assets/images/providers/pepipost.png | Bin 0 -> 13808 bytes .../assets/images/providers/php.svg | 1 + .../assets/images/providers/sendgrid.svg | 1 + .../assets/images/providers/sendinblue.svg | 1 + .../assets/images/providers/smtp.svg | 1 + .../assets/images/recommended.svg | 1 + .../assets/js/jquery.matchHeight.js | 388 + .../assets/js/jquery.matchHeight.min.js | 1 + .../wp-mail-smtp/assets/js/smtp-about.js | 190 + .../wp-mail-smtp/assets/js/smtp-about.min.js | 1 + .../wp-mail-smtp/assets/js/smtp-admin.js | 282 + .../wp-mail-smtp/assets/js/smtp-admin.min.js | 1 + .../assets/languages/wp-mail-smtp.pot | 1771 ++++ .../assets/libs/jquery-confirm.min.css | 9 + .../assets/libs/jquery-confirm.min.js | 10 + wp-content/plugins/wp-mail-smtp/loco.xml | 29 + wp-content/plugins/wp-mail-smtp/readme.txt | 406 + .../plugins/wp-mail-smtp/src/Admin/Area.php | 891 ++ .../wp-mail-smtp/src/Admin/PageAbstract.php | 87 + .../wp-mail-smtp/src/Admin/PageInterface.php | 45 + .../wp-mail-smtp/src/Admin/Pages/About.php | 717 ++ .../wp-mail-smtp/src/Admin/Pages/AuthTab.php | 63 + .../src/Admin/Pages/ControlTab.php | 124 + .../wp-mail-smtp/src/Admin/Pages/Logs.php | 85 + .../wp-mail-smtp/src/Admin/Pages/LogsTab.php | 73 + .../wp-mail-smtp/src/Admin/Pages/MiscTab.php | 219 + .../src/Admin/Pages/SettingsTab.php | 546 ++ .../wp-mail-smtp/src/Admin/Pages/TestTab.php | 1115 +++ .../src/Admin/PluginsInstallSkin.php | 55 + .../src/Admin/PluginsInstallUpgrader.php | 576 ++ .../plugins/wp-mail-smtp/src/Conflicts.php | 184 + wp-content/plugins/wp-mail-smtp/src/Core.php | 738 ++ wp-content/plugins/wp-mail-smtp/src/Debug.php | 122 + wp-content/plugins/wp-mail-smtp/src/Geo.php | 163 + .../plugins/wp-mail-smtp/src/MailCatcher.php | 145 + .../plugins/wp-mail-smtp/src/Migration.php | 257 + .../plugins/wp-mail-smtp/src/Options.php | 937 +++ .../plugins/wp-mail-smtp/src/Processor.php | 252 + .../src/Providers/AmazonSES/Options.php | 44 + .../src/Providers/AuthAbstract.php | 148 + .../src/Providers/AuthInterface.php | 30 + .../wp-mail-smtp/src/Providers/Gmail/Auth.php | 283 + .../src/Providers/Gmail/Mailer.php | 222 + .../src/Providers/Gmail/Options.php | 234 + .../wp-mail-smtp/src/Providers/Loader.php | 205 + .../src/Providers/Mail/Mailer.php | 49 + .../src/Providers/Mail/Options.php | 42 + .../src/Providers/MailerAbstract.php | 417 + .../src/Providers/MailerInterface.php | 83 + .../src/Providers/Mailgun/Mailer.php | 431 + .../src/Providers/Mailgun/Options.php | 161 + .../src/Providers/OptionsAbstract.php | 477 ++ .../src/Providers/OptionsInterface.php | 64 + .../src/Providers/Outlook/Options.php | 44 + .../src/Providers/Pepipost/Mailer.php | 32 + .../src/Providers/Pepipost/Options.php | 29 + .../src/Providers/PepipostAPI/Mailer.php | 440 + .../src/Providers/PepipostAPI/Options.php | 119 + .../src/Providers/SMTP/Mailer.php | 32 + .../src/Providers/SMTP/Options.php | 44 + .../src/Providers/Sendgrid/Mailer.php | 409 + .../src/Providers/Sendgrid/Options.php | 96 + .../src/Providers/Sendinblue/Api.php | 93 + .../src/Providers/Sendinblue/Mailer.php | 393 + .../src/Providers/Sendinblue/Options.php | 119 + .../plugins/wp-mail-smtp/src/SiteHealth.php | 180 + .../plugins/wp-mail-smtp/src/Upgrade.php | 71 + wp-content/plugins/wp-mail-smtp/src/WP.php | 234 + wp-content/plugins/wp-mail-smtp/uninstall.php | 80 + .../plugins/wp-mail-smtp/vendor/autoload.php | 7 + .../vendor/composer/ClassLoader.php | 445 + .../vendor/composer/autoload_classmap.php | 11 + .../vendor/composer/autoload_files.php | 14 + .../vendor/composer/autoload_namespaces.php | 11 + .../vendor/composer/autoload_psr4.php | 22 + .../vendor/composer/autoload_real.php | 70 + .../vendor/composer/autoload_static.php | 141 + .../vendor/google/apiclient-services/LICENSE | 203 + .../src/Google/Service/Gmail.php | 1219 +++ .../Google/Service/Gmail/AutoForwarding.php | 48 + .../Gmail/BatchDeleteMessagesRequest.php | 31 + .../Gmail/BatchModifyMessagesRequest.php | 49 + .../src/Google/Service/Gmail/Delegate.php | 39 + .../src/Google/Service/Gmail/Draft.php | 46 + .../src/Google/Service/Gmail/Filter.php | 62 + .../src/Google/Service/Gmail/FilterAction.php | 49 + .../Google/Service/Gmail/FilterCriteria.php | 102 + .../Service/Gmail/ForwardingAddress.php | 39 + .../src/Google/Service/Gmail/History.php | 111 + .../Service/Gmail/HistoryLabelAdded.php | 47 + .../Service/Gmail/HistoryLabelRemoved.php | 47 + .../Service/Gmail/HistoryMessageAdded.php | 37 + .../Service/Gmail/HistoryMessageDeleted.php | 37 + .../src/Google/Service/Gmail/ImapSettings.php | 57 + .../src/Google/Service/Gmail/Label.php | 118 + .../src/Google/Service/Gmail/LabelColor.php | 39 + .../Google/Service/Gmail/LanguageSettings.php | 30 + .../Service/Gmail/ListDelegatesResponse.php | 38 + .../Service/Gmail/ListDraftsResponse.php | 56 + .../Service/Gmail/ListFiltersResponse.php | 38 + .../Gmail/ListForwardingAddressesResponse.php | 38 + .../Service/Gmail/ListHistoryResponse.php | 56 + .../Service/Gmail/ListLabelsResponse.php | 38 + .../Service/Gmail/ListMessagesResponse.php | 56 + .../Service/Gmail/ListSendAsResponse.php | 38 + .../Service/Gmail/ListSmimeInfoResponse.php | 38 + .../Service/Gmail/ListThreadsResponse.php | 56 + .../src/Google/Service/Gmail/Message.php | 110 + .../src/Google/Service/Gmail/MessagePart.php | 97 + .../Google/Service/Gmail/MessagePartBody.php | 48 + .../Service/Gmail/MessagePartHeader.php | 39 + .../Service/Gmail/ModifyMessageRequest.php | 40 + .../Service/Gmail/ModifyThreadRequest.php | 40 + .../src/Google/Service/Gmail/PopSettings.php | 39 + .../src/Google/Service/Gmail/Profile.php | 57 + .../Google/Service/Gmail/Resource/Users.php | 71 + .../Service/Gmail/Resource/UsersDrafts.php | 130 + .../Service/Gmail/Resource/UsersHistory.php | 61 + .../Service/Gmail/Resource/UsersLabels.php | 120 + .../Service/Gmail/Resource/UsersMessages.php | 229 + .../Resource/UsersMessagesAttachments.php | 44 + .../Service/Gmail/Resource/UsersSettings.php | 184 + .../Gmail/Resource/UsersSettingsDelegates.php | 119 + .../Gmail/Resource/UsersSettingsFilters.php | 86 + .../UsersSettingsForwardingAddresses.php | 97 + .../Gmail/Resource/UsersSettingsSendAs.php | 162 + .../Resource/UsersSettingsSendAsSmimeInfo.php | 115 + .../Service/Gmail/Resource/UsersThreads.php | 135 + .../src/Google/Service/Gmail/SendAs.php | 109 + .../src/Google/Service/Gmail/SmimeInfo.php | 84 + .../src/Google/Service/Gmail/SmtpMsa.php | 66 + .../src/Google/Service/Gmail/Thread.php | 65 + .../Google/Service/Gmail/VacationSettings.php | 93 + .../src/Google/Service/Gmail/WatchRequest.php | 49 + .../Google/Service/Gmail/WatchResponse.php | 39 + .../vendor/google/apiclient/LICENSE | 203 + .../src/Google/AccessToken/Revoke.php | 78 + .../src/Google/AccessToken/Verify.php | 273 + .../Google/AuthHandler/AuthHandlerFactory.php | 42 + .../Google/AuthHandler/Guzzle5AuthHandler.php | 99 + .../Google/AuthHandler/Guzzle6AuthHandler.php | 106 + .../google/apiclient/src/Google/Client.php | 1139 +++ .../apiclient/src/Google/Collection.php | 100 + .../google/apiclient/src/Google/Exception.php | 20 + .../apiclient/src/Google/Http/Batch.php | 253 + .../src/Google/Http/MediaFileUpload.php | 351 + .../google/apiclient/src/Google/Http/REST.php | 182 + .../google/apiclient/src/Google/Model.php | 317 + .../google/apiclient/src/Google/Service.php | 56 + .../src/Google/Service/Exception.php | 68 + .../apiclient/src/Google/Service/Resource.php | 302 + .../apiclient/src/Google/Task/Exception.php | 20 + .../apiclient/src/Google/Task/Retryable.php | 24 + .../apiclient/src/Google/Task/Runner.php | 281 + .../src/Google/Utils/UriTemplate.php | 333 + .../google/apiclient/src/Google/autoload.php | 21 + .../wp-mail-smtp/vendor/google/auth/COPYING | 202 + .../wp-mail-smtp/vendor/google/auth/LICENSE | 203 + .../vendor/google/auth/autoload.php | 34 + .../vendor/google/auth/src/AccessToken.php | 320 + .../src/ApplicationDefaultCredentials.php | 185 + .../src/Cache/InvalidArgumentException.php | 24 + .../vendor/google/auth/src/Cache/Item.php | 190 + .../auth/src/Cache/MemoryCacheItemPool.php | 154 + .../auth/src/Cache/SysVCacheItemPool.php | 244 + .../vendor/google/auth/src/CacheTrait.php | 83 + .../Credentials/AppIdentityCredentials.php | 201 + .../auth/src/Credentials/GCECredentials.php | 373 + .../auth/src/Credentials/IAMCredentials.php | 89 + .../src/Credentials/InsecureCredentials.php | 70 + .../Credentials/ServiceAccountCredentials.php | 198 + .../ServiceAccountJwtAccessCredentials.php | 150 + .../Credentials/UserRefreshCredentials.php | 137 + .../google/auth/src/CredentialsLoader.php | 223 + .../google/auth/src/FetchAuthTokenCache.php | 142 + .../auth/src/FetchAuthTokenInterface.php | 55 + .../src/HttpHandler/Guzzle5HttpHandler.php | 128 + .../src/HttpHandler/Guzzle6HttpHandler.php | 49 + .../auth/src/HttpHandler/HttpClientCache.php | 54 + .../src/HttpHandler/HttpHandlerFactory.php | 45 + .../vendor/google/auth/src/Iam.php | 99 + .../src/Middleware/AuthTokenMiddleware.php | 126 + .../ScopedAccessTokenMiddleware.php | 175 + .../auth/src/Middleware/SimpleMiddleware.php | 93 + .../vendor/google/auth/src/OAuth2.php | 1360 +++ .../auth/src/ServiceAccountSignerTrait.php | 57 + .../google/auth/src/SignBlobInterface.php | 44 + .../src/Subscriber/AuthTokenSubscriber.php | 118 + .../ScopedAccessTokenSubscriber.php | 177 + .../auth/src/Subscriber/SimpleSubscriber.php | 90 + .../vendor/guzzlehttp/guzzle/Dockerfile | 18 + .../vendor/guzzlehttp/guzzle/LICENSE | 19 + .../vendor/guzzlehttp/guzzle/src/Client.php | 422 + .../guzzlehttp/guzzle/src/ClientInterface.php | 84 + .../guzzle/src/Cookie/CookieJar.php | 314 + .../guzzle/src/Cookie/CookieJarInterface.php | 84 + .../guzzle/src/Cookie/FileCookieJar.php | 91 + .../guzzle/src/Cookie/SessionCookieJar.php | 72 + .../guzzle/src/Cookie/SetCookie.php | 403 + .../src/Exception/BadResponseException.php | 27 + .../guzzle/src/Exception/ClientException.php | 9 + .../guzzle/src/Exception/ConnectException.php | 37 + .../guzzle/src/Exception/GuzzleException.php | 23 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 217 + .../guzzle/src/Exception/SeekException.php | 27 + .../guzzle/src/Exception/ServerException.php | 9 + .../Exception/TooManyRedirectsException.php | 6 + .../src/Exception/TransferException.php | 6 + .../guzzle/src/Handler/CurlFactory.php | 580 ++ .../src/Handler/CurlFactoryInterface.php | 27 + .../guzzle/src/Handler/CurlHandler.php | 45 + .../guzzle/src/Handler/CurlMultiHandler.php | 205 + .../guzzle/src/Handler/EasyHandle.php | 92 + .../guzzle/src/Handler/MockHandler.php | 190 + .../guzzlehttp/guzzle/src/Handler/Proxy.php | 55 + .../guzzle/src/Handler/StreamHandler.php | 544 ++ .../guzzlehttp/guzzle/src/HandlerStack.php | 273 + .../guzzle/src/MessageFormatter.php | 180 + .../guzzlehttp/guzzle/src/Middleware.php | 254 + .../vendor/guzzlehttp/guzzle/src/Pool.php | 123 + .../guzzle/src/PrepareBodyMiddleware.php | 106 + .../guzzle/src/RedirectMiddleware.php | 237 + .../guzzlehttp/guzzle/src/RequestOptions.php | 255 + .../guzzlehttp/guzzle/src/RetryMiddleware.php | 115 + .../guzzlehttp/guzzle/src/TransferStats.php | 126 + .../guzzlehttp/guzzle/src/UriTemplate.php | 237 + .../guzzlehttp/guzzle/src/functions.php | 346 + .../guzzle/src/functions_include.php | 6 + .../vendor/guzzlehttp/promises/LICENSE | 19 + .../promises/src/AggregateException.php | 16 + .../promises/src/CancellationException.php | 9 + .../guzzlehttp/promises/src/Coroutine.php | 151 + .../guzzlehttp/promises/src/EachPromise.php | 229 + .../promises/src/FulfilledPromise.php | 82 + .../guzzlehttp/promises/src/Promise.php | 280 + .../promises/src/PromiseInterface.php | 93 + .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 87 + .../promises/src/RejectionException.php | 47 + .../guzzlehttp/promises/src/TaskQueue.php | 66 + .../promises/src/TaskQueueInterface.php | 25 + .../guzzlehttp/promises/src/functions.php | 457 + .../promises/src/functions_include.php | 6 + .../vendor/guzzlehttp/psr7/LICENSE | 19 + .../guzzlehttp/psr7/src/AppendStream.php | 241 + .../guzzlehttp/psr7/src/BufferStream.php | 137 + .../guzzlehttp/psr7/src/CachingStream.php | 138 + .../guzzlehttp/psr7/src/DroppingStream.php | 42 + .../vendor/guzzlehttp/psr7/src/FnStream.php | 158 + .../guzzlehttp/psr7/src/InflateStream.php | 52 + .../guzzlehttp/psr7/src/LazyOpenStream.php | 39 + .../guzzlehttp/psr7/src/LimitStream.php | 155 + .../guzzlehttp/psr7/src/MessageTrait.php | 213 + .../guzzlehttp/psr7/src/MultipartStream.php | 153 + .../guzzlehttp/psr7/src/NoSeekStream.php | 22 + .../vendor/guzzlehttp/psr7/src/PumpStream.php | 165 + .../vendor/guzzlehttp/psr7/src/Request.php | 151 + .../vendor/guzzlehttp/psr7/src/Response.php | 154 + .../vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 + .../guzzlehttp/psr7/src/ServerRequest.php | 376 + .../vendor/guzzlehttp/psr7/src/Stream.php | 267 + .../psr7/src/StreamDecoratorTrait.php | 149 + .../guzzlehttp/psr7/src/StreamWrapper.php | 161 + .../guzzlehttp/psr7/src/UploadedFile.php | 316 + .../vendor/guzzlehttp/psr7/src/Uri.php | 760 ++ .../guzzlehttp/psr7/src/UriNormalizer.php | 216 + .../guzzlehttp/psr7/src/UriResolver.php | 219 + .../vendor/guzzlehttp/psr7/src/functions.php | 899 ++ .../guzzlehttp/psr7/src/functions_include.php | 6 + .../vendor/monolog/monolog/LICENSE | 19 + .../monolog/src/Monolog/ErrorHandler.php | 239 + .../Monolog/Formatter/ChromePHPFormatter.php | 78 + .../Monolog/Formatter/ElasticaFormatter.php | 89 + .../Monolog/Formatter/FlowdockFormatter.php | 116 + .../Monolog/Formatter/FluentdFormatter.php | 86 + .../Monolog/Formatter/FormatterInterface.php | 36 + .../Formatter/GelfMessageFormatter.php | 138 + .../src/Monolog/Formatter/HtmlFormatter.php | 141 + .../src/Monolog/Formatter/JsonFormatter.php | 208 + .../src/Monolog/Formatter/LineFormatter.php | 181 + .../src/Monolog/Formatter/LogglyFormatter.php | 47 + .../Monolog/Formatter/LogstashFormatter.php | 166 + .../Monolog/Formatter/MongoDBFormatter.php | 107 + .../Monolog/Formatter/NormalizerFormatter.php | 297 + .../src/Monolog/Formatter/ScalarFormatter.php | 48 + .../Monolog/Formatter/WildfireFormatter.php | 113 + .../src/Monolog/Handler/AbstractHandler.php | 196 + .../Handler/AbstractProcessingHandler.php | 68 + .../Monolog/Handler/AbstractSyslogHandler.php | 101 + .../src/Monolog/Handler/AmqpHandler.php | 148 + .../Monolog/Handler/BrowserConsoleHandler.php | 240 + .../src/Monolog/Handler/BufferHandler.php | 129 + .../src/Monolog/Handler/ChromePHPHandler.php | 211 + .../src/Monolog/Handler/CouchDBHandler.php | 72 + .../src/Monolog/Handler/CubeHandler.php | 151 + .../monolog/src/Monolog/Handler/Curl/Util.php | 57 + .../Monolog/Handler/DeduplicationHandler.php | 169 + .../Handler/DoctrineCouchDBHandler.php | 45 + .../src/Monolog/Handler/DynamoDbHandler.php | 107 + .../Monolog/Handler/ElasticSearchHandler.php | 128 + .../src/Monolog/Handler/ErrorLogHandler.php | 82 + .../src/Monolog/Handler/FilterHandler.php | 140 + .../ActivationStrategyInterface.php | 28 + .../ChannelLevelActivationStrategy.php | 59 + .../ErrorLevelActivationStrategy.php | 34 + .../Monolog/Handler/FingersCrossedHandler.php | 177 + .../src/Monolog/Handler/FirePHPHandler.php | 195 + .../src/Monolog/Handler/FleepHookHandler.php | 126 + .../src/Monolog/Handler/FlowdockHandler.php | 127 + .../Handler/FormattableHandlerInterface.php | 39 + .../Handler/FormattableHandlerTrait.php | 63 + .../src/Monolog/Handler/GelfHandler.php | 65 + .../src/Monolog/Handler/GroupHandler.php | 117 + .../src/Monolog/Handler/HandlerInterface.php | 90 + .../src/Monolog/Handler/HandlerWrapper.php | 116 + .../src/Monolog/Handler/HipChatHandler.php | 367 + .../src/Monolog/Handler/IFTTTHandler.php | 69 + .../src/Monolog/Handler/InsightOpsHandler.php | 62 + .../src/Monolog/Handler/LogEntriesHandler.php | 55 + .../src/Monolog/Handler/LogglyHandler.php | 102 + .../src/Monolog/Handler/MailHandler.php | 67 + .../src/Monolog/Handler/MandrillHandler.php | 68 + .../Handler/MissingExtensionException.php | 21 + .../src/Monolog/Handler/MongoDBHandler.php | 59 + .../Monolog/Handler/NativeMailerHandler.php | 185 + .../src/Monolog/Handler/NewRelicHandler.php | 204 + .../src/Monolog/Handler/NullHandler.php | 45 + .../src/Monolog/Handler/PHPConsoleHandler.php | 242 + .../Handler/ProcessableHandlerInterface.php | 40 + .../Handler/ProcessableHandlerTrait.php | 73 + .../src/Monolog/Handler/PsrHandler.php | 56 + .../src/Monolog/Handler/PushoverHandler.php | 185 + .../src/Monolog/Handler/RavenHandler.php | 234 + .../src/Monolog/Handler/RedisHandler.php | 97 + .../src/Monolog/Handler/RollbarHandler.php | 144 + .../Monolog/Handler/RotatingFileHandler.php | 190 + .../src/Monolog/Handler/SamplingHandler.php | 82 + .../src/Monolog/Handler/Slack/SlackRecord.php | 294 + .../src/Monolog/Handler/SlackHandler.php | 220 + .../Monolog/Handler/SlackWebhookHandler.php | 120 + .../src/Monolog/Handler/SlackbotHandler.php | 84 + .../src/Monolog/Handler/SocketHandler.php | 385 + .../src/Monolog/Handler/StreamHandler.php | 177 + .../Monolog/Handler/SwiftMailerHandler.php | 111 + .../src/Monolog/Handler/SyslogHandler.php | 67 + .../Monolog/Handler/SyslogUdp/UdpSocket.php | 56 + .../src/Monolog/Handler/SyslogUdpHandler.php | 124 + .../src/Monolog/Handler/TestHandler.php | 177 + .../Handler/WhatFailureGroupHandler.php | 72 + .../Monolog/Handler/ZendMonitorHandler.php | 101 + .../monolog/monolog/src/Monolog/Logger.php | 791 ++ .../src/Monolog/Processor/GitProcessor.php | 64 + .../Processor/IntrospectionProcessor.php | 112 + .../Processor/MemoryPeakUsageProcessor.php | 35 + .../src/Monolog/Processor/MemoryProcessor.php | 63 + .../Processor/MemoryUsageProcessor.php | 35 + .../Monolog/Processor/MercurialProcessor.php | 63 + .../Monolog/Processor/ProcessIdProcessor.php | 31 + .../Monolog/Processor/ProcessorInterface.php | 25 + .../Processor/PsrLogMessageProcessor.php | 50 + .../src/Monolog/Processor/TagProcessor.php | 44 + .../src/Monolog/Processor/UidProcessor.php | 59 + .../src/Monolog/Processor/WebProcessor.php | 113 + .../monolog/monolog/src/Monolog/Registry.php | 134 + .../src/Monolog/ResettableInterface.php | 31 + .../monolog/src/Monolog/SignalHandler.php | 115 + .../monolog/monolog/src/Monolog/Utils.php | 25 + .../vendor/phpseclib/phpseclib/LICENSE | 20 + .../phpseclib/phpseclib/Crypt/AES.php | 126 + .../phpseclib/phpseclib/Crypt/RSA.php | 3201 +++++++ .../phpseclib/phpseclib/Crypt/Random.php | 274 + .../phpseclib/phpseclib/Crypt/Rijndael.php | 936 +++ .../phpseclib/phpseclib/Math/BigInteger.php | 3787 +++++++++ .../phpseclib/phpseclib/bootstrap.php | 16 + .../phpseclib/phpseclib/phpseclib/openssl.cnf | 6 + .../wp-mail-smtp/vendor/psr/cache/LICENSE.txt | 19 + .../vendor/psr/cache/src/CacheException.php | 10 + .../psr/cache/src/CacheItemInterface.php | 105 + .../psr/cache/src/CacheItemPoolInterface.php | 138 + .../cache/src/InvalidArgumentException.php | 13 + .../vendor/psr/http-message/LICENSE | 19 + .../psr/http-message/src/MessageInterface.php | 187 + .../psr/http-message/src/RequestInterface.php | 129 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 + .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + .../psr/http-message/src/UriInterface.php | 323 + .../wp-mail-smtp/vendor/psr/log/LICENSE | 19 + .../vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + .../vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + .../psr/log/Psr/Log/LoggerAwareTrait.php | 26 + .../psr/log/Psr/Log/LoggerInterface.php | 125 + .../vendor/psr/log/Psr/Log/LoggerTrait.php | 142 + .../vendor/psr/log/Psr/Log/NullLogger.php | 30 + .../vendor/ralouphie/getallheaders/LICENSE | 21 + .../getallheaders/src/getallheaders.php | 46 + .../api-v3-sdk/lib/Api/AccountApi.php | 356 + .../api-v3-sdk/lib/Api/AttributesApi.php | 1186 +++ .../api-v3-sdk/lib/Api/ContactsApi.php | 7380 +++++++++++++++++ .../api-v3-sdk/lib/Api/EmailCampaignsApi.php | 2851 +++++++ .../api-v3-sdk/lib/Api/FoldersApi.php | 1787 ++++ .../api-v3-sdk/lib/Api/ListsApi.php | 2698 ++++++ .../api-v3-sdk/lib/Api/ProcessApi.php | 674 ++ .../api-v3-sdk/lib/Api/ResellerApi.php | 4327 ++++++++++ .../api-v3-sdk/lib/Api/SMSCampaignsApi.php | 2842 +++++++ .../sendinblue/api-v3-sdk/lib/Api/SMTPApi.php | 3519 ++++++++ .../api-v3-sdk/lib/Api/SendersApi.php | 1702 ++++ .../lib/Api/TransactionalSMSApi.php | 1317 +++ .../api-v3-sdk/lib/Api/WebhooksApi.php | 1452 ++++ .../api-v3-sdk/lib/ApiException.php | 121 + .../api-v3-sdk/lib/Configuration.php | 429 + .../api-v3-sdk/lib/HeaderSelector.php | 110 + .../api-v3-sdk/lib/Model/AddChildDomain.php | 302 + .../api-v3-sdk/lib/Model/AddContactToList.php | 302 + .../api-v3-sdk/lib/Model/AddCredits.php | 332 + .../api-v3-sdk/lib/Model/CreateAttribute.php | 406 + .../lib/Model/CreateAttributeEnumeration.php | 344 + .../api-v3-sdk/lib/Model/CreateChild.php | 452 + .../api-v3-sdk/lib/Model/CreateContact.php | 482 ++ .../lib/Model/CreateEmailCampaign.php | 1114 +++ .../Model/CreateEmailCampaignRecipients.php | 333 + .../lib/Model/CreateEmailCampaignSender.php | 339 + .../api-v3-sdk/lib/Model/CreateList.php | 344 + .../api-v3-sdk/lib/Model/CreateModel.php | 308 + .../api-v3-sdk/lib/Model/CreateReseller.php | 308 + .../api-v3-sdk/lib/Model/CreateSender.php | 374 + .../api-v3-sdk/lib/Model/CreateSenderIps.php | 396 + .../lib/Model/CreateSenderModel.php | 368 + .../lib/Model/CreateSmsCampaign.php | 451 + .../lib/Model/CreateSmsCampaignRecipients.php | 338 + .../api-v3-sdk/lib/Model/CreateSmtpEmail.php | 308 + .../lib/Model/CreateSmtpTemplate.php | 590 ++ .../lib/Model/CreateSmtpTemplateSender.php | 339 + .../lib/Model/CreateUpdateContactModel.php | 302 + .../lib/Model/CreateUpdateFolder.php | 302 + .../api-v3-sdk/lib/Model/CreateWebhook.php | 486 ++ .../api-v3-sdk/lib/Model/CreatedProcessId.php | 308 + .../lib/Model/DeleteHardbounces.php | 362 + .../lib/Model/EmailExportRecipients.php | 386 + .../api-v3-sdk/lib/Model/ErrorModel.php | 406 + .../api-v3-sdk/lib/Model/GetAccount.php | 554 ++ .../Model/GetAccountMarketingAutomation.php | 338 + .../api-v3-sdk/lib/Model/GetAccountPlan.php | 546 ++ .../api-v3-sdk/lib/Model/GetAccountRelay.php | 345 + .../lib/Model/GetAccountRelayData.php | 381 + .../lib/Model/GetAggregatedReport.php | 740 ++ .../api-v3-sdk/lib/Model/GetAttributes.php | 308 + .../lib/Model/GetAttributesAttributes.php | 518 ++ .../lib/Model/GetAttributesEnumeration.php | 344 + .../lib/Model/GetCampaignOverview.php | 766 ++ .../lib/Model/GetCampaignRecipients.php | 344 + .../api-v3-sdk/lib/Model/GetCampaignStats.php | 692 ++ .../api-v3-sdk/lib/Model/GetChildDomain.php | 344 + .../api-v3-sdk/lib/Model/GetChildDomains.php | 280 + .../api-v3-sdk/lib/Model/GetChildInfo.php | 572 ++ .../lib/Model/GetChildInfoApiKeys.php | 339 + .../lib/Model/GetChildInfoApiKeysV2.php | 344 + .../lib/Model/GetChildInfoApiKeysV3.php | 344 + .../lib/Model/GetChildInfoCredits.php | 333 + .../lib/Model/GetChildInfoStatistics.php | 363 + .../api-v3-sdk/lib/Model/GetChildrenList.php | 302 + .../api-v3-sdk/lib/Model/GetClient.php | 416 + .../lib/Model/GetContactCampaignStats.php | 513 ++ .../Model/GetContactCampaignStatsClicked.php | 344 + .../Model/GetContactCampaignStatsOpened.php | 416 + ...tContactCampaignStatsTransacAttributes.php | 380 + ...GetContactCampaignStatsUnsubscriptions.php | 344 + .../lib/Model/GetContactDetails.php | 590 ++ .../api-v3-sdk/lib/Model/GetContacts.php | 344 + .../api-v3-sdk/lib/Model/GetEmailCampaign.php | 1348 +++ .../lib/Model/GetEmailCampaigns.php | 338 + .../lib/Model/GetEmailEventReport.php | 302 + .../lib/Model/GetEmailEventReportEvents.php | 652 ++ .../lib/Model/GetExtendedCampaignOverview.php | 1276 +++ .../GetExtendedCampaignOverviewSender.php | 332 + .../lib/Model/GetExtendedCampaignStats.php | 488 ++ .../lib/Model/GetExtendedClient.php | 452 + .../lib/Model/GetExtendedClientAddress.php | 417 + .../lib/Model/GetExtendedContactDetails.php | 626 ++ .../GetExtendedContactDetailsStatistics.php | 513 ++ ...xtendedContactDetailsStatisticsClicked.php | 344 + ...tExtendedContactDetailsStatisticsLinks.php | 416 + ...edContactDetailsStatisticsMessagesSent.php | 344 + ...ExtendedContactDetailsStatisticsOpened.php | 416 + ...ontactDetailsStatisticsUnsubscriptions.php | 345 + ...ticsUnsubscriptionsAdminUnsubscription.php | 344 + ...sticsUnsubscriptionsUserUnsubscription.php | 380 + .../api-v3-sdk/lib/Model/GetExtendedList.php | 548 ++ .../Model/GetExtendedListCampaignStats.php | 344 + .../api-v3-sdk/lib/Model/GetFolder.php | 452 + .../api-v3-sdk/lib/Model/GetFolderLists.php | 344 + .../api-v3-sdk/lib/Model/GetFolders.php | 332 + .../sendinblue/api-v3-sdk/lib/Model/GetIp.php | 416 + .../api-v3-sdk/lib/Model/GetIpFromSender.php | 416 + .../api-v3-sdk/lib/Model/GetIps.php | 308 + .../api-v3-sdk/lib/Model/GetIpsFromSender.php | 308 + .../api-v3-sdk/lib/Model/GetList.php | 416 + .../api-v3-sdk/lib/Model/GetLists.php | 344 + .../api-v3-sdk/lib/Model/GetProcess.php | 448 + .../api-v3-sdk/lib/Model/GetProcesses.php | 338 + .../api-v3-sdk/lib/Model/GetReports.php | 302 + .../lib/Model/GetReportsReports.php | 740 ++ .../api-v3-sdk/lib/Model/GetSendersList.php | 302 + .../lib/Model/GetSendersListIps.php | 380 + .../lib/Model/GetSendersListSenders.php | 446 + .../api-v3-sdk/lib/Model/GetSmsCampaign.php | 676 ++ .../lib/Model/GetSmsCampaignOverview.php | 604 ++ .../lib/Model/GetSmsCampaignStats.php | 524 ++ .../api-v3-sdk/lib/Model/GetSmsCampaigns.php | 338 + .../lib/Model/GetSmsEventReport.php | 302 + .../lib/Model/GetSmsEventReportEvents.php | 556 ++ .../lib/Model/GetSmtpTemplateOverview.php | 704 ++ .../Model/GetSmtpTemplateOverviewSender.php | 332 + .../api-v3-sdk/lib/Model/GetSmtpTemplates.php | 332 + .../api-v3-sdk/lib/Model/GetSsoToken.php | 308 + .../api-v3-sdk/lib/Model/GetStatsByDomain.php | 280 + .../Model/GetTransacAggregatedSmsReport.php | 632 ++ .../lib/Model/GetTransacSmsReport.php | 302 + .../lib/Model/GetTransacSmsReportReports.php | 632 ++ .../api-v3-sdk/lib/Model/GetWebhook.php | 560 ++ .../api-v3-sdk/lib/Model/GetWebhooks.php | 308 + .../api-v3-sdk/lib/Model/ManageIp.php | 302 + .../api-v3-sdk/lib/Model/ModelInterface.php | 96 + .../api-v3-sdk/lib/Model/PostContactInfo.php | 308 + .../lib/Model/PostContactInfoContacts.php | 362 + .../api-v3-sdk/lib/Model/PostSendFailed.php | 434 + .../lib/Model/PostSendSmsTestFailed.php | 404 + .../lib/Model/RemainingCreditModel.php | 344 + .../lib/Model/RemainingCreditModelChild.php | 345 + .../Model/RemainingCreditModelReseller.php | 344 + .../lib/Model/RemoveContactFromList.php | 332 + .../api-v3-sdk/lib/Model/RemoveCredits.php | 332 + .../lib/Model/RequestContactExport.php | 368 + .../lib/Model/RequestContactImport.php | 542 ++ .../lib/Model/RequestContactImportNewList.php | 333 + .../lib/Model/RequestSMSRecipientExport.php | 382 + .../api-v3-sdk/lib/Model/SendEmail.php | 548 ++ .../lib/Model/SendEmailAttachment.php | 356 + .../api-v3-sdk/lib/Model/SendReport.php | 382 + .../api-v3-sdk/lib/Model/SendReportEmail.php | 507 ++ .../api-v3-sdk/lib/Model/SendSms.php | 434 + .../api-v3-sdk/lib/Model/SendSmtpEmail.php | 668 ++ .../lib/Model/SendSmtpEmailAttachment.php | 374 + .../api-v3-sdk/lib/Model/SendSmtpEmailBcc.php | 338 + .../api-v3-sdk/lib/Model/SendSmtpEmailCc.php | 338 + .../lib/Model/SendSmtpEmailReplyTo.php | 339 + .../lib/Model/SendSmtpEmailSender.php | 339 + .../api-v3-sdk/lib/Model/SendSmtpEmailTo.php | 338 + .../lib/Model/SendTemplateEmail.php | 308 + .../api-v3-sdk/lib/Model/SendTestEmail.php | 302 + .../api-v3-sdk/lib/Model/SendTestSms.php | 302 + .../api-v3-sdk/lib/Model/SendTransacSms.php | 517 ++ .../api-v3-sdk/lib/Model/UpdateAttribute.php | 332 + .../lib/Model/UpdateAttributeEnumeration.php | 344 + .../lib/Model/UpdateCampaignStatus.php | 351 + .../api-v3-sdk/lib/Model/UpdateChild.php | 422 + .../lib/Model/UpdateChildAccountStatus.php | 362 + .../lib/Model/UpdateChildDomain.php | 302 + .../api-v3-sdk/lib/Model/UpdateContact.php | 452 + .../lib/Model/UpdateEmailCampaign.php | 1102 +++ .../Model/UpdateEmailCampaignRecipients.php | 333 + .../lib/Model/UpdateEmailCampaignSender.php | 333 + .../api-v3-sdk/lib/Model/UpdateList.php | 332 + .../api-v3-sdk/lib/Model/UpdateSender.php | 362 + .../lib/Model/UpdateSmsCampaign.php | 433 + .../lib/Model/UpdateSmtpTemplate.php | 572 ++ .../lib/Model/UpdateSmtpTemplateSender.php | 333 + .../api-v3-sdk/lib/Model/UpdateWebhook.php | 408 + .../api-v3-sdk/lib/ObjectSerializer.php | 317 + .../wp-mail-smtp/wp-mail-smtp-0.11.2.php | 759 ++ .../plugins/wp-mail-smtp/wp-mail-smtp.php | 83 + .../plugins/wp-mail-smtp/wp_mail_smtp.php | 167 + wp-content/plugins/wp-piwik/LICENSE | 675 ++ wp-content/plugins/wp-piwik/README.md | 9 + wp-content/plugins/wp-piwik/bitcoin.png | Bin 0 -> 2020 bytes .../plugins/wp-piwik/classes/WP_Piwik.php | 1327 +++ .../wp-piwik/classes/WP_Piwik/Admin.php | 26 + .../classes/WP_Piwik/Admin/Network.php | 25 + .../classes/WP_Piwik/Admin/Settings.php | 720 ++ .../classes/WP_Piwik/Admin/Sitebrowser.php | 112 + .../classes/WP_Piwik/Admin/Statistics.php | 54 + .../wp-piwik/classes/WP_Piwik/Logger.php | 47 + .../classes/WP_Piwik/Logger/Dummy.php | 9 + .../wp-piwik/classes/WP_Piwik/Logger/File.php | 48 + .../classes/WP_Piwik/Logger/Screen.php | 27 + .../wp-piwik/classes/WP_Piwik/Request.php | 95 + .../wp-piwik/classes/WP_Piwik/Request/Php.php | 55 + .../classes/WP_Piwik/Request/Rest.php | 81 + .../wp-piwik/classes/WP_Piwik/Settings.php | 408 + .../wp-piwik/classes/WP_Piwik/Shortcode.php | 28 + .../wp-piwik/classes/WP_Piwik/Template.php | 31 + .../WP_Piwik/Template/MetaBoxCustomVars.php | 63 + .../classes/WP_Piwik/TrackingCode.php | 150 + .../wp-piwik/classes/WP_Piwik/Widget.php | 376 + .../WP_Piwik/Widget/BrowserDetails.php | 77 + .../classes/WP_Piwik/Widget/Browsers.php | 80 + .../classes/WP_Piwik/Widget/Chart.php | 78 + .../wp-piwik/classes/WP_Piwik/Widget/City.php | 80 + .../classes/WP_Piwik/Widget/Country.php | 80 + .../classes/WP_Piwik/Widget/Ecommerce.php | 45 + .../classes/WP_Piwik/Widget/Items.php | 52 + .../classes/WP_Piwik/Widget/ItemsCategory.php | 52 + .../classes/WP_Piwik/Widget/Keywords.php | 21 + .../classes/WP_Piwik/Widget/Models.php | 80 + .../classes/WP_Piwik/Widget/Noresult.php | 38 + .../classes/WP_Piwik/Widget/OptOut.php | 31 + .../classes/WP_Piwik/Widget/Overview.php | 63 + .../classes/WP_Piwik/Widget/Pages.php | 21 + .../classes/WP_Piwik/Widget/Plugins.php | 38 + .../wp-piwik/classes/WP_Piwik/Widget/Post.php | 51 + .../classes/WP_Piwik/Widget/Referrers.php | 21 + .../classes/WP_Piwik/Widget/Screens.php | 75 + .../classes/WP_Piwik/Widget/Search.php | 38 + .../wp-piwik/classes/WP_Piwik/Widget/Seo.php | 31 + .../classes/WP_Piwik/Widget/SystemDetails.php | 73 + .../classes/WP_Piwik/Widget/Systems.php | 73 + .../classes/WP_Piwik/Widget/Types.php | 80 + .../classes/WP_Piwik/Widget/Visitors.php | 68 + wp-content/plugins/wp-piwik/config.php | 9 + wp-content/plugins/wp-piwik/css/index.php | 2 + .../plugins/wp-piwik/css/wp-piwik-spark.css | 3 + wp-content/plugins/wp-piwik/css/wp-piwik.css | 57 + wp-content/plugins/wp-piwik/gpl-3.0.html | 692 ++ wp-content/plugins/wp-piwik/index.php | 2 + wp-content/plugins/wp-piwik/js/index.php | 2 + .../wp-piwik/js/jqplot/IMPORTANT_NOTICE.txt | 1 + .../wp-piwik/js/jqplot/MIT-LICENSE.txt | 21 + .../plugins/wp-piwik/js/jqplot/README.txt | 77 + .../plugins/wp-piwik/js/jqplot/changes.txt | 458 + .../plugins/wp-piwik/js/jqplot/copyright.txt | 56 + .../wp-piwik/js/jqplot/excanvas.min.js | 3 + .../plugins/wp-piwik/js/jqplot/gpl-2.0.txt | 280 + .../plugins/wp-piwik/js/jqplot/index.php | 2 + .../wp-piwik/js/jqplot/jquery.jqplot.min.css | 1 + .../wp-piwik/js/jqplot/jquery.jqplot.min.js | 3 + .../jqplot/plugins/jqplot.pieRenderer.min.js | 3 + .../js/jqplot/plugins/jqplot.trendline.min.js | 3 + .../plugins/wp-piwik/js/jqplot/usage.txt | 126 + .../wp-piwik/js/jqplot/wp-piwik.jqplot.js | 10 + .../plugins/wp-piwik/js/sparkline/index.php | 2 + .../wp-piwik/js/sparkline/jquery.sparkline.js | 3054 +++++++ .../js/sparkline/jquery.sparkline.min.js | 5 + wp-content/plugins/wp-piwik/js/wp-piwik.js | 4 + .../plugins/wp-piwik/languages/.tx/config | 9 + .../plugins/wp-piwik/languages/update.sh | 5 + .../wp-piwik/languages/wp-piwik-az_AZ.mo | Bin 0 -> 1418 bytes .../wp-piwik/languages/wp-piwik-az_AZ.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-be_BY.mo | Bin 0 -> 1798 bytes .../wp-piwik/languages/wp-piwik-be_BY.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-cs_CZ.mo | Bin 0 -> 474 bytes .../wp-piwik/languages/wp-piwik-cs_CZ.po | 1528 ++++ .../wp-piwik/languages/wp-piwik-de_CH.mo | Bin 0 -> 445 bytes .../wp-piwik/languages/wp-piwik-de_CH.po | 1528 ++++ .../wp-piwik/languages/wp-piwik-de_DE.mo | Bin 0 -> 34143 bytes .../wp-piwik/languages/wp-piwik-de_DE.po | 1530 ++++ .../plugins/wp-piwik/languages/wp-piwik-el.mo | Bin 0 -> 38932 bytes .../plugins/wp-piwik/languages/wp-piwik-el.po | 1531 ++++ .../wp-piwik/languages/wp-piwik-el_GR.mo | Bin 0 -> 13103 bytes .../wp-piwik/languages/wp-piwik-el_GR.po | 407 + .../wp-piwik/languages/wp-piwik-es_ES.mo | Bin 0 -> 7734 bytes .../wp-piwik/languages/wp-piwik-es_ES.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-fa_IR.mo | Bin 0 -> 9852 bytes .../wp-piwik/languages/wp-piwik-fa_IR.po | 1532 ++++ .../wp-piwik/languages/wp-piwik-fr_FR.mo | Bin 0 -> 28250 bytes .../wp-piwik/languages/wp-piwik-fr_FR.po | 1532 ++++ .../plugins/wp-piwik/languages/wp-piwik-hi.mo | Bin 0 -> 7471 bytes .../plugins/wp-piwik/languages/wp-piwik-hi.po | 1529 ++++ .../wp-piwik/languages/wp-piwik-hu_HU.mo | Bin 0 -> 27582 bytes .../wp-piwik/languages/wp-piwik-hu_HU.po | 1530 ++++ .../plugins/wp-piwik/languages/wp-piwik-id.mo | Bin 0 -> 880 bytes .../plugins/wp-piwik/languages/wp-piwik-id.po | 1528 ++++ .../wp-piwik/languages/wp-piwik-it_IT.mo | Bin 0 -> 26692 bytes .../wp-piwik/languages/wp-piwik-it_IT.po | 1532 ++++ .../plugins/wp-piwik/languages/wp-piwik-lb.mo | Bin 0 -> 5705 bytes .../plugins/wp-piwik/languages/wp-piwik-lb.po | 1529 ++++ .../wp-piwik/languages/wp-piwik-lt_LT.mo | Bin 0 -> 3031 bytes .../wp-piwik/languages/wp-piwik-lt_LT.po | 1531 ++++ .../wp-piwik/languages/wp-piwik-nb_NO.mo | Bin 0 -> 5756 bytes .../wp-piwik/languages/wp-piwik-nb_NO.po | 1529 ++++ .../wp-piwik/languages/wp-piwik-nl_NL.mo | Bin 0 -> 21847 bytes .../wp-piwik/languages/wp-piwik-nl_NL.po | 1532 ++++ .../wp-piwik/languages/wp-piwik-pl_PL.mo | Bin 0 -> 26626 bytes .../wp-piwik/languages/wp-piwik-pl_PL.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-pt_BR.mo | Bin 0 -> 26913 bytes .../wp-piwik/languages/wp-piwik-pt_BR.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-ro_RO.mo | Bin 0 -> 1440 bytes .../wp-piwik/languages/wp-piwik-ro_RO.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-ru_RU.mo | Bin 0 -> 4820 bytes .../wp-piwik/languages/wp-piwik-ru_RU.po | 1529 ++++ .../wp-piwik/languages/wp-piwik-sl_SI.mo | Bin 0 -> 1860 bytes .../wp-piwik/languages/wp-piwik-sl_SI.po | 1529 ++++ .../plugins/wp-piwik/languages/wp-piwik-sq.mo | Bin 0 -> 27537 bytes .../plugins/wp-piwik/languages/wp-piwik-sq.po | 1532 ++++ .../wp-piwik/languages/wp-piwik-sv_SE.mo | Bin 0 -> 1731 bytes .../wp-piwik/languages/wp-piwik-sv_SE.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-tr_TR.mo | Bin 0 -> 13468 bytes .../wp-piwik/languages/wp-piwik-tr_TR.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-ua_UA.mo | Bin 0 -> 4907 bytes .../wp-piwik/languages/wp-piwik-ua_UA.po | 186 + .../wp-piwik/languages/wp-piwik-uk_UA.mo | Bin 0 -> 1725 bytes .../wp-piwik/languages/wp-piwik-uk_UA.po | 1530 ++++ .../wp-piwik/languages/wp-piwik-zh_CN.mo | Bin 0 -> 22777 bytes .../wp-piwik/languages/wp-piwik-zh_CN.po | 1529 ++++ .../plugins/wp-piwik/languages/wp-piwik.pot | 1533 ++++ wp-content/plugins/wp-piwik/proxy/config.php | 39 + wp-content/plugins/wp-piwik/proxy/index.php | 2 + wp-content/plugins/wp-piwik/proxy/matomo.php | 137 + wp-content/plugins/wp-piwik/proxy/piwik.php | 2 + wp-content/plugins/wp-piwik/readme.txt | 640 ++ wp-content/plugins/wp-piwik/screenshot-1.gif | Bin 0 -> 47554 bytes wp-content/plugins/wp-piwik/screenshot-2.gif | Bin 0 -> 52962 bytes wp-content/plugins/wp-piwik/screenshot-3.gif | Bin 0 -> 97175 bytes wp-content/plugins/wp-piwik/screenshot-4.gif | Bin 0 -> 12691 bytes wp-content/plugins/wp-piwik/screenshot-5.gif | Bin 0 -> 27708 bytes wp-content/plugins/wp-piwik/uninstall.php | 108 + .../plugins/wp-piwik/update/2015051101.php | 41 + .../plugins/wp-piwik/update/2017080701.php | 13 + wp-content/plugins/wp-piwik/update/90001.php | 9 + wp-content/plugins/wp-piwik/update/90801.php | 5 + wp-content/plugins/wp-piwik/update/91006.php | 10 + wp-content/plugins/wp-piwik/wp-piwik.php | 83 + wp-content/plugins/wp-piwik/wpml-config.xml | 5 + wp-content/themes/generatepress/404.php | 93 + wp-content/themes/generatepress/archive.php | 81 + wp-content/themes/generatepress/comments.php | 113 + .../themes/generatepress/content-link.php | 96 + .../themes/generatepress/content-page.php | 79 + .../themes/generatepress/content-single.php | 90 + wp-content/themes/generatepress/content.php | 95 + .../generatepress/css/admin/block-editor.css | 165 + .../generatepress/css/admin/editor-style.css | 65 + .../generatepress/css/admin/meta-box.css | 80 + .../themes/generatepress/css/admin/style.css | 232 + .../themes/generatepress/css/all.min.css | 1 + .../themes/generatepress/css/font-awesome.css | 2337 ++++++ .../generatepress/css/font-awesome.min.css | 1 + .../themes/generatepress/css/mobile.css | 304 + .../themes/generatepress/css/mobile.min.css | 1 + .../css/unsemantic-grid-lite.css | 567 ++ .../css/unsemantic-grid-lite.min.css | 1 + .../generatepress/css/unsemantic-grid.css | 1467 ++++ .../generatepress/css/unsemantic-grid.min.css | 1 + .../generatepress/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../fonts/fontawesome-webfont.svg | 2671 ++++++ .../fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../generatepress/fonts/generatepress.eot | Bin 0 -> 2828 bytes .../generatepress/fonts/generatepress.svg | 20 + .../generatepress/fonts/generatepress.ttf | Bin 0 -> 2640 bytes .../generatepress/fonts/generatepress.woff | Bin 0 -> 2716 bytes .../generatepress/fonts/generatepress.woff2 | Bin 0 -> 1264 bytes wp-content/themes/generatepress/footer.php | 65 + wp-content/themes/generatepress/functions.php | 98 + wp-content/themes/generatepress/header.php | 75 + .../themes/generatepress/inc/block-editor.php | 390 + .../themes/generatepress/inc/class-css.php | 212 + .../themes/generatepress/inc/css-output.php | 814 ++ .../themes/generatepress/inc/customizer.php | 1445 ++++ .../customizer/controls/class-deprecated.php | 230 + .../controls/class-range-control.php | 180 + .../controls/class-typography-control.php | 193 + .../controls/class-upsell-control.php | 43 + .../controls/class-upsell-section.php | 54 + .../customizer/controls/css/selectWoo.min.css | 1 + .../controls/css/slider-customizer.css | 142 + .../controls/css/typography-customizer.css | 47 + .../controls/css/upsell-customizer.css | 54 + .../controls/js/customizer-controls.js | 338 + .../controls/js/customizer-live-preview.js | 609 ++ .../customizer/controls/js/selectWoo.min.js | 1 + .../customizer/controls/js/slider-control.js | 134 + .../controls/js/typography-customizer.js | 154 + .../customizer/controls/js/upsell-control.js | 12 + .../inc/customizer/customizer-helpers.php | 23 + .../inc/customizer/deprecated.php | 111 + .../generatepress/inc/customizer/helpers.php | 330 + .../themes/generatepress/inc/dashboard.php | 367 + .../themes/generatepress/inc/defaults.php | 354 + .../themes/generatepress/inc/deprecated.php | 712 ++ .../themes/generatepress/inc/general.php | 350 + .../themes/generatepress/inc/markup.php | 565 ++ .../themes/generatepress/inc/meta-box.php | 315 + .../themes/generatepress/inc/migrate.php | 341 + .../generatepress/inc/plugin-compat.php | 268 + .../generatepress/inc/structure/archives.php | 116 + .../generatepress/inc/structure/comments.php | 161 + .../inc/structure/featured-images.php | 112 + .../generatepress/inc/structure/footer.php | 224 + .../generatepress/inc/structure/header.php | 310 + .../inc/structure/navigation.php | 397 + .../generatepress/inc/structure/post-meta.php | 388 + .../generatepress/inc/structure/sidebars.php | 83 + .../generatepress/inc/theme-functions.php | 343 + .../themes/generatepress/inc/typography.php | 1076 +++ wp-content/themes/generatepress/index.php | 77 + wp-content/themes/generatepress/js/a11y.js | 137 + .../themes/generatepress/js/a11y.min.js | 1 + .../generatepress/js/admin/block-editor.js | 97 + .../generatepress/js/admin/tinycolor.js | 1195 +++ .../themes/generatepress/js/back-to-top.js | 64 + .../generatepress/js/back-to-top.min.js | 1 + .../themes/generatepress/js/classList.js | 240 + .../themes/generatepress/js/classList.min.js | 2 + .../themes/generatepress/js/dropdown-click.js | 124 + .../generatepress/js/dropdown-click.min.js | 1 + wp-content/themes/generatepress/js/menu.js | 219 + .../themes/generatepress/js/menu.min.js | 1 + .../generatepress/js/navigation-search.js | 113 + .../generatepress/js/navigation-search.min.js | 1 + .../themes/generatepress/no-results.php | 78 + wp-content/themes/generatepress/page.php | 72 + wp-content/themes/generatepress/readme.txt | 450 + wp-content/themes/generatepress/rtl.css | 197 + .../themes/generatepress/screenshot.png | Bin 0 -> 62172 bytes wp-content/themes/generatepress/search.php | 79 + .../themes/generatepress/searchform.php | 18 + .../themes/generatepress/sidebar-left.php | 34 + wp-content/themes/generatepress/sidebar.php | 34 + wp-content/themes/generatepress/single.php | 67 + wp-content/themes/generatepress/style.css | 2099 +++++ wp-content/themes/generatepress/style.min.css | 1 + wp-content/themes/index.php | 2 + wp-content/themes/twentynineteen/404.php | 33 + wp-content/themes/twentynineteen/archive.php | 55 + .../class-twentynineteen-svg-icons.php | 458 + .../class-twentynineteen-walker-comment.php | 128 + wp-content/themes/twentynineteen/comments.php | 128 + .../fonts/NonBreakingSpaceOverride.woff | Bin 0 -> 1212 bytes .../fonts/NonBreakingSpaceOverride.woff2 | Bin 0 -> 764 bytes wp-content/themes/twentynineteen/footer.php | 57 + .../themes/twentynineteen/functions.php | 330 + wp-content/themes/twentynineteen/header.php | 53 + wp-content/themes/twentynineteen/image.php | 104 + .../themes/twentynineteen/inc/back-compat.php | 79 + .../twentynineteen/inc/color-patterns.php | 271 + .../themes/twentynineteen/inc/customizer.php | 158 + .../twentynineteen/inc/helper-functions.php | 163 + .../twentynineteen/inc/icon-functions.php | 108 + .../twentynineteen/inc/template-functions.php | 211 + .../twentynineteen/inc/template-tags.php | 258 + wp-content/themes/twentynineteen/index.php | 47 + .../twentynineteen/js/customize-controls.js | 30 + .../twentynineteen/js/customize-preview.js | 60 + .../themes/twentynineteen/js/priority-menu.js | 216 + .../twentynineteen/js/skip-link-focus-fix.js | 33 + .../js/touch-keyboard-navigation.js | 354 + .../themes/twentynineteen/package-lock.json | 4627 +++++++++++ wp-content/themes/twentynineteen/package.json | 44 + wp-content/themes/twentynineteen/page.php | 38 + .../themes/twentynineteen/postcss.config.js | 13 + wp-content/themes/twentynineteen/print.css | 162 + wp-content/themes/twentynineteen/print.scss | 198 + wp-content/themes/twentynineteen/readme.txt | 74 + .../twentynineteen/sass/_normalize.scss | 341 + .../twentynineteen/sass/blocks/_blocks.scss | 1032 +++ .../sass/elements/_elements.scss | 92 + .../twentynineteen/sass/elements/_lists.scss | 33 + .../twentynineteen/sass/elements/_tables.scss | 13 + .../twentynineteen/sass/forms/_buttons.scss | 37 + .../twentynineteen/sass/forms/_fields.scss | 58 + .../twentynineteen/sass/forms/_forms.scss | 3 + .../twentynineteen/sass/layout/_layout.scss | 11 + .../twentynineteen/sass/media/_captions.scss | 32 + .../twentynineteen/sass/media/_galleries.scss | 52 + .../twentynineteen/sass/media/_media.scss | 41 + .../sass/mixins/_mixins-master.scss | 132 + .../sass/mixins/_utilities.scss | 51 + .../sass/modules/_accessibility.scss | 38 + .../sass/modules/_alignments.scss | 28 + .../sass/modules/_clearings.scss | 23 + .../sass/navigation/_links.scss | 21 + .../navigation/_menu-footer-navigation.scss | 22 + .../navigation/_menu-main-navigation.scss | 506 ++ .../navigation/_menu-social-navigation.scss | 66 + .../sass/navigation/_navigation.scss | 16 + .../sass/navigation/_next-previous.scss | 201 + .../twentynineteen/sass/site/_site.scss | 27 + .../sass/site/footer/_site-footer.scss | 53 + .../site/header/_site-featured-image.scss | 301 + .../sass/site/header/_site-header.scss | 139 + .../sass/site/primary/_archives.scss | 65 + .../sass/site/primary/_comments.scss | 405 + .../sass/site/primary/_posts-and-pages.scss | 304 + .../sass/site/secondary/_widgets.scss | 102 + .../twentynineteen/sass/typography/_copy.scss | 62 + .../sass/typography/_headings.scss | 164 + .../sass/typography/_typography.scss | 32 + .../sass/variables-site/_colors.scss | 34 + .../sass/variables-site/_columns.scss | 16 + .../sass/variables-site/_fonts.scss | 83 + .../sass/variables-site/_structure.scss | 16 + .../sass/variables-site/_transitions.scss | 6 + .../sass/variables-site/_variables-site.scss | 5 + .../themes/twentynineteen/screenshot.png | Bin 0 -> 175535 bytes wp-content/themes/twentynineteen/search.php | 56 + wp-content/themes/twentynineteen/single.php | 60 + .../style-editor-customizer.css | 5 + .../style-editor-customizer.scss | 5 + .../themes/twentynineteen/style-editor.css | 1451 ++++ .../themes/twentynineteen/style-editor.scss | 943 +++ .../themes/twentynineteen/style-rtl.css | 6513 +++++++++++++++ wp-content/themes/twentynineteen/style.css | 6525 +++++++++++++++ wp-content/themes/twentynineteen/style.scss | 110 + .../content/content-excerpt.php | 33 + .../template-parts/content/content-none.php | 53 + .../template-parts/content/content-page.php | 56 + .../template-parts/content/content-single.php | 55 + .../template-parts/content/content.php | 59 + .../template-parts/footer/footer-widgets.php | 24 + .../template-parts/header/entry-header.php | 46 + .../template-parts/header/site-branding.php | 60 + .../template-parts/post/author-bio.php | 30 + .../template-parts/post/discussion-meta.php | 32 + wp-content/themes/twentyseventeen/404.php | 35 + wp-content/themes/twentyseventeen/archive.php | 68 + .../twentyseventeen/assets/css/blocks.css | 451 + .../assets/css/colors-dark.css | 566 ++ .../assets/css/editor-blocks.css | 808 ++ .../assets/css/editor-style.css | 582 ++ .../themes/twentyseventeen/assets/css/ie8.css | 225 + .../themes/twentyseventeen/assets/css/ie9.css | 43 + .../twentyseventeen/assets/images/coffee.jpg | Bin 0 -> 117713 bytes .../assets/images/espresso.jpg | Bin 0 -> 93540 bytes .../twentyseventeen/assets/images/header.jpg | Bin 0 -> 114854 bytes .../assets/images/sandwich.jpg | Bin 0 -> 171858 bytes .../assets/images/svg-icons.svg | 155 + .../assets/js/customize-controls.js | 36 + .../assets/js/customize-preview.js | 150 + .../twentyseventeen/assets/js/global.js | 250 + .../themes/twentyseventeen/assets/js/html5.js | 326 + .../assets/js/jquery.scrollTo.js | 209 + .../twentyseventeen/assets/js/navigation.js | 109 + .../assets/js/skip-link-focus-fix.js | 31 + .../themes/twentyseventeen/comments.php | 89 + wp-content/themes/twentyseventeen/footer.php | 51 + .../themes/twentyseventeen/front-page.php | 59 + .../themes/twentyseventeen/functions.php | 666 ++ wp-content/themes/twentyseventeen/header.php | 58 + .../twentyseventeen/inc/back-compat.php | 76 + .../twentyseventeen/inc/color-patterns.php | 580 ++ .../twentyseventeen/inc/custom-header.php | 131 + .../themes/twentyseventeen/inc/customizer.php | 249 + .../twentyseventeen/inc/icon-functions.php | 220 + .../inc/template-functions.php | 102 + .../twentyseventeen/inc/template-tags.php | 226 + wp-content/themes/twentyseventeen/index.php | 72 + wp-content/themes/twentyseventeen/page.php | 43 + wp-content/themes/twentyseventeen/readme.txt | 130 + wp-content/themes/twentyseventeen/rtl.css | 556 ++ .../themes/twentyseventeen/screenshot.png | Bin 0 -> 363833 bytes wp-content/themes/twentyseventeen/search.php | 72 + .../themes/twentyseventeen/searchform.php | 21 + wp-content/themes/twentyseventeen/sidebar.php | 20 + wp-content/themes/twentyseventeen/single.php | 47 + wp-content/themes/twentyseventeen/style.css | 4360 ++++++++++ .../template-parts/footer/footer-widgets.php | 35 + .../template-parts/footer/site-info.php | 24 + .../template-parts/header/header-image.php | 20 + .../template-parts/header/site-branding.php | 38 + .../navigation/navigation-top.php | 33 + .../page/content-front-page-panels.php | 87 + .../page/content-front-page.php | 52 + .../template-parts/page/content-page.php | 32 + .../template-parts/post/content-audio.php | 109 + .../template-parts/post/content-excerpt.php | 48 + .../template-parts/post/content-gallery.php | 96 + .../template-parts/post/content-image.php | 86 + .../template-parts/post/content-none.php | 40 + .../template-parts/post/content-video.php | 107 + .../template-parts/post/content.php | 79 + wp-content/themes/twentysixteen/404.php | 34 + wp-content/themes/twentysixteen/archive.php | 69 + wp-content/themes/twentysixteen/comments.php | 83 + .../themes/twentysixteen/css/blocks.css | 436 + .../twentysixteen/css/editor-blocks.css | 616 ++ .../themes/twentysixteen/css/editor-style.css | 547 ++ wp-content/themes/twentysixteen/css/ie.css | 48 + wp-content/themes/twentysixteen/css/ie7.css | 176 + wp-content/themes/twentysixteen/css/ie8.css | 222 + wp-content/themes/twentysixteen/footer.php | 73 + wp-content/themes/twentysixteen/functions.php | 587 ++ .../twentysixteen/genericons/COPYING.txt | 9 + .../twentysixteen/genericons/Genericons.eot | Bin 0 -> 22374 bytes .../twentysixteen/genericons/Genericons.svg | 537 ++ .../twentysixteen/genericons/Genericons.ttf | Bin 0 -> 22188 bytes .../twentysixteen/genericons/Genericons.woff | Bin 0 -> 13988 bytes .../twentysixteen/genericons/LICENSE.txt | 339 + .../themes/twentysixteen/genericons/README.md | 218 + .../twentysixteen/genericons/genericons.css | 263 + wp-content/themes/twentysixteen/header.php | 106 + wp-content/themes/twentysixteen/image.php | 118 + .../themes/twentysixteen/inc/back-compat.php | 78 + .../themes/twentysixteen/inc/customizer.php | 1259 +++ .../twentysixteen/inc/template-tags.php | 286 + wp-content/themes/twentysixteen/index.php | 66 + .../twentysixteen/js/color-scheme-control.js | 96 + .../twentysixteen/js/customize-preview.js | 41 + .../themes/twentysixteen/js/functions.js | 213 + wp-content/themes/twentysixteen/js/html5.js | 326 + .../js/keyboard-image-navigation.js | 26 + .../twentysixteen/js/skip-link-focus-fix.js | 36 + wp-content/themes/twentysixteen/page.php | 42 + wp-content/themes/twentysixteen/readme.txt | 120 + wp-content/themes/twentysixteen/rtl.css | 756 ++ .../themes/twentysixteen/screenshot.png | Bin 0 -> 463555 bytes wp-content/themes/twentysixteen/search.php | 61 + .../themes/twentysixteen/searchform.php | 17 + .../twentysixteen/sidebar-content-bottom.php | 28 + wp-content/themes/twentysixteen/sidebar.php | 15 + wp-content/themes/twentysixteen/single.php | 59 + wp-content/themes/twentysixteen/style.css | 4026 +++++++++ .../template-parts/biography.php | 40 + .../template-parts/content-none.php | 38 + .../template-parts/content-page.php | 47 + .../template-parts/content-search.php | 53 + .../template-parts/content-single.php | 55 + .../twentysixteen/template-parts/content.php | 61 + 1673 files changed, 471161 insertions(+) create mode 100644 .gitignore create mode 100644 wp-content/index.php create mode 100644 wp-content/mu-plugins/LICENSE.md create mode 100644 wp-content/mu-plugins/README.md create mode 100644 wp-content/mu-plugins/VERSION create mode 100644 wp-content/mu-plugins/Vagrantfile create mode 100644 wp-content/mu-plugins/build.xml create mode 100644 wp-content/mu-plugins/composer.json create mode 100644 wp-content/mu-plugins/docker-compose.yml create mode 100644 wp-content/mu-plugins/dockersetup/Dockerfile_wordpress create mode 100644 wp-content/mu-plugins/dockersetup/ldap/environment create mode 100644 wp-content/mu-plugins/langs/wp_mail_smtp-he_IL.mo create mode 100644 wp-content/mu-plugins/langs/wp_mail_smtp-ja.mo create mode 100644 wp-content/mu-plugins/phpunit.travis.xml create mode 100644 wp-content/mu-plugins/phpunit.xml.dist create mode 100644 wp-content/mu-plugins/readme.txt create mode 100644 wp-content/mu-plugins/screenshot-1.png create mode 100644 wp-content/mu-plugins/screenshot-2.png create mode 100644 wp-content/mu-plugins/screenshot-3.png create mode 100644 wp-content/mu-plugins/screenshot-4.png create mode 100644 wp-content/mu-plugins/src/LdapList.php create mode 100644 wp-content/mu-plugins/tests/LDAPBaseTest.php create mode 100644 wp-content/mu-plugins/tests/LDAPListBaseTest.php create mode 100644 wp-content/mu-plugins/tests/LdapTest.php create mode 100644 wp-content/mu-plugins/view/admin.phtml create mode 100644 wp-content/plugins/activitypub/LICENSE create mode 100644 wp-content/plugins/activitypub/activitypub.php create mode 100644 wp-content/plugins/activitypub/includes/class-activity-dispatcher.php create mode 100644 wp-content/plugins/activitypub/includes/class-activitypub.php create mode 100644 wp-content/plugins/activitypub/includes/class-admin.php create mode 100644 wp-content/plugins/activitypub/includes/class-debug.php create mode 100644 wp-content/plugins/activitypub/includes/class-hashtag.php create mode 100644 wp-content/plugins/activitypub/includes/class-health-check.php create mode 100644 wp-content/plugins/activitypub/includes/class-signature.php create mode 100644 wp-content/plugins/activitypub/includes/functions.php create mode 100644 wp-content/plugins/activitypub/includes/model/class-activity.php create mode 100644 wp-content/plugins/activitypub/includes/model/class-post.php create mode 100644 wp-content/plugins/activitypub/includes/peer/class-followers.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-followers.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-following.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-inbox.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-nodeinfo.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-ostatus.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-outbox.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-server.php create mode 100644 wp-content/plugins/activitypub/includes/rest/class-webfinger.php create mode 100644 wp-content/plugins/activitypub/includes/table/followers-list.php create mode 100644 wp-content/plugins/activitypub/languages/activitypub.pot create mode 100644 wp-content/plugins/activitypub/readme.txt create mode 100644 wp-content/plugins/activitypub/templates/followers-list.php create mode 100644 wp-content/plugins/activitypub/templates/json-author.php create mode 100644 wp-content/plugins/activitypub/templates/json-post.php create mode 100644 wp-content/plugins/activitypub/templates/settings.php create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/50-init.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/OpenLDAP/slapd.conf create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/OpenLDAP_run.sh create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/examplespace.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/manager.example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/test.example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/user1.example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/user2.example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/user3.example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/user4.example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/ldif/user5.example.com.ldif create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/load_fixtures.sh create mode 100644 wp-content/plugins/authLdap-2.3.1/.ci/php.ini create mode 100644 wp-content/plugins/authLdap-2.3.1/.gitignore create mode 100644 wp-content/plugins/authLdap-2.3.1/.rsyncIgnore create mode 100644 wp-content/plugins/authLdap-2.3.1/.svnAccess.dist create mode 100644 wp-content/plugins/authLdap-2.3.1/.travis.after.sh create mode 100644 wp-content/plugins/authLdap-2.3.1/.travis.install.sh create mode 100644 wp-content/plugins/authLdap-2.3.1/.travis.yml create mode 100644 wp-content/plugins/authLdap-2.3.1/LICENSE.md create mode 100644 wp-content/plugins/authLdap-2.3.1/README.md create mode 100644 wp-content/plugins/authLdap-2.3.1/VERSION create mode 100644 wp-content/plugins/authLdap-2.3.1/Vagrantfile create mode 100644 wp-content/plugins/authLdap-2.3.1/authLdap.css create mode 100644 wp-content/plugins/authLdap-2.3.1/authLdap.php create mode 100644 wp-content/plugins/authLdap-2.3.1/build.xml create mode 100644 wp-content/plugins/authLdap-2.3.1/composer.json create mode 100644 wp-content/plugins/authLdap-2.3.1/docker-compose.yml create mode 100644 wp-content/plugins/authLdap-2.3.1/dockersetup/Dockerfile_wordpress create mode 100644 wp-content/plugins/authLdap-2.3.1/dockersetup/ldap/environment create mode 100644 wp-content/plugins/authLdap-2.3.1/ldap.php create mode 100644 wp-content/plugins/authLdap-2.3.1/phpunit.travis.xml create mode 100644 wp-content/plugins/authLdap-2.3.1/phpunit.xml.dist create mode 100644 wp-content/plugins/authLdap-2.3.1/readme.txt create mode 100644 wp-content/plugins/authLdap-2.3.1/src/LdapList.php create mode 100644 wp-content/plugins/authLdap-2.3.1/tests/LDAPBaseTest.php create mode 100644 wp-content/plugins/authLdap-2.3.1/tests/LDAPListBaseTest.php create mode 100644 wp-content/plugins/authLdap-2.3.1/tests/LdapTest.php create mode 100644 wp-content/plugins/authLdap-2.3.1/view/admin.phtml create mode 100644 wp-content/plugins/disable-wordpress-core-update/disable-core-update.php create mode 100644 wp-content/plugins/disable-wordpress-core-update/readme.txt create mode 100644 wp-content/plugins/gitium/functions.php create mode 100644 wp-content/plugins/gitium/gitium-webhook.php create mode 100644 wp-content/plugins/gitium/gitium.php create mode 100644 wp-content/plugins/gitium/img/gitium.png create mode 100644 wp-content/plugins/gitium/img/gitium.svg create mode 100644 wp-content/plugins/gitium/inc/class-git-wrapper.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-admin.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-help.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-menu-bubble.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-menu.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-requirements.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-submenu-commits.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-submenu-configure.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-submenu-settings.php create mode 100644 wp-content/plugins/gitium/inc/class-gitium-submenu-status.php create mode 100755 wp-content/plugins/gitium/inc/ssh-git create mode 100644 wp-content/plugins/gitium/languages/gitium-es_ES.mo create mode 100644 wp-content/plugins/gitium/languages/gitium-es_ES.po create mode 100644 wp-content/plugins/gitium/languages/gitium-sr_RS.mo create mode 100644 wp-content/plugins/gitium/languages/gitium-sr_RS.po create mode 100644 wp-content/plugins/gitium/languages/gitium.pot create mode 100644 wp-content/plugins/gitium/readme.txt create mode 100644 wp-content/plugins/gp-premium/backgrounds/functions/css.php create mode 100644 wp-content/plugins/gp-premium/backgrounds/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/backgrounds/functions/secondary-nav-backgrounds.php create mode 100644 wp-content/plugins/gp-premium/backgrounds/generate-backgrounds.php create mode 100644 wp-content/plugins/gp-premium/blog/functions/columns.php create mode 100644 wp-content/plugins/gp-premium/blog/functions/css/style-min.css create mode 100644 wp-content/plugins/gp-premium/blog/functions/css/style.css create mode 100644 wp-content/plugins/gp-premium/blog/functions/customizer.php create mode 100644 wp-content/plugins/gp-premium/blog/functions/defaults.php create mode 100644 wp-content/plugins/gp-premium/blog/functions/generate-blog.php create mode 100644 wp-content/plugins/gp-premium/blog/functions/images.php create mode 100644 wp-content/plugins/gp-premium/blog/functions/js/controls.js create mode 100644 wp-content/plugins/gp-premium/blog/functions/js/customizer.js create mode 100644 wp-content/plugins/gp-premium/blog/functions/js/infinite-scroll.pkgd.min.js create mode 100644 wp-content/plugins/gp-premium/blog/functions/js/scripts.js create mode 100644 wp-content/plugins/gp-premium/blog/functions/js/scripts.min.js create mode 100644 wp-content/plugins/gp-premium/blog/functions/migrate.php create mode 100644 wp-content/plugins/gp-premium/blog/generate-blog.php create mode 100644 wp-content/plugins/gp-premium/changelog.txt create mode 100644 wp-content/plugins/gp-premium/colors/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/colors/functions/js/customizer.js create mode 100644 wp-content/plugins/gp-premium/colors/functions/js/menu-plus-customizer.js create mode 100644 wp-content/plugins/gp-premium/colors/functions/js/wc-customizer.js create mode 100644 wp-content/plugins/gp-premium/colors/functions/secondary-nav-colors.php create mode 100644 wp-content/plugins/gp-premium/colors/functions/slideout-nav-colors.php create mode 100644 wp-content/plugins/gp-premium/colors/functions/woocommerce-colors.php create mode 100644 wp-content/plugins/gp-premium/colors/generate-colors.php create mode 100644 wp-content/plugins/gp-premium/copyright/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/copyright/functions/js/customizer.js create mode 100644 wp-content/plugins/gp-premium/copyright/generate-copyright.php create mode 100644 wp-content/plugins/gp-premium/disable-elements/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/disable-elements/generate-disable-elements.php create mode 100644 wp-content/plugins/gp-premium/elements/assets/admin/balloon.css create mode 100644 wp-content/plugins/gp-premium/elements/assets/admin/metabox.css create mode 100644 wp-content/plugins/gp-premium/elements/assets/admin/metabox.js create mode 100644 wp-content/plugins/gp-premium/elements/assets/admin/spinner.gif create mode 100644 wp-content/plugins/gp-premium/elements/assets/admin/wp-color-picker-alpha.min.js create mode 100644 wp-content/plugins/gp-premium/elements/assets/js/parallax.js create mode 100644 wp-content/plugins/gp-premium/elements/assets/js/parallax.min.js create mode 100644 wp-content/plugins/gp-premium/elements/class-conditions.php create mode 100644 wp-content/plugins/gp-premium/elements/class-elements-helper.php create mode 100644 wp-content/plugins/gp-premium/elements/class-hero.php create mode 100644 wp-content/plugins/gp-premium/elements/class-hooks.php create mode 100644 wp-content/plugins/gp-premium/elements/class-layout.php create mode 100644 wp-content/plugins/gp-premium/elements/class-metabox.php create mode 100644 wp-content/plugins/gp-premium/elements/class-post-type.php create mode 100644 wp-content/plugins/gp-premium/elements/elements.php create mode 100644 wp-content/plugins/gp-premium/general/icons.php create mode 100644 wp-content/plugins/gp-premium/general/icons/gp-premium.eot create mode 100644 wp-content/plugins/gp-premium/general/icons/gp-premium.svg create mode 100644 wp-content/plugins/gp-premium/general/icons/gp-premium.ttf create mode 100644 wp-content/plugins/gp-premium/general/icons/gp-premium.woff create mode 100644 wp-content/plugins/gp-premium/general/icons/icons.css create mode 100644 wp-content/plugins/gp-premium/general/icons/icons.min.css create mode 100644 wp-content/plugins/gp-premium/general/js/smooth-scroll.js create mode 100644 wp-content/plugins/gp-premium/general/js/smooth-scroll.min.js create mode 100644 wp-content/plugins/gp-premium/general/smooth-scroll.php create mode 100644 wp-content/plugins/gp-premium/gp-premium.php create mode 100644 wp-content/plugins/gp-premium/hooks/functions/assets/css/hooks.css create mode 100644 wp-content/plugins/gp-premium/hooks/functions/assets/js/admin.js create mode 100644 wp-content/plugins/gp-premium/hooks/functions/assets/js/jquery.cookie.js create mode 100644 wp-content/plugins/gp-premium/hooks/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/hooks/functions/hooks.php create mode 100644 wp-content/plugins/gp-premium/hooks/generate-hooks.php create mode 100644 wp-content/plugins/gp-premium/import-export/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/import-export/generate-ie.php create mode 100644 wp-content/plugins/gp-premium/inc/activation.php create mode 100644 wp-content/plugins/gp-premium/inc/assets/dashboard.css create mode 100644 wp-content/plugins/gp-premium/inc/assets/dashboard.js create mode 100644 wp-content/plugins/gp-premium/inc/dashboard.php create mode 100644 wp-content/plugins/gp-premium/inc/deprecated.php create mode 100644 wp-content/plugins/gp-premium/inc/functions.php create mode 100644 wp-content/plugins/gp-premium/inc/reset.php create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-cs_CZ.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-cs_CZ.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-da_DK.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-da_DK.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-de_DE.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-de_De.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-fr_FR.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-fr_FR.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-it_IT.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-it_IT.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-pl_PL.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-pl_PL.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-pt_BR.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-pt_BR.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-pt_PT.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-pt_PT.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-ru_RU.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-ru_RU.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-sk_SK.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-sk_SK.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-sv_SE.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-sv_SE.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-zh_CN.mo create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium-zh_CN.po create mode 100644 wp-content/plugins/gp-premium/langs/gp-premium.pot create mode 100644 wp-content/plugins/gp-premium/library/EDD_SL_Plugin_Updater.php create mode 100644 wp-content/plugins/gp-premium/library/batch-processing/wp-async-request.php create mode 100644 wp-content/plugins/gp-premium/library/batch-processing/wp-background-process.php create mode 100644 wp-content/plugins/gp-premium/library/class-make-css.php create mode 100644 wp-content/plugins/gp-premium/library/customizer-helpers.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/active-callbacks.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-action-button-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-alpha-color-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-backgrounds-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-control-toggle.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-copyright-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-deprecated.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-information-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-range-slider-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-refresh-button-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-section-shortcuts-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-spacing-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-title-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/class-typography-control.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/alpha-color-picker.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/control-toggle-customizer.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/section-shortcuts.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/selectWoo.min.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/slider-customizer.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/spacing-customizer.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/title-customizer.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/transparency-grid.png create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/css/typography-customizer.css create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/alpha-color-picker.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/backgrounds-customizer.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/button-actions.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/control-toggle-customizer.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/copyright-customizer.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/generatepress-controls.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/section-shortcuts.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/selectWoo.min.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/slider-customizer.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/spacing-customizer.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/controls/js/typography-customizer.js create mode 100644 wp-content/plugins/gp-premium/library/customizer/deprecated.php create mode 100644 wp-content/plugins/gp-premium/library/customizer/sanitize.php create mode 100644 wp-content/plugins/gp-premium/library/image-processing-queue/image-processing-queue.php create mode 100644 wp-content/plugins/gp-premium/library/image-processing-queue/includes/class-image-processing-queue.php create mode 100644 wp-content/plugins/gp-premium/library/image-processing-queue/includes/class-ipq-process.php create mode 100644 wp-content/plugins/gp-premium/library/image-processing-queue/includes/ipq-template-functions.php create mode 100644 wp-content/plugins/gp-premium/library/select2/select2.full.min.js create mode 100644 wp-content/plugins/gp-premium/library/select2/select2.min.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/menu-logo.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/menu-logo.min.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/navigation-branding.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/navigation-branding.min.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/offside.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/offside.min.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/sticky.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/css/sticky.min.css create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/generate-menu-plus.php create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/js/offside.js create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/js/offside.min.js create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/js/sticky.js create mode 100644 wp-content/plugins/gp-premium/menu-plus/functions/js/sticky.min.js create mode 100644 wp-content/plugins/gp-premium/menu-plus/generate-menu-plus.php create mode 100644 wp-content/plugins/gp-premium/page-header/functions/css/metabox.css create mode 100644 wp-content/plugins/gp-premium/page-header/functions/css/page-header.css create mode 100644 wp-content/plugins/gp-premium/page-header/functions/css/page-header.min.css create mode 100644 wp-content/plugins/gp-premium/page-header/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/page-header/functions/global-locations.php create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/full-height.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/full-height.min.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/jquery.vide.min.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/lc_switch.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/metabox.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/parallax.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/parallax.min.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/js/wp-color-picker-alpha.min.js create mode 100644 wp-content/plugins/gp-premium/page-header/functions/metabox.php create mode 100644 wp-content/plugins/gp-premium/page-header/functions/page-header.php create mode 100644 wp-content/plugins/gp-premium/page-header/functions/post-image.php create mode 100644 wp-content/plugins/gp-premium/page-header/functions/post-type.php create mode 100644 wp-content/plugins/gp-premium/page-header/generate-page-header.php create mode 100644 wp-content/plugins/gp-premium/secondary-nav/functions/css.php create mode 100644 wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.css create mode 100644 wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.min.css create mode 100644 wp-content/plugins/gp-premium/secondary-nav/functions/css/style.css create mode 100644 wp-content/plugins/gp-premium/secondary-nav/functions/css/style.min.css create mode 100644 wp-content/plugins/gp-premium/secondary-nav/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/secondary-nav/functions/js/customizer.js create mode 100644 wp-content/plugins/gp-premium/secondary-nav/generate-secondary-nav.php create mode 100644 wp-content/plugins/gp-premium/sections/functions/css/style.css create mode 100644 wp-content/plugins/gp-premium/sections/functions/css/style.min.css create mode 100644 wp-content/plugins/gp-premium/sections/functions/generate-sections.php create mode 100644 wp-content/plugins/gp-premium/sections/functions/js/parallax.js create mode 100644 wp-content/plugins/gp-premium/sections/functions/js/parallax.min.js create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/css/generate-sections-metabox.css create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/css/lc_switch.css create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox-4.9.js create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox.js create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/js/wp-color-picker-alpha.min.js create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/metabox-functions.php create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/views/sections-template.php create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/views/sections.php create mode 100644 wp-content/plugins/gp-premium/sections/functions/metaboxes/views/use-sections.php create mode 100644 wp-content/plugins/gp-premium/sections/functions/templates/template.php create mode 100644 wp-content/plugins/gp-premium/sections/generate-sections.php create mode 100644 wp-content/plugins/gp-premium/sites/assets/css/admin.css create mode 100644 wp-content/plugins/gp-premium/sites/assets/css/loading.svg create mode 100644 wp-content/plugins/gp-premium/sites/assets/images/screenshot.png create mode 100644 wp-content/plugins/gp-premium/sites/assets/js/admin.js create mode 100644 wp-content/plugins/gp-premium/sites/assets/js/blazy.min.js create mode 100644 wp-content/plugins/gp-premium/sites/assets/js/download.js create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-beaver-builder-batch-processing.php create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-content-importer.php create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-site-helper.php create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-site-import-image.php create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-site-restore.php create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-site-widget-importer.php create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-site.php create mode 100644 wp-content/plugins/gp-premium/sites/classes/class-sites-background-process.php create mode 100644 wp-content/plugins/gp-premium/sites/libs/wxr-importer/WPImporterLogger.php create mode 100644 wp-content/plugins/gp-premium/sites/libs/wxr-importer/WXRImportInfo.php create mode 100644 wp-content/plugins/gp-premium/sites/libs/wxr-importer/WXRImporter.php create mode 100644 wp-content/plugins/gp-premium/sites/sites.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/content-spacing.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/footer-spacing.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/header-spacing.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/js/customizer.js create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/navigation-spacing.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/secondary-nav-spacing.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/sidebar-spacing.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/customizer/top-bar-spacing.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/spacing/functions/migration.php create mode 100644 wp-content/plugins/gp-premium/spacing/generate-spacing.php create mode 100644 wp-content/plugins/gp-premium/typography/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/typography/functions/google-fonts.json create mode 100644 wp-content/plugins/gp-premium/typography/functions/js/customizer.js create mode 100644 wp-content/plugins/gp-premium/typography/functions/migration.php create mode 100644 wp-content/plugins/gp-premium/typography/functions/secondary-nav-fonts.php create mode 100644 wp-content/plugins/gp-premium/typography/functions/slideout-nav-fonts.php create mode 100644 wp-content/plugins/gp-premium/typography/functions/woocommerce-fonts.php create mode 100644 wp-content/plugins/gp-premium/typography/generate-fonts.php create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce-mobile.css create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce-mobile.min.css create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce-tablet.css create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce-tablet.min.css create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce.css create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce.min.css create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/customizer/customizer.php create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/customizer/js/customizer.js create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/functions.php create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.js create mode 100644 wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.min.js create mode 100644 wp-content/plugins/gp-premium/woocommerce/woocommerce.php create mode 100644 wp-content/plugins/gp-premium/wpml-config.xml create mode 100644 wp-content/plugins/index.php create mode 100644 wp-content/plugins/menu-icons/CHANGELOG.md create mode 100644 wp-content/plugins/menu-icons/LICENSE create mode 100644 wp-content/plugins/menu-icons/assets/banner-1544x500.jpg create mode 100644 wp-content/plugins/menu-icons/assets/banner-772x250.jpg create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-1.png create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-2.png create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-3.png create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-4.png create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-5.png create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-6.png create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-7.png create mode 100644 wp-content/plugins/menu-icons/assets/screenshot-8.png create mode 100644 wp-content/plugins/menu-icons/css/admin.css create mode 100644 wp-content/plugins/menu-icons/css/admin.min.css create mode 100644 wp-content/plugins/menu-icons/css/extra.css create mode 100644 wp-content/plugins/menu-icons/css/extra.min.css create mode 100644 wp-content/plugins/menu-icons/includes/front.php create mode 100644 wp-content/plugins/menu-icons/includes/library/compat.php create mode 100644 wp-content/plugins/menu-icons/includes/library/form-fields.php create mode 100644 wp-content/plugins/menu-icons/includes/library/functions.php create mode 100644 wp-content/plugins/menu-icons/includes/media-template.php create mode 100644 wp-content/plugins/menu-icons/includes/meta.php create mode 100644 wp-content/plugins/menu-icons/includes/picker.php create mode 100644 wp-content/plugins/menu-icons/includes/settings.php create mode 100644 wp-content/plugins/menu-icons/includes/type-fonts.php create mode 100644 wp-content/plugins/menu-icons/includes/type.php create mode 100644 wp-content/plugins/menu-icons/js/admin.js create mode 100644 wp-content/plugins/menu-icons/js/admin.min.js create mode 100644 wp-content/plugins/menu-icons/js/src/index.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/index.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/models/item-setting-field.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/models/item-settings.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/models/item.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/views/frame.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/views/item-preview.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/views/item-setting-field.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/views/item-settings.js create mode 100644 wp-content/plugins/menu-icons/js/src/media/views/sidebar.js create mode 100644 wp-content/plugins/menu-icons/js/src/picker.js create mode 100644 wp-content/plugins/menu-icons/js/src/settings.js create mode 100644 wp-content/plugins/menu-icons/languages/menu-icons.pot create mode 100644 wp-content/plugins/menu-icons/mailin.php create mode 100644 wp-content/plugins/menu-icons/menu-icons.php create mode 100644 wp-content/plugins/menu-icons/readme.md create mode 100644 wp-content/plugins/menu-icons/readme.txt create mode 100644 wp-content/plugins/menu-icons/vendor/autoload.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/LICENSE create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/assets/screenshot-1.png create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/assets/screenshot-2.png create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/icon-picker.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/icon-picker.min.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Elusive-Icons.eot create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Elusive-Icons.svg create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Elusive-Icons.ttf create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Elusive-Icons.woff create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Genericons.eot create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Genericons.svg create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Genericons.ttf create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/Genericons.woff create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/elusive.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/elusive.min.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/font-awesome.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/font-awesome.min.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/fontawesome-webfont.eot create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/fontawesome-webfont.svg create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/fontawesome-webfont.ttf create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/fontawesome-webfont.woff create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/fontawesome-webfont.woff2 create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/foundation-icons.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/foundation-icons.eot create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/foundation-icons.min.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/foundation-icons.svg create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/foundation-icons.ttf create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/foundation-icons.woff create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/genericons.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/css/types/genericons.min.css create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/icon-picker.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/fields/base.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/fields/cmb.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/fontpack.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/loader.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/registry.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/base.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/dashicons.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/elusive.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/fa.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/font.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/fontello.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/foundation-icons.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/genericon.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/image.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/includes/types/svg.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/icon-picker.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/icon-picker.min.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/icon-picker.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/controllers/font.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/controllers/img.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/controllers/mixin.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/manifest.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/models/fonts.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/models/target.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/browser.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/font-browser.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/font-filter.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/font-item.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/font-library.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/frame.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/img-browser.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/sidebar.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/js/src/media/views/svg-item.js create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/languages/icon-picker.pot create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/phpcs.ruleset.xml create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/readme.md create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/icon-picker/readme.txt create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/menu-item-custom-fields/LICENSE create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/menu-item-custom-fields/doc/menu-item-custom-fields-example.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/menu-item-custom-fields/menu-item-custom-fields.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/menu-item-custom-fields/phpcs.ruleset.xml create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/menu-item-custom-fields/readme.md create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/menu-item-custom-fields/readme.txt create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/menu-item-custom-fields/walker-nav-menu-edit.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/CHANGELOG.md create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/LICENSE create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/index.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/load.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Common/Abstract_module.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Common/Module_factory.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Loader.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Dashboard_widget.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Endpoint.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Licenser.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Logger.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Notification.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Recommendation.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Review.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Rollback.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Translate.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Modules/Uninstall_feedback.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/src/Product.php create mode 100644 wp-content/plugins/menu-icons/vendor/codeinwp/themeisle-sdk/start.php create mode 100644 wp-content/plugins/menu-icons/vendor/composer/ClassLoader.php create mode 100644 wp-content/plugins/menu-icons/vendor/composer/LICENSE create mode 100644 wp-content/plugins/menu-icons/vendor/composer/autoload_classmap.php create mode 100644 wp-content/plugins/menu-icons/vendor/composer/autoload_files.php create mode 100644 wp-content/plugins/menu-icons/vendor/composer/autoload_namespaces.php create mode 100644 wp-content/plugins/menu-icons/vendor/composer/autoload_psr4.php create mode 100644 wp-content/plugins/menu-icons/vendor/composer/autoload_real.php create mode 100644 wp-content/plugins/menu-icons/vendor/composer/installed.json create mode 100644 wp-content/plugins/simple-local-avatars/readme.txt create mode 100644 wp-content/plugins/simple-local-avatars/screenshot-1.png create mode 100644 wp-content/plugins/simple-local-avatars/simple-local-avatars.dev.js create mode 100644 wp-content/plugins/simple-local-avatars/simple-local-avatars.js create mode 100644 wp-content/plugins/simple-local-avatars/simple-local-avatars.php create mode 100644 wp-content/plugins/static-html-output-plugin/languages/static-html-output-plugin-ja_UTF.mo create mode 100644 wp-content/plugins/static-html-output-plugin/languages/static-html-output-plugin-ja_UTF.po create mode 100644 wp-content/plugins/static-html-output-plugin/languages/static-html-output-plugin-sp_UTF.mo create mode 100644 wp-content/plugins/static-html-output-plugin/languages/static-html-output-plugin-sp_UTF.po create mode 100644 wp-content/plugins/static-html-output-plugin/languages/static-html-output-plugin.pot create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/CSSList/AtRuleBlockList.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/CSSList/CSSBlockList.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/CSSList/CSSList.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/CSSList/Document.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/CSSList/KeyFrame.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Comment/Comment.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Comment/Commentable.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/OutputFormat.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Parser.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Parsing/OutputException.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Parsing/SourceException.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Parsing/UnexpectedTokenException.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Property/AtRule.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Property/CSSNamespace.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Property/Charset.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Property/Import.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Property/Selector.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Renderable.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Rule/Rule.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/RuleSet/AtRuleSet.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/RuleSet/DeclarationBlock.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/RuleSet/RuleSet.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Settings.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/CSSFunction.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/CSSString.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/CalcFunction.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/CalcRuleValueList.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/Color.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/LineName.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/PrimitiveValue.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/RuleValueList.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/Size.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/URL.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/Value.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/CSSParser/Value/ValueList.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/FTP/FtpClient.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/FTP/FtpException.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/FTP/FtpWrapper.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/URL2/URL2.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/Archive.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/ArchiveProcessor.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/CSSProcessor.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/DBSettings.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/Deployer.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/Dispatcher.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/Exporter.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/FileCopier.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/FileWriter.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/FilesHelper.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/HTMLProcessor.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/MimeTypes.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/Options.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/PostSettings.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/ProgressLog.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/Request.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/SiteCrawler.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/SitePublisher.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/TXTProcessor.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/TemplateHelper.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/View.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/WP2Static.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/WPSite.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/WP2Static/WsLog.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/deployers/Bitbucket.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/deployers/BunnyCDN.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/deployers/FTP.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/deployers/GitHub.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/deployers/GitLab.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/deployers/Netlify.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/deployers/S3.php create mode 100644 wp-content/plugins/static-html-output-plugin/plugin/wp2static-wp-cli-commands.php create mode 100644 wp-content/plugins/static-html-output-plugin/readme.txt create mode 100644 wp-content/plugins/static-html-output-plugin/views/bitbucket_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/bunnycdn_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/folder_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/ftp_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/github_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/gitlab_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/message.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/netlify_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/options-page-js.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/options-page.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/s3_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/tab_advanced.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/tab_crawling.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/tab_export.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/tab_help.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/tab_logs.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/tab_love.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/tab_processing.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/views/zip_settings_block.phtml create mode 100644 wp-content/plugins/static-html-output-plugin/wp2static.css create mode 100644 wp-content/plugins/static-html-output-plugin/wp2static.php create mode 100644 wp-content/plugins/wp-mail-smtp/assets/css/smtp-about.min.css create mode 100644 wp-content/plugins/wp-mail-smtp/assets/css/smtp-admin.min.css create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/icon-full.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/icon-none.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/icon-partial.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-mi.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-om.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-rp.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-wpf.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/about/team.jpg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/control/admin.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/control/comments.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/control/personal.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/control/update.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/control/user_new.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/control/users.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/email/icon-check.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/email/signature.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/email/wp-mail-smtp.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/email/wpforms-pro.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/logo.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/logs/archive.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/logs/single.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/menu-icon.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost-smtp.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost.png create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/sendinblue.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg create mode 100644 wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.js create mode 100644 wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.min.js create mode 100644 wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.js create mode 100644 wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js create mode 100644 wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js create mode 100644 wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js create mode 100644 wp-content/plugins/wp-mail-smtp/assets/languages/wp-mail-smtp.pot create mode 100644 wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.css create mode 100644 wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.js create mode 100644 wp-content/plugins/wp-mail-smtp/loco.xml create mode 100644 wp-content/plugins/wp-mail-smtp/readme.txt create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Area.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/PageAbstract.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/PageInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/About.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AuthTab.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/ControlTab.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/Logs.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/LogsTab.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/MiscTab.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/SettingsTab.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/TestTab.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/PluginsInstallSkin.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Admin/PluginsInstallUpgrader.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Conflicts.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Core.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Debug.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Geo.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/MailCatcher.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Migration.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Processor.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/AmazonSES/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/AuthAbstract.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/AuthInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Auth.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Loader.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/MailerAbstract.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/MailerInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Mailgun/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Mailgun/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/OptionsAbstract.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/OptionsInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Outlook/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Pepipost/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Pepipost/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/SMTP/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/SMTP/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Api.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Mailer.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Options.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/SiteHealth.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/Upgrade.php create mode 100644 wp-content/plugins/wp-mail-smtp/src/WP.php create mode 100644 wp-content/plugins/wp-mail-smtp/uninstall.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/autoload.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/composer/ClassLoader.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_classmap.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_files.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_namespaces.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_psr4.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_real.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_static.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/AutoForwarding.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchDeleteMessagesRequest.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchModifyMessagesRequest.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Delegate.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Draft.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Filter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterAction.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterCriteria.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ForwardingAddress.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/History.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelAdded.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelRemoved.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageAdded.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageDeleted.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ImapSettings.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Label.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LabelColor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LanguageSettings.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDelegatesResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDraftsResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListFiltersResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListForwardingAddressesResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListHistoryResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListLabelsResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListMessagesResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSendAsResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSmimeInfoResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListThreadsResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Message.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePart.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartBody.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartHeader.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyMessageRequest.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyThreadRequest.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/PopSettings.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Profile.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/Users.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersDrafts.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersHistory.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersLabels.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessages.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessagesAttachments.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettings.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsDelegates.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsFilters.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsForwardingAddresses.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAs.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAsSmimeInfo.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersThreads.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SendAs.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmimeInfo.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmtpMsa.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Thread.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/VacationSettings.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchRequest.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchResponse.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Revoke.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Verify.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/AuthHandlerFactory.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/Guzzle5AuthHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/Guzzle6AuthHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Client.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Collection.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Exception.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/Batch.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/MediaFileUpload.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/REST.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Model.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Exception.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Resource.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Task/Exception.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Task/Retryable.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Task/Runner.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Utils/UriTemplate.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/autoload.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/COPYING create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/autoload.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/AccessToken.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ApplicationDefaultCredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/InvalidArgumentException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/Item.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/MemoryCacheItemPool.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/SysVCacheItemPool.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CacheTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/AppIdentityCredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/GCECredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/IAMCredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/InsecureCredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/UserRefreshCredentials.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CredentialsLoader.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenCache.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/Guzzle5HttpHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/HttpClientCache.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/HttpHandlerFactory.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Iam.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/SimpleMiddleware.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/OAuth2.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ServiceAccountSignerTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/SignBlobInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/AuthTokenSubscriber.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/SimpleSubscriber.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/Dockerfile create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Client.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Pool.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/UriTemplate.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/AggregateException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/CancellationException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/Coroutine.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/EachPromise.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/Promise.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/RejectionException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/functions.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/functions_include.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/FnStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Request.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Response.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Stream.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Uri.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions_include.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/ErrorHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Logger.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Registry.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/ResettableInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/SignalHandler.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Utils.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/AES.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/bootstrap.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/openssl.cnf create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/cache/LICENSE.txt create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/cache/src/CacheException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/cache/src/CacheItemInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/cache/src/CacheItemPoolInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/cache/src/InvalidArgumentException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/MessageInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/RequestInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/ResponseInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/ServerRequestInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/StreamInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/UploadedFileInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/UriInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LogLevel.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/NullLogger.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/LICENSE create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AccountApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AttributesApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ContactsApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/EmailCampaignsApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/FoldersApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ListsApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ProcessApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ResellerApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMSCampaignsApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMTPApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SendersApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/TransactionalSMSApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/WebhooksApi.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ApiException.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Configuration.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/HeaderSelector.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddChildDomain.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddContactToList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddCredits.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttribute.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttributeEnumeration.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateChild.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateContact.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaign.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignRecipients.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateModel.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateReseller.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderIps.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderModel.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaign.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaignRecipients.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpEmail.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplate.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplateSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateContactModel.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateFolder.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateWebhook.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreatedProcessId.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/DeleteHardbounces.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/EmailExportRecipients.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ErrorModel.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccount.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountMarketingAutomation.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountPlan.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelay.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelayData.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAggregatedReport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributes.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesAttributes.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesEnumeration.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignOverview.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignRecipients.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignStats.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomain.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomains.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfo.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeys.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV2.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV3.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoCredits.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoStatistics.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildrenList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetClient.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStats.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsClicked.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsOpened.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsTransacAttributes.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsUnsubscriptions.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactDetails.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContacts.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaign.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaigns.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReportEvents.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverview.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverviewSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignStats.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClient.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClientAddress.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetails.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatistics.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsClicked.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsLinks.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsMessagesSent.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsOpened.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptions.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedListCampaignStats.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolder.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolderLists.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolders.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIp.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpFromSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIps.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpsFromSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetLists.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcess.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcesses.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReports.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReportsReports.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListIps.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListSenders.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaign.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignOverview.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignStats.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaigns.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReportEvents.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverview.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverviewSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplates.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSsoToken.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetStatsByDomain.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacAggregatedSmsReport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReportReports.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhook.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhooks.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ManageIp.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ModelInterface.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostContactInfo.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostContactInfoContacts.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendFailed.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendSmsTestFailed.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModel.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelChild.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelReseller.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveContactFromList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveCredits.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactExport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImportNewList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestSMSRecipientExport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmail.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmailAttachment.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReport.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReportEmail.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSms.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmail.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailAttachment.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailBcc.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailCc.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailReplyTo.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailTo.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTemplateEmail.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestEmail.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestSms.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTransacSms.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttribute.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttributeEnumeration.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateCampaignStatus.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChild.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildAccountStatus.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildDomain.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateContact.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaign.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignRecipients.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateList.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmsCampaign.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplate.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplateSender.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateWebhook.php create mode 100644 wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ObjectSerializer.php create mode 100644 wp-content/plugins/wp-mail-smtp/wp-mail-smtp-0.11.2.php create mode 100644 wp-content/plugins/wp-mail-smtp/wp-mail-smtp.php create mode 100644 wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php create mode 100644 wp-content/plugins/wp-piwik/LICENSE create mode 100644 wp-content/plugins/wp-piwik/README.md create mode 100644 wp-content/plugins/wp-piwik/bitcoin.png create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Sitebrowser.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Statistics.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/File.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Settings.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Template.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/BrowserDetails.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/City.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php create mode 100644 wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php create mode 100644 wp-content/plugins/wp-piwik/config.php create mode 100644 wp-content/plugins/wp-piwik/css/index.php create mode 100644 wp-content/plugins/wp-piwik/css/wp-piwik-spark.css create mode 100644 wp-content/plugins/wp-piwik/css/wp-piwik.css create mode 100644 wp-content/plugins/wp-piwik/gpl-3.0.html create mode 100644 wp-content/plugins/wp-piwik/index.php create mode 100644 wp-content/plugins/wp-piwik/js/index.php create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/IMPORTANT_NOTICE.txt create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/MIT-LICENSE.txt create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/README.txt create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/changes.txt create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/copyright.txt create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/excanvas.min.js create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/gpl-2.0.txt create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/index.php create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/jquery.jqplot.min.css create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/jquery.jqplot.min.js create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/plugins/jqplot.pieRenderer.min.js create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/plugins/jqplot.trendline.min.js create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/usage.txt create mode 100644 wp-content/plugins/wp-piwik/js/jqplot/wp-piwik.jqplot.js create mode 100644 wp-content/plugins/wp-piwik/js/sparkline/index.php create mode 100644 wp-content/plugins/wp-piwik/js/sparkline/jquery.sparkline.js create mode 100644 wp-content/plugins/wp-piwik/js/sparkline/jquery.sparkline.min.js create mode 100644 wp-content/plugins/wp-piwik/js/wp-piwik.js create mode 100644 wp-content/plugins/wp-piwik/languages/.tx/config create mode 100644 wp-content/plugins/wp-piwik/languages/update.sh create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-az_AZ.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-az_AZ.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-be_BY.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-be_BY.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-cs_CZ.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-cs_CZ.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-de_CH.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-de_CH.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-de_DE.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-de_DE.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-el.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-el.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-el_GR.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-el_GR.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-es_ES.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-es_ES.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-fa_IR.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-fa_IR.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-fr_FR.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-fr_FR.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-hi.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-hi.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-hu_HU.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-hu_HU.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-id.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-id.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-it_IT.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-it_IT.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-lb.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-lb.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-lt_LT.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-lt_LT.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-nb_NO.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-nb_NO.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-nl_NL.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-nl_NL.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-pl_PL.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-pl_PL.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-pt_BR.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-pt_BR.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-ro_RO.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-ro_RO.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-ru_RU.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-ru_RU.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-sl_SI.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-sl_SI.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-sq.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-sq.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-sv_SE.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-sv_SE.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-tr_TR.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-tr_TR.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-ua_UA.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-ua_UA.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-uk_UA.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-uk_UA.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-zh_CN.mo create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik-zh_CN.po create mode 100644 wp-content/plugins/wp-piwik/languages/wp-piwik.pot create mode 100644 wp-content/plugins/wp-piwik/proxy/config.php create mode 100644 wp-content/plugins/wp-piwik/proxy/index.php create mode 100644 wp-content/plugins/wp-piwik/proxy/matomo.php create mode 100644 wp-content/plugins/wp-piwik/proxy/piwik.php create mode 100644 wp-content/plugins/wp-piwik/readme.txt create mode 100644 wp-content/plugins/wp-piwik/screenshot-1.gif create mode 100644 wp-content/plugins/wp-piwik/screenshot-2.gif create mode 100644 wp-content/plugins/wp-piwik/screenshot-3.gif create mode 100644 wp-content/plugins/wp-piwik/screenshot-4.gif create mode 100644 wp-content/plugins/wp-piwik/screenshot-5.gif create mode 100644 wp-content/plugins/wp-piwik/uninstall.php create mode 100644 wp-content/plugins/wp-piwik/update/2015051101.php create mode 100644 wp-content/plugins/wp-piwik/update/2017080701.php create mode 100644 wp-content/plugins/wp-piwik/update/90001.php create mode 100644 wp-content/plugins/wp-piwik/update/90801.php create mode 100644 wp-content/plugins/wp-piwik/update/91006.php create mode 100644 wp-content/plugins/wp-piwik/wp-piwik.php create mode 100644 wp-content/plugins/wp-piwik/wpml-config.xml create mode 100644 wp-content/themes/generatepress/404.php create mode 100644 wp-content/themes/generatepress/archive.php create mode 100644 wp-content/themes/generatepress/comments.php create mode 100644 wp-content/themes/generatepress/content-link.php create mode 100644 wp-content/themes/generatepress/content-page.php create mode 100644 wp-content/themes/generatepress/content-single.php create mode 100644 wp-content/themes/generatepress/content.php create mode 100644 wp-content/themes/generatepress/css/admin/block-editor.css create mode 100644 wp-content/themes/generatepress/css/admin/editor-style.css create mode 100644 wp-content/themes/generatepress/css/admin/meta-box.css create mode 100644 wp-content/themes/generatepress/css/admin/style.css create mode 100644 wp-content/themes/generatepress/css/all.min.css create mode 100644 wp-content/themes/generatepress/css/font-awesome.css create mode 100644 wp-content/themes/generatepress/css/font-awesome.min.css create mode 100644 wp-content/themes/generatepress/css/mobile.css create mode 100644 wp-content/themes/generatepress/css/mobile.min.css create mode 100644 wp-content/themes/generatepress/css/unsemantic-grid-lite.css create mode 100644 wp-content/themes/generatepress/css/unsemantic-grid-lite.min.css create mode 100644 wp-content/themes/generatepress/css/unsemantic-grid.css create mode 100644 wp-content/themes/generatepress/css/unsemantic-grid.min.css create mode 100644 wp-content/themes/generatepress/fonts/FontAwesome.otf create mode 100644 wp-content/themes/generatepress/fonts/fontawesome-webfont.eot create mode 100644 wp-content/themes/generatepress/fonts/fontawesome-webfont.svg create mode 100644 wp-content/themes/generatepress/fonts/fontawesome-webfont.ttf create mode 100644 wp-content/themes/generatepress/fonts/fontawesome-webfont.woff create mode 100644 wp-content/themes/generatepress/fonts/fontawesome-webfont.woff2 create mode 100644 wp-content/themes/generatepress/fonts/generatepress.eot create mode 100644 wp-content/themes/generatepress/fonts/generatepress.svg create mode 100644 wp-content/themes/generatepress/fonts/generatepress.ttf create mode 100644 wp-content/themes/generatepress/fonts/generatepress.woff create mode 100644 wp-content/themes/generatepress/fonts/generatepress.woff2 create mode 100644 wp-content/themes/generatepress/footer.php create mode 100644 wp-content/themes/generatepress/functions.php create mode 100644 wp-content/themes/generatepress/header.php create mode 100644 wp-content/themes/generatepress/inc/block-editor.php create mode 100644 wp-content/themes/generatepress/inc/class-css.php create mode 100644 wp-content/themes/generatepress/inc/css-output.php create mode 100644 wp-content/themes/generatepress/inc/customizer.php create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/class-deprecated.php create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/class-range-control.php create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/class-typography-control.php create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/class-upsell-control.php create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/class-upsell-section.php create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/css/selectWoo.min.css create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/css/slider-customizer.css create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/css/typography-customizer.css create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/css/upsell-customizer.css create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/js/customizer-controls.js create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/js/customizer-live-preview.js create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/js/selectWoo.min.js create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/js/slider-control.js create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/js/typography-customizer.js create mode 100644 wp-content/themes/generatepress/inc/customizer/controls/js/upsell-control.js create mode 100644 wp-content/themes/generatepress/inc/customizer/customizer-helpers.php create mode 100644 wp-content/themes/generatepress/inc/customizer/deprecated.php create mode 100644 wp-content/themes/generatepress/inc/customizer/helpers.php create mode 100644 wp-content/themes/generatepress/inc/dashboard.php create mode 100644 wp-content/themes/generatepress/inc/defaults.php create mode 100644 wp-content/themes/generatepress/inc/deprecated.php create mode 100644 wp-content/themes/generatepress/inc/general.php create mode 100644 wp-content/themes/generatepress/inc/markup.php create mode 100644 wp-content/themes/generatepress/inc/meta-box.php create mode 100644 wp-content/themes/generatepress/inc/migrate.php create mode 100644 wp-content/themes/generatepress/inc/plugin-compat.php create mode 100644 wp-content/themes/generatepress/inc/structure/archives.php create mode 100644 wp-content/themes/generatepress/inc/structure/comments.php create mode 100644 wp-content/themes/generatepress/inc/structure/featured-images.php create mode 100644 wp-content/themes/generatepress/inc/structure/footer.php create mode 100644 wp-content/themes/generatepress/inc/structure/header.php create mode 100644 wp-content/themes/generatepress/inc/structure/navigation.php create mode 100644 wp-content/themes/generatepress/inc/structure/post-meta.php create mode 100644 wp-content/themes/generatepress/inc/structure/sidebars.php create mode 100644 wp-content/themes/generatepress/inc/theme-functions.php create mode 100644 wp-content/themes/generatepress/inc/typography.php create mode 100644 wp-content/themes/generatepress/index.php create mode 100644 wp-content/themes/generatepress/js/a11y.js create mode 100644 wp-content/themes/generatepress/js/a11y.min.js create mode 100644 wp-content/themes/generatepress/js/admin/block-editor.js create mode 100644 wp-content/themes/generatepress/js/admin/tinycolor.js create mode 100644 wp-content/themes/generatepress/js/back-to-top.js create mode 100644 wp-content/themes/generatepress/js/back-to-top.min.js create mode 100644 wp-content/themes/generatepress/js/classList.js create mode 100644 wp-content/themes/generatepress/js/classList.min.js create mode 100644 wp-content/themes/generatepress/js/dropdown-click.js create mode 100644 wp-content/themes/generatepress/js/dropdown-click.min.js create mode 100644 wp-content/themes/generatepress/js/menu.js create mode 100644 wp-content/themes/generatepress/js/menu.min.js create mode 100644 wp-content/themes/generatepress/js/navigation-search.js create mode 100644 wp-content/themes/generatepress/js/navigation-search.min.js create mode 100644 wp-content/themes/generatepress/no-results.php create mode 100644 wp-content/themes/generatepress/page.php create mode 100644 wp-content/themes/generatepress/readme.txt create mode 100644 wp-content/themes/generatepress/rtl.css create mode 100644 wp-content/themes/generatepress/screenshot.png create mode 100644 wp-content/themes/generatepress/search.php create mode 100644 wp-content/themes/generatepress/searchform.php create mode 100644 wp-content/themes/generatepress/sidebar-left.php create mode 100644 wp-content/themes/generatepress/sidebar.php create mode 100644 wp-content/themes/generatepress/single.php create mode 100644 wp-content/themes/generatepress/style.css create mode 100644 wp-content/themes/generatepress/style.min.css create mode 100644 wp-content/themes/index.php create mode 100644 wp-content/themes/twentynineteen/404.php create mode 100644 wp-content/themes/twentynineteen/archive.php create mode 100644 wp-content/themes/twentynineteen/classes/class-twentynineteen-svg-icons.php create mode 100644 wp-content/themes/twentynineteen/classes/class-twentynineteen-walker-comment.php create mode 100644 wp-content/themes/twentynineteen/comments.php create mode 100644 wp-content/themes/twentynineteen/fonts/NonBreakingSpaceOverride.woff create mode 100644 wp-content/themes/twentynineteen/fonts/NonBreakingSpaceOverride.woff2 create mode 100644 wp-content/themes/twentynineteen/footer.php create mode 100644 wp-content/themes/twentynineteen/functions.php create mode 100644 wp-content/themes/twentynineteen/header.php create mode 100644 wp-content/themes/twentynineteen/image.php create mode 100644 wp-content/themes/twentynineteen/inc/back-compat.php create mode 100644 wp-content/themes/twentynineteen/inc/color-patterns.php create mode 100644 wp-content/themes/twentynineteen/inc/customizer.php create mode 100644 wp-content/themes/twentynineteen/inc/helper-functions.php create mode 100644 wp-content/themes/twentynineteen/inc/icon-functions.php create mode 100644 wp-content/themes/twentynineteen/inc/template-functions.php create mode 100644 wp-content/themes/twentynineteen/inc/template-tags.php create mode 100644 wp-content/themes/twentynineteen/index.php create mode 100644 wp-content/themes/twentynineteen/js/customize-controls.js create mode 100644 wp-content/themes/twentynineteen/js/customize-preview.js create mode 100644 wp-content/themes/twentynineteen/js/priority-menu.js create mode 100644 wp-content/themes/twentynineteen/js/skip-link-focus-fix.js create mode 100644 wp-content/themes/twentynineteen/js/touch-keyboard-navigation.js create mode 100644 wp-content/themes/twentynineteen/package-lock.json create mode 100644 wp-content/themes/twentynineteen/package.json create mode 100644 wp-content/themes/twentynineteen/page.php create mode 100644 wp-content/themes/twentynineteen/postcss.config.js create mode 100644 wp-content/themes/twentynineteen/print.css create mode 100644 wp-content/themes/twentynineteen/print.scss create mode 100644 wp-content/themes/twentynineteen/readme.txt create mode 100644 wp-content/themes/twentynineteen/sass/_normalize.scss create mode 100644 wp-content/themes/twentynineteen/sass/blocks/_blocks.scss create mode 100644 wp-content/themes/twentynineteen/sass/elements/_elements.scss create mode 100644 wp-content/themes/twentynineteen/sass/elements/_lists.scss create mode 100644 wp-content/themes/twentynineteen/sass/elements/_tables.scss create mode 100644 wp-content/themes/twentynineteen/sass/forms/_buttons.scss create mode 100644 wp-content/themes/twentynineteen/sass/forms/_fields.scss create mode 100644 wp-content/themes/twentynineteen/sass/forms/_forms.scss create mode 100644 wp-content/themes/twentynineteen/sass/layout/_layout.scss create mode 100644 wp-content/themes/twentynineteen/sass/media/_captions.scss create mode 100644 wp-content/themes/twentynineteen/sass/media/_galleries.scss create mode 100644 wp-content/themes/twentynineteen/sass/media/_media.scss create mode 100644 wp-content/themes/twentynineteen/sass/mixins/_mixins-master.scss create mode 100644 wp-content/themes/twentynineteen/sass/mixins/_utilities.scss create mode 100644 wp-content/themes/twentynineteen/sass/modules/_accessibility.scss create mode 100644 wp-content/themes/twentynineteen/sass/modules/_alignments.scss create mode 100644 wp-content/themes/twentynineteen/sass/modules/_clearings.scss create mode 100644 wp-content/themes/twentynineteen/sass/navigation/_links.scss create mode 100644 wp-content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss create mode 100644 wp-content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss create mode 100644 wp-content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss create mode 100644 wp-content/themes/twentynineteen/sass/navigation/_navigation.scss create mode 100644 wp-content/themes/twentynineteen/sass/navigation/_next-previous.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/_site.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/footer/_site-footer.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/header/_site-featured-image.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/header/_site-header.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/primary/_archives.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/primary/_comments.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss create mode 100644 wp-content/themes/twentynineteen/sass/site/secondary/_widgets.scss create mode 100644 wp-content/themes/twentynineteen/sass/typography/_copy.scss create mode 100644 wp-content/themes/twentynineteen/sass/typography/_headings.scss create mode 100644 wp-content/themes/twentynineteen/sass/typography/_typography.scss create mode 100644 wp-content/themes/twentynineteen/sass/variables-site/_colors.scss create mode 100644 wp-content/themes/twentynineteen/sass/variables-site/_columns.scss create mode 100644 wp-content/themes/twentynineteen/sass/variables-site/_fonts.scss create mode 100644 wp-content/themes/twentynineteen/sass/variables-site/_structure.scss create mode 100644 wp-content/themes/twentynineteen/sass/variables-site/_transitions.scss create mode 100644 wp-content/themes/twentynineteen/sass/variables-site/_variables-site.scss create mode 100644 wp-content/themes/twentynineteen/screenshot.png create mode 100644 wp-content/themes/twentynineteen/search.php create mode 100644 wp-content/themes/twentynineteen/single.php create mode 100644 wp-content/themes/twentynineteen/style-editor-customizer.css create mode 100644 wp-content/themes/twentynineteen/style-editor-customizer.scss create mode 100644 wp-content/themes/twentynineteen/style-editor.css create mode 100644 wp-content/themes/twentynineteen/style-editor.scss create mode 100644 wp-content/themes/twentynineteen/style-rtl.css create mode 100644 wp-content/themes/twentynineteen/style.css create mode 100644 wp-content/themes/twentynineteen/style.scss create mode 100644 wp-content/themes/twentynineteen/template-parts/content/content-excerpt.php create mode 100644 wp-content/themes/twentynineteen/template-parts/content/content-none.php create mode 100644 wp-content/themes/twentynineteen/template-parts/content/content-page.php create mode 100644 wp-content/themes/twentynineteen/template-parts/content/content-single.php create mode 100644 wp-content/themes/twentynineteen/template-parts/content/content.php create mode 100644 wp-content/themes/twentynineteen/template-parts/footer/footer-widgets.php create mode 100644 wp-content/themes/twentynineteen/template-parts/header/entry-header.php create mode 100644 wp-content/themes/twentynineteen/template-parts/header/site-branding.php create mode 100644 wp-content/themes/twentynineteen/template-parts/post/author-bio.php create mode 100644 wp-content/themes/twentynineteen/template-parts/post/discussion-meta.php create mode 100644 wp-content/themes/twentyseventeen/404.php create mode 100644 wp-content/themes/twentyseventeen/archive.php create mode 100644 wp-content/themes/twentyseventeen/assets/css/blocks.css create mode 100644 wp-content/themes/twentyseventeen/assets/css/colors-dark.css create mode 100644 wp-content/themes/twentyseventeen/assets/css/editor-blocks.css create mode 100644 wp-content/themes/twentyseventeen/assets/css/editor-style.css create mode 100644 wp-content/themes/twentyseventeen/assets/css/ie8.css create mode 100644 wp-content/themes/twentyseventeen/assets/css/ie9.css create mode 100644 wp-content/themes/twentyseventeen/assets/images/coffee.jpg create mode 100644 wp-content/themes/twentyseventeen/assets/images/espresso.jpg create mode 100644 wp-content/themes/twentyseventeen/assets/images/header.jpg create mode 100644 wp-content/themes/twentyseventeen/assets/images/sandwich.jpg create mode 100644 wp-content/themes/twentyseventeen/assets/images/svg-icons.svg create mode 100644 wp-content/themes/twentyseventeen/assets/js/customize-controls.js create mode 100644 wp-content/themes/twentyseventeen/assets/js/customize-preview.js create mode 100644 wp-content/themes/twentyseventeen/assets/js/global.js create mode 100644 wp-content/themes/twentyseventeen/assets/js/html5.js create mode 100644 wp-content/themes/twentyseventeen/assets/js/jquery.scrollTo.js create mode 100644 wp-content/themes/twentyseventeen/assets/js/navigation.js create mode 100644 wp-content/themes/twentyseventeen/assets/js/skip-link-focus-fix.js create mode 100644 wp-content/themes/twentyseventeen/comments.php create mode 100644 wp-content/themes/twentyseventeen/footer.php create mode 100644 wp-content/themes/twentyseventeen/front-page.php create mode 100644 wp-content/themes/twentyseventeen/functions.php create mode 100644 wp-content/themes/twentyseventeen/header.php create mode 100644 wp-content/themes/twentyseventeen/inc/back-compat.php create mode 100644 wp-content/themes/twentyseventeen/inc/color-patterns.php create mode 100644 wp-content/themes/twentyseventeen/inc/custom-header.php create mode 100644 wp-content/themes/twentyseventeen/inc/customizer.php create mode 100644 wp-content/themes/twentyseventeen/inc/icon-functions.php create mode 100644 wp-content/themes/twentyseventeen/inc/template-functions.php create mode 100644 wp-content/themes/twentyseventeen/inc/template-tags.php create mode 100644 wp-content/themes/twentyseventeen/index.php create mode 100644 wp-content/themes/twentyseventeen/page.php create mode 100644 wp-content/themes/twentyseventeen/readme.txt create mode 100644 wp-content/themes/twentyseventeen/rtl.css create mode 100644 wp-content/themes/twentyseventeen/screenshot.png create mode 100644 wp-content/themes/twentyseventeen/search.php create mode 100644 wp-content/themes/twentyseventeen/searchform.php create mode 100644 wp-content/themes/twentyseventeen/sidebar.php create mode 100644 wp-content/themes/twentyseventeen/single.php create mode 100644 wp-content/themes/twentyseventeen/style.css create mode 100644 wp-content/themes/twentyseventeen/template-parts/footer/footer-widgets.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/footer/site-info.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/header/header-image.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/header/site-branding.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/navigation/navigation-top.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/page/content-front-page.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/page/content-page.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/post/content-audio.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/post/content-excerpt.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/post/content-gallery.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/post/content-image.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/post/content-none.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/post/content-video.php create mode 100644 wp-content/themes/twentyseventeen/template-parts/post/content.php create mode 100644 wp-content/themes/twentysixteen/404.php create mode 100644 wp-content/themes/twentysixteen/archive.php create mode 100644 wp-content/themes/twentysixteen/comments.php create mode 100644 wp-content/themes/twentysixteen/css/blocks.css create mode 100644 wp-content/themes/twentysixteen/css/editor-blocks.css create mode 100644 wp-content/themes/twentysixteen/css/editor-style.css create mode 100644 wp-content/themes/twentysixteen/css/ie.css create mode 100644 wp-content/themes/twentysixteen/css/ie7.css create mode 100644 wp-content/themes/twentysixteen/css/ie8.css create mode 100644 wp-content/themes/twentysixteen/footer.php create mode 100644 wp-content/themes/twentysixteen/functions.php create mode 100644 wp-content/themes/twentysixteen/genericons/COPYING.txt create mode 100644 wp-content/themes/twentysixteen/genericons/Genericons.eot create mode 100644 wp-content/themes/twentysixteen/genericons/Genericons.svg create mode 100644 wp-content/themes/twentysixteen/genericons/Genericons.ttf create mode 100644 wp-content/themes/twentysixteen/genericons/Genericons.woff create mode 100644 wp-content/themes/twentysixteen/genericons/LICENSE.txt create mode 100644 wp-content/themes/twentysixteen/genericons/README.md create mode 100644 wp-content/themes/twentysixteen/genericons/genericons.css create mode 100644 wp-content/themes/twentysixteen/header.php create mode 100644 wp-content/themes/twentysixteen/image.php create mode 100644 wp-content/themes/twentysixteen/inc/back-compat.php create mode 100644 wp-content/themes/twentysixteen/inc/customizer.php create mode 100644 wp-content/themes/twentysixteen/inc/template-tags.php create mode 100644 wp-content/themes/twentysixteen/index.php create mode 100644 wp-content/themes/twentysixteen/js/color-scheme-control.js create mode 100644 wp-content/themes/twentysixteen/js/customize-preview.js create mode 100644 wp-content/themes/twentysixteen/js/functions.js create mode 100644 wp-content/themes/twentysixteen/js/html5.js create mode 100644 wp-content/themes/twentysixteen/js/keyboard-image-navigation.js create mode 100644 wp-content/themes/twentysixteen/js/skip-link-focus-fix.js create mode 100644 wp-content/themes/twentysixteen/page.php create mode 100644 wp-content/themes/twentysixteen/readme.txt create mode 100644 wp-content/themes/twentysixteen/rtl.css create mode 100644 wp-content/themes/twentysixteen/screenshot.png create mode 100644 wp-content/themes/twentysixteen/search.php create mode 100644 wp-content/themes/twentysixteen/searchform.php create mode 100644 wp-content/themes/twentysixteen/sidebar-content-bottom.php create mode 100644 wp-content/themes/twentysixteen/sidebar.php create mode 100644 wp-content/themes/twentysixteen/single.php create mode 100644 wp-content/themes/twentysixteen/style.css create mode 100644 wp-content/themes/twentysixteen/template-parts/biography.php create mode 100644 wp-content/themes/twentysixteen/template-parts/content-none.php create mode 100644 wp-content/themes/twentysixteen/template-parts/content-page.php create mode 100644 wp-content/themes/twentysixteen/template-parts/content-search.php create mode 100644 wp-content/themes/twentysixteen/template-parts/content-single.php create mode 100644 wp-content/themes/twentysixteen/template-parts/content.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b059e35 --- /dev/null +++ b/.gitignore @@ -0,0 +1,68 @@ +*.log +*.swp +*.back +*.bak +*.sql +*.sql.gz +~* + +.htaccess +.maintenance + +wp-config.php +sitemap.xml +sitemap.xml.gz +wp-content/uploads/ +wp-content/blogs.dir/ +wp-content/upgrade/ +wp-content/backup-db/ +wp-content/cache/ +wp-content/backups/ + +wp-content/advanced-cache.php +wp-content/object-cache.php +wp-content/wp-cache-config.php +wp-content/db.php + +wp-admin/ +wp-includes/ +/index.php +/license.txt +/readme.html + +# de_DE +/liesmich.html + +# it_IT +/LEGGIMI.txt +/licenza.html + +# da_DK +/licens.html + +# es_ES, es_PE +/licencia.txt + +# hu_HU +/licenc.txt +/olvasdel.html + +# sk_SK +/licencia-sk_SK.txt + +# sv_SE +/licens-sv_SE.txt + +/wp-activate.php +/wp-blog-header.php +/wp-comments-post.php +/wp-config-sample.php +/wp-cron.php +/wp-links-opml.php +/wp-load.php +/wp-login.php +/wp-mail.php +/wp-settings.php +/wp-signup.php +/wp-trackback.php +/xmlrpc.php \ No newline at end of file diff --git a/wp-content/index.php b/wp-content/index.php new file mode 100644 index 0000000..6220032 --- /dev/null +++ b/wp-content/index.php @@ -0,0 +1,2 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/wp-content/mu-plugins/README.md b/wp-content/mu-plugins/README.md new file mode 100644 index 0000000..325544e --- /dev/null +++ b/wp-content/mu-plugins/README.md @@ -0,0 +1,95 @@ +# authLDAP + +[![Join the chat at https://gitter.im/heiglandreas/authLdap](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/heiglandreas/authLdap?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +Use your existing LDAP as authentication-backend for your wordpress! + +[![Build Status](https://travis-ci.org/heiglandreas/authLdap.svg?branch=master)](https://travis-ci.org/heiglandreas/authLdap) +[![WordPress Stats](https://img.shields.io/wordpress/plugin/dt/authldap.svg)](https://wordpress.org/plugins/authldap/stats/) +[![WordPress Version](https://img.shields.io/wordpress/plugin/v/authldap.svg)](https://wordpress.org/plugins/authldap/) +[![WordPress testet](https://img.shields.io/wordpress/v/authldap.svg)](https://wordpress.org/plugins/authldap/) +[![Code Climate](https://codeclimate.com/github/heiglandreas/authLdap/badges/gpa.svg)](https://codeclimate.com/github/heiglandreas/authLdap) +[![Test Coverage](https://codeclimate.com/github/heiglandreas/authLdap/badges/coverage.svg)](https://codeclimate.com/github/heiglandreas/authLdap) + +So what are the differences to other Wordpress-LDAP-Authentication-Plugins? + +* **Flexible**: You are totaly free in which LDAP-backend to use. Due to the extensive configuration you can +freely decide how to do the authentication of your users. It simply depends on your +filters +* **Independent**: As soon as a user logs in, it is added/updated to the Wordpress' user-database +to allow wordpress to always use the correct data. You only have to administer your users once. +* **Failsafe**: Due to the users being created in Wordpress' User-database they can +also log in when the LDAP-backend currently is gone. +* **Role-Aware**: You can map Wordpress' roles to values of an existing LDAP-attribute. + +## How does the plugin work? + +Well, as a matter of fact it is rather simple. The plugin verifies, that the user +seeking authentification can bind to the LDAP using the provided password. + +If that is so, the user is either created or updated in the wordpress-user-database. +This update includes the provided password (so the wordpress can authenticate users +even without the LDAP), the users name according to the authLDAP-preferences and +the status of the user depending on the groups-settings of the authLDAP-preferences + +Writing this plugin would not have been as easy as it has been, without the +wonderfull plugin of Alistair Young from http://www.weblogs.uhi.ac.uk/sm00ay/?p=45 + +## Configuration + +### Usage Settings + +* **Enable Authentication via LDAP** Whether you want to enable authLdap for login or not +* **debug authLdap** When you have problems with authentication via LDAP you can enable a debugging mode here. +* **Save entered Password** Decide whether passwords will be cached in your wordpress-installation. **Attention:** Without the cache your users will not be able to log into your site when your LDAP is down! + +### Server Settings + +* **LDAP Uri** This is the URI where your ldap-backend can be reached. More information are actually on the Configuration page +* **Filter** This is the real McCoy! The filter you define here specifies how a user will be found. Before applying the filter a %s will be replaced with the given username. This means, when a user logs in using ‘foobar’ as username the following happens: + + * **uid=%1$s** check for any LDAP-Entry that has an attribute ‘uid’ with value ‘foobar’ + * **(&(objectclass=posixAccount)(|(uid=%1$s)(mail=%1$s)))** check for any LDAP-Entry that has an attribute ‘objectclass’ with value ‘posixAccout’ and either a UID- or a mail-attribute with value ‘foobar’ + + This filter is rather powerfull if used wisely. + +### Creating Users + +* **Name-Attribute** Which Attribute from the LDAP contains the Full or the First name of the user trying to log in. This defaults to name +* **Second Name Attribute** If the above Name-Attribute only contains the First Name of the user you can here specify an Attribute that contains the second name. This field is empty by default +* **User-ID Attribute** This field will be used as login-name for wordpress. Please give the Attribute, that is used to identify the user. This should be the same as you used in the above Filter-Option. This field defaults to uid +* **Mail Attribute** Which Attribute holds the eMail-Address of the user? If more than one eMail-Address are stored in the LDAP, only the first given is used. This field defaults to mail +* **Web-Attribute** If your users have a personal page (URI) stored in the LDAP, it can be provided here. This field is empty by default + +### User-Groups for Roles + +* **Group-Attribute** This is the attribute that defines the Group-ID that can be matched against the Groups defined further down This field defaults to gidNumber. +* **Group-Filter** Here you can add the filter for selecting groups for the currentlly logged in user The Filter should contain the string %s which will be replaced by the login-name of the currently logged in + + +## FAQ + +
+
Can I change a users password with this plugin?
+
Short Answer: No!
Long Answer: As the users credentials are not + only used for a wordpress-site when you authenticate against an LDAP but for + many other services also chances are great that there is a centralized place + where password-changes shall be made. We'll later allow inclusion of a link + to such a place but currently it's not available. And as password-hashing and + where to store it requires deeper insight into the LDAP-Server then most users + have and admins are willing to give, password changes are out of scope of this + plugin. If you know exactyl what you do, you might want to have a look at + + issue 54 + wherer a way of adding it is described! +
+
Can I add a user to the LDAP when she creates a user-account on wordpress?
+
Short Answer: No!
Long Answer: Even though that is technically possible + it's not in the scope of this plugin. As creating a user in an LDAP often involves + an administrative process that has already been implemented in your departments + administration it doesn't make sense to rebuild that - in most cases highly + individual - process in this plugin. If you know exactly what you do, have a look at + issue 65 + where wtfiwtz shows how to implement that feature. +
+
diff --git a/wp-content/mu-plugins/VERSION b/wp-content/mu-plugins/VERSION new file mode 100644 index 0000000..a625450 --- /dev/null +++ b/wp-content/mu-plugins/VERSION @@ -0,0 +1 @@ +2.3.1 \ No newline at end of file diff --git a/wp-content/mu-plugins/Vagrantfile b/wp-content/mu-plugins/Vagrantfile new file mode 100644 index 0000000..33f8311 --- /dev/null +++ b/wp-content/mu-plugins/Vagrantfile @@ -0,0 +1,28 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +$install_ldap = < diff --git a/wp-content/plugins/activitypub/LICENSE b/wp-content/plugins/activitypub/LICENSE new file mode 100644 index 0000000..e59f0cc --- /dev/null +++ b/wp-content/plugins/activitypub/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Matthias Pfefferle + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/wp-content/plugins/activitypub/activitypub.php b/wp-content/plugins/activitypub/activitypub.php new file mode 100644 index 0000000..7edbad1 --- /dev/null +++ b/wp-content/plugins/activitypub/activitypub.php @@ -0,0 +1,100 @@ +post_author; + + $activitypub_post = new \Activitypub\Model\Post( $post ); + $activitypub_activity = new \Activitypub\Model\Activity( 'Create', \Activitypub\Model\Activity::TYPE_FULL ); + $activitypub_activity->from_post( $activitypub_post->to_array() ); + + foreach ( \Activitypub\get_follower_inboxes( $user_id ) as $inbox => $to ) { + $activitypub_activity->set_to( $to ); + $activity = $activitypub_activity->to_json(); // phpcs:ignore + + \Activitypub\safe_remote_post( $inbox, $activity, $user_id ); + } + } + + /** + * Send "update" activities + * + * @param int $post_id + */ + public static function send_update_activity( $post_id ) { + $post = \get_post( $post_id ); + $user_id = $post->post_author; + + $activitypub_post = new \Activitypub\Model\Post( $post ); + $activitypub_activity = new \Activitypub\Model\Activity( 'Update', \Activitypub\Model\Activity::TYPE_FULL ); + $activitypub_activity->from_post( $activitypub_post->to_array() ); + + foreach ( \Activitypub\get_follower_inboxes( $user_id ) as $inbox => $to ) { + $activitypub_activity->set_to( $to ); + $activity = $activitypub_activity->to_json(); // phpcs:ignore + + \Activitypub\safe_remote_post( $inbox, $activity, $user_id ); + } + } + + /** + * Send "delete" activities + * + * @param int $post_id + */ + public static function send_delete_activity( $post_id ) { + $post = \get_post( $post_id ); + $user_id = $post->post_author; + + $activitypub_post = new \Activitypub\Model\Post( $post ); + $activitypub_activity = new \Activitypub\Model\Activity( 'Delete', \Activitypub\Model\Activity::TYPE_FULL ); + $activitypub_activity->from_post( $activitypub_post->to_array() ); + + foreach ( \Activitypub\get_follower_inboxes( $user_id ) as $inbox => $to ) { + $activitypub_activity->set_to( $to ); + $activity = $activitypub_activity->to_json(); // phpcs:ignore + + \Activitypub\safe_remote_post( $inbox, $activity, $user_id ); + } + } +} diff --git a/wp-content/plugins/activitypub/includes/class-activitypub.php b/wp-content/plugins/activitypub/includes/class-activitypub.php new file mode 100644 index 0000000..49e022a --- /dev/null +++ b/wp-content/plugins/activitypub/includes/class-activitypub.php @@ -0,0 +1,179 @@ +query_vars['activitypub'] ) ) { + return $json_template; + } + + if ( ! isset( $_SERVER['HTTP_ACCEPT'] ) ) { + return $template; + } + + $accept_header = $_SERVER['HTTP_ACCEPT']; + + if ( + \stristr( $accept_header, 'application/activity+json' ) || + \stristr( $accept_header, 'application/ld+json' ) + ) { + return $json_template; + } + + // accept header as an array + $accept = \explode( ',', \trim( $accept_header ) ); + + if ( + \in_array( 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', $accept, true ) || + \in_array( 'application/activity+json', $accept, true ) || + \in_array( 'application/ld+json', $accept, true ) || + \in_array( 'application/json', $accept, true ) + ) { + return $json_template; + } + + return $template; + } + + /** + * Add the 'photos' query variable so WordPress + * won't mangle it. + */ + public static function add_query_vars( $vars ) { + $vars[] = 'activitypub'; + + return $vars; + } + + /** + * Add our rewrite endpoint to permalinks and pages. + */ + public static function add_rewrite_endpoint() { + \add_rewrite_endpoint( 'activitypub', EP_AUTHORS | EP_PERMALINK | EP_PAGES ); + } + + /** + * Schedule Activities + * + * @param int $post_id + */ + public static function schedule_post_activity( $new_status, $old_status, $post ) { + // do not send activities if post is password protected + if ( \post_password_required( $post ) ) { + return; + } + + // check if post-type supports ActivityPub + $post_types = \get_post_types_by_support( 'activitypub' ); + if ( ! \in_array( $post->post_type, $post_types, true ) ) { + return; + } + + if ( 'publish' === $new_status && 'publish' !== $old_status ) { + \wp_schedule_single_event( \time(), 'activitypub_send_post_activity', array( $post->ID ) ); + } elseif ( 'publish' === $new_status ) { + \wp_schedule_single_event( \time(), 'activitypub_send_update_activity', array( $post->ID ) ); + } elseif ( 'trash' === $new_status ) { + \wp_schedule_single_event( \time(), 'activitypub_send_delete_activity', array( get_permalink( $post ) ) ); + } + } + + /** + * Replaces the default avatar + * + * @param array $args Arguments passed to get_avatar_data(), after processing. + * @param int|string|object $id_or_email A user ID, email address, or comment object + * + * @return array $args + */ + public static function pre_get_avatar_data( $args, $id_or_email ) { + if ( + ! $id_or_email instanceof \WP_Comment || + ! isset( $id_or_email->comment_type ) || + $id_or_email->user_id + ) { + return $args; + } + + $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, true ) ) { + $args['url'] = false; + /** This filter is documented in wp-includes/link-template.php */ + return \apply_filters( 'get_avatar_data', $args, $id_or_email ); + } + + // check if comment has an avatar + $avatar = self::get_avatar_url( $id_or_email->comment_ID ); + + if ( $avatar ) { + if ( ! isset( $args['class'] ) || ! \is_array( $args['class'] ) ) { + $args['class'] = array( 'u-photo' ); + } else { + $args['class'][] = 'u-photo'; + $args['class'] = \array_unique( $args['class'] ); + } + $args['url'] = $avatar; + $args['class'][] = 'avatar-activitypub'; + } + + return $args; + } + + /** + * Function to retrieve Avatar URL if stored in meta + * + * + * @param int|WP_Comment $comment + * + * @return string $url + */ + public static function get_avatar_url( $comment ) { + if ( \is_numeric( $comment ) ) { + $comment = \get_comment( $comment ); + } + return \get_comment_meta( $comment->comment_ID, 'avatar_url', true ); + } +} diff --git a/wp-content/plugins/activitypub/includes/class-admin.php b/wp-content/plugins/activitypub/includes/class-admin.php new file mode 100644 index 0000000..0dca896 --- /dev/null +++ b/wp-content/plugins/activitypub/includes/class-admin.php @@ -0,0 +1,149 @@ + 'string', + 'description' => \__( 'Use title and link, summary or full content', 'activitypub' ), + 'show_in_rest' => array( + 'schema' => array( + 'enum' => array( 'title', 'excerpt', 'content' ), + ), + ), + 'default' => 'content', + ) + ); + \register_setting( + 'activitypub', 'activitypub_object_type', array( + 'type' => 'string', + 'description' => \__( 'The Activity-Object-Type', 'activitypub' ), + 'show_in_rest' => array( + 'schema' => array( + 'enum' => array( 'note', 'article', 'wordpress-post-format' ), + ), + ), + 'default' => 'note', + ) + ); + \register_setting( + 'activitypub', 'activitypub_use_shortlink', array( + 'type' => 'boolean', + 'description' => \__( 'Use the Shortlink instead of the permalink', 'activitypub' ), + 'default' => 0, + ) + ); + \register_setting( + 'activitypub', 'activitypub_use_hashtags', array( + 'type' => 'boolean', + 'description' => \__( 'Add hashtags in the content as native tags and replace the #tag with the tag-link', 'activitypub' ), + 'default' => 0, + ) + ); + \register_setting( + 'activitypub', 'activitypub_add_tags_as_hashtags', array( + 'type' => 'boolean', + 'description' => \__( 'Add all tags as hashtags at the end of each activity', 'activitypub' ), + 'default' => 0, + ) + ); + \register_setting( + 'activitypub', 'activitypub_support_post_types', array( + 'type' => 'string', + 'description' => \esc_html__( 'Enable ActivityPub support for post types', 'activitypub' ), + 'show_in_rest' => true, + 'default' => array( 'post', 'pages' ), + ) + ); + \register_setting( + 'activitypub', 'activitypub_blacklist', array( + 'type' => 'string', + 'description' => \esc_html__( 'Block fediverse instances', 'activitypub' ), + 'show_in_rest' => true, + 'default' => 'gab.com', + ) + ); + } + + public static function add_settings_help_tab() { + \get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => \__( 'Overview', 'activitypub' ), + 'content' => + '

' . \__( 'ActivityPub is a decentralized social networking protocol based on the ActivityStreams 2.0 data format. ActivityPub is an official W3C recommended standard published by the W3C Social Web Working Group. It provides a client to server API for creating, updating and deleting content, as well as a federated server to server API for delivering notifications and subscribing to content.', 'activitypub' ) . '

', + ) + ); + + \get_current_screen()->set_help_sidebar( + '

' . \__( 'For more information:', 'activitypub' ) . '

' . + '

' . \__( 'Test Suite', 'activitypub' ) . '

' . + '

' . \__( 'W3C Spec', 'activitypub' ) . '

' . + '

' . \__( 'Give us feedback', 'activitypub' ) . '

' . + '
' . + '

' . \__( 'Donate', 'activitypub' ) . '

' + ); + } + + public static function add_followers_list_help_tab() { + // todo + } + + public static function add_fediverse_profile( $user ) { + ?> +

+ ID ); + } +} diff --git a/wp-content/plugins/activitypub/includes/class-debug.php b/wp-content/plugins/activitypub/includes/class-debug.php new file mode 100644 index 0000000..ac8b8bf --- /dev/null +++ b/wp-content/plugins/activitypub/includes/class-debug.php @@ -0,0 +1,30 @@ +post_content, $match ) ) { + $tags = \implode( ', ', $match[1] ); + + \wp_add_post_tags( $data->post_parent, $tags ); + } + + return $id; + } + + /** + * Filter to replace the #tags in the content with links + * + * @param string $the_content the post-content + * + * @return string the filtered post-content + */ + public static function the_content( $the_content ) { + $the_content = \preg_replace_callback( '/' . ACTIVITYPUB_HASHTAGS_REGEXP . '/i', array( '\Activitypub\Hashtag', 'replace_with_links' ), $the_content ); + + return $the_content; + } + + /** + * A callback for preg_replace to build the term links + * + * @param array $result the preg_match results + * @return string the final string + */ + public static function replace_with_links( $result ) { + $tag = $result[1]; + $tag_object = \get_term_by( 'name', $tag, 'post_tag' ); + + if ( $tag_object ) { + $link = \get_term_link( $tag_object, 'post_tag' ); + return \sprintf( '', $link, $tag ); + } + + return '#' . $tag; + } + + /** + * Adds all tags as hashtags to the post/summary content + * + * @param string $content + * @param WP_Post $post + * + * @return string + */ + public static function add_hashtags_to_content( $content, $post ) { + $tags = \get_the_tags( $post->ID ); + + if ( ! $tags ) { + return $content; + } + + $hash_tags = array(); + + foreach ( $tags as $tag ) { + $hash_tags[] = \sprintf( '', \get_tag_link( $tag ), $tag->slug ); + } + + return $content . '

' . \implode( ' ', $hash_tags ) . '

'; + } +} diff --git a/wp-content/plugins/activitypub/includes/class-health-check.php b/wp-content/plugins/activitypub/includes/class-health-check.php new file mode 100644 index 0000000..0a04308 --- /dev/null +++ b/wp-content/plugins/activitypub/includes/class-health-check.php @@ -0,0 +1,12 @@ + 'sha512', + 'private_key_bits' => 2048, + 'private_key_type' => OPENSSL_KEYTYPE_RSA, + ); + + $key = \openssl_pkey_new( $config ); + $priv_key = null; + + \openssl_pkey_export( $key, $priv_key ); + + // private key + \update_user_meta( $user_id, 'magic_sig_private_key', $priv_key ); + + $detail = \openssl_pkey_get_details( $key ); + + // public key + \update_user_meta( $user_id, 'magic_sig_public_key', $detail['key'] ); + } + + public static function generate_signature( $user_id, $url, $date ) { + $key = self::get_private_key( $user_id ); + + $url_parts = \wp_parse_url( $url ); + + $host = $url_parts['host']; + $path = '/'; + + // add path + if ( ! empty( $url_parts['path'] ) ) { + $path = $url_parts['path']; + } + + // add query + if ( ! empty( $url_parts['query'] ) ) { + $path .= '?' . $url_parts['query']; + } + + $signed_string = "(request-target): post $path\nhost: $host\ndate: $date"; + + $signature = null; + \openssl_sign( $signed_string, $signature, $key, OPENSSL_ALGO_SHA256 ); + $signature = \base64_encode( $signature ); // phpcs:ignore + + $key_id = \get_author_posts_url( $user_id ) . '#main-key'; + + return \sprintf( 'keyId="%s",algorithm="rsa-sha256",headers="(request-target) host date",signature="%s"', $key_id, $signature ); + } + + public static function verify_signature( $headers, $signature ) { + + } +} diff --git a/wp-content/plugins/activitypub/includes/functions.php b/wp-content/plugins/activitypub/includes/functions.php new file mode 100644 index 0000000..31d29cf --- /dev/null +++ b/wp-content/plugins/activitypub/includes/functions.php @@ -0,0 +1,336 @@ + 'as:manuallyApprovesFollowers', + 'PropertyValue' => 'schema:PropertyValue', + 'schema' => 'http://schema.org#', + 'value' => 'schema:value', + ), + ); + + return \apply_filters( 'activitypub_json_context', $context ); +} + +function safe_remote_post( $url, $body, $user_id ) { + $date = \gmdate( 'D, d M Y H:i:s T' ); + $signature = \Activitypub\Signature::generate_signature( $user_id, $url, $date ); + + $wp_version = \get_bloginfo( 'version' ); + $user_agent = \apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . \get_bloginfo( 'url' ) ); + $args = array( + 'timeout' => 100, + 'limit_response_size' => 1048576, + 'redirection' => 3, + 'user-agent' => "$user_agent; ActivityPub", + 'headers' => array( + 'Accept' => 'application/activity+json', + 'Content-Type' => 'application/activity+json', + 'Signature' => $signature, + 'Date' => $date, + ), + 'body' => $body, + ); + + $response = \wp_safe_remote_post( $url, $args ); + + \do_action( 'activitypub_safe_remote_post_response', $response, $url, $body, $user_id ); + + return $response; +} + +function safe_remote_get( $url, $user_id ) { + $date = \gmdate( 'D, d M Y H:i:s T' ); + $signature = \Activitypub\Signature::generate_signature( $user_id, $url, $date ); + + $wp_version = \get_bloginfo( 'version' ); + $user_agent = \apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . \get_bloginfo( 'url' ) ); + $args = array( + 'timeout' => 100, + 'limit_response_size' => 1048576, + 'redirection' => 3, + 'user-agent' => "$user_agent; ActivityPub", + 'headers' => array( + 'Accept' => 'application/activity+json', + 'Content-Type' => 'application/activity+json', + 'Signature' => $signature, + 'Date' => $date, + ), + ); + + $response = \wp_safe_remote_get( $url, $args ); + + \do_action( 'activitypub_safe_remote_get_response', $response, $url, $user_id ); + + return $response; +} + +/** + * Returns a users WebFinger "resource" + * + * @param int $user_id + * + * @return string The user-resource + */ +function get_webfinger_resource( $user_id ) { + // use WebFinger plugin if installed + if ( \function_exists( '\get_webfinger_resource' ) ) { + return \get_webfinger_resource( $user_id, false ); + } + + $user = \get_user_by( 'id', $user_id ); + + return $user->user_login . '@' . \wp_parse_url( \home_url(), PHP_URL_HOST ); +} + +/** + * [get_metadata_by_actor description] + * + * @param sting $actor + * + * @return array + */ +function get_remote_metadata_by_actor( $actor ) { + $metadata = \get_transient( 'activitypub_' . $actor ); + + if ( $metadata ) { + return $metadata; + } + + if ( ! \wp_http_validate_url( $actor ) ) { + return new \WP_Error( 'activitypub_no_valid_actor_url', \__( 'The "actor" is no valid URL', 'activitypub' ), $actor ); + } + + $user = \get_users( array ( + 'number' => 1, + 'who' => 'authors', + 'fields' => 'ID', + ) ); + + // we just need any user to generate a request signature + $user_id = \reset( $user ); + + $response = \Activitypub\safe_remote_get( $actor, $user_id ); + + if ( \is_wp_error( $response ) ) { + return $response; + } + + $metadata = \wp_remote_retrieve_body( $response ); + $metadata = \json_decode( $metadata, true ); + + if ( ! $metadata ) { + return new \WP_Error( 'activitypub_invalid_json', \__( 'No valid JSON data', 'activitypub' ), $actor ); + } + + \set_transient( 'activitypub_' . $actor, $metadata, WEEK_IN_SECONDS ); + + return $metadata; +} + +/** + * [get_inbox_by_actor description] + * @param [type] $actor [description] + * @return [type] [description] + */ +function get_inbox_by_actor( $actor ) { + $metadata = \Activitypub\get_remote_metadata_by_actor( $actor ); + + if ( \is_wp_error( $metadata ) ) { + return $metadata; + } + + if ( isset( $metadata['endpoints'] ) && isset( $metadata['endpoints']['sharedInbox'] ) ) { + return $metadata['endpoints']['sharedInbox']; + } + + if ( \array_key_exists( 'inbox', $metadata ) ) { + return $metadata['inbox']; + } + + return new \WP_Error( 'activitypub_no_inbox', __( 'No "Inbox" found', 'activitypub' ), $metadata ); +} + +/** + * [get_inbox_by_actor description] + * @param [type] $actor [description] + * @return [type] [description] + */ +function get_publickey_by_actor( $actor, $key_id ) { + $metadata = \Activitypub\get_remote_metadata_by_actor( $actor ); + + if ( \is_wp_error( $metadata ) ) { + return $metadata; + } + + if ( + isset( $metadata['publicKey'] ) && + isset( $metadata['publicKey']['id'] ) && + isset( $metadata['publicKey']['owner'] ) && + isset( $metadata['publicKey']['publicKeyPem'] ) && + $key_id === $metadata['publicKey']['id'] && + $actor === $metadata['publicKey']['owner'] + ) { + return $metadata['publicKey']['publicKeyPem']; + } + + return new \WP_Error( 'activitypub_no_public_key', \__( 'No "Public-Key" found', 'activitypub' ), $metadata ); +} + +function get_follower_inboxes( $user_id ) { + $followers = \Activitypub\Peer\Followers::get_followers( $user_id ); + $inboxes = array(); + + foreach ( $followers as $follower ) { + $inbox = \Activitypub\get_inbox_by_actor( $follower ); + if ( ! $inbox || \is_wp_error( $inbox ) ) { + continue; + } + // init array if empty + if ( ! isset( $inboxes[ $inbox ] ) ) { + $inboxes[ $inbox ] = array(); + } + $inboxes[ $inbox ][] = $follower; + } + + return $inboxes; +} + +function get_identifier_settings( $user_id ) { + ?> + + + + + + + +
+ + +

or

+ +

+
+ wp_rewrite_rules(); + + // not using rewrite rules, and 'author=N' method failed, so we're out of options + if ( empty( $rewrite ) ) { + return 0; + } + + // generate rewrite rule for the author url + $author_rewrite = $wp_rewrite->get_author_permastruct(); + $author_regexp = \str_replace( '%author%', '', $author_rewrite ); + + // match the rewrite rule with the passed url + if ( \preg_match( '/https?:\/\/(.+)' . \preg_quote( $author_regexp, '/' ) . '([^\/]+)/i', $url, $match ) ) { + $user = get_user_by( 'slug', $match[2] ); + if ( $user ) { + return $user->ID; + } + } + + return 0; +} + +/** + * Get the blacklist from the WordPress options table + * + * @return array the list of blacklisted hosts + * + * @uses apply_filters() Calls 'activitypub_blacklist' filter + */ +function get_blacklist() { + $blacklist = \get_option( 'activitypub_blacklist' ); + $blacklist_hosts = \explode( PHP_EOL, $blacklist ); + + // if no values have been set, revert to the defaults + if ( ! $blacklist || ! $blacklist_hosts || ! \is_array( $blacklist_hosts ) ) { + $blacklist_hosts = array( + 'gab.com', + ); + } + + // clean out any blank values + foreach ( $blacklist_hosts as $key => $value ) { + if ( empty( $value ) ) { + unset( $blacklist_hosts[ $key ] ); + } else { + $blacklist_hosts[ $key ] = \trim( $blacklist_hosts[ $key ] ); + } + } + + return \apply_filters( 'activitypub_blacklist', $blacklist_hosts ); +} + +/** + * Check if an URL is blacklisted + * + * @param string $url an URL to check + * + * @return boolean + */ +function is_blacklisted( $url ) { + foreach ( \ActivityPub\get_blacklist() as $blacklisted_host ) { + if ( \strpos( $url, $blacklisted_host ) !== false ) { + return true; + } + } + + return false; +} diff --git a/wp-content/plugins/activitypub/includes/model/class-activity.php b/wp-content/plugins/activitypub/includes/model/class-activity.php new file mode 100644 index 0000000..470b192 --- /dev/null +++ b/wp-content/plugins/activitypub/includes/model/class-activity.php @@ -0,0 +1,95 @@ +context = null; + } elseif ( 'full' === $context ) { + $this->context = \Activitypub\get_context(); + } + + $this->type = \ucfirst( $type ); + $this->published = \date( 'Y-m-d\TH:i:s\Z', \strtotime( 'now' ) ); + } + + public function __call( $method, $params ) { + $var = \strtolower( \substr( $method, 4 ) ); + + if ( \strncasecmp( $method, 'get', 3 ) === 0 ) { + return $this->$var; + } + + if ( \strncasecmp( $method, 'set', 3 ) === 0 ) { + $this->$var = $params[0]; + } + } + + public function from_post( $object ) { + $this->object = $object; + $this->published = $object['published']; + $this->actor = $object['attributedTo']; + $this->id = $object['id']; + } + + public function from_comment( $object ) { + + } + + public function to_array() { + $array = \get_object_vars( $this ); + + if ( $this->context ) { + $array = array( '@context' => $this->context ) + $array; + } + + unset( $array['context'] ); + + return $array; + } + + public function to_json() { + return \wp_json_encode( $this->to_array(), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_QUOT ); + } + + public function to_simple_array() { + $activity = array( + '@context' => $this->context, + 'type' => $this->type, + 'actor' => $this->actor, + 'object' => $this->object, + 'to' => $this->to, + 'cc' => $this->cc, + ); + + if ( $this->id ) { + $activity['id'] = $this->id; + } + + return $activity; + } + + public function to_simple_json() { + return \wp_json_encode( $this->to_simple_array(), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_QUOT ); + } +} diff --git a/wp-content/plugins/activitypub/includes/model/class-post.php b/wp-content/plugins/activitypub/includes/model/class-post.php new file mode 100644 index 0000000..a452274 --- /dev/null +++ b/wp-content/plugins/activitypub/includes/model/class-post.php @@ -0,0 +1,320 @@ +post = \get_post( $post ); + } + + public function get_post() { + return $this->post; + } + + public function get_post_author() { + return $this->post->post_author; + } + + public function to_array() { + $post = $this->post; + + $array = array( + 'id' => \get_permalink( $post ), + 'type' => $this->get_object_type(), + 'published' => \date( 'Y-m-d\TH:i:s\Z', \strtotime( $post->post_date ) ), + 'attributedTo' => \get_author_posts_url( $post->post_author ), + 'summary' => $this->get_the_title(), + 'inReplyTo' => null, + 'content' => $this->get_the_content(), + 'contentMap' => array( + \strstr( \get_locale(), '_', true ) => $this->get_the_content(), + ), + 'to' => array( 'https://www.w3.org/ns/activitystreams#Public' ), + 'cc' => array( 'https://www.w3.org/ns/activitystreams#Public' ), + 'attachment' => $this->get_attachments(), + 'tag' => $this->get_tags(), + ); + + return \apply_filters( 'activitypub_post', $array ); + } + + public function to_json() { + return \wp_json_encode( $this->to_array(), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_QUOT ); + } + + public function get_attachments() { + $max_images = \apply_filters( 'activitypub_max_images', 3 ); + + $images = array(); + + // max images can't be negative or zero + if ( $max_images <= 0 ) { + $max_images = 1; + } + + $id = $this->post->ID; + + $image_ids = array(); + // list post thumbnail first if this post has one + if ( \function_exists( 'has_post_thumbnail' ) && \has_post_thumbnail( $id ) ) { + $image_ids[] = \get_post_thumbnail_id( $id ); + $max_images--; + } + // then list any image attachments + $query = new \WP_Query( + array( + 'post_parent' => $id, + 'post_status' => 'inherit', + 'post_type' => 'attachment', + 'post_mime_type' => 'image', + 'order' => 'ASC', + 'orderby' => 'menu_order ID', + 'posts_per_page' => $max_images, + ) + ); + foreach ( $query->get_posts() as $attachment ) { + if ( ! \in_array( $attachment->ID, $image_ids, true ) ) { + $image_ids[] = $attachment->ID; + } + } + + $image_ids = \array_unique( $image_ids ); + + // get URLs for each image + foreach ( $image_ids as $id ) { + $alt = \get_post_meta( $id, '_wp_attachment_image_alt', true ); + $thumbnail = \wp_get_attachment_image_src( $id, 'full' ); + $mimetype = \get_post_mime_type( $id ); + + if ( $thumbnail ) { + $image = array( + 'type' => 'Image', + 'url' => $thumbnail[0], + 'mediaType' => $mimetype + ); + if ( $alt ) { + $image['name'] = $alt; + } + $images[] = $image; + } + } + + return $images; + } + + public function get_tags() { + $tags = array(); + + $post_tags = \get_the_tags( $this->post->ID ); + if ( $post_tags ) { + foreach ( $post_tags as $post_tag ) { + $tag = array( + 'type' => 'Hashtag', + 'href' => \get_tag_link( $post_tag->term_id ), + 'name' => '#' . $post_tag->slug, + ); + $tags[] = $tag; + } + } + + return $tags; + } + + /** + * Returns the as2 object-type for a given post + * + * @param string $type the object-type + * @param Object $post the post-object + * + * @return string the object-type + */ + public function get_object_type() { + if ( 'wordpress-post-format' !== \get_option( 'activitypub_object_type', 'note' ) ) { + return \ucfirst( \get_option( 'activitypub_object_type', 'note' ) ); + } + + $post_type = \get_post_type( $this->post ); + switch ( $post_type ) { + case 'post': + $post_format = \get_post_format( $this->post ); + switch ( $post_format ) { + case 'aside': + case 'status': + case 'quote': + case 'note': + $object_type = 'Note'; + break; + case 'gallery': + case 'image': + $object_type = 'Image'; + break; + case 'video': + $object_type = 'Video'; + break; + case 'audio': + $object_type = 'Audio'; + break; + default: + $object_type = 'Article'; + break; + } + break; + case 'page': + $object_type = 'Page'; + break; + case 'attachment': + $mime_type = \get_post_mime_type(); + $media_type = \preg_replace( '/(\/[a-zA-Z]+)/i', '', $mime_type ); + switch ( $media_type ) { + case 'audio': + $object_type = 'Audio'; + break; + case 'video': + $object_type = 'Video'; + break; + case 'image': + $object_type = 'Image'; + break; + } + break; + default: + $object_type = 'Article'; + break; + } + + return $object_type; + } + + public function get_the_content() { + if ( 'excerpt' === \get_option( 'activitypub_post_content_type', 'content' ) ) { + return $this->get_the_post_summary(); + } + + if ( 'title' === \get_option( 'activitypub_post_content_type', 'content' ) ) { + return $this->get_the_title(); + } + + return $this->get_the_post_content(); + } + + public function get_the_title() { + if ( 'Article' === $this->get_object_type() ) { + $title = \get_the_title( $this->post ); + + return \html_entity_decode( $title, ENT_QUOTES, 'UTF-8' ); + } + + return null; + } + + /** + * Get the excerpt for a post for use outside of the loop. + * + * @param int Optional excerpt length. + * + * @return string The excerpt. + */ + public function get_the_post_excerpt( $excerpt_length = 400 ) { + $post = $this->post; + + $excerpt = \get_post_field( 'post_excerpt', $post ); + + if ( '' === $excerpt ) { + + $content = \get_post_field( 'post_content', $post ); + + // An empty string will make wp_trim_excerpt do stuff we do not want. + if ( '' !== $content ) { + + $excerpt = \strip_shortcodes( $content ); + + /** This filter is documented in wp-includes/post-template.php */ + $excerpt = \apply_filters( 'the_content', $excerpt ); + $excerpt = \str_replace( ']]>', ']]>', $excerpt ); + + $excerpt_length = \apply_filters( 'excerpt_length', $excerpt_length ); + + /** This filter is documented in wp-includes/formatting.php */ + $excerpt_more = \apply_filters( 'excerpt_more', ' [...]' ); + + $excerpt = \wp_trim_words( $excerpt, $excerpt_length, $excerpt_more ); + } + } + + return $excerpt; + } + + /** + * Get the content for a post for use outside of the loop. + * + * @return string The content. + */ + public function get_the_post_content() { + $post = $this->post; + + $content = \get_post_field( 'post_content', $post ); + + $filtered_content = \apply_filters( 'the_content', $content ); + $filtered_content = \apply_filters( 'activitypub_the_content', $filtered_content, $this->post ); + + $decoded_content = \html_entity_decode( $filtered_content, ENT_QUOTES, 'UTF-8' ); + + $allowed_html = \apply_filters( 'activitypub_allowed_html', '

",{class:"select2-results__options select2-results__options--nested",role:"listbox"});n.append(j),g.attr("role","list"),g.append(h),g.append(n)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("data-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[data-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):h-g<0&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[data-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted").attr("aria-selected","true"),d.$results.attr("aria-activedescendant",a.element.attr("id"))}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[data-selected]",function(b){var c=a(this),e=c.data("data");if("true"===c.attr("data-selected"))return void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{}));d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[data-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted").attr("aria-selected","false"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[data-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.options.get("minimumResultsForSearch");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),window.setTimeout(function(){d.$selection.focus()},1),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2");a(".select2.select2-container--open").each(function(){var b=a(this);this!=d[0]&&b.data("element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",d),this.$selection.attr("role","combobox"),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("keydown",function(b){!a.isOpen()&&b.which>=48&&b.which<=90&&a.open()}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
    '),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('
  • ')},d.prototype.update=function(a){var b=this;if(this.clear(),0!==a.length){for(var d=[],e=0;e1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this,f=b.id+"-results";a.call(this,b,d),b.on("open",function(){e.$search.attr("aria-owns",f),e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.removeAttr("aria-owns"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.data._resultId)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===e.$search.val()){var b=e.$searchContainer.prev(".select2-selection__choice");if(b.length>0){var d=b.data("data");e.searchRemoveChoice(d),a.preventDefault()}}});var g=document.documentMode,h=g&&g<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(h)return void e.$selection.off("input.search input.searchcheck");e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(h&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d="";return d+=null!=b?b.id:a.generateChars(4),d+="-result-",d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f),e.container.focusOnActiveElement()},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this,f=c.id+"-results";b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.attr("aria-owns",f),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.removeAttr("aria-activedescendant"),e.$search.removeAttr("aria-owns"),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}}),c.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.data._resultId)})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
  • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var b=this;this.on("open",function(){b.$container.addClass("select2-container--open")}),this.on("close",function(){b.$container.removeClass("select2-container--open")}),this.on("enable",function(){b.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){b.$container.addClass("select2-container--disabled")}),this.on("blur",function(){b.$container.removeClass("select2-container--focus")}),this.on("query",function(a){b.isOpen()||b.trigger("open",{}),this.dataAdapter.query(a,function(c){b.trigger("results:all",{data:c,query:a})})}),this.on("query:append",function(a){this.dataAdapter.query(a,function(c){b.trigger("results:append",{data:c,query:a})})}),this.on("open",function(){setTimeout(function(){b.focusOnActiveElement()},1)}),a(document).on("keydown",function(a){var c=a.which;if(b.isOpen())if(c===d.ESC||c===d.TAB||c===d.UP&&a.altKey?(b.close(),a.preventDefault()):c===d.ENTER?(b.trigger("results:select",{}),a.preventDefault()):c===d.SPACE&&a.ctrlKey?(b.trigger("results:toggle",{}),a.preventDefault()):c===d.UP?(b.trigger("results:previous",{}),a.preventDefault()):c===d.DOWN&&(b.trigger("results:next",{}),a.preventDefault()),c===d.DOWN||c===d.UP)b.focusOnActiveElement();else{var e=b.$dropdown.find(".select2-search__field");e.length||(e=b.$container.find(".select2-search__field")),e.focus(),setTimeout(function(){b.focusOnActiveElement()},1e3)}else b.hasFocus()&&(c===d.ENTER||c===d.SPACE||c===d.DOWN&&a.altKey)&&(b.open(),a.preventDefault())})},e.prototype.focusOnActiveElement=function(){c.isTouchscreen()||this.$results.find("li.select2-results__option--highlighted").focus()},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.selectWoo){var e=["open","close","destroy"];a.fn.selectWoo=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null!=a.fn.select2&&null!=a.fn.select2.defaults&&(a.fn.selectWoo.defaults=a.fn.select2.defaults),null==a.fn.selectWoo.defaults&&(a.fn.selectWoo.defaults=d),a.fn.select2=a.fn.select2||a.fn.selectWoo,c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,a.fn.selectWoo.amd=b,c}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/library/customizer/controls/js/slider-customizer.js b/wp-content/plugins/gp-premium/library/customizer/controls/js/slider-customizer.js new file mode 100644 index 0000000..549b225 --- /dev/null +++ b/wp-content/plugins/gp-premium/library/customizer/controls/js/slider-customizer.js @@ -0,0 +1,134 @@ +wp.customize.controlConstructor['generatepress-pro-range-slider'] = wp.customize.Control.extend({ + + ready: function() { + + 'use strict'; + + var control = this, + value, + thisInput, + inputDefault, + changeAction, + controlClass = '.customize-control-generatepress-pro-range-slider', + footerActions = jQuery( '#customize-footer-actions' ); + + // Set up the sliders + jQuery( '.generatepress-slider' ).each( function() { + var _this = jQuery( this ); + var _input = _this.closest( 'label' ).find( 'input[type="number"]' ); + var _text = _input.next( '.value' ); + _this.slider({ + value: _input.val(), + min: _this.data( 'min' ), + max: _this.data( 'max' ), + step: _this.data( 'step' ), + slide: function( event, ui ) { + _input.val( ui.value ).change(); + _text.text( ui.value ); + } + }); + }); + + // Update the range value based on the input value + jQuery( controlClass + ' .gp_range_value input[type=number]' ).on( 'input', function() { + value = jQuery( this ).attr( 'value' ); + if ( '' == value ) { + value = -1; + } + jQuery( this ).closest( 'label' ).find( '.generatepress-slider' ).slider( 'value', parseFloat(value)).change(); + }); + + // Handle the reset button + jQuery( controlClass + ' .generatepress-reset' ).on( 'click', function() { + var icon = jQuery( this ), + visible_area = icon.closest( '.gp-range-title-area' ).next( '.gp-range-slider-areas' ).children( 'label:visible' ), + input = visible_area.find( 'input[type=number]' ), + slider_value = visible_area.find( '.generatepress-slider' ), + visual_value = visible_area.find( '.gp_range_value' ), + reset_value = input.attr( 'data-reset_value' ); + + input.val( reset_value ).change(); + visual_value.find( 'input' ).val( reset_value ); + visual_value.find( '.value' ).text( reset_value ); + + if ( '' == reset_value ) { + reset_value = -1; + } + + slider_value.slider( 'value', parseFloat( reset_value ) ); + }); + + // Figure out which device icon to make active on load + jQuery( controlClass + ' .generatepress-range-slider-control' ).each( function() { + var _this = jQuery( this ); + _this.find( '.gp-device-controls' ).children( 'span:first-child' ).addClass( 'selected' ); + _this.find( '.range-option-area:first-child' ).show(); + }); + + // Do stuff when device icons are clicked + jQuery( controlClass + ' .gp-device-controls > span' ).on( 'click', function( event ) { + var device = jQuery( this ).data( 'option' ); + + jQuery( controlClass + ' .gp-device-controls span' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.addClass( 'selected' ); + _this.siblings().removeClass( 'selected' ); + } + }); + + jQuery( controlClass + ' .gp-range-slider-areas label' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.show(); + _this.siblings().hide(); + } + }); + + // Set the device we're currently viewing + wp.customize.previewedDevice.set( jQuery( event.currentTarget ).data( 'option' ) ); + } ); + + // Set the selected devices in our control when the Customizer devices are clicked + footerActions.find( '.devices button' ).on( 'click', function() { + var device = jQuery( this ).data( 'device' ); + jQuery( controlClass + ' .gp-device-controls span' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.addClass( 'selected' ); + _this.siblings().removeClass( 'selected' ); + } + }); + + jQuery( controlClass + ' .gp-range-slider-areas label' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.show(); + _this.siblings().hide(); + } + }); + }); + + // Apply changes when desktop slider is changed + control.container.on( 'input change', '.desktop-range', + function() { + control.settings['desktop'].set( jQuery( this ).val() ); + } + ); + + // Apply changes when tablet slider is changed + control.container.on( 'input change', '.tablet-range', + function() { + control.settings['tablet'].set( jQuery( this ).val() ); + } + ); + + // Apply changes when mobile slider is changed + control.container.on( 'input change', '.mobile-range', + function() { + control.settings['mobile'].set( jQuery( this ).val() ); + } + ); + } + +}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/library/customizer/controls/js/spacing-customizer.js b/wp-content/plugins/gp-premium/library/customizer/controls/js/spacing-customizer.js new file mode 100644 index 0000000..ad2eeee --- /dev/null +++ b/wp-content/plugins/gp-premium/library/customizer/controls/js/spacing-customizer.js @@ -0,0 +1,200 @@ +( function( $, api ) { + // No longer needed as of 1.2.95 + // Keeping it here just in case + api.controlConstructor['spacing'] = api.Control.extend( { + ready: function() { + var control = this; + $( '.generate-number-control', control.container ).on( 'change keyup', + function() { + control.setting.set( $( this ).val() ); + } + ); + } + } ); + + api.controlConstructor['gp-spacing-slider'] = api.Control.extend( { + ready: function() { + var control = this; + $( '.slider-input', control.container ).on( 'change keyup', + function() { + control.setting.set( $( this ).val() ); + } + ); + } + } ); + + api.controlConstructor['generatepress-spacing'] = api.Control.extend( { + ready: function() { + var control = this, + controlClass = '.customize-control-generatepress-spacing', + footerActions = jQuery( '#customize-footer-actions' ); + + // Figure out which device icon to make active on load + jQuery( controlClass + ' .gp-spacing-control-section' ).each( function() { + var _this = jQuery( this ); + _this.find( '.gp-device-controls' ).children( 'span:first-child' ).addClass( 'selected' ); + _this.find( '.spacing-values-area:first-child' ).show(); + }); + + // Do stuff when device icons are clicked + jQuery( controlClass + ' .gp-device-controls > span' ).on( 'click', function( event ) { + var device = jQuery( this ).data( 'option' ); + + jQuery( controlClass + ' .gp-device-controls span' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.addClass( 'selected' ); + _this.siblings().removeClass( 'selected' ); + } + }); + + jQuery( controlClass + ' .spacing-values-container .spacing-values-area' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.show(); + _this.siblings().hide(); + } + }); + + // Set the device we're currently viewing + wp.customize.previewedDevice.set( jQuery( event.currentTarget ).data( 'option' ) ); + } ); + + // Set the selected devices in our control when the Customizer devices are clicked + footerActions.find( '.devices button' ).on( 'click', function() { + var device = jQuery( this ).data( 'device' ); + jQuery( controlClass + ' .gp-device-controls span' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.addClass( 'selected' ); + _this.siblings().removeClass( 'selected' ); + } + }); + + jQuery( controlClass + ' .spacing-values-container .spacing-values-area' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.show(); + _this.siblings().hide(); + } + }); + }); + + control.container.on( 'change keyup', '.spacing-top', + function() { + control.settings['desktop_top'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.spacing-right', + function() { + control.settings['desktop_right'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.spacing-bottom', + function() { + control.settings['desktop_bottom'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.spacing-left', + function() { + control.settings['desktop_left'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.tablet-spacing-top', + function() { + control.settings['tablet_top'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.tablet-spacing-right', + function() { + control.settings['tablet_right'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.tablet-spacing-bottom', + function() { + control.settings['tablet_bottom'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.tablet-spacing-left', + function() { + control.settings['tablet_left'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.mobile-spacing-top', + function() { + control.settings['mobile_top'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.mobile-spacing-right', + function() { + control.settings['mobile_right'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.mobile-spacing-bottom', + function() { + control.settings['mobile_bottom'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change keyup', '.mobile-spacing-left', + function() { + control.settings['mobile_left'].set( jQuery( this ).val() ); + } + ); + } + } ); +} )( jQuery, wp.customize ); + +jQuery( document ).ready( function($) { + $( '.gp-link-spacing' ).on( 'click', function(e) { + e.preventDefault(); + + // Set up variables + var _this = $( this ), + element = _this.data( 'element' ); + + // Add our linked-values class to the next 4 elements + _this.parent( '.gp-spacing-section' ).prevAll().slice(0,4).find( 'input' ).addClass( 'linked-values' ).attr( 'data-element', element ); + + // Change our link icon class + _this.hide(); + _this.next( 'span' ).show(); + }); + + $( '.gp-unlink-spacing' ).on( 'click', function(e) { + e.preventDefault(); + + // Set up variables + var _this = $( this ); + + // Remove our linked-values class to the next 4 elements + _this.parent( '.gp-spacing-section' ).prevAll().slice(0,4).find( 'input' ).removeClass( 'linked-values' ).attr( 'data-element', '' ); + + // Change our link icon class + _this.hide(); + _this.prev( 'span' ).show(); + }); + + $( '.gp-spacing-section' ).on( 'input', '.linked-values', function() { + var _this = $( this ), + data = _this.attr( 'data-element' ), + val = _this.val(), + targetElements = _this.closest( '.spacing-values-area' ).find( '.linked-values[ data-element="' + data + '" ]' ); + + + targetElements.each( function( key, value ) { + var element = $( this ); + element.val( val ).change(); + }); + }); +}); diff --git a/wp-content/plugins/gp-premium/library/customizer/controls/js/typography-customizer.js b/wp-content/plugins/gp-premium/library/customizer/controls/js/typography-customizer.js new file mode 100644 index 0000000..002dec0 --- /dev/null +++ b/wp-content/plugins/gp-premium/library/customizer/controls/js/typography-customizer.js @@ -0,0 +1,151 @@ +( function( api ) { + + api.controlConstructor['gp-pro-customizer-typography'] = api.Control.extend( { + ready: function() { + var control = this; + + control.container.on( 'change', '.generatepress-font-family select', + function() { + var _this = jQuery( this ), + _value = _this.val(), + _categoryID = _this.attr( 'data-category' ), + _variantsID = _this.attr( 'data-variants' ); + + // Set our font family + control.settings['family'].set( _this.val() ); + + // Bail if our controls don't exist + if ( 'undefined' == typeof control.settings['category'] || 'undefined' == typeof control.settings['variant'] ) { + return; + } + + setTimeout( function() { + // Send our request to the generate_get_all_google_fonts_ajax function + var response = jQuery.getJSON({ + type: 'POST', + url: ajaxurl, + data: { + action: 'generate_get_all_google_fonts_ajax', + gp_customize_nonce: gp_customize.nonce + }, + async: false, + dataType: 'json', + }); + + // Get our response + var fonts = response.responseJSON; + + // Create an ID from our selected font + var id = _value.split(' ').join('_').toLowerCase(); + + // Set our values if we have them + if ( id in fonts ) { + + // Get existing variants if this font is already selected + var got_variants = false; + jQuery( '.generatepress-font-family select' ).not( _this ).each( function( key, select ) { + var parent = jQuery( this ).closest( '.generatepress-font-family' ); + + if ( _value == jQuery( select ).val() && _this.data( 'category' ) !== jQuery( select ).data( 'category' ) ) { + if ( ! got_variants ) { + updated_variants = jQuery( parent.next( '.generatepress-font-variant' ).find( 'select' ) ).val(); + got_variants = true; + } + } + } ); + + // We're using a Google font, so show the variants field + _this.closest( '.generatepress-font-family' ).next( 'div' ).show(); + + // Remove existing variants + jQuery( 'select[name="' + _variantsID + '"]' ).find( 'option' ).remove(); + + // Populate our select input with available variants + jQuery.each( fonts[ id ].variants, function( key, value ) { + jQuery( 'select[name="' + _variantsID + '"]' ).append( jQuery( '' ).attr( 'value', value ).text( value ) ); + } ); + + // Set our variants + if ( ! got_variants ) { + control.settings[ 'variant' ].set( fonts[ id ].variants ); + } else { + control.settings[ 'variant' ].set( updated_variants ); + } + + // Set our font category + control.settings[ 'category' ].set( fonts[ id ].category ); + jQuery( 'input[name="' + _categoryID + '"' ).val( fonts[ id ].category ); + } else { + _this.closest( '.generatepress-font-family' ).next( 'div' ).hide(); + control.settings[ 'category' ].set( '' ) + control.settings[ 'variant' ].set( '' ) + jQuery( 'input[name="' + _categoryID + '"' ).val( '' ); + jQuery( 'select[name="' + _variantsID + '"]' ).find( 'option' ).remove(); + } + }, 25 ); + } + ); + + control.container.on( 'change', '.generatepress-font-variant select', + function() { + var _this = jQuery( this ); + var variants = _this.val(); + + control.settings['variant'].set( variants ); + + jQuery( '.generatepress-font-variant select' ).each( function( key, value ) { + var this_control = jQuery( this ).closest( 'li' ).attr( 'id' ).replace( 'customize-control-', '' ); + var parent = jQuery( this ).closest( '.generatepress-font-variant' ); + var font_val = api.control( this_control ).settings['family'].get(); + + if ( font_val == control.settings['family'].get() && _this.attr( 'name' ) !== jQuery( value ).attr( 'name' ) ) { + jQuery( parent.find( 'select' ) ).not( _this ).val( variants ).triggerHandler( 'change' ); + api.control( this_control ).settings['variant'].set( variants ); + } + } ); + } + ); + + control.container.on( 'change', '.generatepress-font-category input', + function() { + control.settings['category'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change', '.generatepress-font-weight select', + function() { + control.settings['weight'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change', '.generatepress-font-transform select', + function() { + control.settings['transform'].set( jQuery( this ).val() ); + } + ); + + } + } ); + +} )( wp.customize ); + +jQuery( document ).ready( function($) { + + jQuery( '.generatepress-font-family select' ).selectWoo(); + jQuery( '.generatepress-font-variant' ).each( function( key, value ) { + var _this = $( this ); + var value = _this.data( 'saved-value' ); + if ( value ) { + value = value.toString().split( ',' ); + } + _this.find( 'select' ).selectWoo().val( value ).trigger( 'change.select2' ); + } ); + + $( ".generatepress-font-family" ).each( function( key, value ) { + var _this = $( this ); + if ( $.inArray( _this.find( 'select' ).val(), typography_defaults ) !== -1 ) { + _this.next( '.generatepress-font-variant' ).hide(); + } + }); + +} ); diff --git a/wp-content/plugins/gp-premium/library/customizer/deprecated.php b/wp-content/plugins/gp-premium/library/customizer/deprecated.php new file mode 100644 index 0000000..00dd2f9 --- /dev/null +++ b/wp-content/plugins/gp-premium/library/customizer/deprecated.php @@ -0,0 +1,324 @@ +manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); +} +endif; + +if ( ! function_exists( 'generate_backgrounds_is_top_bar_active' ) ) : +/** + * Check to see if the top bar is active + * + * @since 1.3.45 + */ +function generate_backgrounds_is_top_bar_active() +{ + $top_bar = is_active_sidebar( 'top-bar' ) ? true : false; + return apply_filters( 'generate_is_top_bar_active', $top_bar ); +} +endif; + +if ( ! function_exists( 'generate_blog_sanitize_choices' ) ) : +/** + * Sanitize choices + */ +function generate_blog_sanitize_choices( $input, $setting ) { + + // Ensure input is a slug + $input = sanitize_key( $input ); + + // Get list of choices from the control + // associated with the setting + $choices = $setting->manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); +} +endif; + +if ( ! function_exists( 'generate_blog_is_posts_page' ) ) : +/** + * Check to see if we're on a posts page + */ +function generate_blog_is_posts_page() +{ + $blog = ( is_home() || is_archive() || is_attachment() || is_tax() ) ? true : false; + + return $blog; +} +endif; + +if ( ! function_exists( 'generate_blog_is_posts_page_single' ) ) : +/** + * Check to see if we're on a posts page or a single post + */ +function generate_blog_is_posts_page_single() +{ + $blog = ( is_home() || is_archive() || is_attachment() || is_tax() || is_single() ) ? true : false; + + return $blog; +} +endif; + +if ( ! function_exists( 'generate_blog_is_excerpt' ) ) : +/** + * Check to see if we're displaying excerpts + */ +function generate_blog_is_excerpt() +{ + if ( ! function_exists( 'generate_get_defaults' ) ) + return; + + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_defaults() + ); + + return ( 'excerpt' == $generate_settings['post_content'] ) ? true : false; +} +endif; + +if ( ! function_exists( 'generate_colors_sanitize_hex_color' ) ) : +/** + * Sanitize hex colors + * We don't use the core function as we want to allow empty values + * @since 0.1 + */ +function generate_colors_sanitize_hex_color( $color ) { + if ( '' === $color ) + return ''; + + // 3 or 6 hex digits, or the empty string. + if ( preg_match('|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) + return $color; + + return ''; +} +endif; + +if ( ! function_exists( 'generate_colors_sanitize_rgba' ) ) : +/** + * Sanitize RGBA colors + * @since 1.3.42 + */ +function generate_colors_sanitize_rgba( $color ) { + if ( '' === $color ) + return ''; + + // If string does not start with 'rgba', then treat as hex + // sanitize the hex color and finally convert hex to rgba + if ( false === strpos( $color, 'rgba' ) ) { + return generate_colors_sanitize_hex_color( $color ); + } + + // By now we know the string is formatted as an rgba color so we need to further sanitize it. + $color = str_replace( ' ', '', $color ); + sscanf( $color, 'rgba(%d,%d,%d,%f)', $red, $green, $blue, $alpha ); + return 'rgba('.$red.','.$green.','.$blue.','.$alpha.')'; + + return ''; +} +endif; + +if ( ! function_exists( 'generate_menu_plus_sanitize_choices' ) ) : +/** + * Sanitize choices + */ +function generate_menu_plus_sanitize_choices( $input, $setting ) { + + // Ensure input is a slug + $input = sanitize_key( $input ); + + // Get list of choices from the control + // associated with the setting + $choices = $setting->manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); +} +endif; + +if ( ! function_exists( 'generate_page_header_is_posts_page' ) ) : +/** + * This is an active_callback + * Check if we're on a posts page + */ +function generate_page_header_is_posts_page() +{ + $blog = ( is_home() || is_archive() || is_attachment() || is_tax() ) ? true : false; + + return $blog; +} +endif; + +if ( ! function_exists( 'generate_page_header_is_posts_page_single' ) ) : +/** + * Check to see if we're on a posts page or a single post + */ +function generate_page_header_is_posts_page_single() +{ + $blog = ( is_home() || is_archive() || is_attachment() || is_tax() || is_single() ) ? true : false; + + return $blog; +} +endif; + +if ( ! function_exists( 'generate_secondary_nav_sanitize_choices' ) ) : +/** + * Sanitize choices + */ +function generate_secondary_nav_sanitize_choices( $input, $setting ) { + + // Ensure input is a slug + $input = sanitize_key( $input ); + + // Get list of choices from the control + // associated with the setting + $choices = $setting->manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); +} +endif; + +if ( ! function_exists( 'generate_spacing_sanitize_choices' ) ) : +/** + * Sanitize choices + */ +function generate_spacing_sanitize_choices( $input, $setting ) { + + // Ensure input is a slug + $input = sanitize_key( $input ); + + // Get list of choices from the control + // associated with the setting + $choices = $setting->manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); +} +endif; + +if ( ! function_exists( 'generate_premium_sanitize_typography' ) ) : +/** + * Sanitize typography dropdown + * @since 1.1.10 + * @deprecated 1.2.95 + */ +function generate_premium_sanitize_typography( $input ) +{ + if ( ! function_exists( 'generate_get_all_google_fonts' ) || ! function_exists( 'generate_typography_default_fonts' ) ) { + return 'Open Sans'; + } + + // Grab all of our fonts + $fonts = generate_get_all_google_fonts(); + + // Loop through all of them and grab their names + $font_names = array(); + foreach ( $fonts as $k => $fam ) { + $font_names[] = $fam['name']; + } + + // Get all non-Google font names + $not_google = generate_typography_default_fonts(); + + // Merge them both into one array + $valid = array_merge( $font_names, $not_google ); + + // Sanitize + if ( in_array( $input, $valid ) ) { + return $input; + } else { + return 'Open Sans'; + } +} +endif; + +if ( ! function_exists( 'generate_typography_sanitize_choices' ) ) : +/** + * Sanitize choices + * @since 1.3.24 + */ +function generate_typography_sanitize_choices( $input, $setting ) { + + // Ensure input is a slug + $input = sanitize_key( $input ); + + // Get list of choices from the control + // associated with the setting + $choices = $setting->manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); +} +endif; + +if ( ! function_exists( 'generate_page_header_sanitize_choices' ) ) : +/** + * Sanitize our select inputs + */ +function generate_page_header_sanitize_choices( $input, $setting ) { + + // Ensure input is a slug + $input = sanitize_key( $input ); + + // Get list of choices from the control + // associated with the setting + $choices = $setting->manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); +} +endif; + +if ( ! function_exists( 'generate_page_header_sanitize_hex_color' ) ) : +/** + * Sanitize colors + * We don't use the core function as we want to allow empty values + */ +function generate_page_header_sanitize_hex_color( $color ) { + if ( '' === $color ) + return ''; + + // 3 or 6 hex digits, or the empty string. + if ( preg_match('|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) + return $color; + + return ''; +} +endif; + +if ( ! function_exists( 'generate_page_header_sanitize_html' ) ) : +/** + * Sanitize our fields that accept HTML + */ +function generate_page_header_sanitize_html( $input ) +{ + return wp_kses_post( $input ); +} +endif; \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/library/customizer/sanitize.php b/wp-content/plugins/gp-premium/library/customizer/sanitize.php new file mode 100644 index 0000000..a0cb7ef --- /dev/null +++ b/wp-content/plugins/gp-premium/library/customizer/sanitize.php @@ -0,0 +1,131 @@ +manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); + } +} + +if ( ! function_exists( 'generate_premium_sanitize_checkbox' ) ) { + /** + * Sanitize checkbox + */ + function generate_premium_sanitize_checkbox( $checked ) { + // Boolean check. + return ( ( isset( $checked ) && true == $checked ) ? true : false ); + } +} + +if ( ! function_exists( 'generate_premium_sanitize_hex_color' ) ) { + /** + * Sanitize hex colors + * We don't use the core function as we want to allow empty values + * + * @since 0.1 + */ + function generate_premium_sanitize_hex_color( $color ) { + if ( '' === $color ) { + return ''; + } + + // 3 or 6 hex digits, or the empty string. + if ( preg_match('|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) { + return $color; + } + + return ''; + } +} + +if ( ! function_exists( 'generate_premium_sanitize_rgba' ) ) { + /** + * Sanitize RGBA colors + * + * @since 1.3.42 + */ + function generate_premium_sanitize_rgba( $color ) { + if ( '' === $color ) { + return ''; + } + + // If string does not start with 'rgba', then treat as hex + // sanitize the hex color and finally convert hex to rgba + if ( false === strpos( $color, 'rgba' ) ) { + return generate_premium_sanitize_hex_color( $color ); + } + + // By now we know the string is formatted as an rgba color so we need to further sanitize it. + $color = str_replace( ' ', '', $color ); + sscanf( $color, 'rgba(%d,%d,%d,%f)', $red, $green, $blue, $alpha ); + return 'rgba('.$red.','.$green.','.$blue.','.$alpha.')'; + + return ''; + } +} + +if ( ! function_exists( 'generate_premium_sanitize_decimal_integer' ) ) { + /** + * Sanitize integers that can use decimals + * + * @since 1.3.41 + */ + function generate_premium_sanitize_decimal_integer( $input ) { + return abs( floatval( $input ) ); + } +} + +/** + * Sanitize integers that can use decimals + * @since 1.4 + */ +function generate_premium_sanitize_decimal_integer_empty( $input ) { + if ( '' == $input ) { + return ''; + } + + return abs( floatval( $input ) ); +} + +if ( ! function_exists( 'generate_premium_sanitize_html' ) ) { + /** + * Sanitize our fields that accept HTML + */ + function generate_premium_sanitize_html( $input ) { + return wp_kses_post( $input ); + } +} + +function generate_premium_sanitize_variants( $input ) { + if ( is_array( $input ) ) { + $input = implode( ',', $input ); + } + + return sanitize_text_field( $input ); +} diff --git a/wp-content/plugins/gp-premium/library/image-processing-queue/image-processing-queue.php b/wp-content/plugins/gp-premium/library/image-processing-queue/image-processing-queue.php new file mode 100644 index 0000000..0ae72af --- /dev/null +++ b/wp-content/plugins/gp-premium/library/image-processing-queue/image-processing-queue.php @@ -0,0 +1,17 @@ +process = new IPQ_Process(); + add_filter( 'update_post_metadata', array( $this, 'filter_update_post_metadata' ), 10, 5 ); + } + + /** + * Filter the post meta data for backup sizes + * + * Unfortunately WordPress core is lacking hooks in its image resizing functions so we are reduced + * to this hackery to detect when images are resized and previous versions are relegated to backup sizes. + * + * @param bool $check + * @param int $object_id + * @param string $meta_key + * @param mixed $meta_value + * @param mixed $prev_value + * @return bool + */ + public function filter_update_post_metadata( $check, $object_id, $meta_key, $meta_value, $prev_value ) { + if ( '_wp_attachment_backup_sizes' !== $meta_key ) { + return $check; + } + + $current_value = get_post_meta( $object_id, $meta_key, true ); + + if ( ! $current_value ) { + $current_value = array(); + } + + $diff = array_diff_key( $meta_value, $current_value ); + + if ( ! $diff ) { + return $check; + } + + $key = key( $diff ); + $suffix = substr( $key, strrpos( $key, '-' ) + 1 ); + + $image_meta = self::get_image_meta( $object_id ); + + foreach ( $image_meta['sizes'] as $size_name => $size ) { + if ( 0 !== strpos( $size_name, 'ipq-' ) ) { + continue; + } + + $meta_value[ $size_name . '-' . $suffix ] = $size; + unset( $image_meta['sizes'][ $size_name ] ); + } + + if ( ! $this->is_updating_backup_sizes ) { + $this->is_updating_backup_sizes = true; + update_post_meta( $object_id, '_wp_attachment_backup_sizes', $meta_value ); + wp_update_attachment_metadata( $object_id, $image_meta ); + return true; + } + + $this->is_updating_backup_sizes = false; + + return $check; + } + + /** + * Check if the image sizes exist and push them to the queue if not. + * + * @param int $post_id + * @param array $sizes + */ + protected function process_image( $post_id, $sizes ) { + $new_item = false; + + foreach ( $sizes as $size ) { + if ( self::does_size_already_exist_for_image( $post_id, $size ) ) { + continue; + } + + if ( self::is_size_larger_than_original( $post_id, $size ) ) { + continue; + } + + $item = array( + 'post_id' => $post_id, + 'width' => $size[0], + 'height' => $size[1], + 'crop' => $size[2], + ); + $this->process->push_to_queue( $item ); + $new_item = true; + } + + if ( $new_item ) { + $this->process->save()->dispatch(); + } + } + + /** + * Get image HTML for a specific context in a theme, specifying the exact sizes + * for the image. The first image size is always used as the `src` and the other + * sizes are used in the `srcset` if they're the same aspect ratio as the original + * image. If any of the image sizes don't currently exist, they are queued for + * creation by a background process. Example: + * + * echo ipq_get_theme_image( 1353, array( + * array( 600, 400, false ), + * array( 1280, 720, false ), + * array( 1600, 1067, false ), + * ), + * array( + * 'class' => 'header-banner' + * ) + * ); + * + * @param int $post_id Image attachment ID. + * @param array $sizes Array of arrays of sizes in the format array(width,height,crop). + * @param string $attr Optional. Attributes for the image markup. Default empty. + * @return string HTML img element or empty string on failure. + */ + public function get_image( $post_id, $sizes, $attr = '' ) { + $this->process_image( $post_id, $sizes ); + + return wp_get_attachment_image( $post_id, array( $sizes[0][0], $sizes[0][1] ), false, $attr ); + } + + /** + * Get image URL for a specific context in a theme, specifying the exact size + * for the image. If the image size does not currently exist, it is queued for + * creation by a background process. Example: + * + * echo ipq_get_theme_image_url( 1353, array( 600, 400, false ) ); + * + * @param int $post_id + * @param array $size + * + * @return string + */ + public function get_image_url( $post_id, $size ) { + $this->process_image( $post_id, array( $size ) ); + + $size = self::get_size_name( $size ); + $src = wp_get_attachment_image_src( $post_id, $size ); + + if ( isset( $src[0] ) ) { + return $src[0]; + } + + return ''; + } + + /** + * Get array index name for image size. + * + * @param array $size array in format array(width,height,crop). + * @return string Image size name. + */ + public static function get_size_name( $size ) { + $crop = $size[2] ? 'true' : 'false'; + return 'ipq-' . $size[0] . 'x' . $size[1] . '-' . $crop; + } + + /** + * Get an image's file path. + * + * @param int $post_id ID of the image post. + * @return false|string + */ + public static function get_image_path( $post_id ) { + return get_attached_file( $post_id ); + } + + /** + * Get an image's post meta data. + * + * @param int $post_id ID of the image post. + * @return mixed Post meta field. False on failure. + */ + public static function get_image_meta( $post_id ) { + return wp_get_attachment_metadata( $post_id ); + } + + /** + * Update meta data for an image + * + * @param int $post_id Image ID. + * @param array $data Image data. + * @return bool|int False if $post is invalid. + */ + public static function update_image_meta( $post_id, $data ) { + return wp_update_attachment_metadata( $post_id, $data ); + } + + /** + * Checks if an image size already exists for an image + * + * @param int $post_id Image ID. + * @param array $size array in format array(width,height,crop). + * @return bool + */ + public static function does_size_already_exist_for_image( $post_id, $size ) { + $image_meta = self::get_image_meta( $post_id ); + $size_name = self::get_size_name( $size ); + + return isset( $image_meta['sizes'][ $size_name ] ); + } + + /** + * Check if an image size is larger than the original. + * + * @param int $post_id Image ID. + * @param array $size array in format array(width,height,crop). + * + * @return bool + */ + public static function is_size_larger_than_original( $post_id, $size ) { + $image_meta = self::get_image_meta( $post_id ); + + if ( ! isset( $image_meta['width'] ) || ! isset( $image_meta['height'] ) ) { + return true; + } + + if ( $size[0] > $image_meta['width'] || $size[1] > $image_meta['height'] ) { + return true; + } + + return false; + } + } + +} diff --git a/wp-content/plugins/gp-premium/library/image-processing-queue/includes/class-ipq-process.php b/wp-content/plugins/gp-premium/library/image-processing-queue/includes/class-ipq-process.php new file mode 100644 index 0000000..88da843 --- /dev/null +++ b/wp-content/plugins/gp-premium/library/image-processing-queue/includes/class-ipq-process.php @@ -0,0 +1,97 @@ + 0, + 'width' => 0, + 'height' => 0, + 'crop' => false, + ); + $item = wp_parse_args( $item, $defaults ); + + $post_id = $item['post_id']; + $width = $item['width']; + $height = $item['height']; + $crop = $item['crop']; + + if ( ! $width && ! $height ) { + throw new IPQ_Process_Exception( "Invalid dimensions '{$width}x{$height}'" ); + } + + if ( Image_Processing_Queue::does_size_already_exist_for_image( $post_id, array( $width, $height, $crop ) ) ) { + return false; + } + + $image_meta = Image_Processing_Queue::get_image_meta( $post_id ); + + if ( ! $image_meta ) { + return false; + } + + add_filter( 'as3cf_get_attached_file_copy_back_to_local', '__return_true' ); + $img_path = Image_Processing_Queue::get_image_path( $post_id ); + + if ( ! $img_path ) { + return false; + } + + $editor = wp_get_image_editor( $img_path ); + + if ( is_wp_error( $editor ) ) { + throw new IPQ_Process_Exception( 'Unable to get WP_Image_Editor for file "' . $img_path . '": ' . $editor->get_error_message() . ' (is GD or ImageMagick installed?)' ); + } + + if ( is_wp_error( $editor->resize( $width, $height, $crop ) ) ) { + throw new IPQ_Process_Exception( 'Error resizing image: ' . $editor->get_error_message() ); + } + + $resized_file = $editor->save(); + + if ( is_wp_error( $resized_file ) ) { + throw new IPQ_Process_Exception( 'Unable to save resized image file: ' . $editor->get_error_message() ); + } + + $size_name = Image_Processing_Queue::get_size_name( array( $width, $height, $crop ) ); + $image_meta['sizes'][ $size_name ] = array( + 'file' => $resized_file['file'], + 'width' => $resized_file['width'], + 'height' => $resized_file['height'], + 'mime-type' => $resized_file['mime-type'], + ); + wp_update_attachment_metadata( $post_id, $image_meta ); + + return false; + } + } +} + diff --git a/wp-content/plugins/gp-premium/library/image-processing-queue/includes/ipq-template-functions.php b/wp-content/plugins/gp-premium/library/image-processing-queue/includes/ipq-template-functions.php new file mode 100644 index 0000000..13c6fc3 --- /dev/null +++ b/wp-content/plugins/gp-premium/library/image-processing-queue/includes/ipq-template-functions.php @@ -0,0 +1,47 @@ + 'header-banner' + * ) + * ); + * + * @param int $post_id Image attachment ID. + * @param array $sizes Array of arrays of sizes in the format array(width,height,crop). + * @param string $attr Optional. Attributes for the image markup. Default empty. + * + * @return string HTML img element or empty string on failure. + */ + function ipq_get_theme_image( $post_id, $sizes, $attr = '' ) { + return Image_Processing_Queue::instance()->get_image( $post_id, $sizes, $attr ); + } +} + +if ( ! function_exists( 'ipq_get_theme_image_url' ) ) { + /** + * Get image URL for a specific context in a theme, specifying the exact size + * for the image. If the image size does not currently exist, it is queued for + * creation by a background process. Example: + * + * echo ipq_get_theme_image_url( 1353, array( 600, 400, false ) ); + * + * @param int $post_id + * @param array $size + * + * @return string Img URL + */ + function ipq_get_theme_image_url( $post_id, $size ) { + return Image_Processing_Queue::instance()->get_image_url( $post_id, $size ); + } +} diff --git a/wp-content/plugins/gp-premium/library/select2/select2.full.min.js b/wp-content/plugins/gp-premium/library/select2/select2.full.min.js new file mode 100644 index 0000000..567c81a --- /dev/null +++ b/wp-content/plugins/gp-premium/library/select2/select2.full.min.js @@ -0,0 +1 @@ +/*! Select2 1.0.1 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return v.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=b&&b.split("/"),p=t.map,q=p&&p["*"]||{};if(a){for(a=a.split("/"),g=a.length-1,t.nodeIdCompat&&x.test(a[g])&&(a[g]=a[g].replace(x,"")),"."===a[0].charAt(0)&&o&&(n=o.slice(0,o.length-1),a=n.concat(a)),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}if((o||q)&&p){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),o)for(l=o.length;l>0;l-=1)if((e=p[o.slice(0,l).join("/")])&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=w.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),o.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){r[a]=b}}function j(a){if(e(s,a)){var c=s[a];delete s[a],u[a]=!0,n.apply(b,c)}if(!e(r,a)&&!e(u,a))throw new Error("No "+a);return r[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return a?k(a):[]}function m(a){return function(){return t&&t.config&&t.config[a]||{}}}var n,o,p,q,r={},s={},t={},u={},v=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;p=function(a,b){var c,d=k(a),e=d[0],g=b[1];return a=d[1],e&&(e=f(e,g),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(g)):f(a,g):(a=f(a,g),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},q={require:function(a){return g(a)},exports:function(a){var b=r[a];return void 0!==b?b:r[a]={}},module:function(a){return{id:a,uri:"",exports:r[a],config:m(a)}}},n=function(a,c,d,f){var h,k,m,n,o,t,v,w=[],x=typeof d;if(f=f||a,t=l(f),"undefined"===x||"function"===x){for(c=!c.length&&d.length?["require","exports","module"]:c,o=0;o0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c.isTouchscreen=function(){return void 0===c._isTouchscreenCache&&(c._isTouchscreenCache="ontouchstart"in document.documentElement),c._isTouchscreenCache},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('
      ');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a(''),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()});b.$results.find(".select2-results__option[data-selected]").each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("data-selected","true"):b.attr("data-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"option","data-selected":"false",tabindex:-1};b.disabled&&(delete d["data-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["data-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d["aria-label"]=b.text,delete d["data-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";var i=a(h);this.template(b,h),i.attr("role","presentation");for(var j=[],k=0;k",{class:"select2-results__options select2-results__options--nested",role:"listbox"});n.append(j),g.attr("role","list"),g.append(h),g.append(n)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("data-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[data-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):h-g<0&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[data-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted").attr("aria-selected","true"),d.$results.attr("aria-activedescendant",a.element.attr("id"))}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[data-selected]",function(b){var c=a(this),e=c.data("data");if("true"===c.attr("data-selected"))return void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{}));d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[data-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted").attr("aria-selected","false"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[data-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.options.get("minimumResultsForSearch");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),window.setTimeout(function(){d.$selection.focus()},1),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2");a(".select2.select2-container--open").each(function(){var b=a(this);this!=d[0]&&(b.data("element").select2("close"),setTimeout(function(){b.find("*:focus").blur(),c.focus()},1))})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",d),this.$selection.attr("role","combobox"),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("keydown",function(b){!a.isOpen()&&b.which>=48&&b.which<=90&&a.open()}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
        '),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}}),this.$selection.on("keydown",function(a){!b.isOpen()&&a.which>=48&&a.which<=90&&b.open()}),b.on("focus",function(){e.focusOnSearch()})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('
      • ')},d.prototype.focusOnSearch=function(){var a=this;void 0!==a.$search&&setTimeout(function(){a._keyUpPrevented=!0,a.$search.focus()},1)},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this,f=b.id+"-results";a.call(this,b,d),b.on("open",function(){e.$search.attr("aria-owns",f),e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.removeAttr("aria-owns"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.data._resultId)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}else a.which===c.ENTER&&(b.open(),a.preventDefault())});var g=document.documentMode,h=g&&g<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(h)return void e.$selection.off("input.search input.searchcheck");e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(h&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d="";return d+=null!=b?b.id:a.generateChars(4),d+="-result-",d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f),e.container.focusOnActiveElement()},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this,f=c.id+"-results";b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.attr("aria-owns",f),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.removeAttr("aria-activedescendant"),e.$search.removeAttr("aria-owns"),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}}),c.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.data._resultId)})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
      • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var b=this;this.on("open",function(){b.$container.addClass("select2-container--open")}),this.on("close",function(){b.$container.removeClass("select2-container--open")}),this.on("enable",function(){b.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){b.$container.addClass("select2-container--disabled")}),this.on("blur",function(){b.$container.removeClass("select2-container--focus")}),this.on("query",function(a){b.isOpen()||b.trigger("open",{}),this.dataAdapter.query(a,function(c){b.trigger("results:all",{data:c,query:a})})}),this.on("query:append",function(a){this.dataAdapter.query(a,function(c){b.trigger("results:append",{data:c,query:a})})}),this.on("open",function(){setTimeout(function(){b.focusOnActiveElement()},1)}),a(document).on("keydown",function(a){var c=a.which;if(b.isOpen()){c===d.ESC||c===d.TAB||c===d.UP&&a.altKey?(b.close(),a.preventDefault()):c===d.ENTER?(b.trigger("results:select",{}),a.preventDefault()):c===d.SPACE&&a.ctrlKey?(b.trigger("results:toggle",{}),a.preventDefault()):c===d.UP?(b.trigger("results:previous",{}),a.preventDefault()):c===d.DOWN&&(b.trigger("results:next",{}),a.preventDefault());var e=b.$dropdown.find(".select2-search__field");e.length||(e=b.$container.find(".select2-search__field")),c===d.DOWN||c===d.UP?b.focusOnActiveElement():(e.focus(),setTimeout(function(){b.focusOnActiveElement()},1e3))}else b.hasFocus()&&(c!==d.ENTER&&c!==d.SPACE&&c!==d.DOWN||(b.open(),a.preventDefault()))})},e.prototype.focusOnActiveElement=function(){this.isOpen()&&!c.isTouchscreen()&&this.$results.find("li.select2-results__option--highlighted").focus()},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(f=d(this))&&g.push(f)})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;if(this._isInitialized)return void b.call(this,c);this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a ` + + -1, + 'orderby' => 'title', + 'post_type' => 'generate_page_header', + 'suppress_filters' => false, + )); + + $options[ $type ] = ! isset( $options[ $type ] ) ? '' : $options[ $type ]; + + foreach( $page_headers as $header ) { + printf( '', + $header->ID, + selected( $options[ $type ], $header->ID ), + $header->post_title + ); + } + ?> + + ( window_height - offset ) ) { + jQuery( '.fullscreen-enabled' ).attr( 'style', 'height: initial !important' ); + } +} + +jQuery(document).ready(function($) { + + // Run the header height function + generateHeaderHeight(); + + // Set up the resize timer + var generateResizeTimer; + + if ( jQuery('.generate-page-header.fullscreen-enabled')[0] ) { + // Initiate full window height on resize + var width = $(window).width(); + $(window).resize(function() { + if($(window).width() != width){ + clearTimeout(generateResizeTimer); + generateResizeTimer = setTimeout(generateHeaderHeight, 200); + width = $(window).width(); + } + }); + + $( window ).on( "orientationchange", function( event ) { + if($(window).width() != width){ + clearTimeout(generateResizeTimer); + generateResizeTimer = setTimeout(generateHeaderHeight, 200); + width = $(window).width(); + } + }); + } + +}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/page-header/functions/js/full-height.min.js b/wp-content/plugins/gp-premium/page-header/functions/js/full-height.min.js new file mode 100644 index 0000000..dd988e1 --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/js/full-height.min.js @@ -0,0 +1 @@ +function generateHeaderHeight(){if(jQuery(".fullscreen-enabled").length){var a,b=jQuery(window).height();a=jQuery(".inside-page-header").length?jQuery(".inside-page-header"):jQuery(".generate-inside-combined-content").length?jQuery(".generate-inside-combined-content"):jQuery(".generate-inside-page-header-content");var c=jQuery(".fullscreen-enabled").offset().top;jQuery(".fullscreen-enabled").css("height",b-c+"px"),a.outerHeight()>b-c&&jQuery(".fullscreen-enabled").attr("style","height: initial !important")}}function generateHeaderParallax(){var a=jQuery(".menu-toggle");if(!a.is(":visible")&&jQuery(".generate-page-header.parallax-enabled")[0]){if(jQuery(".page-header-contained")[0])var b=jQuery(".generate-page-header.parallax-enabled .inside-content-header");else var b=jQuery(".generate-page-header.parallax-enabled");var c=jQuery(this).scrollTop(),d=jQuery(".generate-page-header.parallax-enabled").data("parallax-speed");return b.css("background-position","center "+parseInt(-c/d)+"px")}}jQuery(document).ready(function(a){generateHeaderHeight();var b;if(jQuery(".generate-page-header.parallax-enabled")[0]&&a(document).scroll(function(){generateHeaderParallax()}),jQuery(".generate-page-header.fullscreen-enabled")[0]){var c=a(window).width();a(window).resize(function(){a(window).width()!=c&&(clearTimeout(b),b=setTimeout(generateHeaderHeight,200),c=a(window).width())}),a(window).on("orientationchange",function(d){a(window).width()!=c&&(clearTimeout(b),b=setTimeout(generateHeaderHeight,200),c=a(window).width())})}}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/page-header/functions/js/jquery.vide.min.js b/wp-content/plugins/gp-premium/page-header/functions/js/jquery.vide.min.js new file mode 100644 index 0000000..d78004e --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/js/jquery.vide.min.js @@ -0,0 +1,9 @@ +/* + * Vide - v0.5.0 + * Easy as hell jQuery plugin for video backgrounds. + * http://vodkabears.github.io/vide/ + * + * Made by Ilya Makarov + * Under MIT License + */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b("object"==typeof exports?require("jquery"):a.jQuery)}(this,function(a){"use strict";function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,":").replace(/\s*,\s*/g,",").split(","),h=0,g=f.length;g>h&&(c=f[h],-1===c.search(/^(http|https|ftp):\/\//)&&-1!==c.search(":"));h++)b=c.indexOf(":"),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),"string"==typeof e&&(e="true"===e||("false"===e?!1:e)),"string"==typeof e&&(e=isNaN(e)?e:+e),i[d]=e;return null==d&&null==e?a:i}function c(a){a=""+a;var b,c,d,e=a.split(/\s+/),f="50%",g="50%";for(d=0,b=e.length;b>d;d++)c=e[d],"left"===c?f="0%":"right"===c?f="100%":"top"===c?g="0%":"bottom"===c?g="100%":"center"===c?0===d?f="50%":g="50%":0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a('').load(d),a('').load(d),a('').load(d),a('').load(d)}function e(c,d,e){if(this.$element=a(c),"string"==typeof d&&(d=b(d)),e?"string"==typeof e&&(e=b(e)):e={},"string"==typeof d)d=d.replace(/\.\w*$/,"");else if("object"==typeof d)for(var f in d)d.hasOwnProperty(f)&&(d[f]=d[f].replace(/\.\w*$/,""));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f="vide",g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:"50% 50%",posterType:"detect",resizing:!0,bgColor:"transparent",className:""},h="Not implemented";e.prototype.init=function(){var b,e,g=this,i=g.path,j=i,k="",l=g.$element,m=g.settings,n=c(m.position),o=m.posterType;e=g.$wrapper=a("
        ").addClass(m.className).css({position:"absolute","z-index":-1,top:0,left:0,bottom:0,right:0,overflow:"hidden","-webkit-background-size":"cover","-moz-background-size":"cover","-o-background-size":"cover","background-size":"cover","background-color":m.bgColor,"background-repeat":"no-repeat","background-position":n.x+" "+n.y}),"object"==typeof i&&(i.poster?j=i.poster:i.mp4?j=i.mp4:i.webm?j=i.webm:i.ogv&&(j=i.ogv)),"detect"===o?d(j,function(a){e.css("background-image","url("+a+")")}):"none"!==o&&e.css("background-image","url("+j+"."+o+")"),"static"===l.css("position")&&l.css("position","relative"),l.prepend(e),"object"==typeof i?(i.mp4&&(k+=''),i.webm&&(k+=''),i.ogv&&(k+=''),b=g.$video=a("")):b=g.$video=a('');try{b.prop({autoplay:m.autoplay,loop:m.loop,volume:m.volume,muted:m.muted,defaultMuted:m.muted,playbackRate:m.playbackRate,defaultPlaybackRate:m.playbackRate})}catch(p){throw new Error(h)}b.css({margin:"auto",position:"absolute","z-index":-1,top:n.y,left:n.x,"-webkit-transform":"translate(-"+n.x+", -"+n.y+")","-ms-transform":"translate(-"+n.x+", -"+n.y+")","-moz-transform":"translate(-"+n.x+", -"+n.y+")",transform:"translate(-"+n.x+", -"+n.y+")",visibility:"hidden",opacity:0}).one("canplaythrough."+f,function(){g.resize()}).one("playing."+f,function(){b.css({visibility:"visible",opacity:1}),e.css("background-image","none")}),l.on("resize."+f,function(){m.resizing&&g.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e>f/d?b.css({width:g+2,height:"auto"}):b.css({width:"auto",height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&&this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&&d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on("resize."+f,function(){for(var b,c=a[f].lookup.length,d=0;c>d;d++)b=a[f].lookup[d],b&&b.settings.resizing&&b.resize()}),b.on("unload."+f,function(){return!1}),a(document).find("[data-"+f+"-bg]").each(function(b,c){var d=a(c),e=d.data(f+"-options"),g=d.data(f+"-bg");d[f](g,e)})})});jQuery(document).ready(function($) {var page_header_content = $( '.page-header-content' );if ( page_header_content.length ) {if ( page_header_content.hasClass( 'grid-container' ) ) {$( '.inside-page-header-container' ).data('vide').getVideoObject().play();} else {page_header_content.data('vide').getVideoObject().play();}}}); diff --git a/wp-content/plugins/gp-premium/page-header/functions/js/lc_switch.js b/wp-content/plugins/gp-premium/page-header/functions/js/lc_switch.js new file mode 100644 index 0000000..89eae36 --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/js/lc_switch.js @@ -0,0 +1,149 @@ +/** + * lc_switch.js + * Version: 1.0 + * Author: LCweb - Luca Montanari + * Website: http://www.lcweb.it + * Licensed under the MIT license + */ + +(function($){ + if(typeof($.fn.lc_switch) != 'undefined') {return false;} // prevent dmultiple scripts inits + + $.fn.lc_switch = function(on_text, off_text) { + + // destruct + $.fn.lcs_destroy = function() { + + $(this).each(function() { + var $wrap = $(this).parents('.lcs_wrap'); + + $wrap.children().not('input').remove(); + $(this).unwrap(); + }); + + return true; + }; + + + // set to ON + $.fn.lcs_on = function() { + + $(this).each(function() { + var $wrap = $(this).parents('.lcs_wrap'); + var $input = $wrap.find('input'); + + if(typeof($.fn.prop) == 'function') { + $wrap.find('input').prop('checked', true); + } else { + $wrap.find('input').attr('checked', true); + } + + $wrap.find('input').trigger('lcs-on'); + $wrap.find('input').trigger('lcs-statuschange'); + $wrap.find('.lcs_switch').removeClass('lcs_off').addClass('lcs_on'); + + // if radio - disable other ones + if( $wrap.find('.lcs_switch').hasClass('lcs_radio_switch') ) { + var f_name = $input.attr('name'); + $wrap.parents('form').find('input[name='+f_name+']').not($input).lcs_off(); + } + }); + + return true; + }; + + + // set to OFF + $.fn.lcs_off = function() { + + $(this).each(function() { + var $wrap = $(this).parents('.lcs_wrap'); + + if(typeof($.fn.prop) == 'function') { + $wrap.find('input').prop('checked', false); + } else { + $wrap.find('input').attr('checked', false); + } + + $wrap.find('input').trigger('lcs-off'); + $wrap.find('input').trigger('lcs-statuschange'); + $wrap.find('.lcs_switch').removeClass('lcs_on').addClass('lcs_off'); + }); + + return true; + }; + + + // construct + return this.each(function(){ + + // check against double init + if( !$(this).parent().hasClass('lcs_wrap') ) { + + // default texts + var ckd_on_txt = (typeof(on_text) == 'undefined') ? 'ON' : on_text; + var ckd_off_txt = (typeof(off_text) == 'undefined') ? 'OFF' : off_text; + + // labels structure + var on_label = (ckd_on_txt) ? '
        '+ ckd_on_txt +'
        ' : ''; + var off_label = (ckd_off_txt) ? '
        '+ ckd_off_txt +'
        ' : ''; + + + // default states + var disabled = ($(this).is(':disabled')) ? true: false; + var active = ($(this).is(':checked')) ? true : false; + + var status_classes = ''; + status_classes += (active) ? ' lcs_on' : ' lcs_off'; + if(disabled) {status_classes += ' lcs_disabled';} + + + // wrap and append + var structure = + '
        ' + + '
        ' + + on_label + off_label + + '
        '; + + if( $(this).is(':input') && ($(this).attr('type') == 'checkbox' || $(this).attr('type') == 'radio') ) { + + $(this).wrap('
        '); + $(this).parent().append(structure); + + $(this).parent().find('.lcs_switch').addClass('lcs_'+ $(this).attr('type') +'_switch'); + } + } + }); + }; + + + + // handlers + $(document).ready(function() { + + // on click + $(document).delegate('.lcs_switch:not(.lcs_disabled)', 'click tap', function(e) { + + if( $(this).hasClass('lcs_on') ) { + if( !$(this).hasClass('lcs_radio_switch') ) { // not for radio + $(this).lcs_off(); + } + } else { + $(this).lcs_on(); + } + }); + + + // on checkbox status change + $(document).delegate('.lcs_wrap input', 'change', function() { + + if( $(this).is(':checked') ) { + $(this).lcs_on(); + } else { + $(this).lcs_off(); + } + }); + + }); + +})(jQuery); diff --git a/wp-content/plugins/gp-premium/page-header/functions/js/metabox.js b/wp-content/plugins/gp-premium/page-header/functions/js/metabox.js new file mode 100644 index 0000000..b4739c7 --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/js/metabox.js @@ -0,0 +1,220 @@ +jQuery(document).ready(function($) { + $( '#generate-tabs-container input[type="checkbox"]' ).lc_switch( '', '' ); + + $( '.generate-tabs-menu a' ).on( 'click', function( event ) { + event.preventDefault(); + $( this ).parent().addClass( 'generate-current' ); + $( this ).parent().siblings().removeClass( 'generate-current' ); + var tab = $( this ).attr( 'href' ); + $( '.generate-tab-content' ).not(tab).css( 'display', 'none' ); + $( tab ).fadeIn( 100 ); + + if ( '#generate-image-tab' == tab || '#generate-content-tab' == tab ) { + $( '.show-in-excerpt' ).show(); + } else { + $( '.show-in-excerpt' ).hide(); + } + } ); + + $( '#_meta-generate-page-header-content' ).bind( 'input change', function() { + if ( this.value.length ) { + $( '.page-header-content-required' ).hide(); + } else { + $( '.page-header-content-required' ).show(); + } + }); +}); + +jQuery(window).load(function($) { + if ( jQuery( '#_meta-generate-page-header-enable-image-crop' ).val() == 'enable' ) { + jQuery( '#crop-enabled' ).show(); + } + + jQuery( '#_meta-generate-page-header-enable-image-crop' ).change(function () { + if ( jQuery( this ).val() === 'enable' ) { + jQuery( '#crop-enabled' ).show(); + } else { + jQuery( '#crop-enabled' ).hide(); + } + }); + + if ( jQuery( '#_meta-generate-page-header-image-background' ).is( ':checked' ) ) { + jQuery( '.parallax' ).show(); + } else { + jQuery( '.parallax' ).hide(); + } + + jQuery('body').delegate('.image-background', 'lcs-statuschange', function() { + if (jQuery(this).is(":checked")) { + jQuery('.parallax').show(); + } else { + jQuery('.parallax').hide(); + jQuery('#_meta-generate-page-header-image-background-fixed').lcs_off(); + } + }); + + if ( jQuery('#_meta-generate-page-header-full-screen').is(':checked')) { + jQuery('.vertical-center').show(); + } else { + jQuery('.vertical-center').hide(); + } + + jQuery('body').delegate('#_meta-generate-page-header-full-screen', 'lcs-statuschange', function() { + if (jQuery(this).is(":checked")) { + jQuery('.vertical-center').show(); + } else { + jQuery('.vertical-center').hide(); + jQuery('#_meta-generate-page-header-vertical-center').lcs_off(); + } + }); + + if ( jQuery('#_meta-generate-page-header-transparent-navigation').is(':checked')) { + jQuery('.navigation-colors').show(); + } else { + jQuery('.navigation-colors').hide(); + } + + jQuery('body').delegate('#_meta-generate-page-header-transparent-navigation', 'lcs-statuschange', function() { + if (jQuery(this).is(":checked")) { + jQuery('.navigation-colors').show(); + } else { + jQuery('.navigation-colors').hide(); + } + }); + + if ( jQuery('#_meta-generate-page-header-combine').is(':checked')) { + jQuery('.combination-options').show(); + } else { + jQuery('.combination-options').hide(); + } + + jQuery('body').delegate('#_meta-generate-page-header-combine', 'lcs-statuschange', function() { + if (jQuery(this).is(":checked")) { + jQuery('.combination-options').show(); + } else { + jQuery('.combination-options').hide(); + } + }); + + if ( jQuery('#_meta-generate-page-header-image-background-type').val() == '' ) { + jQuery('.vertical-center').hide(); + jQuery('.fullscreen').hide(); + } + jQuery('#_meta-generate-page-header-image-background-type').change(function () { + if (jQuery(this).val() === '') { + jQuery('.vertical-center').hide(); + jQuery('#_meta-generate-page-header-vertical-center').lcs_off(); + jQuery('.fullscreen').hide(); + jQuery('#_meta-generate-page-header-full-screen').lcs_off(); + } else { + //jQuery('.vertical-center').show(); + jQuery('.fullscreen').show(); + } + }); + + var $set_button = jQuery('.generate-upload-file'); + /** + * open the media manager + */ + $set_button.click(function (e) { + e.preventDefault(); + + var $thisbutton = jQuery(this); + var frame = wp.media({ + title : $thisbutton.data('title'), + multiple : false, + library : { type : $thisbutton.data('type') }, + button : { text : $thisbutton.data('insert') } + }); + // close event media manager + frame.on('select', function () { + var attachment = frame.state().get('selection').first().toJSON(); + // set the file + //set_dfi(attachment.url); + $thisbutton.prev('input').val(attachment.url); + $thisbutton.nextAll('input.image-id').val(attachment.id); + if ( $thisbutton.data('prev') === true ) { + $thisbutton.prev('input').prevAll('#preview-image').children('.saved-image').remove(); + $thisbutton.prev('input').prevAll('#preview-image').append(''); + } + $thisbutton.nextAll( '.generate-page-header-remove-image' ).show(); + if ( 'upload_image' == $thisbutton.prev( 'input' ).attr( 'id' ) ) { + jQuery( '.featured-image-message' ).hide(); + jQuery( '.page-header-image-settings' ).show(); + jQuery( '.generate-page-header-set-featured-image' ).hide(); + } + }); + + // everthing is set open the media manager + frame.open(); + }); +}); +jQuery(document).ready(function($) { + $('#generate-tabs-container .color-picker').wpColorPicker(); + + jQuery( '.generate-page-header-remove-image' ).on( 'click', function( e ) { + e.preventDefault(); + var input = jQuery( this ).data( 'input' ); + var input_id = jQuery( this ).data( 'input-id' ); + var preview = jQuery( this ).data( 'prev' ); + jQuery( input ).attr( 'value', '' ); + jQuery( input_id ).attr( 'value', '' ); + jQuery( preview ).children( '.saved-image' ).remove(); + jQuery( this ).hide(); + if ( '-1' == jQuery( '#_thumbnail_id' ).attr( 'value' ) ) { + jQuery( '.page-header-image-settings' ).hide(); + jQuery( '.generate-page-header-set-featured-image' ).show(); + + } else { + jQuery( '.generate-page-header-set-featured-image' ).hide(); + jQuery( '.page-header-image-settings' ).show(); + jQuery( '.featured-image-message' ).show(); + } + return false; + }); + + $('#postimagediv').on( 'click', '#remove-post-thumbnail', function() { + // The featured image is gone, so we can hide the message + jQuery( '.featured-image-message' ).hide(); + + // If there's no other image set, we can hide the image settings + if ( '' == jQuery( '#_meta-generate-page-header-image-id' ).attr( 'value' ) ) { + jQuery( '.page-header-image-settings' ).hide(); + jQuery( '.generate-page-header-set-featured-image' ).show(); + } + + // No more featured image means we can show the 'show excerpt' option + jQuery( '.show-in-excerpt' ).show(); + + return false; + }); + + wp.media.featuredImage.frame().on('select', function() { + + // We have a featured image, so the 'show excerpt' function isn't necessary + jQuery( '.show-in-excerpt' ).hide(); + + // We can stop here if we have a custom image set + if ( '' !== jQuery( '#_meta-generate-page-header-image-id' ).attr( 'value' ) ) + return; + + // Hide the set your featured image message + jQuery( '.generate-page-header-set-featured-image' ).hide(); + + // Show the "using feaured image" message + jQuery( '.featured-image-message' ).show(); + + // Show the image settings (image link, resizing etc..) + jQuery( '.page-header-image-settings' ).show(); + }); + + $( '.generate-featured-image, .generate-page-header-set-featured-image a' ).on( 'click', function( event ) { + event.preventDefault(); + + // Stop propagation to prevent thickbox from activating. + event.stopPropagation(); + + // Open the featured image modal + wp.media.featuredImage.frame().open(); + }); +}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/page-header/functions/js/parallax.js b/wp-content/plugins/gp-premium/page-header/functions/js/parallax.js new file mode 100644 index 0000000..8fe3b26 --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/js/parallax.js @@ -0,0 +1,17 @@ +function generate_parallax_element( selector, context ) { + context = context || document; + var elements = context.querySelectorAll( selector ); + return Array.prototype.slice.call( elements ); +} + +window.addEventListener( "scroll", function() { + var scrolledHeight= window.pageYOffset; + generate_parallax_element( ".parallax-enabled" ).forEach( function( el, index, array ) { + var limit = el.offsetTop + el.offsetHeight; + if( scrolledHeight > el.offsetTop && scrolledHeight <= limit ) { + el.style.backgroundPositionY = ( scrolledHeight - el.offsetTop ) / el.getAttribute( 'data-parallax-speed' ) + "px"; + } else { + el.style.backgroundPositionY = "0"; + } + }); +}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/page-header/functions/js/parallax.min.js b/wp-content/plugins/gp-premium/page-header/functions/js/parallax.min.js new file mode 100644 index 0000000..8263a90 --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/js/parallax.min.js @@ -0,0 +1 @@ +function generate_parallax_element(e,t){var a=(t=t||document).querySelectorAll(e);return Array.prototype.slice.call(a)}window.addEventListener("scroll",function(){var e=window.pageYOffset;generate_parallax_element(".parallax-enabled").forEach(function(t,a,o){var r=t.offsetTop+t.offsetHeight;e>t.offsetTop&&e<=r?t.style.backgroundPositionY=(e-t.offsetTop)/t.getAttribute("data-parallax-speed")+"px":t.style.backgroundPositionY="0"})}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/page-header/functions/js/wp-color-picker-alpha.min.js b/wp-content/plugins/gp-premium/page-header/functions/js/wp-color-picker-alpha.min.js new file mode 100644 index 0000000..c67aacc --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/js/wp-color-picker-alpha.min.js @@ -0,0 +1,340 @@ +/**! + * wp-color-picker-alpha + * + * Overwrite Automattic Iris for enabled Alpha Channel in wpColorPicker + * Only run in input and is defined data alpha in true + * + * Version: 1.2.2 + * https://github.com/23r9i0/wp-color-picker-alpha + * Copyright (c) 2015 Sergio P.A. (23r9i0). + * Licensed under the GPLv2 license. + */ +( function( $ ) { + // Variable for some backgrounds ( grid ) + var image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAAHnlligAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNpi+P///4EDBxiAGMgCCCAGFB5AADGCRBgYDh48CCRZIJS9vT2QBAggFBkmBiSAogxFBiCAoHogAKIKAlBUYTELAiAmEtABEECk20G6BOmuIl0CIMBQ/IEMkO0myiSSraaaBhZcbkUOs0HuBwDplz5uFJ3Z4gAAAABJRU5ErkJggg==', + // html stuff for wpColorPicker copy of the original color-picker.js + _before = '', + _after = '
        ', + _wrap = '
        ', + _button = '', + _wrappingLabel = '', + _wrappingLabelText = ''; + + /** + * Overwrite Color + * for enable support rbga + */ + Color.fn.toString = function() { + if ( this._alpha < 1 ) + return this.toCSS( 'rgba', this._alpha ).replace( /\s+/g, '' ); + + var hex = parseInt( this._color, 10 ).toString( 16 ); + + if ( this.error ) + return ''; + + if ( hex.length < 6 ) + hex = ( '00000' + hex ).substr( -6 ); + + return '#' + hex; + }; + + /** + * Overwrite wpColorPicker + */ + $.widget( 'wp.wpColorPicker', $.wp.wpColorPicker, { + _create: function() { + // bail early for unsupported Iris. + if ( ! $.support.iris ) + return; + + var self = this, + el = self.element; + + self.inputWrapper = el.closest( '.wp-picker-input-wrap' ); + + $.extend( self.options, el.data() ); + + // keep close bound so it can be attached to a body listener + self.close = $.proxy( self.close, self ); + + self.initialValue = el.val(); + + // Set up HTML structure, hide things + el.addClass( 'wp-color-picker' ).wrap( _wrap ); + self.wrap = el.parent(); + self.toggler = $( _before ).insertBefore( el ).css( { backgroundColor : self.initialValue } ).attr( 'title', wpColorPickerL10n.pick ).attr( 'data-current', wpColorPickerL10n.current ); + self.pickerContainer = $( _after ).insertAfter( el ); + self.button = $( _button ); + + if ( self.options.defaultColor ) { + self.button.addClass( 'wp-picker-default' ).val( wpColorPickerL10n.defaultString ); + } else { + self.button.addClass( 'wp-picker-clear' ).val( wpColorPickerL10n.clear ); + } + + el.wrap( '
        ', + __( 'Content is required for the below settings to work.', 'gp-premium' ), + '' !== generate_page_header_get_post_meta( get_the_ID(), '_meta-generate-page-header-content', true ) ? 'style="display:none"' : '' + ); + + if ( '' !== generate_page_header_get_post_meta( get_the_ID(), '_meta-generate-page-header-content', true ) ) { + ?> + + +
        +
          +
        • + +
        • + +
        • + +
        • + +
        • + +
        • + + +
        • + +
        • + + +
        • + +
        • + + +
          > +

          +
          + /> +

          +
          + +
        +
        +
        + + + +
        + + + +
        + + + + + + + + +
        > +

        +
        + +

        + +

        +
        + +

        + + +
        +
        + +
        + + +

        + +
        + +
        +

        + /> + +

        + +

        + /> + +

        + +

        + /> + +

        + +

        + /> + +

        + +

        + /> + +

        + +

        + /> + +

        + +

        + /> + +

        +
        + +
        +

        +
        + +

        + +

        +
        + +

        + +

        +
        + +

        + +

        +
        + + +

        + +

        +
        + + +

        +
        + +
        +

        +
        + +

        + +

        +
        + +

        + +

        +
        + +

        + +

        +
        + +

        +
        +
        +
        +
        + + + + +
        + +

        + +

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

        + +

        + +

        + +
        + + + +
        + + + + + + + + + +
        + + + +
        +
        + 'FILTER_CONTENT', + '_meta-generate-page-header-image' => 'FILTER_SANITIZE_URL', + '_meta-generate-page-header-image-id' => 'FILTER_SANITIZE_NUMBER_INT', + '_meta-generate-page-header-image-link' => 'FILTER_SANITIZE_URL', + '_meta-generate-page-header-enable-image-crop' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-crop' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-width' => 'FILTER_SANITIZE_NUMBER_INT', + '_meta-generate-page-header-image-height' => 'FILTER_SANITIZE_NUMBER_INT', + '_meta-generate-page-header-image-background-type' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-inner-container' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-alignment' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-spacing' => 'FILTER_SANITIZE_NUMBER_INT', + '_meta-generate-page-header-image-background-spacing-unit' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-left-right-padding' => 'FILTER_SANITIZE_NUMBER_INT', + '_meta-generate-page-header-left-right-padding-unit' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-color' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-text-color' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-link-color' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-link-color-hover' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-navigation-background' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-navigation-text' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-navigation-background-hover' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-navigation-text-hover' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-navigation-background-current' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-navigation-text-current' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-site-title' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-site-tagline' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-video' => 'FILTER_SANITIZE_URL', + '_meta-generate-page-header-video-ogv' => 'FILTER_SANITIZE_URL', + '_meta-generate-page-header-video-webm' => 'FILTER_SANITIZE_URL', + '_meta-generate-page-header-video-overlay' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-content-autop' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-content-padding' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-full-screen' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-vertical-center' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-fixed' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-image-background-overlay' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-combine' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-absolute-position' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-transparent-navigation' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-add-to-excerpt' => 'FILTER_SANITIZE_STRING', + '_meta-generate-page-header-logo' => 'FILTER_SANITIZE_URL', + '_meta-generate-page-header-logo-id' => 'FILTER_SANITIZE_NUMBER_INT', + '_meta-generate-page-header-navigation-logo' => 'FILTER_SANITIZE_URL', + '_meta-generate-page-header-navigation-logo-id' => 'FILTER_SANITIZE_NUMBER_INT', + ); + + if ( ! defined( 'GENERATE_LAYOUT_META_BOX' ) ) { + $options[ '_generate-select-page-header' ] = 'FILTER_SANITIZE_NUMBER_INT'; + } + + foreach ( $options as $key => $sanitize ) { + if ( 'FILTER_SANITIZE_STRING' == $sanitize ) { + $value = filter_input( INPUT_POST, $key, FILTER_SANITIZE_STRING ); + } elseif ( 'FILTER_SANITIZE_URL' == $sanitize ) { + $value = filter_input( INPUT_POST, $key, FILTER_SANITIZE_URL ); + } elseif ( 'FILTER_SANITIZE_NUMBER_INT' == $sanitize ) { + $value = filter_input( INPUT_POST, $key, FILTER_SANITIZE_NUMBER_INT ); + } elseif ( 'FILTER_CONTENT' == $sanitize && isset( $_POST[ $key ] ) ) { + if ( current_user_can( 'unfiltered_html' ) ) { + $value = $_POST[ $key ]; + } else { + $value = wp_kses_post( $_POST[ $key ] ); + } + } else { + $value = filter_input( INPUT_POST, $key, FILTER_DEFAULT ); + } + + if ( $value ) { + update_post_meta( $post_id, $key, $value ); + } else { + delete_post_meta( $post_id, $key ); + } + } + } +} + +add_action( 'add_meta_boxes', 'generate_page_header_tags_add_meta_box' ); +/** + * Add our Template Tags meta box. + * + * @param WP_Post $post Current post object. + * + * @since 1.4 + */ +function generate_page_header_tags_add_meta_box( $post ) { + add_meta_box( 'generate_page_header_tags', __( 'Template Tags', 'gp-premium' ), 'generate_page_header_tags_do_meta_box', 'generate_page_header', 'side', 'low' ); +} + +/** + * Meta box display callback. + * + * @param WP_Post $post Current post object. + * + * @since 1.4 + */ +function generate_page_header_tags_do_meta_box( $post ) { + ?> + +

        + + +

        + + +

        + + +

        + + +

        + + + +
      • + ( ! empty( $options[ 'background_video' ] ) ) ? 'mp4:' . esc_url( $options[ 'background_video' ] ) : null, + 'ogv' => ( ! empty( $options[ 'background_video_ogv' ] ) ) ? 'ogv:' . esc_url( $options[ 'background_video_ogv' ] ) : null, + 'webm' => ( ! empty( $options[ 'background_video_webm' ] ) ) ? 'webm:' . esc_url( $options[ 'background_video_webm' ] ) : null, + 'poster' => ( ! empty( $image_url ) ) ? 'poster:' . esc_url( $image_url ) : null + ); + + // Add our videos to a string + $video_output = array(); + foreach( $video_types as $video => $val ) { + $video_output[] = $val; + } + + $video = null; + // Video variable + if ( $video_enabled && '' !== $options[ 'content' ] ) { + + $ext = ( ! empty( $image_url ) ) ? pathinfo( $image_url, PATHINFO_EXTENSION ) : false; + $video_options = array(); + + if ( $ext ) { + $video_options[ 'posterType' ] = 'posterType:' . $ext; + } else { + $video_options[ 'posterType' ] = 'posterType: none'; + } + + $video_options[ 'className' ] = 'className:generate-page-header-video'; + + if ( apply_filters( 'generate_page_header_video_loop', true ) ) { + $video_options[ 'loop' ] = 'loop:true'; + } else { + $video_options[ 'loop' ] = 'loop:false'; + } + + if ( apply_filters( 'generate_page_header_video_muted', true ) ) { + $video_options[ 'muted' ] = 'muted:true'; + } else { + $video_options[ 'muted' ] = 'muted:false'; + } + + $video_options[ 'autoplay' ] = 'autoplay:false'; + + $video = sprintf( ' data-vide-bg="%1$s" data-vide-options="%2$s"', + implode( ', ', array_filter( $video_output ) ), + implode( ', ', array_filter( $video_options ) ) + ); + } + + // Write a class if we're merging the header + $combined_content = ( '' !== $options[ 'merge' ] ) ? ' generate-combined-page-header' : ''; + + // If content is set, show it + if ( '' !== $options[ 'content' ] && false !== $options[ 'content' ] ) { + printf( + '
        +
        ', + ( 'fluid' == $options[ 'container_type' ] ) ? $video : null, + $content_class . $parallax . $full_screen . $vertical_center_container . $container_type . $combined_content . ' generate-page-header generate-content-header', + ( 'fluid' !== $options[ 'container_type' ] ) ? $video : null, + $vertical_center, + ( '' !== $options[ 'merge' ] ) ? 'generate-merged-header' : '', + ( ! empty( $parallax ) ) ? 'data-parallax-speed="' . esc_attr( $parallax_speed ) . '"' : '', + $options[ 'page_header_id' ] + ); + } + + do_action( 'generate_inside_merged_page_header' ); + } +} + +if ( ! function_exists( 'generate_page_header_area' ) ) { + /** + * Build our entire page header. + * + * @since 0.1 + * + * @param $image_class The class to give our element if it's an image. + * @param $content_class The class to give our element if it's content. + */ + function generate_page_header_area( $image_class, $content_class ) { + // Get our options + $options = generate_page_header_get_options(); + + // Get out of here if we don't have content or an image + if ( '' == $options[ 'content' ] && ! generate_page_header_get_image( 'ALL' ) ) { + return; + } + + $inner_container = ( '' == $options[ 'inner_container' ] ) ? ' grid-container grid-parent' : ''; + + do_action( 'generate_before_page_header' ); + + // If an image is set and no content is set + if ( '' == $options[ 'content' ] && generate_page_header_get_image( 'ALL' ) ) { + + printf( + '
        + %2$s + %4$s + %3$s +
        ', + esc_attr( $image_class ) . $inner_container . ' generate-page-header', + ( ! empty( $options[ 'image_link' ] ) ) ? '' : null, + ( ! empty( $options[ 'image_link' ] ) ) ? '' : null, + generate_page_header_get_image_output() + ); + + } + + // If content is set, show it + if ( '' !== $options[ 'content' ] && false !== $options[ 'content' ] ) { + // If we're not merging our header, we can start the container here + // If we were merging, the container would be added in the generate_before_header hook + if ( '' == $options[ 'merge' ] ) { + generate_page_header_area_start_container( 'page-header-image', 'page-header-content' ); + } + + // Replace any found template tags + $options[ 'content' ] = generate_page_header_template_tags( $options[ 'content' ] ); + + // Print the rest of our page header HTML + // The starting elements are inside generate_page_header_area_start_container() + printf ( '
        +
        + %4$s + %6$s + %5$s +
        +
        +
        +
        ', + ( '' !== $options[ 'merge' ] ) ? 'generate-combined-content' : '', + $inner_container, + ( '' !== $options[ 'merge' ] ) ? 'generate-inside-combined-content' : 'generate-inside-page-header-content', + ( ! empty( $options[ 'add_padding' ] ) ) ? '
        ' : null, + ( ! empty( $options[ 'add_padding' ] ) ) ? '
        ' : null, + ( ! empty( $options[ 'autop' ] ) ) ? do_shortcode( wpautop( $options[ 'content' ] ) ) : do_shortcode( $options[ 'content' ] ) + ); + } + + do_action( 'generate_after_page_header' ); + } +} diff --git a/wp-content/plugins/gp-premium/page-header/functions/post-image.php b/wp-content/plugins/gp-premium/page-header/functions/post-image.php new file mode 100644 index 0000000..b88250a --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/post-image.php @@ -0,0 +1,60 @@ + + %2$s + %4$s + %3$s +
        ', + 'post-image page-header-post-image', + ( ! empty( $options[ 'image_link' ] ) ) ? '' : null, + ( ! empty( $options[ 'image_link' ] ) ) ? '' : null, + generate_page_header_get_image_output() + ); + } + + // If content is set, show it + if ( '' !== $options[ 'content' ] && false !== $options[ 'content' ] ) { + printf( + '
        +
        + %3$s + %5$s + %4$s +
        +
        ', + 'post-image generate-page-header generate-post-content-header page-header-post-image', + 'inside-page-header-container inside-post-content-header grid-container grid-parent', + ( ! empty( $options[ 'add_padding' ] ) ) ? '
        ' : null, + ( ! empty( $options[ 'add_padding' ] ) ) ? '
        ' : null, + ( ! empty( $options[ 'autop' ] ) ) ? do_shortcode( wpautop( $options[ 'content' ] ) ) : do_shortcode( $options[ 'content' ] ) + ); + } + } + } +} diff --git a/wp-content/plugins/gp-premium/page-header/functions/post-type.php b/wp-content/plugins/gp-premium/page-header/functions/post-type.php new file mode 100644 index 0000000..34cd95b --- /dev/null +++ b/wp-content/plugins/gp-premium/page-header/functions/post-type.php @@ -0,0 +1,236 @@ + _x( 'Page Headers', 'Post Type General Name', 'gp-premium' ), + 'singular_name' => _x( 'Page Header', 'Post Type Singular Name', 'gp-premium' ), + 'menu_name' => __( 'Page Headers', 'gp-premium' ), + 'name_admin_bar' => __( 'Page Header', 'gp-premium' ), + 'archives' => __( 'Page Header Archives', 'gp-premium' ), + 'parent_item_colon' => __( 'Parent Page Header:', 'gp-premium' ), + 'all_items' => __( 'All Page Headers', 'gp-premium' ), + 'add_new_item' => __( 'Add New Page Header', 'gp-premium' ), + 'new_item' => __( 'New Page Header', 'gp-premium' ), + 'edit_item' => __( 'Edit Page Header', 'gp-premium' ), + 'update_item' => __( 'Update Page Header', 'gp-premium' ), + 'view_item' => __( 'View Page Header', 'gp-premium' ), + 'search_items' => __( 'Search Page Header', 'gp-premium' ), + 'insert_into_item' => __( 'Insert into Page Header', 'gp-premium' ), + 'uploaded_to_this_item' => __( 'Uploaded to this Page Header', 'gp-premium' ), + ); + $args = array( + 'label' => __( 'Page Header', 'gp-premium' ), + 'labels' => $labels, + 'supports' => array( 'title', 'thumbnail' ), + 'hierarchical' => false, + 'public' => false, + 'show_ui' => true, + 'show_in_menu' => function_exists( 'generate_premium_do_elements' ) ? false : true, + 'menu_position' => 100, + 'menu_icon' => 'dashicons-welcome-widgets-menus', + 'show_in_admin_bar' => false, + 'show_in_nav_menus' => false, + 'can_export' => true, + 'has_archive' => false, + 'exclude_from_search' => true, + 'publicly_queryable' => false, + 'capability_type' => 'page', + ); + register_post_type( 'generate_page_header', $args ); + + $post_types = get_post_types( array( 'public' => true ) ); + $term_args = array( + 'sanitize_callback' => 'int', + 'type' => 'string', + 'description' => '', + 'single' => true, + 'show_in_rest' => true, + ); + foreach ( $post_types as $type ) { + register_meta( $type, 'generate_page_header', $term_args ); + } + + $taxonomies = get_taxonomies( array( 'public' => true ) ); + if ( $taxonomies ) { + foreach ( $taxonomies as $taxonomy ) { + add_action( $taxonomy . '_add_form_fields', 'generate_page_header_tax_new_ph_field' ); + add_action( $taxonomy . '_edit_form_fields', 'generate_page_header_tax_edit_ph_field' ); + add_action( 'edit_' . $taxonomy, 'generate_page_header_tax_save_ph' ); + add_action( 'create_' . $taxonomy, 'generate_page_header_tax_save_ph' ); + } + } +} + +add_action( 'admin_menu', 'generate_old_page_header_options_page' ); +/** + * Add our submenu page to the Appearance tab. + * + * @since 1.7 + */ +function generate_old_page_header_options_page() { + if ( ! function_exists( 'generate_premium_do_elements' ) ) { + return; + } + + add_submenu_page( + 'themes.php', + esc_html__( 'Page Headers', 'gp-premium' ), + esc_html__( 'Page Headers', 'gp-premium' ), + 'manage_options', + 'edit.php?post_type=generate_page_header' + ); +} + +add_action( 'admin_head', 'generate_old_page_header_fix_menu' ); +/** + * Set our current menu in the admin while in the old Page Header pages. + * + * @since 1.7 + */ +function generate_old_page_header_fix_menu() { + if ( ! function_exists( 'generate_premium_do_elements' ) ) { + return; + } + + global $parent_file, $submenu_file, $post_type; + + $screen = get_current_screen(); + + if ( 'generate_page_header' === $post_type || 'appearance_page_page-header-global-locations' === $screen->base ) { + $parent_file = 'themes.php'; + $submenu_file = 'edit.php?post_type=gp_elements'; + } + + remove_submenu_page( 'themes.php', 'edit.php?post_type=generate_page_header' ); + remove_submenu_page( 'themes.php', 'page-header-global-locations' ); +} + +add_action( 'admin_head', 'generate_page_header_add_legacy_locations_button', 999 ); +/** + * Add legacy buttons to our new GP Elements post type. + * + * @since 1.7 + */ +function generate_page_header_add_legacy_locations_button() { + if ( ! function_exists( 'generate_premium_do_elements' ) ) { + return; + } + + $screen = get_current_screen(); + + if ( 'generate_page_header' === $screen->post_type ) : + ?> + + post_type && 'edit' === $screen->base ) : + ?> + + +
        + + +
        + + + + + + + + + + +_selector !== '' ){ + $this->add_selector_rules_to_output(); + } + $this->_selector = $selector; + return $this; + } + + public function add_property( $property, $value, $og_default = false, $unit = false ) + { + // Add our unit to the value if it exists + if ( $unit && '' !== $unit ) { + $value = $value . $unit; + if ( '' !== $og_default ) { + $og_default = $og_default . $unit; + } + } + + // If we don't have a value or our value is the same as our og default, bail + if ( empty( $value ) || $og_default == $value ) + return false; + + $this->_css .= $property . ':' . $value . ';'; + return $this; + } + + private function add_selector_rules_to_output() + { + if( !empty( $this->_css ) ) { + $this->_selector_output = $this->_selector; + $selector_output = sprintf( '%1$s{%2$s}', $this->_selector_output, $this->_css ); + + $this->_output .= $selector_output; + + // Reset the css + $this->_css = ''; + } + + return $this; + } + + public function css_output() + { + // Add current selector's rules to output + $this->add_selector_rules_to_output(); + + // Output minified css + return $this->_output; + } + +} +endif; \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.css b/wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.css new file mode 100644 index 0000000..fdd88af --- /dev/null +++ b/wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.css @@ -0,0 +1,103 @@ +.secondary-navigation.toggled ul ul { + transition: 0s; +} + +.dropdown-hover .secondary-navigation.toggled ul li:hover > ul, +.dropdown-hover .secondary-navigation.toggled ul li.sfHover > ul { + transition-delay: 0s; +} + +.secondary-navigation.toggled ul ul { + visibility: hidden; +} + +.secondary-navigation.toggled ul ul.toggled-on { + visibility: visible; +} + +.secondary-navigation.toggled .main-nav ul ul.toggled-on { + position: relative; + top: 0; + left: auto !important; + right: auto !important; + width: 100%; + pointer-events: auto; + height: auto; + opacity: 1; + display: block; +} + +.secondary-navigation.toggled .main-nav > ul { + display: block; +} + +.secondary-navigation.toggled .main-nav ul ul { + position: relative; + top: 0; + left: 0; + width: 100%; +} + +.secondary-navigation.toggled .main-nav .sf-menu > li { + float: none; + clear: both; + display: block !important; + text-align: left !important; +} + +.secondary-navigation.toggled .main-nav .sf-menu > li.hide-on-mobile { + display: none !important; +} + +.secondary-navigation.toggled .dropdown-menu-toggle:before { + content: "\f107" !important; +} + +.secondary-navigation.toggled .sfHover > a .dropdown-menu-toggle:before { + content: "\f106" !important; +} + +.secondary-navigation.toggled .menu-item-has-children .dropdown-menu-toggle { + float: right; +} + +.secondary-navigation.toggled .sf-menu > li.menu-item-float-right { + float: none !important; + display: inline-block; +} + +.rtl .secondary-navigation.toggled .main-nav .sf-menu > li { + text-align: right !important; +} + +@media (max-width: 768px) { + .secondary-navigation .menu-toggle { + display: block; + } + + .secondary-navigation ul { + display: none; + } + + .secondary-nav-aligned-left .secondary-navigation .top-bar { + position: absolute; + right: 0; + } + + .secondary-nav-aligned-left .secondary-navigation .top-bar + .menu-toggle { + text-align: left; + } + + .secondary-nav-aligned-right .secondary-navigation .top-bar { + position: absolute; + left: 0; + } + + .secondary-nav-aligned-right .secondary-navigation .top-bar + .menu-toggle { + text-align: right; + } + + .secondary-nav-aligned-center .secondary-navigation .top-bar + .menu-toggle + div { + display: block; + } +} diff --git a/wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.min.css b/wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.min.css new file mode 100644 index 0000000..3d04621 --- /dev/null +++ b/wp-content/plugins/gp-premium/secondary-nav/functions/css/mobile.min.css @@ -0,0 +1 @@ +.secondary-navigation.toggled ul ul{transition:0s;visibility:hidden}.dropdown-hover .secondary-navigation.toggled ul li.sfHover>ul,.dropdown-hover .secondary-navigation.toggled ul li:hover>ul{transition-delay:0s}.secondary-navigation.toggled ul ul.toggled-on{visibility:visible}.secondary-navigation.toggled .main-nav ul ul.toggled-on{position:relative;top:0;left:auto!important;right:auto!important;width:100%;pointer-events:auto;height:auto;opacity:1;display:block}.secondary-navigation.toggled .main-nav>ul{display:block}.secondary-navigation.toggled .main-nav ul ul{position:relative;top:0;left:0;width:100%}.secondary-navigation.toggled .main-nav .sf-menu>li{float:none;clear:both;display:block!important;text-align:left!important}.secondary-navigation.toggled .main-nav .sf-menu>li.hide-on-mobile{display:none!important}.secondary-navigation.toggled .dropdown-menu-toggle:before{content:"\f107"!important}.secondary-navigation.toggled .sfHover>a .dropdown-menu-toggle:before{content:"\f106"!important}.secondary-navigation.toggled .menu-item-has-children .dropdown-menu-toggle{float:right}.secondary-navigation.toggled .sf-menu>li.menu-item-float-right{float:none!important;display:inline-block}.rtl .secondary-navigation.toggled .main-nav .sf-menu>li{text-align:right!important}@media (max-width:768px){.secondary-nav-aligned-center .secondary-navigation .top-bar+.menu-toggle+div,.secondary-navigation .menu-toggle{display:block}.secondary-navigation ul{display:none}.secondary-nav-aligned-left .secondary-navigation .top-bar{position:absolute;right:0}.secondary-nav-aligned-left .secondary-navigation .top-bar+.menu-toggle{text-align:left}.secondary-nav-aligned-right .secondary-navigation .top-bar{position:absolute;left:0}.secondary-nav-aligned-right .secondary-navigation .top-bar+.menu-toggle{text-align:right}} diff --git a/wp-content/plugins/gp-premium/secondary-nav/functions/css/style.css b/wp-content/plugins/gp-premium/secondary-nav/functions/css/style.css new file mode 100644 index 0000000..638775f --- /dev/null +++ b/wp-content/plugins/gp-premium/secondary-nav/functions/css/style.css @@ -0,0 +1,349 @@ +.secondary-navigation { + clear: both; +} + +.secondary-navigation ul { + list-style: none; + margin: 0; + padding-left: 0; +} + +.secondary-navigation li { + float: left; + position: relative; +} + +.secondary-navigation a { + display: block; + text-decoration: none; +} + +.secondary-navigation ul ul { + display: block; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); + float: left; + position: absolute; + left: -99999px; + opacity: 0; + z-index: 99999; + width: 200px; + text-align: left; + top: auto; + transition: opacity 80ms linear; + transition-delay: 0s; + pointer-events: none; + height: 0; + overflow: hidden; +} + +.secondary-navigation ul ul li { + width: 100%; +} + +.secondary-navigation.sub-menu-left .sub-menu { + right: 0; +} + +.dropdown-hover .secondary-navigation:not(.toggled) ul li:hover > ul, +.dropdown-hover .secondary-navigation:not(.toggled) ul li.sfHover > ul { + left: auto; + opacity: 1; + transition-delay: 150ms; + pointer-events: auto; + height: auto; + overflow: visible; +} + +.dropdown-hover .secondary-navigation:not(.toggled) ul ul li:hover > ul, +.dropdown-hover .secondary-navigation:not(.toggled) ul ul li.sfHover > ul { + left: 100%; + top: 0; +} + +.dropdown-hover .secondary-navigation.sub-menu-left:not(.toggled) ul ul li:hover > ul, +.dropdown-hover .secondary-navigation.sub-menu-left:not(.toggled) ul ul li.sfHover > ul { + right: 100%; + top: 0; + left: auto; +} + +.secondary-nav-float-right .secondary-navigation { + float: right; +} + +.secondary-navigation .main-nav ul ul li a, +.secondary-nav-float-right .secondary-navigation .main-nav ul ul li a { + line-height: normal; +} + +.secondary-nav-float-right .secondary-navigation ul ul ul{ + top: 0 +} + +.secondary-nav-float-left .inside-header .secondary-navigation { + float: left; + clear: left; +} + +.secondary-nav-float-left:not(.nav-float-right) .inside-header .site-branding, +.secondary-nav-float-left:not(.nav-float-right) .inside-header .site-logo { + float: right; + clear: right; +} + +.secondary-nav-float-left.nav-float-right .inside-header .site-branding, +.secondary-nav-float-left.nav-float-right .inside-header .site-logo, +.nav-float-left.secondary-nav-float-right .inside-header .site-branding, +.nav-float-left.secondary-nav-float-right .inside-header .site-logo { + float: none; + clear: none; +} + +.secondary-nav-float-left .inside-header:after { + clear: both; + content: ''; + display: table; +} + +.secondary-nav-float-left.nav-float-right .site-header, +.nav-float-left.secondary-nav-float-right .site-header { + text-align: center; +} + +.secondary-navigation { + z-index: 99; +} + +.secondary-navigation { + padding: 0; +} + +.secondary-navigation .menu-toggle { + margin: 0; +} + +.secondary-navigation ul ul li a { + line-height: normal; +} + +.secondary-navigation ul ul li a { + font-size: 90%; +} + +.widget-area .secondary-navigation li { + display: block; + float: none; + margin: 0; + padding: 0; + width: 100%; +} + +.widget-area .secondary-navigation ul ul { + left: 100%; + top: 0; + width: 220px; +} + +.both-right .widget-area .secondary-navigation ul ul, +.right-sidebar .widget-area .secondary-navigation ul ul, +.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation ul ul { + left: auto; + right: 100%; +} + +.secondary-nav-aligned-right.secondary-nav-below-header .secondary-navigation .sf-menu > li, +.secondary-nav-aligned-right.secondary-nav-above-header .secondary-navigation .sf-menu > li, +.secondary-nav-aligned-center.secondary-nav-below-header .secondary-navigation .sf-menu > li, +.secondary-nav-aligned-center.secondary-nav-above-header .secondary-navigation .sf-menu > li { + float: none; + display: inline-block; +} + +.secondary-nav-aligned-right .secondary-navigation ul, +.secondary-nav-aligned-center .secondary-navigation ul { + font-size: 0px; +} + +.secondary-nav-aligned-left.secondary-nav-below-header .secondary-navigation, +.secondary-nav-aligned-left.secondary-nav-above-header .secondary-navigation { + text-align: left; +} + +.secondary-nav-aligned-center.secondary-nav-below-header .secondary-navigation, +.secondary-nav-aligned-center.secondary-nav-above-header .secondary-navigation { + text-align: center; +} + +.secondary-nav-aligned-right.secondary-nav-below-header .secondary-navigation, +.secondary-nav-aligned-right.secondary-nav-above-header .secondary-navigation { + text-align: right; +} + +.dropdown-click .secondary-navigation ul ul { + visibility: hidden; +} + +.dropdown-click .secondary-navigation ul.toggled-on, +.dropdown-click .secondary-navigation ul li.sfHover > ul.toggled-on { + left: auto; + opacity: 1; + visibility: visible; + pointer-events: auto; + height: auto; + overflow: visible; +} + +.dropdown-click .secondary-navigation ul ul ul.toggled-on { + left: 0; + top: auto; + position: relative; +} + +.dropdown-click.both-right .widget-area .secondary-navigation ul ul, +.dropdown-click.right-sidebar .widget-area .secondary-navigation ul ul, +.dropdown-click.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation ul ul { + right: 0; +} + +.dropdown-click .widget-area .secondary-navigation ul ul { + top: auto; + position: absolute; + float: none; + width: 100%; + left: -99999px; +} + +.dropdown-click .widget-area .secondary-navigation ul ul.toggled-on { + position: relative; + left: 0; + right: 0; +} + +.secondary-navigation .main-nav ul li.menu-item-has-children > a { + padding-right: 0; + position: relative; +} + +.widget-area .secondary-navigation li { + float: none; + display: block; + width: 100%; + padding: 0; + margin: 0; +} + +.dropdown-hover .widget-area .secondary-navigation:not(.toggled) ul li:hover ul, +.dropdown-hover .widget-area .secondary-navigation:not(.toggled) ul li.sfHover > ul { + top: 0; + left: 100%; + width:220px; +} + +.dropdown-hover.both-right .widget-area .secondary-navigation:not(.toggled) ul li:hover ul, +.dropdown-hover.both-right .widget-area .secondary-navigation:not(.toggled) ul li.sfHover ul, +.dropdown-hover.right-sidebar .widget-area .secondary-navigation:not(.toggled) ul li:hover ul, +.dropdown-hover.right-sidebar .widget-area .secondary-navigation:not(.toggled) ul li.sfHover ul, +.dropdown-hover.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation:not(.toggled) ul li:hover ul, +.dropdown-hover.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation:not(.toggled) ul li.sfHover ul { + right: 100%; + left: auto; +} + +.widget-area .secondary-navigation ul ul { + top: 0; + left: 100%; + width: 220px; +} + +.rtl .secondary-navigation ul ul { + float: right; + left: auto; + right: 0; + text-align: right; +} + +.rtl .secondary-navigation ul ul ul { + left: auto; + right: 100%; +} + +.rtl .secondary-navigation .menu-item-has-children ul .dropdown-menu-toggle { + transform: rotate(180deg); +} + +/* Default styles */ +.widget-area .secondary-navigation { + margin-bottom: 11px; +} + +.secondary-navigation ul ul { + top: auto; +} + +.secondary-navigation .main-nav ul li a, +.secondary-navigation .menu-toggle { + font-family: inherit; + font-weight: normal; + text-transform: none; + font-size: 13px; + padding-left: 20px; + padding-right: 20px; + line-height: 40px; +} + +.secondary-navigation .main-nav ul ul li a { + font-size: 12px; + padding-left: 20px; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; +} + +.secondary-navigation .menu-item-has-children ul .dropdown-menu-toggle { + padding-top: 10px; + padding-bottom: 10px; + margin-top: -10px; +} + +.secondary-navigation .menu-item-has-children .dropdown-menu-toggle { + padding-right: 20px; +} + +/* Top bar */ +.secondary-navigation .top-bar { + background: transparent; +} + +.secondary-navigation .inside-top-bar { + padding: 0; +} + +.secondary-navigation .top-bar a { + display: inline; +} + +.secondary-nav-aligned-right .secondary-navigation .top-bar { + float: left; +} + +.secondary-nav-aligned-right .secondary-navigation .top-bar .inside-top-bar .widget { + margin: 0 10px; +} + +.secondary-nav-aligned-left .secondary-navigation .top-bar { + float: right; +} + +.secondary-nav-aligned-left .secondary-navigation .top-bar .inside-top-bar .widget { + margin-left: 10px; +} + +.secondary-nav-aligned-center .secondary-navigation .top-bar, +.secondary-nav-aligned-center .secondary-navigation .top-bar + .menu-toggle + div { + display: inline-block; + vertical-align: middle; +} + +.secondary-nav-aligned-center .secondary-navigation .top-bar .widget:not(:first-child) { + margin-left: 10px; +} diff --git a/wp-content/plugins/gp-premium/secondary-nav/functions/css/style.min.css b/wp-content/plugins/gp-premium/secondary-nav/functions/css/style.min.css new file mode 100644 index 0000000..64687c0 --- /dev/null +++ b/wp-content/plugins/gp-premium/secondary-nav/functions/css/style.min.css @@ -0,0 +1 @@ +.secondary-navigation{clear:both;z-index:99;padding:0}.secondary-navigation ul{list-style:none;margin:0;padding-left:0}.secondary-navigation li{float:left;position:relative}.secondary-navigation a{display:block;text-decoration:none}.secondary-navigation ul ul{display:block;box-shadow:0 2px 2px rgba(0,0,0,.1);float:left;position:absolute;left:-99999px;opacity:0;z-index:99999;width:200px;text-align:left;transition:opacity 80ms linear;transition-delay:0s;pointer-events:none;height:0;overflow:hidden;top:auto}.secondary-navigation ul ul li{width:100%}.secondary-navigation.sub-menu-left .sub-menu{right:0}.dropdown-hover .secondary-navigation:not(.toggled) ul li.sfHover>ul,.dropdown-hover .secondary-navigation:not(.toggled) ul li:hover>ul{left:auto;opacity:1;transition-delay:150ms;pointer-events:auto;height:auto;overflow:visible}.dropdown-hover .secondary-navigation:not(.toggled) ul ul li.sfHover>ul,.dropdown-hover .secondary-navigation:not(.toggled) ul ul li:hover>ul{left:100%;top:0}.dropdown-hover .secondary-navigation.sub-menu-left:not(.toggled) ul ul li.sfHover>ul,.dropdown-hover .secondary-navigation.sub-menu-left:not(.toggled) ul ul li:hover>ul{right:100%;top:0;left:auto}.secondary-nav-float-right .secondary-navigation{float:right}.secondary-nav-float-right .secondary-navigation .main-nav ul ul li a,.secondary-navigation .main-nav ul ul li a,.secondary-navigation ul ul li a{line-height:normal}.secondary-nav-float-right .secondary-navigation ul ul ul{top:0}.secondary-nav-float-left .inside-header .secondary-navigation{float:left;clear:left}.secondary-nav-float-left:not(.nav-float-right) .inside-header .site-branding,.secondary-nav-float-left:not(.nav-float-right) .inside-header .site-logo{float:right;clear:right}.nav-float-left.secondary-nav-float-right .inside-header .site-branding,.nav-float-left.secondary-nav-float-right .inside-header .site-logo,.secondary-nav-float-left.nav-float-right .inside-header .site-branding,.secondary-nav-float-left.nav-float-right .inside-header .site-logo{float:none;clear:none}.secondary-nav-float-left .inside-header:after{clear:both;content:'';display:table}.nav-float-left.secondary-nav-float-right .site-header,.secondary-nav-float-left.nav-float-right .site-header{text-align:center}.secondary-navigation .menu-toggle{margin:0}.secondary-navigation ul ul li a{font-size:90%}.widget-area .secondary-navigation li{float:none;display:block;width:100%;padding:0;margin:0}.both-right .widget-area .secondary-navigation ul ul,.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation ul ul,.right-sidebar .widget-area .secondary-navigation ul ul,.rtl .secondary-navigation ul ul ul{left:auto;right:100%}.secondary-nav-aligned-center.secondary-nav-above-header .secondary-navigation .sf-menu>li,.secondary-nav-aligned-center.secondary-nav-below-header .secondary-navigation .sf-menu>li,.secondary-nav-aligned-right.secondary-nav-above-header .secondary-navigation .sf-menu>li,.secondary-nav-aligned-right.secondary-nav-below-header .secondary-navigation .sf-menu>li{float:none;display:inline-block}.secondary-nav-aligned-center .secondary-navigation ul,.secondary-nav-aligned-right .secondary-navigation ul{font-size:0}.secondary-nav-aligned-left.secondary-nav-above-header .secondary-navigation,.secondary-nav-aligned-left.secondary-nav-below-header .secondary-navigation{text-align:left}.secondary-nav-aligned-center.secondary-nav-above-header .secondary-navigation,.secondary-nav-aligned-center.secondary-nav-below-header .secondary-navigation{text-align:center}.secondary-nav-aligned-right.secondary-nav-above-header .secondary-navigation,.secondary-nav-aligned-right.secondary-nav-below-header .secondary-navigation{text-align:right}.dropdown-click .secondary-navigation ul ul{visibility:hidden}.dropdown-click .secondary-navigation ul li.sfHover>ul.toggled-on,.dropdown-click .secondary-navigation ul.toggled-on{left:auto;opacity:1;visibility:visible;pointer-events:auto;height:auto;overflow:visible}.dropdown-click .secondary-navigation ul ul ul.toggled-on{left:0;top:auto;position:relative}.dropdown-click.both-right .widget-area .secondary-navigation ul ul,.dropdown-click.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation ul ul,.dropdown-click.right-sidebar .widget-area .secondary-navigation ul ul{right:0}.dropdown-click .widget-area .secondary-navigation ul ul{top:auto;position:absolute;float:none;width:100%;left:-99999px}.dropdown-click .widget-area .secondary-navigation ul ul.toggled-on{position:relative;left:0;right:0}.secondary-navigation .main-nav ul li.menu-item-has-children>a{padding-right:0;position:relative}.dropdown-hover .widget-area .secondary-navigation:not(.toggled) ul li.sfHover>ul,.dropdown-hover .widget-area .secondary-navigation:not(.toggled) ul li:hover ul{top:0;left:100%;width:220px}.dropdown-hover.both-right .widget-area .secondary-navigation:not(.toggled) ul li.sfHover ul,.dropdown-hover.both-right .widget-area .secondary-navigation:not(.toggled) ul li:hover ul,.dropdown-hover.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation:not(.toggled) ul li.sfHover ul,.dropdown-hover.both-sidebars .widget-area .inside-right-sidebar .secondary-navigation:not(.toggled) ul li:hover ul,.dropdown-hover.right-sidebar .widget-area .secondary-navigation:not(.toggled) ul li.sfHover ul,.dropdown-hover.right-sidebar .widget-area .secondary-navigation:not(.toggled) ul li:hover ul{right:100%;left:auto}.widget-area .secondary-navigation ul ul{top:0;left:100%;width:220px}.rtl .secondary-navigation ul ul{float:right;left:auto;right:0;text-align:right}.rtl .secondary-navigation .menu-item-has-children ul .dropdown-menu-toggle{transform:rotate(180deg)}.widget-area .secondary-navigation{margin-bottom:11px}.secondary-navigation .main-nav ul li a,.secondary-navigation .menu-toggle{font-family:inherit;font-weight:400;text-transform:none;font-size:13px;padding-left:20px;padding-right:20px;line-height:40px}.secondary-navigation .main-nav ul ul li a{font-size:12px;padding:10px 20px}.secondary-navigation .menu-item-has-children ul .dropdown-menu-toggle{padding-top:10px;padding-bottom:10px;margin-top:-10px}.secondary-navigation .menu-item-has-children .dropdown-menu-toggle{padding-right:20px}.secondary-navigation .top-bar{background:0 0}.secondary-navigation .inside-top-bar{padding:0}.secondary-navigation .top-bar a{display:inline}.secondary-nav-aligned-right .secondary-navigation .top-bar{float:left}.secondary-nav-aligned-right .secondary-navigation .top-bar .inside-top-bar .widget{margin:0 10px}.secondary-nav-aligned-left .secondary-navigation .top-bar{float:right}.secondary-nav-aligned-left .secondary-navigation .top-bar .inside-top-bar .widget{margin-left:10px}.secondary-nav-aligned-center .secondary-navigation .top-bar,.secondary-nav-aligned-center .secondary-navigation .top-bar+.menu-toggle+div{display:inline-block;vertical-align:middle}.secondary-nav-aligned-center .secondary-navigation .top-bar .widget:not(:first-child){margin-left:10px} diff --git a/wp-content/plugins/gp-premium/secondary-nav/functions/functions.php b/wp-content/plugins/gp-premium/secondary-nav/functions/functions.php new file mode 100644 index 0000000..f8e8ecd --- /dev/null +++ b/wp-content/plugins/gp-premium/secondary-nav/functions/functions.php @@ -0,0 +1,1090 @@ + __( 'Secondary Menu', 'gp-premium' ), + ) ); + } +} + +if ( ! function_exists( 'generate_secondary_nav_enqueue_scripts' ) ) { + add_action( 'wp_enqueue_scripts', 'generate_secondary_nav_enqueue_scripts', 100 ); + /** + * Add our necessary scripts + * @since 0.1 + */ + function generate_secondary_nav_enqueue_scripts() { + // Bail if no Secondary menu is set + if ( ! has_nav_menu( 'secondary' ) ) { + return; + } + + $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + wp_enqueue_style( 'generate-secondary-nav', plugin_dir_url( __FILE__ ) . "css/style{$suffix}.css", array(), GENERATE_SECONDARY_NAV_VERSION ); + if ( ! defined( 'GENERATE_DISABLE_MOBILE' ) ) { + wp_add_inline_script( 'generate-navigation', + "jQuery( document ).ready( function($) { + $( '.secondary-navigation .menu-toggle' ).on( 'click', function( e ) { + e.preventDefault(); + $( this ).closest( '.secondary-navigation' ).toggleClass( 'toggled' ); + $( this ).closest( '.secondary-navigation' ).attr( 'aria-expanded', $( this ).closest( '.secondary-navigation' ).attr( 'aria-expanded' ) === 'true' ? 'false' : 'true' ); + $( this ).toggleClass( 'toggled' ); + $( this ).children( 'i' ).toggleClass( 'fa-bars' ).toggleClass( 'fa-close' ); + $( this ).attr( 'aria-expanded', $( this ).attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' ); + }); + });" + ); + + wp_enqueue_style( 'generate-secondary-nav-mobile', plugin_dir_url( __FILE__ ) . "css/mobile{$suffix}.css", array(), GENERATE_SECONDARY_NAV_VERSION, 'all' ); + } + } +} + +if ( ! function_exists( 'generate_secondary_nav_enqueue_customizer_scripts' ) ) { + add_action( 'customize_preview_init', 'generate_secondary_nav_enqueue_customizer_scripts' ); + /** + * Add our Customizer preview JS. + * + * @since 0.1 + */ + function generate_secondary_nav_enqueue_customizer_scripts() { + wp_enqueue_script( 'generate-secondary-nav-customizer', plugin_dir_url( __FILE__ ) . 'js/customizer.js', array( 'jquery', 'customize-preview' ), GENERATE_SECONDARY_NAV_VERSION, true ); + } +} + +if ( ! function_exists( 'generate_secondary_nav_get_defaults' ) ) { + /** + * Set default options. + * + * @since 0.1 + */ + function generate_secondary_nav_get_defaults( $filter = true ) { + $generate_defaults = array( + 'secondary_nav_mobile_label' => 'Menu', + 'secondary_nav_layout_setting' => 'secondary-fluid-nav', + 'secondary_nav_inner_width' => 'contained', + 'secondary_nav_position_setting' => 'secondary-nav-above-header', + 'secondary_nav_alignment' => 'right', + 'secondary_nav_dropdown_direction' => 'right', + 'navigation_background_color' => '#636363', + 'navigation_text_color' => '#ffffff', + 'navigation_background_hover_color' => '#303030', + 'navigation_text_hover_color' => '#ffffff', + 'navigation_background_current_color' => '#ffffff', + 'navigation_text_current_color' => '#222222', + 'subnavigation_background_color' => '#303030', + 'subnavigation_text_color' => '#ffffff', + 'subnavigation_background_hover_color' => '#474747', + 'subnavigation_text_hover_color' => '#ffffff', + 'subnavigation_background_current_color' => '#474747', + 'subnavigation_text_current_color' => '#ffffff', + 'secondary_menu_item' => '20', + 'secondary_menu_item_height' => '40', + 'secondary_sub_menu_item_height' => '10', + 'font_secondary_navigation' => 'inherit', + 'font_secondary_navigation_variants' => '', + 'font_secondary_navigation_category' => '', + 'secondary_navigation_font_weight' => 'normal', + 'secondary_navigation_font_transform' => 'none', + 'secondary_navigation_font_size' => '13', + 'nav_image' => '', + 'nav_repeat' => '', + 'nav_item_image' => '', + 'nav_item_repeat' => '', + 'nav_item_hover_image' => '', + 'nav_item_hover_repeat' => '', + 'nav_item_current_image' => '', + 'nav_item_current_repeat' => '', + 'sub_nav_image' => '', + 'sub_nav_repeat' => '', + 'sub_nav_item_image' => '', + 'sub_nav_item_repeat' => '', + 'sub_nav_item_hover_image' => '', + 'sub_nav_item_hover_repeat' => '', + 'sub_nav_item_current_image' => '', + 'sub_nav_item_current_repeat' => '', + 'merge_top_bar' => false + ); + + if ( $filter ) { + return apply_filters( 'generate_secondary_nav_option_defaults', $generate_defaults ); + } + + return $generate_defaults; + } +} + +if ( ! function_exists( 'generate_secondary_nav_customize_register' ) ) { + add_action( 'customize_register', 'generate_secondary_nav_customize_register', 100 ); + /** + * Register our options. + * + * @since 0.1 + */ + function generate_secondary_nav_customize_register( $wp_customize ) { + // Get our defaults + $defaults = generate_secondary_nav_get_defaults(); + + // Controls + require_once GP_LIBRARY_DIRECTORY . 'customizer-helpers.php'; + + if ( method_exists( $wp_customize, 'register_control_type' ) ) { + $wp_customize->register_control_type( 'GeneratePress_Section_Shortcut_Control' ); + } + + // Use the Layout panel in the free theme if it exists + if ( $wp_customize->get_panel( 'generate_layout_panel' ) ) { + $layout_panel = 'generate_layout_panel'; + } else { + $layout_panel = 'secondary_navigation_panel'; + } + + // Add our secondary navigation panel + // This shouldn't be used anymore if the theme is up to date + if ( class_exists( 'WP_Customize_Panel' ) ) { + $wp_customize->add_panel( 'secondary_navigation_panel', array( + 'priority' => 100, + 'capability' => 'edit_theme_options', + 'theme_supports' => '', + 'title' => __( 'Secondary Navigation', 'gp-premium' ), + 'description' => '', + ) ); + } + + // Add secondary navigation section + $wp_customize->add_section( + 'secondary_nav_section', + array( + 'title' => __( 'Secondary Navigation', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 31, + 'panel' => $layout_panel + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_secondary_navigation_layout_shortcuts', + array( + 'section' => 'secondary_nav_section', + 'element' => __( 'Secondary Navigation', 'gp-premium' ), + 'shortcuts' => array( + 'colors' => 'secondary_navigation_color_section', + 'typography' => 'secondary_font_section', + 'backgrounds' => 'secondary_bg_images_section', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + // Mobile menu label + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_nav_mobile_label]', + array( + 'default' => $defaults['secondary_nav_mobile_label'], + 'type' => 'option', + 'sanitize_callback' => 'wp_kses_post' + ) + ); + + $wp_customize->add_control( + 'secondary_nav_mobile_label_control', array( + 'label' => __( 'Mobile Menu Label', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'settings' => 'generate_secondary_nav_settings[secondary_nav_mobile_label]', + 'priority' => 10 + ) + ); + + // Navigation width + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_nav_layout_setting]', + array( + 'default' => $defaults['secondary_nav_layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + 'generate_secondary_nav_settings[secondary_nav_layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Width', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'choices' => array( + 'secondary-fluid-nav' => _x( 'Full', 'Width', 'gp-premium' ), + 'secondary-contained-nav' => _x( 'Contained', 'Width', 'gp-premium' ) + ), + 'settings' => 'generate_secondary_nav_settings[secondary_nav_layout_setting]', + 'priority' => 15 + ) + ); + + // Inner navigation width + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_nav_inner_width]', + array( + 'default' => $defaults['secondary_nav_inner_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + 'generate_secondary_nav_settings[secondary_nav_inner_width]', + array( + 'type' => 'select', + 'label' => __( 'Inner Navigation Width', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'choices' => array( + 'full-width' => _x( 'Full', 'Width', 'gp-premium' ), + 'contained' => _x( 'Contained', 'Width', 'gp-premium' ) + ), + 'settings' => 'generate_secondary_nav_settings[secondary_nav_inner_width]', + 'priority' => 15 + ) + ); + + // Navigation alignment + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_nav_alignment]', + array( + 'default' => $defaults['secondary_nav_alignment'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + 'generate_secondary_nav_settings[secondary_nav_alignment]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Alignment', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'choices' => array( + 'left' => __( 'Left', 'gp-premium' ), + 'center' => __( 'Center', 'gp-premium' ), + 'right' => __( 'Right', 'gp-premium' ) + ), + 'settings' => 'generate_secondary_nav_settings[secondary_nav_alignment]', + 'priority' => 20 + ) + ); + + // Navigation location + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_nav_position_setting]', + array( + 'default' => $defaults['secondary_nav_position_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + 'generate_secondary_nav_settings[secondary_nav_position_setting]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Location', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'choices' => array( + 'secondary-nav-below-header' => __( 'Below Header', 'gp-premium' ), + 'secondary-nav-above-header' => __( 'Above Header', 'gp-premium' ), + 'secondary-nav-float-right' => __( 'Float Right', 'gp-premium' ), + 'secondary-nav-float-left' => __( 'Float Left', 'gp-premium' ), + 'secondary-nav-left-sidebar' => __( 'Left Sidebar', 'gp-premium' ), + 'secondary-nav-right-sidebar' => __( 'Right Sidebar', 'gp-premium' ), + '' => __( 'No Navigation', 'gp-premium' ) + ), + 'settings' => 'generate_secondary_nav_settings[secondary_nav_position_setting]', + 'priority' => 30 + ) + ); + + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_nav_dropdown_direction]', + array( + 'default' => $defaults['secondary_nav_dropdown_direction'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_secondary_nav_settings[secondary_nav_dropdown_direction]', + array( + 'type' => 'select', + 'label' => __( 'Dropdown Direction', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'choices' => array( + 'right' => __( 'Right', 'gp-premium' ), + 'left' => __( 'Left', 'gp-premium' ), + ), + 'settings' => 'generate_secondary_nav_settings[secondary_nav_dropdown_direction]', + 'priority' => 35 + ) + ); + + // Merge top bar + $wp_customize->add_setting( + 'generate_secondary_nav_settings[merge_top_bar]', + array( + 'default' => $defaults['merge_top_bar'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_secondary_nav_settings[merge_top_bar]', + array( + 'type' => 'checkbox', + 'label' => __( 'Merge with Secondary Navigation', 'gp-premium' ), + 'section' => 'generate_top_bar', + 'settings' => 'generate_secondary_nav_settings[merge_top_bar]', + 'priority' => 100, + 'active_callback' => 'generate_secondary_nav_show_merge_top_bar' + ) + ); + } +} + +if ( ! function_exists( 'generate_display_secondary_google_fonts' ) ) { + add_filter( 'generate_typography_google_fonts', 'generate_display_secondary_google_fonts', 50 ); + /** + * Add Google Fonts to wp_head if needed. + * + * @since 0.1 + */ + function generate_display_secondary_google_fonts($google_fonts) { + + // Bail if no Secondary menu is set + if ( ! has_nav_menu( 'secondary' ) ) { + return $google_fonts; + } + + $generate_secondary_nav_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + // List our non-Google fonts + if ( function_exists( 'generate_typography_default_fonts' ) ) { + $not_google = str_replace( ' ', '+', generate_typography_default_fonts() ); + } else { + $not_google = array( + 'inherit', + 'Arial,+Helvetica,+sans-serif', + 'Century+Gothic', + 'Comic+Sans+MS', + 'Courier+New', + 'Georgia,+Times+New+Roman,+Times,+serif', + 'Helvetica', + 'Impact', + 'Lucida+Console', + 'Lucida+Sans+Unicode', + 'Palatino+Linotype', + 'Tahoma,+Geneva,+sans-serif', + 'Trebuchet+MS,+Helvetica,+sans-serif', + 'Verdana,+Geneva,+sans-serif' + ); + } + + // Create our Google Fonts array + $secondary_google_fonts = array(); + + if ( function_exists( 'generate_get_google_font_variants' ) ) { + + // If our value is still using the old format, fix it + if ( strpos( $generate_secondary_nav_settings[ 'font_secondary_navigation' ], ':' ) !== false ) { + $generate_secondary_nav_settings[ 'font_secondary_navigation' ] = current( explode( ':', $generate_secondary_nav_settings[ 'font_secondary_navigation' ] ) ); + } + + // Grab the variants using the plain name + $variants = generate_get_google_font_variants( $generate_secondary_nav_settings[ 'font_secondary_navigation' ], 'font_secondary_navigation', generate_secondary_nav_get_defaults() ); + + } else { + $variants = ''; + } + + // Replace the spaces in the names with a plus + $value = str_replace( ' ', '+', $generate_secondary_nav_settings[ 'font_secondary_navigation' ] ); + + // If we have variants, add them to our value + $value = ! empty( $variants ) ? $value . ':' . $variants : $value; + + // Add our value to the array + $secondary_google_fonts[] = $value; + + // Ignore any non-Google fonts + $secondary_google_fonts = array_diff($secondary_google_fonts, $not_google); + + // Separate each different font with a bar + $secondary_google_fonts = implode('|', $secondary_google_fonts); + + if ( !empty( $secondary_google_fonts ) ) { + $print_secondary_fonts = '|' . $secondary_google_fonts; + } else { + $print_secondary_fonts = ''; + } + + // Remove any duplicates + $return = $google_fonts . $print_secondary_fonts; + $return = implode('|',array_unique(explode('|', $return))); + return $return; + + } +} + +if ( ! function_exists( 'generate_add_secondary_navigation_after_header' ) ) { + add_action( 'generate_after_header', 'generate_add_secondary_navigation_after_header', 7 ); + /** + * Add the navigation after the header. + * + * @since 0.1 + */ + function generate_add_secondary_navigation_after_header() { + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + if ( 'secondary-nav-below-header' == $generate_settings['secondary_nav_position_setting'] ) { + generate_secondary_navigation_position(); + } + + } +} + +if ( ! function_exists( 'generate_add_secondary_navigation_before_header' ) ) { + add_action( 'generate_before_header', 'generate_add_secondary_navigation_before_header', 7 ); + /** + * Add the navigation before the header. + * + * @since 0.1 + */ + function generate_add_secondary_navigation_before_header() { + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + if ( 'secondary-nav-above-header' == $generate_settings['secondary_nav_position_setting'] ) { + generate_secondary_navigation_position(); + } + + } +} + +if ( ! function_exists( 'generate_add_secondary_navigation_float_right' ) ) { + add_action( 'generate_before_header_content', 'generate_add_secondary_navigation_float_right', 7 ); + /** + * Add the navigation inside the header so it can float right. + * + * @since 0.1 + */ + function generate_add_secondary_navigation_float_right() { + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + if ( 'secondary-nav-float-right' == $generate_settings['secondary_nav_position_setting'] || 'secondary-nav-float-left' == $generate_settings['secondary_nav_position_setting'] ) { + generate_secondary_navigation_position(); + } + + } +} + +if ( ! function_exists( 'generate_add_secondary_navigation_before_right_sidebar' ) ) { + add_action( 'generate_before_right_sidebar_content', 'generate_add_secondary_navigation_before_right_sidebar', 7 ); + /** + * Add the navigation into the right sidebar. + * + * @since 0.1 + */ + function generate_add_secondary_navigation_before_right_sidebar() { + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + if ( 'secondary-nav-right-sidebar' == $generate_settings['secondary_nav_position_setting'] ) { + echo '
        '; + generate_secondary_navigation_position(); + echo '
        '; + } + + } +} + +if ( ! function_exists( 'generate_add_secondary_navigation_before_left_sidebar' ) ) { + add_action( 'generate_before_left_sidebar_content', 'generate_add_secondary_navigation_before_left_sidebar', 7 ); + /** + * Add the navigation into the left sidebar. + * + * @since 0.1 + */ + function generate_add_secondary_navigation_before_left_sidebar() { + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + if ( 'secondary-nav-left-sidebar' == $generate_settings['secondary_nav_position_setting'] ) { + echo '
        '; + generate_secondary_navigation_position(); + echo '
        '; + } + + } +} + +if ( ! function_exists( 'generate_secondary_navigation_position' ) ) { + /** + * Build our secondary navigation. + * Would like to change this function name. + * + * @since 0.1 + */ + function generate_secondary_navigation_position() { + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + if ( has_nav_menu( 'secondary' ) ) : + ?> + + + + section using the Theme Customizer. + * + * @since 0.1 + */ + function generate_secondary_nav_css() { + + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + if ( function_exists( 'generate_spacing_get_defaults' ) ) { + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + $separator = $spacing_settings[ 'separator' ]; + } else { + $separator = 20; + } + + if ( function_exists( 'generate_get_font_family_css' ) ) { + $secondary_nav_family = generate_get_font_family_css( 'font_secondary_navigation', 'generate_secondary_nav_settings', generate_secondary_nav_get_defaults() ); + } else { + $secondary_nav_family = current( explode( ':', $generate_settings['font_secondary_navigation'] ) ); + } + + if ( '""' == $secondary_nav_family ) { + $secondary_nav_family = 'inherit'; + } + + // Get our untouched defaults + $og_defaults = generate_secondary_nav_get_defaults( false ); + + // Initiate our CSS class + $css = new GeneratePress_Secondary_Nav_CSS; + + // Navigation background + $css->set_selector( '.secondary-navigation' ); + $css->add_property( 'background-color', esc_attr( $generate_settings[ 'navigation_background_color' ] ) ); + $css->add_property( 'background-image', !empty( $generate_settings['nav_image'] ) ? 'url(' . esc_url( $generate_settings['nav_image'] ) . ')' : '' ); + $css->add_property( 'background-repeat', esc_attr( $generate_settings['nav_repeat'] ) ); + + // Top bar + if ( 'secondary-nav-above-header' == $generate_settings[ 'secondary_nav_position_setting' ] && has_nav_menu( 'secondary' ) && is_active_sidebar( 'top-bar' ) ) { + $css->set_selector( '.secondary-navigation .top-bar' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'navigation_text_color' ] ) ); + $css->add_property( 'line-height', absint( $generate_settings[ 'secondary_menu_item_height' ] ), false, 'px' ); + $css->add_property( 'font-family', $secondary_nav_family ); + $css->add_property( 'font-weight', esc_attr( $generate_settings[ 'secondary_navigation_font_weight' ] ) ); + $css->add_property( 'text-transform', esc_attr( $generate_settings[ 'secondary_navigation_font_transform' ] ) ); + $css->add_property( 'font-size', absint( $generate_settings[ 'secondary_navigation_font_size' ] ), false, 'px' ); + + $css->set_selector( '.secondary-navigation .top-bar a' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'navigation_text_color' ] ) ); + + $css->set_selector( '.secondary-navigation .top-bar a:hover, .secondary-navigation .top-bar a:focus' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'navigation_background_hover_color' ] ) ); + } + + // Navigation text + $css->set_selector( '.secondary-navigation .main-nav ul li a,.secondary-navigation .menu-toggle' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'navigation_text_color' ] ) ); + $css->add_property( 'font-family', ( 'inherit' !== $secondary_nav_family ) ? $secondary_nav_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings[ 'secondary_navigation_font_weight' ] ), $og_defaults[ 'secondary_navigation_font_weight' ] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings[ 'secondary_navigation_font_transform' ] ), $og_defaults[ 'secondary_navigation_font_transform' ] ); + $css->add_property( 'font-size', absint( $generate_settings[ 'secondary_navigation_font_size' ] ), $og_defaults[ 'secondary_navigation_font_size' ], 'px' ); + $css->add_property( 'padding-left', absint( $generate_settings[ 'secondary_menu_item' ] ), $og_defaults[ 'secondary_menu_item' ], 'px' ); + $css->add_property( 'padding-right', absint( $generate_settings[ 'secondary_menu_item' ] ), $og_defaults[ 'secondary_menu_item' ], 'px' ); + $css->add_property( 'line-height', absint( $generate_settings[ 'secondary_menu_item_height' ] ), $og_defaults[ 'secondary_menu_item_height' ], 'px' ); + $css->add_property( 'background-image', !empty( $generate_settings['nav_item_image'] ) ? 'url(' . esc_url( $generate_settings['nav_item_image'] ) . ')' : '' ); + $css->add_property( 'background-repeat', esc_attr( $generate_settings['nav_item_repeat'] ) ); + + // Mobile menu text on hover + $css->set_selector( 'button.secondary-menu-toggle:hover,button.secondary-menu-toggle:focus' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'navigation_text_color' ] ) ); + + // Widget area navigation + $css->set_selector( '.widget-area .secondary-navigation' ); + $css->add_property( 'margin-bottom', absint( $separator ), false, 'px' ); + + // Sub-navigation background + $css->set_selector( '.secondary-navigation ul ul' ); + $css->add_property( 'background-color', esc_attr( $generate_settings[ 'subnavigation_background_color' ] ) ); + $css->add_property( 'top', 'auto' ); // Added for compatibility purposes on 22/12/2016 + + // Sub-navigation text + $css->set_selector( '.secondary-navigation .main-nav ul ul li a' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'subnavigation_text_color' ] ) ); + $css->add_property( 'font-size', absint( $generate_settings[ 'secondary_navigation_font_size' ] - 1 ), absint( $og_defaults[ 'secondary_navigation_font_size' ] - 1 ), 'px' ); + $css->add_property( 'padding-left', absint( $generate_settings[ 'secondary_menu_item' ] ), $og_defaults[ 'secondary_menu_item' ], 'px' ); + $css->add_property( 'padding-right', absint( $generate_settings[ 'secondary_menu_item' ] ), $og_defaults[ 'secondary_menu_item' ], 'px' ); + $css->add_property( 'padding-top', absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), $og_defaults[ 'secondary_sub_menu_item_height' ], 'px' ); + $css->add_property( 'padding-bottom', absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), $og_defaults[ 'secondary_sub_menu_item_height' ], 'px' ); + $css->add_property( 'background-image', !empty( $generate_settings['sub_nav_item_image'] ) ? 'url(' . esc_url( $generate_settings['sub_nav_item_image'] ) . ')' : '' ); + $css->add_property( 'background-repeat', esc_attr( $generate_settings['sub_nav_item_repeat'] ) ); + + // Menu item padding on RTL + if ( is_rtl() ) { + $css->set_selector( 'nav.secondary-navigation .main-nav ul li.menu-item-has-children > a' ); + $css->add_property( 'padding-right', absint( $generate_settings[ 'secondary_menu_item' ] ), $og_defaults[ 'secondary_menu_item' ], 'px' ); + } + + // Dropdown arrow + $css->set_selector( '.secondary-navigation .menu-item-has-children ul .dropdown-menu-toggle' ); + $css->add_property( 'padding-top', absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), $og_defaults[ 'secondary_sub_menu_item_height' ], 'px' ); + $css->add_property( 'padding-bottom', absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), $og_defaults[ 'secondary_sub_menu_item_height' ], 'px' ); + $css->add_property( 'margin-top', '-' . absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), '-' . absint( $og_defaults[ 'secondary_sub_menu_item_height' ] ), 'px' ); + + // Dropdown arrow + $css->set_selector( '.secondary-navigation .menu-item-has-children .dropdown-menu-toggle' ); + $css->add_property( 'padding-right', absint( $generate_settings[ 'secondary_menu_item' ] ), $og_defaults[ 'secondary_menu_item' ], 'px' ); + + // Sub-navigation dropdown arrow + $css->set_selector( '.secondary-navigation .menu-item-has-children ul .dropdown-menu-toggle' ); + $css->add_property( 'padding-top', absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), $og_defaults[ 'secondary_sub_menu_item_height' ], 'px' ); + $css->add_property( 'padding-bottom', absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), $og_defaults[ 'secondary_sub_menu_item_height' ], 'px' ); + $css->add_property( 'margin-top', '-' . absint( $generate_settings[ 'secondary_sub_menu_item_height' ] ), '-' . absint( $og_defaults[ 'secondary_sub_menu_item_height' ] ), 'px' ); + + // Navigation background/text on hover + $css->set_selector( '.secondary-navigation .main-nav ul li:hover > a,.secondary-navigation .main-nav ul li:focus > a,.secondary-navigation .main-nav ul li.sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'navigation_text_hover_color' ] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings[ 'navigation_background_hover_color' ] ) ); + $css->add_property( 'background-image', !empty( $generate_settings[ 'nav_item_hover_image' ] ) ? 'url(' . esc_url( $generate_settings[ 'nav_item_hover_image' ] ) . ')' : '' ); + $css->add_property( 'background-repeat', esc_attr( $generate_settings['nav_item_hover_repeat'] ) ); + + // Sub-Navigation background/text on hover + $css->set_selector( '.secondary-navigation .main-nav ul ul li:hover > a,.secondary-navigation .main-nav ul ul li:focus > a,.secondary-navigation .main-nav ul ul li.sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'subnavigation_text_hover_color' ] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings[ 'subnavigation_background_hover_color' ] ) ); + $css->add_property( 'background-image', !empty( $generate_settings[ 'sub_nav_item_hover_image' ] ) ? 'url(' . esc_url( $generate_settings[ 'sub_nav_item_hover_image' ] ) . ')' : '' ); + $css->add_property( 'background-repeat', esc_attr( $generate_settings['sub_nav_item_hover_repeat'] ) ); + + // Navigation background / text current + hover + $css->set_selector( '.secondary-navigation .main-nav ul li[class*="current-menu-"] > a, .secondary-navigation .main-nav ul li[class*="current-menu-"] > a:hover,.secondary-navigation .main-nav ul li[class*="current-menu-"].sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'navigation_text_current_color' ] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings[ 'navigation_background_current_color' ] ) ); + $css->add_property( 'background-image', !empty( $generate_settings[ 'nav_item_current_image' ] ) ? 'url(' . esc_url( $generate_settings[ 'nav_item_current_image' ] ) . ')' : '' ); + $css->add_property( 'background-repeat', esc_attr( $generate_settings['nav_item_current_repeat'] ) ); + + // Sub-Navigation background / text current + hover + $css->set_selector( '.secondary-navigation .main-nav ul ul li[class*="current-menu-"] > a,.secondary-navigation .main-nav ul ul li[class*="current-menu-"] > a:hover,.secondary-navigation .main-nav ul ul li[class*="current-menu-"].sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings[ 'subnavigation_text_current_color' ] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings[ 'subnavigation_background_current_color' ] ) ); + $css->add_property( 'background-image', !empty( $generate_settings[ 'sub_nav_item_current_image' ] ) ? 'url(' . esc_url( $generate_settings[ 'sub_nav_item_current_image' ] ) . ')' : '' ); + $css->add_property( 'background-repeat', esc_attr( $generate_settings['sub_nav_item_current_repeat'] ) ); + + // RTL menu item padding + if ( is_rtl() ) { + $css->set_selector( '.secondary-navigation .main-nav ul li.menu-item-has-children > a' ); + $css->add_property( 'padding-right', absint( $generate_settings[ 'secondary_menu_item' ] ), false, 'px' ); + } + + if ( function_exists( 'generate_get_option' ) && function_exists( 'generate_get_defaults' ) ) { + $theme_defaults = generate_get_defaults(); + + if ( isset( $theme_defaults['icons'] ) ) { + if ( 'svg' === generate_get_option( 'icons' ) ) { + $css->set_selector( '.secondary-navigation.toggled .dropdown-menu-toggle:before' ); + $css->add_property( 'display', 'none' ); + } + } + } + + // Return our dynamic CSS + return $css->css_output(); + } +} + +if ( ! function_exists( 'generate_secondary_color_scripts' ) ) { + add_action( 'wp_enqueue_scripts', 'generate_secondary_color_scripts', 110 ); + /** + * Enqueue scripts and styles + */ + function generate_secondary_color_scripts() { + // Bail if no Secondary menu is set + if ( ! has_nav_menu( 'secondary' ) ) { + return; + } + + wp_add_inline_style( 'generate-secondary-nav', generate_secondary_nav_css() ); + } +} + +if ( ! function_exists( 'generate_secondary_navigation_class' ) ) { + /** + * Display the classes for the secondary navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_secondary_navigation_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_secondary_navigation_class( $class ) ) . '"'; + } +} + +if ( ! function_exists( 'generate_get_secondary_navigation_class' ) ) { + /** + * Retrieve the classes for the secondary navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_secondary_navigation_class( $class = '' ) { + + $classes = array(); + + 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('generate_secondary_navigation_class', $classes, $class); + } +} + +if ( ! function_exists( 'generate_secondary_menu_class' ) ) { + /** + * Display the classes for the secondary navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_secondary_menu_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_secondary_menu_class( $class ) ) . '"'; + } +} + +if ( ! function_exists( 'generate_get_secondary_menu_class' ) ) { + /** + * Retrieve the classes for the secondary navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_secondary_menu_class( $class = '' ) { + + $classes = array(); + + 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('generate_secondary_menu_class', $classes, $class); + } +} + +if ( ! function_exists( 'generate_inside_secondary_navigation_class' ) ) { + /** + * Display the classes for the inner navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_inside_secondary_navigation_class( $class = '' ) { + $classes = array(); + + 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('generate_inside_secondary_navigation_class', $classes, $class); + + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', $return ) . '"'; + } +} + +if ( ! function_exists( 'generate_hidden_secondary_navigation' ) && function_exists( 'is_customize_preview' ) ) { + add_action( 'wp_footer', 'generate_hidden_secondary_navigation' ); + /** + * Adds a hidden navigation if no navigation is set + * This allows us to use postMessage to position the navigation when it doesn't exist + */ + function generate_hidden_secondary_navigation() { + if ( is_customize_preview() && function_exists( 'generate_secondary_navigation_position' ) ) { + ?> +
        + +
        + +
        +
        + +
        +
        + .secondary-navigation .main-nav ul li a, .secondary-navigation .menu-toggle{padding: 0 ' + newval + 'px;}.secondary-navigation .menu-item-has-children .dropdown-menu-toggle{padding-right:' + newval + 'px;}' ); + setTimeout(function() { + jQuery( 'style#secondary_menu_item' ).not( ':last' ).remove(); + }, 50); + } ); + } ); + + wp.customize( 'generate_secondary_nav_settings[secondary_menu_item_height]', function( value ) { + value.bind( function( newval ) { + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#secondary_menu_item_height' ).not( ':last' ).remove(); + }, 50); + } ); + } ); + + wp.customize( 'generate_secondary_nav_settings[secondary_sub_menu_item_height]', function( value ) { + value.bind( function( newval ) { + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#secondary_sub_menu_item_height' ).not( ':last' ).remove(); + }, 50); + } ); + } ); + +})( jQuery ); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/secondary-nav/generate-secondary-nav.php b/wp-content/plugins/gp-premium/secondary-nav/generate-secondary-nav.php new file mode 100644 index 0000000..77b7ad6 --- /dev/null +++ b/wp-content/plugins/gp-premium/secondary-nav/generate-secondary-nav.php @@ -0,0 +1,19 @@ + *:last-child { + margin-bottom: 0; +} + +.generate-sections-container { + background-size: cover; +} + +.generate-sections-container.no-padding .generate-sections-inside-container { + padding: 0px !important; +} + +.generate-sections-enabled.one-container .site-content { + padding: 0; +} + +.generate-sections-enabled.one-container .container { + background: transparent; +} + +.generate-sections-enabled.one-container .site-main { + margin: 0 !important; +} + +.generate-sections-enabled .entry-content { + text-align: center; +} + +.separate-containers .site-main > .generate-sections-container { + margin-bottom: 0; +} \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/sections/functions/css/style.min.css b/wp-content/plugins/gp-premium/sections/functions/css/style.min.css new file mode 100644 index 0000000..802b011 --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/css/style.min.css @@ -0,0 +1 @@ +.sections-no-sidebars.generate-sections-enabled .container.grid-container,.sections-sidebars.no-sidebar.generate-sections-enabled .container.grid-container{max-width:100%}.sections-no-sidebars.generate-sections-enabled #primary.content-area,.sections-sidebars.no-sidebar.generate-sections-enabled #primary.content-area{width:100%}.sections-no-sidebars.generate-sections-enabled.separate-containers #main.site-main,.sections-no-sidebars.generate-sections-enabled.separate-containers .hentry,.sections-sidebars.no-sidebar.generate-sections-enabled.separate-containers #main.site-main,.sections-sidebars.no-sidebar.generate-sections-enabled.separate-containers .hentry{margin:0}.generate-sections-inside-container>:last-child{margin-bottom:0}.generate-sections-container{background-size:cover}.generate-sections-container.no-padding .generate-sections-inside-container{padding:0!important}.generate-sections-enabled.one-container .site-content{padding:0}.generate-sections-enabled.one-container .container{background:0 0}.generate-sections-enabled.one-container .site-main{margin:0!important}.generate-sections-enabled .entry-content{text-align:center}.separate-containers .site-main>.generate-sections-container{margin-bottom:0} \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/sections/functions/generate-sections.php b/wp-content/plugins/gp-premium/sections/functions/generate-sections.php new file mode 100644 index 0000000..2703c8e --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/generate-sections.php @@ -0,0 +1,329 @@ +ID, '_generate_use_sections', TRUE) : ''; + + if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) { + return $template; + } + + if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) { + + $new_template = dirname( __FILE__ ) . '/templates/template.php'; + + if ( '' != $new_template ) { + return $new_template; + } + } + return $template; + + } +} + +if ( ! function_exists( 'generate_sections_show_excerpt' ) ) { + add_filter( 'generate_show_excerpt', 'generate_sections_show_excerpt' ); + /** + * If Sections is enabled on a post, make sure we use the excerpt field on the blog page + */ + function generate_sections_show_excerpt( $show_excerpt ) { + global $post; + $use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : ''; + + if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) { + return true; + } + + return $show_excerpt; + } +} + +if ( ! function_exists( 'generate_sections_styles' ) ) { + add_action( 'wp_enqueue_scripts', 'generate_sections_styles' ); + /** + * Enqueue necessary scripts if sections are enabled + */ + function generate_sections_styles() { + + global $post; + $use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : ''; + + // Bail if we're on a posts page + if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) { + return; + } + + if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) { + wp_enqueue_style( 'generate-sections-styles', plugin_dir_url( __FILE__ ) . 'css/style.min.css' ); + wp_enqueue_script( 'generate-sections-parallax', plugin_dir_url( __FILE__ ) . 'js/parallax.min.js', array(), GENERATE_SECTIONS_VERSION, true ); + } + } +} + +if ( ! function_exists( 'generate_sections_body_classes' ) ) { + add_filter( 'body_class', 'generate_sections_body_classes' ); + /** + * Add classes to our element when sections are enabled + */ + function generate_sections_body_classes( $classes ) { + global $post; + $use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : ''; + $sidebars = apply_filters( 'generate_sections_sidebars', false ); + + // Bail if we're on a posts page + if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) { + return $classes; + } + + if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) { + $classes[] = 'generate-sections-enabled'; + } + + if ( ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) && ! $sidebars ) { + $classes[] = 'sections-no-sidebars'; + } + + if ( ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) && $sidebars ) { + $classes[] = 'sections-sidebars'; + } + + return $classes; + } +} + +if ( ! function_exists( 'generate_sections_add_css' ) ) { + add_action( 'wp_enqueue_scripts', 'generate_sections_add_css', 500 ); + /** + * Create the CSS for our sections + */ + function generate_sections_add_css() { + global $post; + $use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : ''; + + if ( ! isset( $use_sections['use_sections'] ) ) { + return; + } + + if ( 'true' !== $use_sections['use_sections'] ) { + return; + } + + if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) { + return; + } + + if ( function_exists( 'generate_spacing_get_defaults' ) ) { + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + $left_padding = $spacing_settings['content_left']; + $right_padding = $spacing_settings['content_right']; + $mobile_padding_left = ( isset( $spacing_settings[ 'mobile_content_left' ] ) ) ? $spacing_settings[ 'mobile_content_left' ] : 30; + $mobile_padding_right = ( isset( $spacing_settings[ 'mobile_content_right' ] ) ) ? $spacing_settings[ 'mobile_content_right' ] : 30; + } else { + $right_padding = 40; + $left_padding = 40; + $mobile_padding = 30; + } + + $sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_sections', TRUE) : ''; + + // check if the repeater field has rows of data + if ( $sections && '' !== $sections ) { + + $css = '.generate-sections-inside-container {padding-left:' . $left_padding . 'px;padding-right:' . $right_padding . 'px;}'; + // loop through the rows of data + $i = 0; + foreach ( $sections['sections'] as $section ) : + $i++; + + // Get image details + $image_id = ( isset( $section['background_image'] ) && '' !== $section['background_image'] ) ? intval( $section['background_image'] ) : ''; + $image_url = ( '' !== $image_id ) ? wp_get_attachment_image_src( $image_id, 'full' ) : ''; + + // Get the padding type + $padding_type = apply_filters( 'generate_sections_padding_type','px' ); + + // If someone has changed the padding type using a filter, use their value + if ( 'px' !== $padding_type ) { + $top_padding_type = $padding_type; + $bottom_padding_type = $padding_type; + } else { + $top_padding_type = ( isset( $section['top_padding_unit'] ) && '' !== $section['top_padding_unit'] ) ? $section['top_padding_unit'] : $padding_type; + $bottom_padding_type = ( isset( $section['bottom_padding_unit'] ) && '' !== $section['bottom_padding_unit'] ) ? $section['bottom_padding_unit'] : $padding_type; + } + + // Default padding top + $padding_top = apply_filters( 'generate_sections_default_padding_top','40' ); + + // Default padding bottom + $padding_bottom = apply_filters( 'generate_sections_default_padding_bottom','40' ); + + $custom_id = ( isset( $section['custom_id'] ) ) ? $section['custom_id'] : ''; + $custom_id = ( '' == $custom_id ) ? "generate-section-$i" : $custom_id; + + // Get the values + $background_color = ( isset( $section['background_color'] ) && '' !== $section['background_color'] ) ? 'background-color:' . esc_attr( $section['background_color'] ) . ';' : ''; + $background_image = ( ! empty( $image_url[0] ) ) ? 'background-image:url(' . esc_url( $image_url[0] ) . ');' : ''; + + if ( isset( $section['background_color_overlay'] ) && '' !== $section['background_color_overlay'] ) { + if ( '' !== $background_image && '' !== $background_color ) { + $background_image = 'background-image:linear-gradient(0deg, ' . $section['background_color'] . ',' . $section['background_color'] . '), url(' . esc_url( $image_url[0] ) . ');'; + $background_color = ''; + } + } + + $text_color = ( isset( $section['text_color'] ) && '' !== $section['text_color'] ) ? 'color:' . esc_attr( $section['text_color'] ) . ';' : ''; + $link_color = ( isset( $section['link_color'] ) && '' !== $section['link_color'] ) ? 'color:' . esc_attr( $section['link_color'] ) . ';' : ''; + $link_color_hover = ( isset( $section['link_color_hover'] ) && '' !== $section['link_color_hover'] ) ? 'color:' . esc_attr( $section['link_color_hover'] ) . ';' : ''; + $top_padding = ( isset( $section['top_padding'] ) && '' !== $section['top_padding'] ) ? 'padding-top:' . absint( $section['top_padding'] ) . $top_padding_type . ';' : 'padding-top:' . $padding_top . 'px;'; + $bottom_padding = ( isset( $section['bottom_padding'] ) && '' !== $section['bottom_padding'] ) ? 'padding-bottom:' . absint( $section['bottom_padding'] ) . $bottom_padding_type . ';' : 'padding-bottom:' . $padding_bottom . 'px;'; + + // Outer container + if ( '' !== $background_color || '' !== $background_image ) { + $css .= '#' . $custom_id . '.generate-sections-container{' . $background_color . $background_image . '}'; + } + + // Inner container + if ( '' !== $top_padding || '' !== $bottom_padding || '' !== $text_color ) { + $css .= '#' . $custom_id . ' .generate-sections-inside-container{' . $top_padding . $bottom_padding . $text_color . '}'; + } + + // Link color + if ( '' !== $link_color ) { + $css .= '#' . $custom_id . ' a,#generate-section-' . $i . ' a:visited{' . $link_color . '}'; + } + + // Link color hover + if ( '' !== $link_color_hover ) { + $css .= '#' . $custom_id . ' a:hover{' . $link_color_hover . '}'; + } + + $mobile = generate_premium_get_media_query( 'mobile' ); + $css .= '@media ' . esc_attr( $mobile ) . ' {.generate-sections-inside-container {padding-left: ' . $mobile_padding_left . 'px;padding-right: ' . $mobile_padding_right . 'px;}}'; + endforeach; + + // Build CSS + wp_add_inline_style( 'generate-style', $css ); + + } + } +} + +if ( ! function_exists( 'generate_sections_filter_admin_init' ) ) { + add_action( 'admin_init', 'generate_sections_filter_admin_init' ); + /* + * Recreate the default filters on the_content + * this will make it much easier to output the meta content with proper/expected formatting + */ + function generate_sections_filter_admin_init() { + if ( user_can_richedit() ) { + add_filter( 'generate_section_content', 'convert_smilies' ); + add_filter( 'generate_section_content', 'convert_chars' ); + add_filter( 'generate_section_content', 'wpautop' ); + add_filter( 'generate_section_content', 'shortcode_unautop' ); + add_filter( 'generate_section_content', 'prepend_attachment' ); + } + } +} + +if ( ! function_exists( 'generate_sections_filter' ) ) { + add_action( 'init', 'generate_sections_filter' ); + /* + * Recreate the default filters on the_content + * this will make it much easier to output the meta content with proper/expected formatting + */ + function generate_sections_filter() { + if ( is_admin() ) { + return; + } + + add_filter( 'generate_section_content', 'convert_smilies' ); + add_filter( 'generate_section_content', 'convert_chars' ); + add_filter( 'generate_section_content', 'wpautop' ); + add_filter( 'generate_section_content', 'shortcode_unautop' ); + add_filter( 'generate_section_content', 'prepend_attachment' ); + add_filter( 'generate_section_content', 'do_shortcode'); + + add_filter( 'generate_the_section_content', array($GLOBALS['wp_embed'], 'autoembed'), 9 ); + } +} + +if ( ! function_exists( 'generate_sections_save_content' ) ) { + add_action( 'save_post', 'generate_sections_save_content', 99, 4 ); + /* + * When we save our post, grab all of the section content and save it as regular content. + * + * This will prevent content loss/theme lock. + */ + function generate_sections_save_content( $post_id, $post ) { + + if ( ! isset( $_POST['_generate_sections_nonce'] ) || ! wp_verify_nonce( $_POST['_generate_sections_nonce'], 'generate_sections_nonce' ) ) { + return; + } + + if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) { + return; + } + + if ( ! current_user_can('edit_post', $post_id ) ) { + return; + } + + // See if we're using sections + $use_sections = get_post_meta( $post_id, '_generate_use_sections', true); + + // Make sure use sections exists and that we're not saving a revision + if ( ! isset( $use_sections['use_sections'] ) || wp_is_post_revision( $post_id ) ) { + return; + } + + // Return if sections are set to false + if ( 'true' !== $use_sections['use_sections'] ) { + return; + } + + // Get our sections + $sections = get_post_meta( $post_id, '_generate_sections', true ); + + // Return if there's nothing in our sections + if ( ! isset( $sections ) || '' == $sections ) { + return; + } + + // Prevent infinite loop + remove_action( 'save_post', 'generate_sections_save_content', 99, 4 ); + + // Let's do some stuff if sections aren't empty + if ( '' !== $sections ) { + // Set up our content variable + $content = ''; + + // Loop through each section and add our content to the content variable + foreach ( $sections['sections'] as $section ) { + $content .= ( isset( $section['content'] ) && '' !== $section['content'] ) ? $section['content'] . "\n\n" : ''; + } + + // Now update our post if we have section content + if ( '' !== $content ) { + $post->post_content = $content; + wp_update_post( $post, true ); + } + } + + // Re-hook the save_post action + add_action('save_post', 'generate_sections_save_content', 99, 4); + } +} diff --git a/wp-content/plugins/gp-premium/sections/functions/js/parallax.js b/wp-content/plugins/gp-premium/sections/functions/js/parallax.js new file mode 100644 index 0000000..2c49e75 --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/js/parallax.js @@ -0,0 +1,17 @@ +function generate_sections_parallax_element( selector, context ) { + context = context || document; + var elements = context.querySelectorAll( selector ); + return Array.prototype.slice.call( elements ); +} + +window.addEventListener( "scroll", function() { + var scrolledHeight= window.pageYOffset; + generate_sections_parallax_element( ".generate-sections-container.enable-parallax" ).forEach( function( el, index, array ) { + var limit = el.offsetTop + el.offsetHeight; + if( scrolledHeight > el.offsetTop && scrolledHeight <= limit ) { + el.style.backgroundPositionY = ( scrolledHeight - el.offsetTop ) / el.getAttribute( 'data-speed' ) + "px"; + } else { + el.style.backgroundPositionY = "0"; + } + }); +}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/sections/functions/js/parallax.min.js b/wp-content/plugins/gp-premium/sections/functions/js/parallax.min.js new file mode 100644 index 0000000..7004f63 --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/js/parallax.min.js @@ -0,0 +1 @@ +function generate_sections_parallax_element(e,t){var o=(t=t||document).querySelectorAll(e);return Array.prototype.slice.call(o)}window.addEventListener("scroll",function(){var e=window.pageYOffset;generate_sections_parallax_element(".generate-sections-container.enable-parallax").forEach(function(t,o,n){var a=t.offsetTop+t.offsetHeight;e>t.offsetTop&&e<=a?t.style.backgroundPositionY=(e-t.offsetTop)/t.getAttribute("data-speed")+"px":t.style.backgroundPositionY="0"})}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/sections/functions/metaboxes/css/generate-sections-metabox.css b/wp-content/plugins/gp-premium/sections/functions/metaboxes/css/generate-sections-metabox.css new file mode 100644 index 0000000..6f72471 --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/metaboxes/css/generate-sections-metabox.css @@ -0,0 +1,351 @@ +body { + -webkit-backface-visibility: hidden; +} +#_generate_sections_metabox { + opacity: 0; + height: 0; + overflow: hidden; +} + +#_generate_use_sections_metabox { + display: block !important; +} + +.generate_sections_control { + padding-top: 8px; +} + +.generate-sections-enabled #postdivrich { + opacity: 0; + height: 0; + overflow: hidden; +} +.generate-sections-enabled #_generate_sections_metabox { + opacity: 1; + height: auto; +} + +.generate_sections_control .warning { + color: red; +} +.generate_sections_control .dodelete-repeating_textareas { + float: right; +} +.generate_sections_control .section { + border: 1px solid #DFDFDF; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + margin: 6px 0px 8px; + overflow: hidden; + position: relative; + background: white; +} +.generate_sections_control .section .section-title { + font-size: 14px; + padding: 0 0 0 15px; + margin: 0; + max-height: 50px; +} +.generate_sections_control .section .section-title > span { + cursor: pointer; + overflow:hidden; + display:block; + max-height:50px; + line-height:50px; + width:100%; +} +.generate_sections_control .section .section-controls { + position: absolute; + top:0; + right:0; + text-align: right; +} +.rtl .generate_sections_control .section .section-controls { + right:auto;left:0; +} +.generate_sections_control .section .section-controls a { + color: #aaa; + display:block; + float:left; + border-left: 1px solid #efefef; +} +.generate_sections_control .section .section-controls a:hover { + color: #777; +} +.generate_sections_control .section textarea { + display: none; +} +.generate_sections_control .section h3 { + color: #999; + font-size: 1em; + margin: 15px 6px; + text-transform: uppercase; +} +.generate_sections_control .section .ui-sortable-placeholder { + line-height: 1.4em; + border: 3px dashed #DDD; +} +.generate-sections-modal .media-menu-item { + cursor: pointer; +} +.custom-classes input { + width:100%; +} +.js .generate_sections_control .move-section { + cursor: move; +} +.generate-sections-modal p { + margin-top:5px; +} +#_generate_sections_metabox { + box-shadow: 0 0 0 transparent; +} +.section-controls a { + line-height:50px; + padding: 0 15px; + width:initial; + height:initial; +} + +.generate_sections_control .section .section-controls a.delete-section:hover { + color: red; +} + +.generate_sections_control p { + margin: 5px; +} + +textarea#generate-sections-editor { + border:0; +} + +#generate-sections-editor_ifr { + min-height: 400px; +} + +a#generate-add-section, a#generate-delete-sections { + height: auto; + line-height: inherit; + padding: 10px 20px; +} + +#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > * { + display:none; +} + +#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .generate-sections-add-media, +#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .su-generator-button, +#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .envira-gallery-choose-gallery, +#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .gridable-insert-row-button { + display: inline-block; +} + +#custom-media-buttons > * { + display: none; +} + +#custom-media-buttons > .insert-media, +#custom-media-buttons > .su-generator-button, +#custom-media-buttons > .envira-gallery-choose-gallery, +#custom-media-buttons > .gridable-insert-row-button, +#custom-media-buttons > .bfa-iconpicker { + display: inline-block; +} + +#_generate_sections_metabox { + background: transparent; + border: 0; +} +#_generate_sections_metabox > .handlediv, #_generate_sections_metabox > .hndle { + display: none; +} +#_generate_sections_metabox > .inside { + padding-left: 0; + padding-right: 0; +} + +body.wp-admin .grid-container { + max-width: 100%; +} + +.generate-sections-modal h3 { + margin-top: 0; +} + +input#custom_classes, +input#custom_id { + width: 100%; + max-width: 300px; +} + +.box-type select, +.inner-box-type select, +.parallax-effect select, +.top-padding input, +.bottom-padding input { + width: 100%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.send-to-editor { + display: inline-block; + margin-top: 15px !important; +} + +.gs-grid-container { + margin-left: auto; + margin-right: auto; + max-width: 100%; + padding-left: 10px; + padding-right: 10px; +} + +.gs-grid-parent { + padding-left: 0; + padding-right: 0; +} + +.gs-grid-container:before, +.gs-grid-container:after { + content: "."; + display: block; + overflow: hidden; + visibility: hidden; + font-size: 0; + line-height: 0; + width: 0; + height: 0; + clear: both; +} + +@media screen and (min-width: 769px) { + .gs-grid-50:before, + .gs-grid-50:after, + .gs-grid-33:before, + .gs-grid-33:after, + .gs-grid-25:before, + .gs-grid-25:after + .gs-grid-20:before, + .gs-grid-20:after + .gs-grid-12:before, + .gs-grid-12:after { + content: "."; + display: block; + overflow: hidden; + visibility: hidden; + font-size: 0; + line-height: 0; + width: 0; + height: 0; + clear: both; + } + .gs-grid-50, + .gs-grid-33, + .gs-grid-25, + .gs-grid-20, + .gs-grid-12 { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-left: 10px; + padding-right: 10px; + } + .gs-grid-50 { + width: 50% !important; + float: left; + } + .gs-grid-33 { + width: 33.333% !important; + float: left; + } + .gs-grid-25 { + width: 25% !important; + float: left; + } + .gs-grid-20 { + width: 20% !important; + float: left; + } + .gs-grid-12 { + width: 12.5% !important; + float: left; + } + .top-border { + border-top: 1px solid #EFEFEF; + } + .bottom-border { + border-bottom: 1px solid #EFEFEF; + } + .border-right { + border-right: 1px solid #EFEFEF; + } + .border-left { + border-left: 1px solid #EFEFEF; + } +} + +@media screen and (max-width: 768px) { + .gs-grid-50, .gs-grid-33, .gs-grid-25, .gs-grid-12 { + width: 100% !important; + } + .generate_sections_control .section .section-controls { + position: relative; + } +} + +@media screen and (max-width: 500px) { + .generate_sections_control .section .section-controls a:first-child { + border-left: 0; + } +} + +#generate-sections-modal-dialog .media-modal-close { + text-decoration: none; + text-align: center; +} +/* + The styles below were ripped from the Media Modal in WordPress 3.5 + ~~ Thanks for building a beautiful Modal UI ( that I could steal ) +*/ +body.generate-modal-open { overflow: hidden; } + +.generate-sections-modal .media-modal { z-index: 65535; } +.generate-sections-modal .media-modal-backdrop { z-index: 65534; } +.generate-sections-modal .media-frame-content .panel { display: none; padding: 2em; } +.generate-sections-modal .media-frame-content .panel.active { display: block; } +.generate-sections-modal .media-frame-content .panel .section-title input { width:100%;padding:10px; } +.generate-sections-modal .media-frame-content .panel .html-active .mce-panel { display: none; } +.generate-sections-modal .media-frame-content .panel .html-active .wp-editor-area { display: block !important; min-height: 300px; } +.generate-sections-modal .media-frame-content .panel .mce-wp-dfw, .generate-sections-modal .media-frame-content .panel .qt-dfw { display: none; } +.generate-sections-modal .media-frame-content .panel .generate-sections-remove-image { display: none; } + +textarea.no-rich-edit { + width: 100%; + min-height: 300px; +} + +/*# sourceMappingURL=meta.css.map */ + +.wp-picker-container .wp-color-result.button { + height: 24px; + margin: 0 6px 6px 0px; + padding: 0 0 0 30px; + font-size: 11px; +} + +.wp-color-result:after { + display: none; +} + +.wp-color-result-text { + background: #f7f7f7; + border-radius: 0 2px 2px 0; + border-left: 1px solid #ccc; + color: #555; + display: block; + line-height: 22px; + padding: 0 6px; + text-align: center; +} diff --git a/wp-content/plugins/gp-premium/sections/functions/metaboxes/css/lc_switch.css b/wp-content/plugins/gp-premium/sections/functions/metaboxes/css/lc_switch.css new file mode 100644 index 0000000..829bc8c --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/metaboxes/css/lc_switch.css @@ -0,0 +1,101 @@ +.lcs_wrap { + display: inline-block; + direction: ltr; + height: 28px; + vertical-align: middle; +} +.lcs_wrap input { + display: none; +} + +.lcs_switch { + display: inline-block; + position: relative; + width: 73px; + height: 28px; + border-radius: 30px; + background: #ddd; + overflow: hidden; + cursor: pointer; + + -webkit-transition: all .2s ease-in-out; + -ms-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.lcs_cursor { + display: inline-block; + position: absolute; + top: 3px; + width: 22px; + height: 22px; + border-radius: 100%; + background: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.1); + z-index: 10; + + -webkit-transition: all .2s linear; + -ms-transition: all .2s linear; + transition: all .2s linear; +} +.lcs_label { + font-family: "Trebuchet MS", Helvetica, sans-serif; + font-size: 12px; + letter-spacing: 1px; + line-height: 18px; + color: #fff; + font-weight: bold; + position: absolute; + width: 33px; + top: 5px; + overflow: hidden; + text-align: center; + opacity: 0; + + -webkit-transition: all .2s ease-in-out .1s; + -ms-transition: all .2s ease-in-out .1s; + transition: all .2s ease-in-out .1s; +} +.lcs_label.lcs_label_on { + left: -70px; + z-index: 6; +} +.lcs_label.lcs_label_off { + right: -70px; + z-index: 5; +} + + +/* on */ +.lcs_switch.lcs_on { + background: #75b936; + box-shadow: 0 0 2px #579022 inset; +} +.lcs_switch.lcs_on .lcs_cursor { + left: 48px; +} +.lcs_switch.lcs_on .lcs_label_on { + left: 10px; + opacity: 1; +} + + +/* off */ +.lcs_switch.lcs_off { + background: #b2b2b2; + box-shadow: 0px 0px 2px #a4a4a4 inset; +} +.lcs_switch.lcs_off .lcs_cursor { + left: 3px; +} +.lcs_switch.lcs_off .lcs_label_off { + right: 10px; + opacity: 1; +} + + +/* disabled */ +.lcs_switch.lcs_disabled { + opacity: 0.65; + filter: alpha(opacity=65); + cursor: default; +} \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox-4.9.js b/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox-4.9.js new file mode 100644 index 0000000..f921506 --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox-4.9.js @@ -0,0 +1,835 @@ +/*-----------------------------------------------------------------------------------*/ +/* Generate Sections Metabox +/* +/* © Kathy Darling http://www.kathyisawesome.com +/* 2016-07-19. */ +/*-----------------------------------------------------------------------------------*/ + +/** + * @type {Object} JavaScript namespace for our application. + */ +var Generate_Sections = { + backbone_modal: { + __instance: undefined + } +}; + +(function($, Generate_Sections) { + + + // Model + Generate_Sections.Section = Backbone.Model.extend({ + defaults: { + "title": "", + "box_type": "", + "inner_box_type": "", + "custom_classes": "", + "custom_id": "", + "top_padding": "", + "bottom_padding": "", + "top_padding_unit": "", + "bottom_padding_unit": "", + "background_color": "", + "background_image": "", + "background_image_preview": "", + "parallax_effect": "", + "background_color_overlay": "", + "text_color": "", + "link_color": "", + "link_color_hover": "", + "content": "" + } + }); + + + // Collection + Generate_Sections.SectionsCollection = Backbone.Collection.extend({ + model: Generate_Sections.Section, + el: "#generate_sections_container", + comparator: function(model) { + return model.get('index'); + } + }); + + + /** + * Primary Modal Application Class + */ + Generate_Sections.backbone_modal.Application = Backbone.View.extend({ + + attributes: { + id: "generate-sections-modal-dialog", + class: "generate-sections-modal", + role: "dialog" + }, + + template: wp.template("generate-sections-modal-window"), + + mediaUploader: null, + + /*-----------------------------------------------------------------------------------*/ + /* tinyMCE settings + /*-----------------------------------------------------------------------------------*/ + + tmc_settings: {}, + + /*-----------------------------------------------------------------------------------*/ + /* tinyMCE defaults + /*-----------------------------------------------------------------------------------*/ + + tmc_defaults: { + theme: "modern", + menubar: false, + wpautop: true, + indent: false, + toolbar1: "bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink,fullscreen", + plugins: "fullscreen,image,wordpress,wpeditimage,wplink", + max_height: 500 + }, + + /*-----------------------------------------------------------------------------------*/ + /* quicktags settings + /*-----------------------------------------------------------------------------------*/ + + qt_settings: {}, + + /*-----------------------------------------------------------------------------------*/ + /* quicktags defaults + /*-----------------------------------------------------------------------------------*/ + + qt_defaults: { + buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen" + }, + + model: Generate_Sections.Section, + + events: { + "click .media-modal-backdrop, .media-modal-close, .media-button-close": "closeModal", + "click .media-button-insert": "saveModal", + "click .media-menu-item": "switchTab", + "keydown": "keydown", + "click .generate-sections-upload-button": "openMediaUploader", + "click .generate-sections-remove-image": "removeImage", + "click div.media-frame-title h1": "toggleMenu" + }, + + + + /** + * Simple object to store any UI elements we need to use over the life of the application. + */ + ui: { + nav: undefined, + content: undefined + }, + + + /** + * Instantiates the Template object and triggers load. + */ + initialize: function() { + _.bindAll(this, "render", "closeModal", "saveModal", "switchTab"); + + this.focusManager = new wp.media.view.FocusManager({ + el: this.el + }); + + this.changeInsertText(); + this.tinyMCEsettings(); + this.render(); + }, + + /** + * switch the insert button text to "insert section" + */ + changeInsertText: function(restore) { + + var restore = typeof restore !== 'undefined' && restore == true ? true : false; + + if (restore == false && typeof(wp.media.view.l10n.insertIntoPost) !== "undefined") { + this.insertIntoPost = wp.media.view.l10n.insertIntoPost; + wp.media.view.l10n.insertIntoPost = generate_sections_metabox_i18n.insert_into_section; + // switch the insert button text back + } else if (restore == true && typeof(this.insertIntoPost) !== "undefined") { + wp.media.view.l10n.insertIntoPost = this.insertIntoPost; + } + }, + + + /** + * Merge the default TinyMCE settings + */ + tinyMCEsettings: function() { + // get the #content"s tinyMCE settings or use default + var init_settings = typeof tinyMCEPreInit == "object" && "mceInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.mceInit ? tinyMCEPreInit.mceInit.content : this.tmc_defaults; + + // get the #content"s quicktags settings or use default + var qt_settings = typeof tinyMCEPreInit == "object" && "qtInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.qtInit ? tinyMCEPreInit.qtInit.content : this.qt_defaults; + + var _this = this; + var custom_settings = { + selector: "#generate-sections-editor", + wp_autoresize_on: false, + cache_suffix: "", + min_height: 400, + } + + // merge our settings with WordPress" and store for later use + this.tmc_settings = $.extend({}, init_settings, custom_settings); + + this.qt_settings = $.extend({}, qt_settings, { + id: "generate-sections-editor" + }); + }, + + + /** + * Assembles the UI from loaded template. + * @internal Obviously, if the template fail to load, our modal never launches. + */ + render: function() { + + "use strict"; + + // Build the base window and backdrop, attaching them to the $el. + // Setting the tab index allows us to capture focus and redirect it in Application.preserveFocus + this.$el.attr("tabindex", "0") + .html(this.template); + + // Handle any attempt to move focus out of the modal. + //jQuery(document).on("focusin", this.preserveFocus); + + // set overflow to "hidden" on the body so that it ignores any scroll events while the modal is active + // and append the modal to the body. + jQuery("body").addClass("generate-modal-open").prepend(this.$el); + + // aria hide the background + jQuery("#wpwrap").attr("aria-hidden", "true"); + + this.renderContent(); + + this.renderPreview(); + + this.selected(); + this.colorPicker(); + this.startTinyMCE(); + + // Set focus on the modal to prevent accidental actions in the underlying page + this.$el.focus(); + + return this; + }, + + /** + * Make the menu mobile-friendly + */ + toggleMenu: function() { + this.$el.find('.media-menu').toggleClass('visible'); + }, + + /** + * Create the nav tabs & panels + */ + renderContent: function() { + + var model = this.model; + + var menu_item = wp.template("generate-sections-modal-menu-item"); + + // Save a reference to the navigation bar"s unordered list and populate it with items. + this.ui.nav = this.$el.find(".media-menu"); + + // reference to content area + this.ui.panels = this.$el.find(".media-frame-content"); + + // loop through the tabs + if (generate_sections_metabox_i18n.tabs.length) { + + // for...of is nicer, but not supported by minify, so stay with for...in for now + for (var tab in generate_sections_metabox_i18n.tabs) { + + if (generate_sections_metabox_i18n.tabs.hasOwnProperty(tab)) { + + tab = generate_sections_metabox_i18n.tabs[tab]; + + var $new_tab = $(menu_item({ + target: tab.target, + name: tab.title + })); + + var panel = wp.template("generate-sections-edit-" + tab.target); + + var $new_panel = $(panel(model.toJSON())); + + if (tab.active == "true") { + $new_tab.addClass("active"); + $new_panel.addClass("active"); + } + + jQuery( 'body' ).on( 'generate_section_show_settings', function() { + jQuery( '.generate-sections-modal .media-menu-item' ).removeClass('active'); + jQuery( '.generate-sections-modal .panel' ).removeClass('active'); + jQuery( '.generate-section-item-style' ).addClass('active'); + jQuery( '.generate-section-settings' ).addClass('active'); + }); + + this.ui.nav.append($new_tab); + this.ui.panels.append($new_panel); + } + } + } + + }, + + + /** + * Render the background image preview + */ + renderPreview: function(image_id) { + + var image_id = typeof image_id !== 'undefined' ? image_id : this.model.get("background_image"); + + var $preview = $("#generate-section-image-preview"); + $preview.children().remove(); + + if (image_id > 0) { + this.background = new wp.media.model.Attachment.get(image_id); + + this.background.fetch({ + success: function(att) { + if (_.contains(['png', 'jpg', 'gif', 'jpeg'], att.get('subtype'))) { + $("").attr("src", att.attributes.sizes.thumbnail.url).appendTo($preview); + $preview.next().find(".generate-sections-remove-image").show(); + } + } + }); + } + + }, + + + /** + * Set the default option for the select boxes + */ + selected: function() { + + var _this = this; + + this.$el.find("select").each(function(index, select) { + + var attribute = jQuery(select).attr("name"); + var selected = _this.model.get(attribute); + jQuery(select).val(selected); + + }); + }, + + /** + * Start the colorpicker + */ + colorPicker: function() { + this.$el.find(".generate-sections-color").wpColorPicker(); + }, + + /** + * Start TinyMCE on the textarea + */ + startTinyMCE: function() { + + // set the default editor + this.ui.panels.find("#wp-generate-sections-editor-wrap").addClass(generate_sections_metabox_i18n.default_editor); + + // remove tool buttons if richedit disabled + if (!generate_sections_metabox_i18n.user_can_richedit) { + this.ui.panels.find(".wp-editor-tabs").remove(); + } + + // add our copy to the collection in the tinyMCEPreInit object because switch editors + if (typeof tinyMCEPreInit == 'object') { + tinyMCEPreInit.mceInit["generate-sections-editor"] = this.tmc_settings; + tinyMCEPreInit.qtInit["generate-sections-editor"] = this.qt_settings; + tinyMCEPreInit.mceInit["generate-sections-editor"].wp_keep_scroll_position = false; + } + + try { + + var rich = (typeof tinyMCE != "undefined"); + + // turn on the quicktags editor + quicktags(this.qt_settings); + + // attempt to fix problem of quicktags toolbar with no buttons + QTags._buttonsInit(); + + if (rich !== false) { + // turn on tinyMCE + tinyMCE.init(this.tmc_settings); + } + + } catch (e) {} + + }, + + /** + * Launch Media Uploader + */ + openMediaUploader: function(e) { + + var _this = this; + + $input = jQuery(e.currentTarget).prev("#generate-sections-background-image"); + + e.preventDefault(); + + // If the uploader object has already been created, reopen the dialog + if (this.mediaUploader) { + this.mediaUploader.open(); + return; + } + // Extend the wp.media object + this.mediaUploader = wp.media.frames.file_frame = wp.media({ + title: generate_sections_metabox_i18n.media_library_title, + button: { + text: generate_sections_metabox_i18n.media_library_button + }, + multiple: false + }); + + + // When a file is selected, grab the URL and set it as the text field"s value + this.mediaUploader.on("select", function() { + + attachment = _this.mediaUploader.state().get("selection").first().toJSON(); + + $input.val(attachment.id); + + _this.renderPreview(attachment.id); + }); + // Open the uploader dialog + this.mediaUploader.open(); + + }, + + /** + * Remove the background image + */ + removeImage: function(e) { + e.preventDefault(); + $("#generate-section-image-preview").children().remove(); + $("#generate-section-image-preview").next().find(".generate-sections-remove-image").hide(); + $("#generate-sections-background-image").val(""); + }, + + + /** + * Closes the modal and cleans up after the instance. + * @param e {object} A jQuery-normalized event object. + */ + closeModal: function(e) { + "use strict"; + + e.preventDefault(); + this.undelegateEvents(); + jQuery(document).off("focusin"); + jQuery("body").removeClass("generate-modal-open"); + jQuery("body").removeClass("generate-section-content"); + + // remove restricted media modal tab focus once it's closed + this.$el.undelegate('keydown'); + + // remove the tinymce editor + // this needs to be called before the modal is closed or it will fail in Firefox (that was fun to figure out...) + if (typeof tinyMCE != "undefined") { + tinymce.EditorManager.execCommand("mceRemoveEditor", true, "generate-sections-editor"); + } + + // remove modal and unset instances + this.remove(); + Generate_Sections.backbone_modal.__instance = undefined; + this.mediaUploader = null; + Generate_Sections.modalOpen = null; + + // switch the insert button text back + this.changeInsertText(true); + + // send focus back to where it was prior to modal open + Generate_Sections.lastFocus.focus(); + + // aria unhide the background + jQuery("#wpwrap").attr("aria-hidden", "false"); + + // Fix bug where the window scrolls down 50px on close + var topDistance = jQuery("body").offset().top; + if ( topDistance >= jQuery("body").scrollTop() ) { + jQuery("body").scrollTop(0); + } + + }, + + /** + * Responds to the btn-ok.click event + * @param e {object} A jQuery-normalized event object. + * @todo You should make this your own. + */ + saveModal: function(e) { + "use strict"; + + this.model.get("index"); + + var model = this.model; + + // send the tinymce content to the textarea + if (typeof tinyMCE != "undefined") { + tinymce.triggerSave(); + } + + var $inputs = this.ui.panels.find("input, select, textarea"); + + $inputs.each(function(index, input) { + + var name = $(input).attr("name"); + + if (model.attributes.hasOwnProperty(name)) { + var value = $(input).val(); + model.set(name, value); + } + + }); + + this.closeModal(e); + }, + + /** + * Handles tab clicks and switches to corresponding panel + * @param e {object} A jQuery-normalized event object. + */ + switchTab: function(e) { + "use strict"; + e.preventDefault(); + + // close lingering wp link windows + if (typeof tinyMCE != "undefined" && 'style' == jQuery( e.currentTarget ).data( 'target' ) && this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).hasClass( 'tmce-active' )) { + tinyMCE.activeEditor.execCommand('wp_link_cancel'); + tinyMCE.activeEditor.execCommand('wp_media_cancel'); + } + + this.ui.nav.children().removeClass("active"); + this.ui.panels.children().removeClass("active"); + + var target = jQuery(e.currentTarget).addClass("active").data("target"); + + this.ui.panels.find("div[data-id=" + target + "]").addClass("active"); + }, + + /** + * close on keyboard shortcuts + * @param {Object} event + */ + keydown: function(e) { + // Close the modal when escape is pressed. + if (27 === e.which && this.$el.is(':visible')) { + this.closeModal(e); + e.stopImmediatePropagation(); + } + } + + }); + + + // Singular View + Generate_Sections.sectionView = Backbone.View.extend({ + + model: Generate_Sections.Section, + tagName: 'div', + + initialize: function() { + // re-render on all changes EXCEPT index + this.listenTo(this.model, "change", this.maybeRender); + }, + + attributes: { + class: "ui-state-default section" + }, + + // Get the template from the DOM + template: wp.template("generate-sections-section"), + + events: { + 'click .edit-section': 'editSection', + 'click .section-title > span': 'editSection', + 'click .delete-section': 'removeSection', + 'click .toggle-section': 'toggleSection', + 'reorder': 'reorder', + }, + + maybeRender: function(e) { + if (this.model.hasChanged('index')) return; + this.render(); + }, + + // Render the single model - include an index. + render: function() { + this.model.set('index', this.model.collection.indexOf(this.model)); + this.$el.html(this.template(this.model.toJSON())); + + if (!this.model.get('title')) { + this.$el.find('h3.section-title > span').text(generate_sections_metabox_i18n.default_title); + } + this.$el.find('textarea').val(JSON.stringify(this.model)); + + return this; + }, + + + // launch the edit modal + editSection: function(e) { + + // stash the current focus + Generate_Sections.lastFocus = document.activeElement; + Generate_Sections.modalOpen = true; + + e.preventDefault(); + if (Generate_Sections.backbone_modal.__instance === undefined) { + Generate_Sections.backbone_modal.__instance = new Generate_Sections.backbone_modal.Application({ + model: this.model + }); + } + + }, + + // reorder after sort + reorder: function(event, index) { + this.$el.trigger('update-sort', [this.model, index]); + }, + + // remove/destroy a model + removeSection: function(e) { + e.preventDefault(); + if (confirm(generate_sections_metabox_i18n.confirm)) { + this.model.destroy(); + Generate_Sections.sectionList.render(); // manually calling instead of listening since listening interferes with sorting + } + }, + }); + + + // List View + Generate_Sections.sectionListView = Backbone.View.extend({ + + el: "#generate_sections_container", + events: { + 'update-sort': 'updateSort', + // 'add-section': 'addOne' + }, + + // callback for clone button + addSection: function(model) { + this.collection.add(model); + this.addOne(model); + }, + + addOne: function(model) { + var view = new Generate_Sections.sectionView({ + model: model + }); + this.$el.append(view.render().el); + }, + + render: function() { + this.$el.children().remove(); + this.collection.each(this.addOne, this); + return this; + }, + + updateSort: function(event, model, position) { + this.collection.remove(model); + + // renumber remaining models around missing model + this.collection.each(function(model, index) { + + var new_index = index; + if (index >= position) { + new_index += 1; + } + model.set('index', new_index); + }); + + // set the index of the missing model + model.set('index', position); + + // add the model back to the collection + this.collection.add(model, { + at: position + }); + + this.render(); + + }, + + }); + + + // The Buttons & Nonce + Generate_Sections.ButtonControls = Backbone.View.extend({ + + attributes: { + class: "generate_sections_buttons" + }, + + tagName: 'p', + + el: "#_generate_sections_metabox", + + template: wp.template("generate-sections-buttons"), + + // Attach events + events: { + "click .button-primary": "newSection", + "click #generate-delete-sections": "clearAll", + 'click .edit-section': 'editSection', + }, + + // create new + newSection: function(e) { + e.preventDefault(); + var newSection = new Generate_Sections.Section(); + Generate_Sections.sectionList.addSection(newSection); + }, + + // clear all models + clearAll: function(e) { + e.preventDefault(); + if (confirm(generate_sections_metabox_i18n.confirm)) { + Generate_Sections.sectionCollection.reset(); + Generate_Sections.sectionList.render(); + } + }, + + render: function() { + this.$el.find(".generate_sections_control").append(this.template); + return this; + }, + + }); + + + // init + Generate_Sections.initApplication = function() { + + // Create Collection From Existing Meta + Generate_Sections.sectionCollection = new Generate_Sections.SectionsCollection(generate_sections_metabox_i18n.sections); + + // Create the List View + Generate_Sections.sectionList = new Generate_Sections.sectionListView({ + collection: Generate_Sections.sectionCollection + }); + Generate_Sections.sectionList.render(); + + // Buttons + Generate_Sections.Buttons = new Generate_Sections.ButtonControls({ + collection: Generate_Sections.sectionCollection + }); + Generate_Sections.Buttons.render(); + + }; + + + /*-----------------------------------------------------------------------------------*/ + /* Execute the above methods in the Generate_Sections object. + /*-----------------------------------------------------------------------------------*/ + + jQuery(document).ready(function($) { + + Generate_Sections.initApplication(); + + $( '#generate_sections_container' ).sortable({ + axis: "y", + opacity: 0.5, + grid: [20, 10], + tolerance: "pointer", + handle: ".move-section", + update: function(event, ui) { + ui.item.trigger("reorder", ui.item.index()); + } + } ); + + if ( $( '.use-sections-switch' ).is( ':checked' ) ) { + setTimeout( function() { + generateShowSections(); + }, 200 ); + } else { + generateHideSections(); + } + + $( '.use-sections-switch' ).on( 'change', function( e ) { + var status = ( $(this).is( ':checked' ) ) ? 'checked' : 'unchecked'; + + if ( 'checked' == status ) { + generateShowSections(); + } else if ( 'unchecked' == status ) { + generateHideSections(); + } + } ); + + function generateShowSections() { + + // Hide send to editor button + $('.send-to-editor').css('display', 'none'); + + // Hide the editor + $('#postdivrich').css({ + 'opacity': '0', + 'height': '0', + 'overflow': 'hidden' + }); + + // Show the sections + $('#_generate_sections_metabox').css({ + 'opacity': '1', + 'height': 'auto' + }); + + // Remove and add the default editor - this removes any visible toolbars etc.. + // We need to set a timeout for this to work + // if (typeof tinyMCE != "undefined") { + // tinyMCE.EditorManager.execCommand("mceRemoveEditor", true, "content"); + // $( '.use-sections-cover' ).css( 'z-index','10000' ); + // setTimeout('tinyMCE.EditorManager.execCommand("mceAddEditor", true, "content");', 1); + // setTimeout('jQuery( ".use-sections-cover" ).css( "z-index","-1" );', 1000); + // } + + // Set a trigger + $('body').trigger('generate_show_sections'); + + } + + function generateHideSections() { + + // Show send to editor button + $('.send-to-editor').css('display', 'inline-block'); + + // Show the editor + $('#postdivrich').css({ + 'opacity': '1', + 'height': 'auto' + }); + + // Hide the sections + $('#_generate_sections_metabox').css({ + 'opacity': '0', + 'height': '0', + 'overflow': 'hidden' + }); + + $('body').trigger('generate_hide_sections'); + + } + + $( document ).on( 'click', '.edit-section.edit-settings', function() { + $( 'body' ).trigger( 'generate_section_show_settings' ); + }); + + }); + + +})(jQuery, Generate_Sections); diff --git a/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox.js b/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox.js new file mode 100644 index 0000000..e6b59fd --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/generate-sections-metabox.js @@ -0,0 +1,846 @@ +/*-----------------------------------------------------------------------------------*/ +/* Generate Sections Metabox +/* +/* © Kathy Darling http://www.kathyisawesome.com +/* 2016-07-19. */ +/*-----------------------------------------------------------------------------------*/ + +/** + * @type {Object} JavaScript namespace for our application. + */ +var Generate_Sections = { + backbone_modal: { + __instance: undefined + } +}; + +(function($, Generate_Sections) { + + + // Model + Generate_Sections.Section = Backbone.Model.extend({ + defaults: { + "title": "", + "box_type": "", + "inner_box_type": "", + "custom_classes": "", + "custom_id": "", + "top_padding": "", + "bottom_padding": "", + "top_padding_unit": "", + "bottom_padding_unit": "", + "background_color": "", + "background_image": "", + "background_image_preview": "", + "parallax_effect": "", + "background_color_overlay": "", + "text_color": "", + "link_color": "", + "link_color_hover": "", + "content": "" + } + }); + + + // Collection + Generate_Sections.SectionsCollection = Backbone.Collection.extend({ + model: Generate_Sections.Section, + el: "#generate_sections_container", + comparator: function(model) { + return model.get('index'); + } + }); + + + /** + * Primary Modal Application Class + */ + Generate_Sections.backbone_modal.Application = Backbone.View.extend({ + + attributes: { + id: "generate-sections-modal-dialog", + class: "generate-sections-modal", + role: "dialog" + }, + + template: wp.template("generate-sections-modal-window"), + + mediaUploader: null, + + /*-----------------------------------------------------------------------------------*/ + /* tinyMCE settings + /*-----------------------------------------------------------------------------------*/ + + tmc_settings: {}, + + /*-----------------------------------------------------------------------------------*/ + /* tinyMCE defaults + /*-----------------------------------------------------------------------------------*/ + + tmc_defaults: { + theme: "modern", + menubar: false, + wpautop: true, + indent: false, + toolbar1: "bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink,fullscreen", + plugins: "fullscreen,image,wordpress,wpeditimage,wplink", + max_height: 500 + }, + + /*-----------------------------------------------------------------------------------*/ + /* quicktags settings + /*-----------------------------------------------------------------------------------*/ + + qt_settings: {}, + + /*-----------------------------------------------------------------------------------*/ + /* quicktags defaults + /*-----------------------------------------------------------------------------------*/ + + qt_defaults: { + buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen" + }, + + model: Generate_Sections.Section, + + events: { + "click .media-modal-backdrop, .media-modal-close, .media-button-close": "closeModal", + "click .media-button-insert": "saveModal", + "click .media-menu-item": "switchTab", + "keydown": "keydown", + "click .generate-sections-upload-button": "openMediaUploader", + "click .generate-sections-remove-image": "removeImage", + "click div.media-frame-title h1": "toggleMenu" + }, + + + + /** + * Simple object to store any UI elements we need to use over the life of the application. + */ + ui: { + nav: undefined, + content: undefined + }, + + + /** + * Instantiates the Template object and triggers load. + */ + initialize: function() { + _.bindAll(this, "render", "closeModal", "saveModal", "switchTab"); + + this.focusManager = new wp.media.view.FocusManager({ + el: this.el + }); + + this.changeInsertText(); + //this.tinyMCEsettings(); + this.render(); + }, + + /** + * switch the insert button text to "insert section" + */ + changeInsertText: function(restore) { + + var restore = typeof restore !== 'undefined' && restore == true ? true : false; + + if (restore == false && typeof(wp.media.view.l10n.insertIntoPost) !== "undefined") { + this.insertIntoPost = wp.media.view.l10n.insertIntoPost; + wp.media.view.l10n.insertIntoPost = generate_sections_metabox_i18n.insert_into_section; + // switch the insert button text back + } else if (restore == true && typeof(this.insertIntoPost) !== "undefined") { + wp.media.view.l10n.insertIntoPost = this.insertIntoPost; + } + }, + + /** + * Assembles the UI from loaded template. + * @internal Obviously, if the template fail to load, our modal never launches. + */ + render: function() { + + "use strict"; + + // Build the base window and backdrop, attaching them to the $el. + // Setting the tab index allows us to capture focus and redirect it in Application.preserveFocus + this.$el.attr("tabindex", "0").html(this.template); + + // Handle any attempt to move focus out of the modal. + //jQuery(document).on("focusin", this.preserveFocus); + + // set overflow to "hidden" on the body so that it ignores any scroll events while the modal is active + // and append the modal to the body. + jQuery("body").addClass("generate-modal-open").prepend(this.$el); + + // aria hide the background + jQuery("#wpwrap").attr("aria-hidden", "true"); + + this.renderContent(); + + this.renderPreview(); + + this.selected(); + this.colorPicker(); + //this.startTinyMCE(); + this.launchEditor(); + + // Set focus on the modal to prevent accidental actions in the underlying page + this.$el.focus(); + + return this; + }, + + launchEditor: function() { + var id = this.ui.panels.find( ".generate-sections-editor-wrap" ).find( 'textarea' ).attr( 'id' ), + customButtonsContainer = this.ui.panels.find( '.generate-sections-editor-wrap' ).find( '#custom-media-buttons' ); + + customButtonsContainer.find( '.insert-media' ).remove(); + var customButtons = customButtonsContainer.html(); + customButtonsContainer.remove(); + + var init_settings = true; + + if ( typeof tinyMCEPreInit == "object" && "mceInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.mceInit ) { + init_settings = tinyMCEPreInit.mceInit.content; + } else if ( typeof window.wpEditorL10n !== "undefined" ) { + init_settings = window.wpEditorL10n.tinymce.settings; + } else { + init_settings = this.tmc_defaults; + } + + var thisPanel = this.ui.panels; + + var custom_settings = { + wp_autoresize_on: false, + cache_suffix: "", + min_height: 400, + wp_keep_scroll_position: false, + setup: function( editor ) { + editor.on( 'init', function( e ) { + if ( 'html-active' === generate_sections_metabox_i18n.default_editor && generate_sections_metabox_i18n.user_can_richedit ) { + thisPanel.find( '#wp-generate-sections-editor-wrap' ).removeClass( 'tmce-active' ).addClass( 'html-active' ); + editor.hidden = true; + } + } ); + } + } + + init_settings = $.extend({}, init_settings, custom_settings); + + var qt_settings = true; + + if ( typeof tinyMCEPreInit == "object" && "qtInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.qtInit ) { + qt_settings = tinyMCEPreInit.qtInit.content; + } else { + qt_settings = this.qt_defaults; + } + + if ( ! generate_sections_metabox_i18n.user_can_richedit ) { + init_settings = false; + } + + wp.sectionsEditor.initialize( id, { + tinymce: init_settings, + quicktags: qt_settings, + mediaButtons: true + } ); + + var buttonsElement = this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).find( '.wp-media-buttons' ); + buttonsElement.attr( 'id', 'custom-media-buttons' ); + $( customButtons ).appendTo( buttonsElement ); + + if ( ! generate_sections_metabox_i18n.user_can_richedit ) { + this.ui.panels.find( '#generate-sections-editor' ).addClass( 'no-rich-edit' ); + } + }, + + /** + * Make the menu mobile-friendly + */ + toggleMenu: function() { + this.$el.find('.media-menu').toggleClass('visible'); + }, + + /** + * Create the nav tabs & panels + */ + renderContent: function() { + + var model = this.model; + + var menu_item = wp.template("generate-sections-modal-menu-item"); + + // Save a reference to the navigation bar"s unordered list and populate it with items. + this.ui.nav = this.$el.find(".media-menu"); + + // reference to content area + this.ui.panels = this.$el.find(".media-frame-content"); + + // loop through the tabs + if (generate_sections_metabox_i18n.tabs.length) { + + // for...of is nicer, but not supported by minify, so stay with for...in for now + for (var tab in generate_sections_metabox_i18n.tabs) { + + if (generate_sections_metabox_i18n.tabs.hasOwnProperty(tab)) { + + tab = generate_sections_metabox_i18n.tabs[tab]; + + var $new_tab = $(menu_item({ + target: tab.target, + name: tab.title + })); + + var panel = wp.template("generate-sections-edit-" + tab.target); + + var $new_panel = $(panel(model.toJSON())); + + if (tab.active == "true") { + $new_tab.addClass("active"); + $new_panel.addClass("active"); + } + + jQuery( 'body' ).on( 'generate_section_show_settings', function() { + jQuery( '.generate-sections-modal .media-menu-item' ).removeClass('active'); + jQuery( '.generate-sections-modal .panel' ).removeClass('active'); + jQuery( '.generate-section-item-style' ).addClass('active'); + jQuery( '.generate-section-settings' ).addClass('active'); + }); + + this.ui.nav.append($new_tab); + this.ui.panels.append($new_panel); + } + } + } + + }, + + + /** + * Render the background image preview + */ + renderPreview: function(image_id) { + + var image_id = typeof image_id !== 'undefined' ? image_id : this.model.get("background_image"); + + var $preview = $("#generate-section-image-preview"); + $preview.children().remove(); + + if (image_id > 0) { + this.background = new wp.media.model.Attachment.get(image_id); + + this.background.fetch({ + success: function(att) { + if (_.contains(['png', 'jpg', 'gif', 'jpeg'], att.get('subtype'))) { + $("").attr("src", att.attributes.sizes.thumbnail.url).appendTo($preview); + $preview.next().find(".generate-sections-remove-image").show(); + } + } + }); + } + + }, + + + /** + * Set the default option for the select boxes + */ + selected: function() { + + var _this = this; + + this.$el.find("select").each(function(index, select) { + + var attribute = jQuery(select).attr("name"); + var selected = _this.model.get(attribute); + jQuery(select).val(selected); + + }); + }, + + /** + * Start the colorpicker + */ + colorPicker: function() { + this.$el.find(".generate-sections-color").wpColorPicker(); + }, + + /** + * Launch Media Uploader + */ + openMediaUploader: function(e) { + + var _this = this; + + $input = jQuery(e.currentTarget).prev("#generate-sections-background-image"); + + e.preventDefault(); + + // If the uploader object has already been created, reopen the dialog + if (this.mediaUploader) { + this.mediaUploader.open(); + return; + } + // Extend the wp.media object + this.mediaUploader = wp.media.frames.file_frame = wp.media({ + title: generate_sections_metabox_i18n.media_library_title, + button: { + text: generate_sections_metabox_i18n.media_library_button + }, + multiple: false + }); + + + // When a file is selected, grab the URL and set it as the text field"s value + this.mediaUploader.on("select", function() { + + attachment = _this.mediaUploader.state().get("selection").first().toJSON(); + + $input.val(attachment.id); + + _this.renderPreview(attachment.id); + }); + // Open the uploader dialog + this.mediaUploader.open(); + + }, + + /** + * Remove the background image + */ + removeImage: function(e) { + e.preventDefault(); + $("#generate-section-image-preview").children().remove(); + $("#generate-section-image-preview").next().find(".generate-sections-remove-image").hide(); + $("#generate-sections-background-image").val(""); + }, + + + /** + * Closes the modal and cleans up after the instance. + * @param e {object} A jQuery-normalized event object. + */ + closeModal: function(e) { + "use strict"; + + e.preventDefault(); + this.undelegateEvents(); + jQuery(document).off("focusin"); + jQuery("body").removeClass("generate-modal-open"); + jQuery("body").removeClass("generate-section-content"); + + // remove restricted media modal tab focus once it's closed + this.$el.undelegate('keydown'); + + // remove the tinymce editor + // this needs to be called before the modal is closed or it will fail in Firefox (that was fun to figure out...) + if (typeof tinyMCE != "undefined") { + tinymce.EditorManager.execCommand("mceRemoveEditor", true, "generate-sections-editor"); + } + + // remove modal and unset instances + this.remove(); + Generate_Sections.backbone_modal.__instance = undefined; + this.mediaUploader = null; + Generate_Sections.modalOpen = null; + + // switch the insert button text back + this.changeInsertText(true); + + // send focus back to where it was prior to modal open + Generate_Sections.lastFocus.focus(); + + // aria unhide the background + jQuery("#wpwrap").attr("aria-hidden", "false"); + + // Fix bug where the window scrolls down 50px on close + var topDistance = jQuery("body").offset().top; + if ( topDistance >= jQuery("body").scrollTop() ) { + jQuery("body").scrollTop(0); + } + + }, + + /** + * Responds to the btn-ok.click event + * @param e {object} A jQuery-normalized event object. + * @todo You should make this your own. + */ + saveModal: function(e) { + "use strict"; + + this.model.get("index"); + + var model = this.model; + + // send the tinymce content to the textarea + if (typeof tinyMCE != "undefined") { + tinymce.triggerSave(); + } + + var $inputs = this.ui.panels.find("input, select, textarea"); + + $inputs.each(function(index, input) { + + var name = $(input).attr("name"); + + if (model.attributes.hasOwnProperty(name)) { + var value = $(input).val(); + model.set(name, value); + } + + }); + + this.closeModal(e); + }, + + /** + * Handles tab clicks and switches to corresponding panel + * @param e {object} A jQuery-normalized event object. + */ + switchTab: function(e) { + "use strict"; + e.preventDefault(); + + // close lingering wp link windows + if (typeof tinyMCE != "undefined" && 'style' == jQuery( e.currentTarget ).data( 'target' ) && this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).hasClass( 'tmce-active' )) { + tinyMCE.activeEditor.execCommand('wp_link_cancel'); + tinyMCE.activeEditor.execCommand('wp_media_cancel'); + } + + this.ui.nav.children().removeClass("active"); + this.ui.panels.children().removeClass("active"); + + var target = jQuery(e.currentTarget).addClass("active").data("target"); + + this.ui.panels.find("div[data-id=" + target + "]").addClass("active"); + }, + + /** + * close on keyboard shortcuts + * @param {Object} event + */ + keydown: function(e) { + // Close the modal when escape is pressed. + if (27 === e.which && this.$el.is(':visible')) { + this.closeModal(e); + e.stopImmediatePropagation(); + } + } + + }); + + + // Singular View + Generate_Sections.sectionView = Backbone.View.extend({ + + model: Generate_Sections.Section, + tagName: 'div', + + initialize: function() { + // re-render on all changes EXCEPT index + this.listenTo(this.model, "change", this.maybeRender); + }, + + attributes: { + class: "ui-state-default section" + }, + + // Get the template from the DOM + template: wp.template("generate-sections-section"), + + events: { + 'click .edit-section': 'editSection', + 'click .section-title > span': 'editSection', + 'click .delete-section': 'removeSection', + 'click .toggle-section': 'toggleSection', + 'reorder': 'reorder', + }, + + maybeRender: function(e) { + if (this.model.hasChanged('index')) return; + this.render(); + }, + + // Render the single model - include an index. + render: function() { + this.model.set('index', this.model.collection.indexOf(this.model)); + this.$el.html(this.template(this.model.toJSON())); + + if (!this.model.get('title')) { + this.$el.find('h3.section-title > span').text(generate_sections_metabox_i18n.default_title); + } + this.$el.find('textarea').val(JSON.stringify(this.model)); + + return this; + }, + + + // launch the edit modal + editSection: function(e) { + + // stash the current focus + Generate_Sections.lastFocus = document.activeElement; + Generate_Sections.modalOpen = true; + + e.preventDefault(); + if (Generate_Sections.backbone_modal.__instance === undefined) { + Generate_Sections.backbone_modal.__instance = new Generate_Sections.backbone_modal.Application({ + model: this.model + }); + } + + }, + + // reorder after sort + reorder: function(event, index) { + this.$el.trigger('update-sort', [this.model, index]); + }, + + // remove/destroy a model + removeSection: function(e) { + e.preventDefault(); + if (confirm(generate_sections_metabox_i18n.confirm)) { + this.model.destroy(); + Generate_Sections.sectionList.render(); // manually calling instead of listening since listening interferes with sorting + } + }, + }); + + + // List View + Generate_Sections.sectionListView = Backbone.View.extend({ + + el: "#generate_sections_container", + events: { + 'update-sort': 'updateSort', + // 'add-section': 'addOne' + }, + + // callback for clone button + addSection: function(model) { + this.collection.add(model); + this.addOne(model); + }, + + addOne: function(model) { + var view = new Generate_Sections.sectionView({ + model: model + }); + this.$el.append(view.render().el); + }, + + render: function() { + this.$el.children().remove(); + this.collection.each(this.addOne, this); + return this; + }, + + updateSort: function(event, model, position) { + this.collection.remove(model); + + // renumber remaining models around missing model + this.collection.each(function(model, index) { + + var new_index = index; + if (index >= position) { + new_index += 1; + } + model.set('index', new_index); + }); + + // set the index of the missing model + model.set('index', position); + + // add the model back to the collection + this.collection.add(model, { + at: position + }); + + this.render(); + + }, + + }); + + + // The Buttons & Nonce + Generate_Sections.ButtonControls = Backbone.View.extend({ + + attributes: { + class: "generate_sections_buttons" + }, + + tagName: 'p', + + el: "#_generate_sections_metabox", + + template: wp.template("generate-sections-buttons"), + + // Attach events + events: { + "click .button-primary": "newSection", + "click #generate-delete-sections": "clearAll", + 'click .edit-section': 'editSection', + }, + + // create new + newSection: function(e) { + e.preventDefault(); + var newSection = new Generate_Sections.Section(); + Generate_Sections.sectionList.addSection(newSection); + }, + + // clear all models + clearAll: function(e) { + e.preventDefault(); + if (confirm(generate_sections_metabox_i18n.confirm)) { + Generate_Sections.sectionCollection.reset(); + Generate_Sections.sectionList.render(); + } + }, + + render: function() { + this.$el.find(".generate_sections_control").append(this.template); + return this; + }, + + }); + + + // init + Generate_Sections.initApplication = function() { + + // Create Collection From Existing Meta + Generate_Sections.sectionCollection = new Generate_Sections.SectionsCollection(generate_sections_metabox_i18n.sections); + + // Create the List View + Generate_Sections.sectionList = new Generate_Sections.sectionListView({ + collection: Generate_Sections.sectionCollection + }); + Generate_Sections.sectionList.render(); + + // Buttons + Generate_Sections.Buttons = new Generate_Sections.ButtonControls({ + collection: Generate_Sections.sectionCollection + }); + Generate_Sections.Buttons.render(); + + }; + + + /*-----------------------------------------------------------------------------------*/ + /* Execute the above methods in the Generate_Sections object. + /*-----------------------------------------------------------------------------------*/ + + jQuery(document).ready(function($) { + + Generate_Sections.initApplication(); + + $( '#generate_sections_container' ).sortable({ + axis: "y", + opacity: 0.5, + grid: [20, 10], + tolerance: "pointer", + handle: ".move-section", + update: function(event, ui) { + ui.item.trigger("reorder", ui.item.index()); + } + } ); + + if ( $( '.use-sections-switch' ).is( ':checked' ) ) { + setTimeout( function() { + generateShowSections(); + }, 200 ); + } else { + generateHideSections(); + } + + $( '.use-sections-switch' ).on( 'change', function( e ) { + var status = ( $(this).is( ':checked' ) ) ? 'checked' : 'unchecked'; + + if ( 'checked' == status ) { + generateShowSections(); + } else if ( 'unchecked' == status ) { + generateHideSections(); + } + } ); + + function generateShowSections() { + + // Hide send to editor button + $('.send-to-editor').css('display', 'none'); + + // Hide the editor + $('#postdivrich').css({ + 'opacity': '0', + 'height': '0', + 'overflow': 'hidden' + }); + + $( '.editor-block-list__layout' ).hide(); + $( '.edit-post-layout__content .edit-post-visual-editor' ).css( { + 'flex-grow': 'unset', + 'flex-basis': '0' + } ); + $( '.edit-post-layout__metaboxes:not(:empty)' ).css( 'border-top', '0' ); + + // Show the sections + $('#_generate_sections_metabox').css({ + 'opacity': '1', + 'height': 'auto' + }); + + // Remove and add the default editor - this removes any visible toolbars etc.. + // We need to set a timeout for this to work + // if (typeof tinyMCE != "undefined") { + // tinyMCE.EditorManager.execCommand("mceRemoveEditor", true, "content"); + // $( '.use-sections-cover' ).css( 'z-index','10000' ); + // setTimeout('tinyMCE.EditorManager.execCommand("mceAddEditor", true, "content");', 1); + // setTimeout('jQuery( ".use-sections-cover" ).css( "z-index","-1" );', 1000); + // } + + // Set a trigger + $('body').trigger('generate_show_sections'); + + } + + function generateHideSections() { + + // Show send to editor button + $('.send-to-editor').css('display', 'inline-block'); + + // Show the editor + $('#postdivrich').css({ + 'opacity': '1', + 'height': 'auto' + }); + + $( '.editor-block-list__layout' ).show(); + $( '.edit-post-layout__content .edit-post-visual-editor' ).css( { + 'flex-grow': '', + 'flex-basis': '' + } ); + $( '.edit-post-layout__metaboxes:not(:empty)' ).css( 'border-top', '' ); + + // Hide the sections + $('#_generate_sections_metabox').css({ + 'opacity': '0', + 'height': '0', + 'overflow': 'hidden' + }); + + $('body').trigger('generate_hide_sections'); + + } + + $( document ).on( 'click', '.edit-section.edit-settings', function() { + $( 'body' ).trigger( 'generate_section_show_settings' ); + }); + + }); + + +})(jQuery, Generate_Sections); diff --git a/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/wp-color-picker-alpha.min.js b/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/wp-color-picker-alpha.min.js new file mode 100644 index 0000000..c67aacc --- /dev/null +++ b/wp-content/plugins/gp-premium/sections/functions/metaboxes/js/wp-color-picker-alpha.min.js @@ -0,0 +1,340 @@ +/**! + * wp-color-picker-alpha + * + * Overwrite Automattic Iris for enabled Alpha Channel in wpColorPicker + * Only run in input and is defined data alpha in true + * + * Version: 1.2.2 + * https://github.com/23r9i0/wp-color-picker-alpha + * Copyright (c) 2015 Sergio P.A. (23r9i0). + * Licensed under the GPLv2 license. + */ +( function( $ ) { + // Variable for some backgrounds ( grid ) + var image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAAHnlligAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNpi+P///4EDBxiAGMgCCCAGFB5AADGCRBgYDh48CCRZIJS9vT2QBAggFBkmBiSAogxFBiCAoHogAKIKAlBUYTELAiAmEtABEECk20G6BOmuIl0CIMBQ/IEMkO0myiSSraaaBhZcbkUOs0HuBwDplz5uFJ3Z4gAAAABJRU5ErkJggg==', + // html stuff for wpColorPicker copy of the original color-picker.js + _before = '', + _after = '
        ', + _wrap = '
        ', + _button = '', + _wrappingLabel = '', + _wrappingLabelText = ''; + + /** + * Overwrite Color + * for enable support rbga + */ + Color.fn.toString = function() { + if ( this._alpha < 1 ) + return this.toCSS( 'rgba', this._alpha ).replace( /\s+/g, '' ); + + var hex = parseInt( this._color, 10 ).toString( 16 ); + + if ( this.error ) + return ''; + + if ( hex.length < 6 ) + hex = ( '00000' + hex ).substr( -6 ); + + return '#' + hex; + }; + + /** + * Overwrite wpColorPicker + */ + $.widget( 'wp.wpColorPicker', $.wp.wpColorPicker, { + _create: function() { + // bail early for unsupported Iris. + if ( ! $.support.iris ) + return; + + var self = this, + el = self.element; + + self.inputWrapper = el.closest( '.wp-picker-input-wrap' ); + + $.extend( self.options, el.data() ); + + // keep close bound so it can be attached to a body listener + self.close = $.proxy( self.close, self ); + + self.initialValue = el.val(); + + // Set up HTML structure, hide things + el.addClass( 'wp-color-picker' ).wrap( _wrap ); + self.wrap = el.parent(); + self.toggler = $( _before ).insertBefore( el ).css( { backgroundColor : self.initialValue } ).attr( 'title', wpColorPickerL10n.pick ).attr( 'data-current', wpColorPickerL10n.current ); + self.pickerContainer = $( _after ).insertAfter( el ); + self.button = $( _button ); + + if ( self.options.defaultColor ) { + self.button.addClass( 'wp-picker-default' ).val( wpColorPickerL10n.defaultString ); + } else { + self.button.addClass( 'wp-picker-clear' ).val( wpColorPickerL10n.clear ); + } + + el.wrap( '
        + + * { + pointer-events :none; +} + +.site-step-details > div { + border-bottom: 1px solid #ddd; + margin: 0 0 30px; + padding: 0 0 30px 60px; + position: relative; +} + +.site-step-details > div:last-child { + border: 0; + margin: 0; + padding-bottom: 0; +} + +.site-step-details > div p:last-child { + margin-bottom: 0; +} + +.number, +.big-loader { + position: absolute; + width: 40px; + height: 40px; + background: #fff; + border-radius: 50%; + line-height: 40px; + text-align: center; + top: 5px; + left: 0; + border: 2px solid #555; + font-size: 20px; + font-weight: 600; + transition: opacity 250ms ease-in-out; +} + +.site-step-details > div:nth-child(1) .number:before { + content: "1"; +} + +.site-step-details > div:nth-child(2) .number:before { + content: "2"; +} + +.site-step-details > div:nth-child(3) .number:before { + content: "3"; +} + +.site-step-details > div:nth-child(4) .number:before { + content: "4"; +} + +.big-loader { + border-color: transparent; +} + +.big-loader svg { + height: 50px; + width: 50px; + position: relative; + top: -5px; + left: -5px; +} + +.site-step-details > div .number.step-complete:before { + content: "\f147"; + font-family: dashicons; + color: #4BB543; + font-size: 20px; +} + +.number.step-complete { + border-color: #4BB543; + font-size: 0; +} + +.site-step-details h3 { + margin-bottom: 0; +} + +.site-step-details p { + margin: 0; +} + +.replace-elementor-urls, +.site-step-details .replace-elementor-urls p:not(:first-child) { + margin-top: 1em; +} + +.action-area { + margin: 40px 0; + display: flex; + align-items: center; +} + +.action-buttons input[type="submit"] { + border-radius: 0; + font-size: 17px; + line-height: 50px; + height: auto; + padding: 0 20px; +} + +.big-loader { + opacity: 0; +} + +.loading, +.error-message { + font-size: 15px; + line-height: 52px; +} + +.loading svg { + width: 20px; + height: 20px; + position: relative; + top: 5px; +} + +.checking-for-plugins { + line-height: normal; +} + +.action-area { + display: flex; + align-items: center; +} + +.important-note { + padding-left: 20px; + width: 75%; + margin-left: auto; +} + +.important-note label { + display: flex; + align-items: baseline; +} + +.important-note input { + position: relative; + top: 3px; + margin-right: 10px; +} + +.site-open .site-box .step-information { + background: #fff; + box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #DDD; + padding: 40px; + position: relative; +} + +.step-information h1 { + margin-top: 0; +} + +.site-open .site-overview-details { + grid-area: right; + margin-left: 20px; +} + +.site-open .site-description h3 { + margin-bottom: 0; + text-transform: uppercase; + font-size: 14px; +} + +.site-open .site-screenshot { + margin-bottom: 40px; + padding: 5px; + box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #DDD; +} + +.site-description > div:not(:last-child) { + margin-bottom: 20px; + padding-bottom: 20px; + border-bottom: 1px solid #ddd; +} + +.site-description > div > *:last-child { + margin-bottom: 0; +} + +.site-step-details ul li { + list-style-type: none; + display: inline-block; + padding: 2px 5px; + background: #f5f5f5; + margin: 2px; +} + +.elementor-urls input { + display: block; + width: 100%; + padding: 8px; +} + +.elementor-urls label { + font-size: 12px; + font-weight: bold; +} + +.elementor-urls { + margin-top: 10px; +} + +.site-open .site-box .controls button { + background: #fff; + border: none; + font-size: 20px; + cursor: pointer; + padding: 10px; + line-height: 1; + box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #DDD; + margin-right: 5px; +} + +.site-open .site-box .controls button:before { + line-height: 0; + position: relative; + top: 2px; +} + +.site-open .site-box .controls .preview-site { + font-size: inherit; + color: #000; + padding-left: 20px; + padding-right: 20px; + margin-left: auto; + margin-right: 0; + font-weight: 600; +} + +.site-open .site-box .controls .preview-site:hover { + color: #0073aa; +} + +.site-box:not(.no-page-builder) { + display: none; +} + +.site-card-buttons { + display: flex; + margin-top: 20px; +} + +.site-card-buttons button.button, +.site-card-buttons button.button-primary { + width: 50%; + height: 40px; + line-height: 40px; + border-radius: 0; +} + +.site-details p { + margin: 0; +} + +.plugin-area { + display: none; + margin-top: 1em; +} + +.site-plugins { + margin-top: 1em; +} + +.skip-content-import { + font-size: 11px; + font-weight: normal; + padding: 2px 5px; + margin-left: 5px; + position: relative; + top: -1px; +} + +.no-site-library-results { + text-align: center; + margin-bottom: 2em; +} + +.remove-site { + background: #fff; + padding: 40px; + box-shadow: 0 0 10px 10px rgba(0,0,0,0.01); + border: 1px solid #ddd; + margin-bottom: 40px; +} + +.remove-site h2 { + margin-top: 0; + font-size: 25px; + margin-bottom: 30px; +} + +.remove-site button.button-primary { + font-size: 17px; + line-height: 50px; + height: 50px; + padding: 0 20px; + border-radius: 0; +} + +.remove-site .loading { + height: 50px; +} + +.close-remove-site, +.skip-remove-site { + display: inline-block; + margin-left: 15px; + font-size: 15px; +} + +.remove-site p { + font-size: 16px; +} + +.remove-site-actions { + margin-top: 30px; +} + +.generatepress-sites.remove-site-needed { + pointer-events: none; + opacity: 0.2; +} diff --git a/wp-content/plugins/gp-premium/sites/assets/css/loading.svg b/wp-content/plugins/gp-premium/sites/assets/css/loading.svg new file mode 100644 index 0000000..2aeb6ba --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/assets/css/loading.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/wp-content/plugins/gp-premium/sites/assets/images/screenshot.png b/wp-content/plugins/gp-premium/sites/assets/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..95b5ca3212355db54d7247ea426077dfd82789de GIT binary patch literal 23276 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 vhWmz7K<@%ct5#I(=Ae' + value.name + '' ); + } else if ( value.installed || value.active ) { + site_box.find( '.installed-plugins' ).fadeIn(); + site_box.find( '.installed-plugins ul' ).append( '
      • ' + value.name + '
      • ' ); + } else { + site_box.find( '.manual-plugins' ).fadeIn(); + site_box.find( '.manual-plugins ul' ).append( '
      • ' + value.name + '
      • ' ); + } + } ); + + if ( $.isEmptyObject( data.plugin_data ) ) { + site_box.find( '.no-plugins' ).fadeIn(); + } + + site_box.find( '.loading' ).hide(); + site_box.find( '.site-action.import-content' ).show(); + site_box.find( '.confirm-content-import-message' ).show(); + site_box.find( '.skip-content-import' ).show(); + }, + error: function( data ) { + console.log( data ); + site_box.find( '.site-message' ).hide(); + site_box.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + } + } ); + } else { + site_box.find( '.loading' ).hide(); + site_box.find( '.site-action.import-content' ).show(); + site_box.find( '.confirm-content-import-message' ).show(); + site_box.find( '.skip-content-import' ).show(); + } + } else { + site_box.find( '.loading' ).hide(); + site_box.find( '.demo-content .big-loader' ).css( 'opacity', '0' ); + site_box.find( '.demo-content .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + _this.next( 'input' ).show(); + + setTimeout( function() { + site_box.find( '.import-complete .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + }, 500 ); + } + + + }, + error: function( data ) { + console.log( data ); + site_box.removeClass( 'data-loaded' ); + site_box.find( '.loading' ).hide(); + site_box.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + } + }); + } + }; + + /** + * Backup options. + */ + $( '.site-box .backup-options' ).on( 'click', function(e) { + e.preventDefault(); + + var _this = $( this ), + siteBox = _this.closest( '.site-box' ); + + _this.hide(); + siteBox.find( '.confirm-backup-options' ).hide(); + backup_options( _this ); + } ); + + /** + * Backup and import theme options. + */ + $( '.site-box .import-options' ).on( 'click', function( e ) { + e.preventDefault(); + + var _this = $( this ); + + _this.hide(); + _this.closest( '.site-box' ).find( '.confirm-backup-options' ).hide(); + import_options( _this ); + } ); + + function backup_options( _this ) { + var siteBox = _this.closest( '.site-box' ) + data = siteBox.data( 'site-data' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.backing_up_options ); + siteBox.find( '.loading' ).show(); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_backup_options_' + data.slug, + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + download( data, 'generatepress-options-backup.json', 'application/json' ); + + siteBox.find( '.loading' ).hide(); + _this.next( 'input' ).show(); + }, + error: function( data ) { + console.log( data ); + siteBox.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + } + } ); + } + + function import_options( _this ) { + var siteBox = _this.closest( '.site-box' ), + data = siteBox.data( 'site-data' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.importing_options ); + siteBox.find( '.loading' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '1' );; + siteBox.find( '.theme-options .number' ).css( 'opacity', '0' ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_import_options_' + data.slug, + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + if ( 'undefined' !== typeof data.success && ! data.success ) { + siteBox.find( '.loading' ).hide(); + siteBox.find( '.error-message' ).html( data.data ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + return; + } + + console.log( 'Options imported.' ); + + _this.hide(); + siteBox.find( '.loading' ).hide(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + $( 'body' ).addClass( 'site-import-data-exists' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.checking_demo_content ); + siteBox.find( '.loading' ).show(); + setup_demo_content( _this ); + }, + error: function( data ) { + console.log( data ); + siteBox.find( '.loading' ).hide(); + siteBox.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + } + } ); + } + + $( '.site-box' ).on( 'click', '.skip-content-import a', function(e) { + e.preventDefault(); + + var _this = $( this ), + siteBox = _this.closest( '.site-box' ); + + siteBox.find( '.skip-content-import' ).hide(); + siteBox.find( '.demo-content' ).css( 'opacity', '0.5' ); + siteBox.find( '.confirm-content-import-message' ).hide(); + siteBox.find( '.action-buttons input' ).hide(); + siteBox.find( '.action-buttons input.view-site' ).show(); + siteBox.find( '.import-complete .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + } ); + + /** + * Install and activate plugins. + * Before content, as content may be depedent on plugins. + */ + $( '.site-box' ).on( 'click', '.import-content', function(e) { + e.preventDefault(); + + var _this = $( this ) + siteBox = _this.closest( '.site-box' ), + plugins = _this.data( 'plugins' ), + plugin_text = siteBox.find( '.automatic-plugins li' ); + + _this.hide(); + siteBox.find( '.skip-content-import' ).hide(); + siteBox.find( '.loading' ).show(); + siteBox.find( '.confirm-content-import-message' ).hide(); + siteBox.find( '.demo-content .big-loader' ).css( 'opacity', '1' ); + siteBox.find( '.demo-content .number' ).css( 'opacity', '0' ); + $( 'body' ).addClass( 'site-import-content-exists' ); + + siteBox.attr( 'data-plugins', JSON.stringify( plugins ) ); + + if ( ! $.isEmptyObject( plugins ) ) { + siteBox.find( '.site-message' ).text( generate_sites_params.installing_plugins ); + + $.each( plugins, function( index, value ) { + var plugin_slug = value.slug.split('/')[0]; + + var plugin_row = plugin_text.filter( function () { + return $( this ).attr( 'data-slug' ) == plugin_slug; + } ); + + if ( 'elementor' === plugin_slug ) { + siteBox.find( '.replace-elementor-urls' ).show(); + } + + if ( ! value.installed ) { + plugin_row.find( '.loading' ).show(); + plugin_row.addClass( 'installing-plugins' ); + + // Install BB Lite if Pro doesn't exist. + if ( 'bb-plugin' == plugin_slug ) { + plugin_slug = 'beaver-builder-lite-version'; + } + + wp.updates.installPlugin( { + slug: plugin_slug, + success: function( data ) { + console.log( data ); + + plugin_row.removeClass( 'installing-plugins' ).addClass( 'plugin-installed' ); + plugin_row.removeClass( 'show-loading' ).next().addClass( 'show-loading' ); + + // Remove current plugin from queue + delete plugins[index]; + + if ( $.isEmptyObject( plugins ) ) { + // Onto the next step + activate_plugins( _this ); + } + }, + error: function( data ) { + console.log(data); + + plugin_row.append( '' + data.errorMessage + '' ); + plugin_row.removeClass( 'installing-plugins' ).addClass( 'plugin-install-failed' ); + plugin_row.removeClass( 'show-loading' ).next().addClass( 'show-loading' ); + + // Remove current plugin from queue + delete plugins[index]; + + if ( $.isEmptyObject( plugins ) ) { + // Onto the next step + activate_plugins( _this ); + } + } + } ); + } else { + // Remove current plugin from queue + delete plugins[index]; + + if ( $.isEmptyObject( plugins ) ) { + // Onto the next step + activate_plugins( _this ); + } + } + + } ); + } else { + download_content( _this ); + } + } ); + + function activate_plugins( _this ) { + var siteBox = _this.closest( '.site-box' ), + data = siteBox.data( 'site-data' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.activating_plugins ); + + setTimeout( function() { + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_activate_plugins_' + data.slug, + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + console.log( data ); + download_content( _this ); + }, + error: function( data ) { + console.log( data ); + siteBox.find( '.loading' ).hide(); + siteBox.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + } + } ); + }, 250 ); + } + + function download_content( _this ) { + var siteBox = _this.closest( '.site-box' ), + data = siteBox.data( 'site-data' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.downloading_content ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_download_content_' + data.slug, + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + console.log( data ); + + import_content( _this ); + }, + error: function( data ) { + console.log( data ); + + siteBox.find( '.loading' ).hide(); + siteBox.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + } + } ); + } + + function import_content( _this ) { + var siteBox = _this.closest( '.site-box' ), + data = siteBox.data( 'site-data' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.importing_content ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_import_content_' + data.slug, + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + console.log( data ); + + import_site_options( _this ); + }, + error: function( data ) { + console.log( data ); + + siteBox.find( '.loading' ).hide(); + siteBox.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + } + } ); + } + + /** + * Import site options. + * Comes last, as options may be dependent on plugins. + */ + function import_site_options( _this ) { + var siteBox = _this.closest( '.site-box' ), + data = siteBox.data( 'site-data' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.importing_site_options ); + + setTimeout( function() { + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_import_site_options_' + data.slug, + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + console.log( data ); + + if ( '1' == _this.data( 'widgets' ) ) { + + import_widgets( _this ); + + } else { + + siteBox.find( '.loading' ).hide(); + siteBox.find( '.site-message' ).hide(); + siteBox.find( '.demo-content .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.demo-content .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + _this.next( 'input' ).show(); + siteBox.find( '.import-complete .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + + } + }, + error: function( data ) { + console.log( data ); + + siteBox.find( '.loading' ).hide(); + siteBox.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + } + } ); + }, 250 ); + } + + /** + * Import widgets. + */ + function import_widgets( _this ) { + var siteBox = _this.closest( '.site-box' ), + data = siteBox.data( 'site-data' ); + + siteBox.find( '.site-message' ).text( generate_sites_params.importing_widgets ); + + setTimeout( function() { + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_import_widgets_' + data.slug, + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + console.log( data ); + + siteBox.find( '.loading' ).hide(); + siteBox.find( '.site-message' ).hide(); + siteBox.find( '.demo-content .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.demo-content .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + _this.next( 'input' ).show(); + siteBox.find( '.import-complete .number' ).css( 'opacity', '1' ).addClass( 'step-complete' ); + }, + error: function( data ) { + console.log( data ); + + siteBox.find( '.loading' ).hide(); + siteBox.find( '.error-message' ).html( data.status + ' ' + data.statusText + ' [?]' ).show(); + siteBox.find( '.theme-options .big-loader' ).css( 'opacity', '0' ); + siteBox.find( '.theme-options .number' ).css( 'opacity', '1' ); + } + } ); + }, 250 ); + } + + /** + * View our completed site. + */ + $( '.site-box .view-site, .remove-site .view-site' ).on( 'click', function( e ) { + e.preventDefault(); + + window.location.href = generate_sites_params.home_url; + } ); + + function restoreThemeOptions() { + var restoreBox = $( '.remove-site' ); + + restoreBox.find( '.do-remove-site' ).hide() + restoreBox.find( '.skip-remove-site' ).hide(); + restoreBox.find( '.loading' ).show(); + restoreBox.find( '.remove-site-message' ).text( generate_sites_params.restoreThemeOptions ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_restore_theme_options', + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + if ( generate_sites_params.hasContentBackup || $( 'body' ).hasClass( 'site-import-content-exists' ) ) { + restoreSiteOptions(); + } else { + restoreCSS(); + } + console.log( data ); + }, + error: function( data ) { + console.log( data ); + } + } ); + } + + function restoreSiteOptions() { + var restoreBox = $( '.remove-site' ); + + restoreBox.find( '.remove-site-message' ).text( generate_sites_params.restoreSiteOptions ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_restore_site_options', + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + restoreContent(); + console.log( data ); + }, + error: function( data ) { + console.log( data ); + } + } ); + } + + function restoreContent() { + var restoreBox = $( '.remove-site' ); + + restoreBox.find( '.remove-site-message' ).text( generate_sites_params.restoreContent ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_restore_content', + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + restorePlugins(); + console.log( data ); + }, + error: function( data ) { + console.log( data ); + } + } ); + } + + function restorePlugins() { + var restoreBox = $( '.remove-site' ); + + restoreBox.find( '.remove-site-message' ).text( generate_sites_params.restorePlugins ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_restore_plugins', + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + restoreWidgets(); + console.log( data ); + }, + error: function( data ) { + console.log( data ); + } + } ); + } + + function restoreWidgets() { + var restoreBox = $( '.remove-site' ); + + restoreBox.find( '.remove-site-message' ).text( generate_sites_params.restoreWidgets ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_restore_widgets', + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + restoreCSS(); + console.log( data ); + }, + error: function( data ) { + console.log( data ); + } + } ); + } + + function restoreCSS() { + var restoreBox = $( '.remove-site' ); + + restoreBox.find( '.remove-site-message' ).text( generate_sites_params.restoreCSS ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_restore_css', + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + cleanUp(); + console.log( data ); + }, + error: function( data ) { + console.log( data ); + } + } ); + } + + function cleanUp() { + var restoreBox = $( '.remove-site' ); + + restoreBox.find( '.remove-site-message' ).text( generate_sites_params.cleanUp ); + + $.ajax( { + type: 'POST', + url: generate_sites_params.ajaxurl, + data: { + action: 'generate_restore_site_clean_up', + nonce: generate_sites_params.nonce, + }, + success: function( data ) { + restoreBox.find( '.loading' ).hide(); + restoreBox.hide(); + + $( '.generatepress-sites' ).removeClass( 'remove-site-needed' ); + $( 'body' ).removeClass( 'site-import-content-exists' ); + $( 'body' ).removeClass( 'site-import-data-exists' ); + console.log( data ); + }, + error: function( data ) { + console.log( data ); + } + } ); + } + + $( '.do-remove-site' ).on( 'click', function( e ) { + e.preventDefault(); + + if ( confirm( generate_sites_params.confirmRemoval ) ) { + restoreThemeOptions(); + } + } ); + + $( '.skip-remove-site' ).on( 'click', function( e ) { + e.preventDefault(); + + $( '.remove-site' ).hide(); + $( '.generatepress-sites' ).removeClass( 'remove-site-needed' ); + $( 'body' ).removeClass( 'site-import-content-exists' ); + $( 'body' ).removeClass( 'site-import-data-exists' ); + } ); +} ); diff --git a/wp-content/plugins/gp-premium/sites/assets/js/blazy.min.js b/wp-content/plugins/gp-premium/sites/assets/js/blazy.min.js new file mode 100644 index 0000000..3957cac --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/assets/js/blazy.min.js @@ -0,0 +1,6 @@ +/*! + hey, [be]Lazy.js - v1.8.2 - 2016.10.25 + A fast, small and dependency free lazy load script (https://github.com/dinbror/blazy) + (c) Bjoern Klinggaard - @bklinggaard - http://dinbror.dk/blazy +*/ + (function(q,m){"function"===typeof define&&define.amd?define(m):"object"===typeof exports?module.exports=m():q.Blazy=m()})(this,function(){function q(b){var c=b._util;c.elements=E(b.options);c.count=c.elements.length;c.destroyed&&(c.destroyed=!1,b.options.container&&l(b.options.container,function(a){n(a,"scroll",c.validateT)}),n(window,"resize",c.saveViewportOffsetT),n(window,"resize",c.validateT),n(window,"scroll",c.validateT));m(b)}function m(b){for(var c=b._util,a=0;a=c.left&&b.bottom>=c.top&&b.left<=c.right&&b.top<=c.bottom}function z(b,c,a){if(!t(b,a.successClass)&&(c||a.loadInvisible||0=window.screen.width)return u=a.src,!1});setTimeout(function(){q(a)})}}); diff --git a/wp-content/plugins/gp-premium/sites/assets/js/download.js b/wp-content/plugins/gp-premium/sites/assets/js/download.js new file mode 100644 index 0000000..469a96b --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/assets/js/download.js @@ -0,0 +1,167 @@ +//download.js v4.2, by dandavis; 2008-2016. [MIT] see http://danml.com/download.html for tests/usage +// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime +// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs +// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling. +// v4 adds AMD/UMD, commonJS, and plain browser support +// v4.1 adds url download capability via solo URL argument (same domain/CORS only) +// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors +// https://github.com/rndme/download + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], factory); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + root.download = factory(); + } +}(this, function () { + + return function download(data, strFileName, strMimeType) { + + var self = window, // this script is only for browsers anyway... + defaultMime = "application/octet-stream", // this default mime also triggers iframe downloads + mimeType = strMimeType || defaultMime, + payload = data, + url = !strFileName && !strMimeType && payload, + anchor = document.createElement("a"), + toString = function(a){return String(a);}, + myBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString), + fileName = strFileName || "download", + blob, + reader; + myBlob= myBlob.call ? myBlob.bind(self) : Blob ; + + if(String(this)==="true"){ //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback + payload=[payload, mimeType]; + mimeType=payload[0]; + payload=payload[1]; + } + + + if(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument + fileName = url.split("/").pop().split("?")[0]; + anchor.href = url; // assign href prop to temp anchor + if(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path: + var ajax=new XMLHttpRequest(); + ajax.open( "GET", url, true); + ajax.responseType = 'blob'; + ajax.onload= function(e){ + download(e.target.response, fileName, defaultMime); + }; + setTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return: + return ajax; + } // end if valid url? + } // end if url? + + + //go ahead and download dataURLs right away + if(/^data:([\w+-]+\/[\w+.-]+)?[,;]/.test(payload)){ + + if(payload.length > (1024*1024*1.999) && myBlob !== toString ){ + payload=dataUrlToBlob(payload); + mimeType=payload.type || defaultMime; + }else{ + return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs: + navigator.msSaveBlob(dataUrlToBlob(payload), fileName) : + saver(payload) ; // everyone else can save dataURLs un-processed + } + + }else{//not data url, is it a string with special needs? + if(/([\x80-\xff])/.test(payload)){ + var i=0, tempUiArr= new Uint8Array(payload.length), mx=tempUiArr.length; + for(i;iimage_importer = new GeneratePress_Sites_Image_Importer(); + } + + /** + * Import + * + * @since 1.6 + * @return void + */ + public function import() { + GeneratePress_Sites_Helper::log( '== Start Processing Beaver Builder Images ==' ); + + $post_ids = GeneratePress_Sites_Helper::get_all_posts(); + + if ( is_array( $post_ids ) ) { + foreach ( $post_ids as $post_id ) { + $this->import_single_post( $post_id ); + } + } + } + + /** + * Update post meta. + * + * @param integer $post_id Post ID. + * @return void + */ + public function import_single_post( $post_id = 0 ) { + + if ( ! empty( $post_id ) ) { + + // Get page builder data. + $data = get_post_meta( $post_id, '_fl_builder_data', true ); + + if ( ! empty( $data ) ) { + + foreach ( $data as $key => $el ) { + + // Import background images. + if ( 'row' === $el->type || 'column' === $el->type ) { + $data[ $key ]->settings = $this->import_background_images( $el->settings ); + } + + // Import module images. + if ( 'module' === $el->type ) { + $data[ $key ]->settings = $this->import_module_images( $el->settings ); + } + + } + + // Update page builder data. + update_post_meta( $post_id, '_fl_builder_data', $data ); + update_post_meta( $post_id, '_fl_builder_draft', $data ); + + // Clear all cache. + FLBuilderModel::delete_asset_cache_for_all_posts(); + } + } + } + + /** + * Import Module Images. + * + * @param object $settings Module settings object. + * @return object + */ + public function import_module_images( $settings ) { + + /** + * 1) Set photos. + */ + $settings = $this->import_photo( $settings ); + + /** + * 2) Set `$settings->data` for Only type 'image-icon' + * + * @todo Remove the condition `'image-icon' === $settings->type` if `$settings->data` is used only for the Image Icon. + */ + if ( isset( $settings->data ) && isset( $settings->photo ) && ! empty( $settings->photo ) && 'image-icon' === $settings->type ) { + $settings->data = FLBuilderPhoto::get_attachment_data( $settings->photo ); + } + + /** + * 3) Set `list item` module images + */ + if ( isset( $settings->add_list_item ) ) { + foreach ( $settings->add_list_item as $key => $value ) { + $settings->add_list_item[ $key ] = $this->import_photo( $value ); + } + } + + return $settings; + } + + /** + * Helper: Import BG Images. + * + * @param object $settings Row settings object. + * @return object + */ + public function import_background_images( $settings ) { + + if ( ! empty( $settings->bg_image ) && ! empty( $settings->bg_image_src ) ) { + $image = array( + 'url' => $settings->bg_image_src, + 'id' => $settings->bg_image, + ); + + $downloaded_image = $this->image_importer->import( $image ); + + $settings->bg_image_src = $downloaded_image['url']; + $settings->bg_image = $downloaded_image['id']; + } + + return $settings; + } + + /** + * Helper: Import Photo. + * + * @param object $settings Row settings object. + * @return object + */ + public function import_photo( $settings ) { + + if ( ! empty( $settings->photo ) && ! empty( $settings->photo_src ) ) { + $image = array( + 'url' => $settings->photo_src, + 'id' => $settings->photo, + ); + + $downloaded_image = $this->image_importer->import( $image ); + + $settings->photo_src = $downloaded_image['url']; + $settings->photo = $downloaded_image['id']; + } + + return $settings; + } + + +} diff --git a/wp-content/plugins/gp-premium/sites/classes/class-content-importer.php b/wp-content/plugins/gp-premium/sites/classes/class-content-importer.php new file mode 100644 index 0000000..35c3fbd --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/classes/class-content-importer.php @@ -0,0 +1,36 @@ +mapping['user_slug'][ $current_user_obj->user_login ] = $current_user_obj->ID; + } + + /** + * Get all protected variables from the WXR_Importer needed for continuing the import. + */ + public function get_importer_data() { + return array( + 'mapping' => $this->mapping + ); + } + + /** + * Sets all protected variables from the WXR_Importer needed for continuing the import. + * + * @param array $data with set variables. + */ + public function set_importer_data( $data ) { + //$this->mapping = empty( $data['mapping'] ) ? array() : $data['mapping']; + //$this->requires_remapping = empty( $data['requires_remapping'] ) ? array() : $data['requires_remapping']; + } +} diff --git a/wp-content/plugins/gp-premium/sites/classes/class-site-helper.php b/wp-content/plugins/gp-premium/sites/classes/class-site-helper.php new file mode 100644 index 0000000..765a677 --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/classes/class-site-helper.php @@ -0,0 +1,990 @@ + $widgets ) { + // Skip inactive widgets (should not be in export file). + if ( 'wp_inactive_widgets' === $sidebar_id ) { + continue; + } + + if ( is_array( $widgets ) ) { + foreach ( $widgets as $widget_instance_id => $widget ) { + $all_widgets[] = $widget; + } + } + } + + $results['wp_inactive_widgets'] = $all_widgets; + + update_option( 'sidebars_widgets', $results ); + + } + + /** + * Checks to see whether options exist or not. + * + * @since 1.8 + * + * @return bool + */ + public static function do_options_exist() { + $theme_mods = self::get_theme_mods(); + $settings = self::get_theme_settings(); + + $has_data = array( + 'mods' => array(), + 'options' => array() + ); + + foreach ( $theme_mods as $theme_mod ) { + if ( get_theme_mod( $theme_mod ) ) { + $has_data['mods'][$theme_mod] = get_theme_mod( $theme_mod ); + } + } + + foreach ( $settings as $setting ) { + if ( get_option( $setting ) ) { + + // The blog module runs a migration script on activation for now. This checks if those migrated values have been changed. + if ( 'generate_blog_settings' === $setting && function_exists( 'generate_blog_get_defaults' ) ) { + $defaults = generate_blog_get_defaults(); + $options = get_option( $setting ); + $diff = array(); + + foreach ( $options as $option => $value ) { + if ( isset( $defaults[ $option ] ) && $value !== $defaults[ $option ] ) { + $diff[ $option ] = $value; + } + } + + if ( empty( $diff ) ) { + continue; + } + } + + $has_data['options'][$setting] = get_option( $setting ); + } + } + + if ( ! array_filter( $has_data ) ) { + return false; + } else { + return true; + } + } + + /** + * Imports our content and custom CSS. + * + * @since 1.6 + * + * @param string $path + */ + public static function import_xml( $path, $slug ) { + $options = array( + 'fetch_attachments' => true, + 'default_author' => 0, + ); + + $current_css = wp_get_custom_css_post(); + + $logger = new GeneratePress\WPContentImporter2\WPImporterLogger(); + $importer = new GeneratePress_Sites_Content_Importer( $options ); + $importer->set_logger( $logger ); + $result = $importer->import( $path ); + + // Get all mapped post and term data. + $existing_data = self::get_mapped_post_ids( $slug ); + $mapped_data = $importer->get_importer_data(); + $mapped_posts = $mapped_data['mapping']['post']; + + // Merge exiting mapped posts with any new ones. Existing posts don't get mapped, so we need to preserve them. + $all_data = $mapped_posts + $existing_data; + + // Set our site specific mapped posts with all of our data. + update_option( 'generatepress_sites_mapped_ids_' . $slug, $all_data, false ); + + // Set mapped term IDs. + // These are always the same, even if the site has been imported before. No fancy stuff needed. + $term_mapping = $mapped_data['mapping']['term_id']; + set_transient( 'generatepress_sites_mapped_term_ids', $term_mapping, 0.1 * HOUR_IN_SECONDS ); + + wp_update_custom_css_post( $current_css->post_content ); + + // Page builders need so much extra work. + self::update_page_builder_content(); + + // Log our content + //self::log( $logger ); + } + + /** + * List plugins that have a pro version. + * + * We want to check to see if these exist before installing or activating + * the free versions. + * + * @since 1.6 + * + * @return array + */ + public static function check_for_pro_plugins() { + return apply_filters( 'generate_sites_pro_plugins', array( + 'beaver-builder-lite-version/fl-builder.php' => 'bb-plugin/fl-builder.php', + 'ultimate-addons-for-beaver-builder-lite/bb-ultimate-addon.php' => 'bb-ultimate-addon/bb-ultimate-addon.php', + 'powerpack-addon-for-beaver-builder/bb-powerpack-lite.php' => 'bbpowerpack/bb-powerpack.php', + ) ); + } + + /** + * Check to see if required plugins are active. + * + * @since 1.6 + * + * @param string $plugin + */ + public static function is_plugin_installed( $plugin ) { + $pro_plugins = self::check_for_pro_plugins(); + + // Check to see if this plugin has a pro version. + if ( array_key_exists( $plugin, $pro_plugins ) ) { + if ( file_exists( WP_PLUGIN_DIR . '/' . $pro_plugins[$plugin] ) ) { + return true; + } + } + + if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin ) ) { + return true; + } + + return false; + + } + + /** + * Allow SVG images. + * + * @since 1.6 + * + * @param array $response Attachment response. + * @param object $attachment Attachment object. + * @param array $meta Attachment meta data. + */ + public static function add_svg_image_support( $response, $attachment, $meta ) { + if ( ! function_exists( 'simplexml_load_file' ) ) { + return $response; + } + + if ( ! empty( $response['sizes'] ) ) { + return $response; + } + + if ( 'image/svg+xml' !== $response['mime'] ) { + return $response; + } + + $svg_path = get_attached_file( $attachment->ID ); + + $dimensions = self::get_svg_dimensions( $svg_path ); + + $response['sizes'] = array( + 'full' => array( + 'url' => $response['url'], + 'width' => $dimensions->width, + 'height' => $dimensions->height, + 'orientation' => $dimensions->width > $dimensions->height ? 'landscape' : 'portrait', + ), + ); + + return $response; + } + + /** + * Get the dimensions of the uploaded SVG. + * + * @since 1.6 + * + * @param string $svg SVG file path. + * @return array Return SVG file height & width for valid SVG file. + */ + public static function get_svg_dimensions( $svg ) { + $svg = simplexml_load_file( $svg ); + + if ( false === $svg ) { + $width = '0'; + $height = '0'; + } else { + $attributes = $svg->attributes(); + $width = (string) $attributes->width; + $height = (string) $attributes->height; + } + + return (object) array( + 'width' => $width, + 'height' => $height, + ); + } + + /** + * Taken from the core media_sideload_image function and + * modified to return an array of data instead of html. + * + * @since 1.6 + * + * @param string $file The image file path. + * @return array An array of image data. + */ + public static function sideload_image( $file ) { + + $data = new stdClass(); + + if ( ! function_exists( 'media_handle_sideload' ) ) { + require_once( ABSPATH . 'wp-admin/includes/media.php' ); + require_once( ABSPATH . 'wp-admin/includes/file.php' ); + require_once( ABSPATH . 'wp-admin/includes/image.php' ); + } + + if ( ! empty( $file ) ) { + + // Set variables for storage, fix file filename for query strings. + preg_match( '/[^\?]+\.(jpe?g|jpe|svg|gif|png)\b/i', $file, $matches ); + $file_array = array(); + $file_array['name'] = basename( $matches[0] ); + + // Download file to temp location. + $file_array['tmp_name'] = download_url( $file ); + + // If error storing temporarily, return the error. + if ( is_wp_error( $file_array['tmp_name'] ) ) { + return $file_array['tmp_name']; + } + + // Do the validation and storage stuff. + $id = media_handle_sideload( $file_array, 0 ); + + // If error storing permanently, unlink. + if ( is_wp_error( $id ) ) { + @unlink( $file_array['tmp_name'] ); + return $id; + } + + // Build the object to return. + $meta = wp_get_attachment_metadata( $id ); + $data->attachment_id = $id; + $data->url = wp_get_attachment_url( $id ); + $data->thumbnail_url = wp_get_attachment_thumb_url( $id ); + + if ( isset( $meta['height'] ) ) { + $data->height = $meta['height']; + } + + if ( isset( $meta['width'] ) ) { + $data->width = $meta['width']; + } + } + + return $data; + + } + + /** + * Re-maps menu locations. + * + * @since 1.6 + * + * @param array Incoming locations. + */ + public static function set_nav_menu_locations( $locations = array() ) { + $menu_locations = array(); + + $term_ids = self::get_mapped_term_ids(); + + if ( isset( $locations ) ) { + self::log( '== Start mapping menu locations ==' ); + + foreach ( $locations as $menu => $value ) { + if ( empty( $value ) ) { + continue; + } + + $menu_locations[$menu] = $term_ids[$value]; + self::log( $value . ' -> ' . $term_ids[$value] ); + } + + set_theme_mod( 'nav_menu_locations', $menu_locations ); + } + } + + /** + * Re-maps the global Page Header locations. + * + * @since 1.6 + * + * @param array Incoming locations. + */ + public static function set_global_page_header_locations( $locations = array(), $slug ) { + $new_locations = array(); + + $post_ids = self::get_mapped_post_ids( $slug ); + + if ( isset( $locations ) && ! empty( $locations ) ) { + self::log( '== Start mapping global page headers ==' ); + + foreach( $locations as $key => $value ) { + if ( empty( $value ) ) { + continue; + } + + $new_locations[$key] = $post_ids[$value]; + self::log( $value . ' -> ' . $post_ids[$value] ); + } + + update_option( 'generate_page_header_global_locations', $new_locations ); + } + } + + /** + * Re-maps the per-page Page Headers. + * + * @since 1.6 + * + * @param array Incoming locations. + */ + public static function set_page_headers( $headers = array(), $slug ) { + $new_headers = array(); + + $post_ids = self::get_mapped_post_ids( $slug ); + + if ( isset( $headers ) && ! empty( $headers ) ) { + self::log( '== Start mapping individual page headers ==' ); + + foreach ( $headers as $post_id => $header_id ) { + update_post_meta( $post_ids[$post_id], '_generate-select-page-header', $post_ids[$header_id] ); + self::log( $header_id . ' -> ' . $post_ids[$header_id] ); + } + } + } + + /** + * Re-maps the front page and posts page. + * + * @since 1.6 + * + * @param string Name of the option to update. + * @param string Title of the page. + */ + public static function set_reading_pages( $name, $value, $slug ) { + if ( empty( $value ) ) { + return; + } + + self::log( '== Start mapping front and blog pages ==' ); + + // Get import data, with new menu IDs. + $post_ids = self::get_mapped_post_ids( $slug ); + + update_option( $name, $post_ids[$value] ); + self::log( $value . ' -> ' . $post_ids[$value] ); + } + + /** + * Re-maps WooCommerce pages. + * + * @since 1.6 + * + * @param string Name of the option to update. + * @param string Title of the page. + */ + public static function set_woocommerce_pages( $name, $value, $slug ) { + if ( empty( $value ) ) { + return; + } + + self::log( '== Start mapping WooCommerce pages ==' ); + + $post_ids = self::get_mapped_post_ids( $slug ); + + update_option( $name, $post_ids[$value] ); + self::log( $value . ' -> ' . $post_ids[$value] ); + } + + /** + * Change the menu IDs in the custom menu widgets in the widget import data. + * This solves the issue with custom menu widgets not having the correct (new) menu ID, because they + * have the old menu ID from the export site. + * + * @param array $widget The widget settings array. + */ + public static function fix_custom_menu_widget_ids( $widget ) { + // Skip (no changes needed), if this is not a custom menu widget. + if ( ! array_key_exists( 'nav_menu', $widget ) || empty( $widget['nav_menu'] ) || ! is_int( $widget['nav_menu'] ) ) { + return $widget; + } + + // Get import data, with new menu IDs. + $term_ids = self::get_mapped_term_ids(); + + if ( ! isset( $term_ids[ $widget['nav_menu'] ] ) ) { + return $widget; + } + + self::log( '== Start mapping navigation widgets ==' ); + self::log( $widget['nav_menu'] . ' -> ' . $term_ids[ $widget['nav_menu'] ] ); + + // Set the new menu ID for the widget. + $widget['nav_menu'] = $term_ids[ $widget['nav_menu'] ]; + + return $widget; + } + + /** + * Re-maps the element locations. + * + * @since 1.7 + * + * @param array Incoming locations. + */ + public static function set_element_locations( $locations = array(), $slug ) { + $post_ids = self::get_mapped_post_ids( $slug ); + + if ( isset( $locations ) && ! empty( $locations ) ) { + self::log( '== Start mapping element locations ==' ); + + foreach( $locations as $key => $value ) { + $new_locations = array(); + if ( empty( $value ) ) { + continue; + } + + foreach ( ( array ) $value as $data ) { + if ( $data['object'] ) { + self::log( $data['object'] . ' -> ' . $post_ids[$data['object']] ); + $data['object'] = $post_ids[$data['object']]; + } + + $new_locations[] = $data; + } + + update_post_meta( $post_ids[$key], '_generate_element_display_conditions', $new_locations ); + } + } + } + + /** + * Re-maps the element exclusions. + * + * @since 1.7 + * + * @param array Incoming locations. + */ + public static function set_element_exclusions( $locations = array(), $slug ) { + $post_ids = self::get_mapped_post_ids( $slug ); + + if ( isset( $locations ) && ! empty( $locations ) ) { + self::log( '== Start mapping element exclusions ==' ); + + foreach( $locations as $key => $value ) { + $new_locations = array(); + if ( empty( $value ) ) { + continue; + } + + foreach ( ( array ) $value as $data ) { + if ( $data['object'] ) { + self::log( $data['object'] . ' -> ' . $post_ids[$data['object']] ); + $data['object'] = $post_ids[$data['object']]; + } + + $new_locations[] = $data; + } + + update_post_meta( $post_ids[$key], '_generate_element_exclude_conditions', $new_locations ); + } + } + } + + /** + * Update menu URLs. + * + * @since 1.7.3 + * + * @param string Preview URL + */ + public static function update_menu_urls( $url ) { + $args = array ( + 'post_type' => 'nav_menu_item', + 'fields' => 'ids', + 'no_found_rows' => true, + 'post_status' => 'any', + 'numberposts' => 50, + ); + + $items = get_posts( $args ); + + foreach ( $items as $item_id ) { + $item_type = get_post_meta( $item_id, '_menu_item_type', true ); + + if ( 'custom' === $item_type ) { + $item_url = get_post_meta( $item_id, '_menu_item_url', true ); + + if ( $item_url && '#' !== $item_url ) { + $item_url = str_replace( $url, site_url(), $item_url ); + + update_post_meta( $item_id, '_menu_item_url', $item_url ); + } + } + } + } + + /** + * Allow other files types to be uploaded. + * + * @since 1.6 + * + * @param array Existing types. + * @return array Merged types. + */ + public static function mime_types( $mimes ) { + $mimes = array_merge( + $mimes, array( + 'xml' => 'text/xml', + 'wie' => 'text/plain', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml' + ) + ); + + return $mimes; + } + + /** + * Different MIME type of different PHP version + * + * Filters the "real" file type of the given file. + * + * @since 1.8 + * + * @param array $wp_check_filetype_and_ext File data array containing 'ext', 'type', and + * 'proper_filename' keys. + * @param string $file Full path to the file. + * @param string $filename The name of the file (may differ from $file due to + * $file being in a tmp directory). + * @param array $mimes Key is the file extension with value as the mime type. + */ + public static function check_real_mime_type( $defaults, $file, $filename, $mimes ) { + if ( 'content.xml' === $filename ) { + $defaults['ext'] = 'xml'; + $defaults['type'] = 'text/xml'; + } + + if ( 'widgets.wie' === $filename ) { + $defaults['ext'] = 'wie'; + $defaults['type'] = 'text/plain'; + } + + return $defaults; + } + + /** + * Download a file to WordPress from a URL. + * + * @since 1.6 + * + * @param string URL of the file. + * @return array + */ + public static function download_file( $file ) { + // Gives us access to the download_url() and wp_handle_sideload() functions + require_once( ABSPATH . 'wp-admin/includes/file.php' ); + + // URL to the WordPress logo + $url = $file; + $timeout_seconds = 10; + + // Download file to temp dir + $temp_file = download_url( $url, $timeout_seconds ); + + if ( is_wp_error( $temp_file ) ) { + + return array( + 'success' => false, + 'data' => $temp_file->get_error_message() + ); + + } + + // Array based on $_FILE as seen in PHP file uploads + $file = array( + 'name' => basename( $url ), + 'tmp_name' => $temp_file, + 'error' => 0, + 'size' => filesize( $temp_file ), + ); + + $overrides = array( + 'test_form' => false, + 'test_size' => true, + ); + + // Move the temporary file into the uploads directory + $results = wp_handle_sideload( $file, $overrides ); + + if ( empty( $results['error'] ) ) { + + return array( + 'success' => true, + 'data' => $results, + ); + + } else { + + return array( + 'success' => false, + 'error' => $results['error'], + ); + + } + + } + + /** + * Get data from the options.json file. + * + * @since 1.6 + * + * @param string URL of the file. + * @return array + */ + public static function get_options( $url ) { + $url = wp_safe_remote_get( esc_url( $url ) ); + + if ( is_wp_error( $url ) ) { + return false; + } + + return json_decode( wp_remote_retrieve_body( $url ), true ); + } + + /** + * Check to see if a remote file exists. + * + * @since 1.6 + * + * @param string URL of the file. + * @return bool + */ + public static function file_exists( $url ) { + $response = wp_safe_remote_get( esc_url( $url ) ); + + if ( is_wp_error( $response ) ) { + self::log( $response->get_error_message() ); + return false; + } + + return strlen( $response['body'] ) > 100 && ( '200' == $response['response']['code'] || '301' == $response['response']['code'] ) ? true : false; + } + + /** + * Log events to the debug.log file. + * + * @since 1.6 + * @param mixed $log Log data. + * @return void + */ + public static function log( $log ) { + if ( ! WP_DEBUG_LOG ) { + return; + } + + if ( is_array( $log ) || is_object( $log ) ) { + error_log( print_r( $log, true ) ); + } else { + error_log( $log ); + } + } + + /** + * Get all posts to run through batch processing. + * + * @since 1.6 + * + * @return object All posts. + */ + public static function get_all_posts() { + $args = array( + 'post_type' => 'any', + 'fields' => 'ids', + 'no_found_rows' => true, + 'post_status' => 'publish', + 'numberposts' => -1, + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => '_fl_builder_data', + 'compare' => 'EXISTS', + ), + array( + 'key' => '_elementor_data', + 'compare' => 'EXISTS', + ) + ) + ); + + $posts = get_posts( $args ); + + if ( $posts ) { + return $posts; + } + + return false; + } + + /** + * Searches Elementor and Beaver Builder content for images to download. + * + * @since 1.6 + */ + public static function update_page_builder_content() { + + // Add "bb-plugin" in import [queue]. + // Add "beaver-builder-lite-version" in import [queue]. + if ( is_plugin_active( 'beaver-builder-lite-version/fl-builder.php' ) || is_plugin_active( 'bb-plugin/fl-builder.php' ) ) { + if ( class_exists( 'GeneratePress_Sites_Process_Beaver_Builder' ) ) { + $import = new GeneratePress_Sites_Process_Beaver_Builder(); + self::$background_process->push_to_queue( $import ); + } + } + + // Dispatch Queue. + self::$background_process->save()->dispatch(); + } + + /** + * Clear Elementor & Beaver Builder caches when needed. + * + * @since 1.6 + */ + public static function clear_page_builder_cache() { + + if ( class_exists( 'FLBuilderModel' ) && method_exists( 'FLBuilderModel', 'delete_asset_cache_for_all_posts' ) ) { + // Clear all cache. + FLBuilderModel::delete_asset_cache_for_all_posts(); + self::log( 'Cleared Beaver Builder cache.' ); + } + + if ( class_exists( 'Elementor\Plugin' ) && method_exists( 'Elementor\Posts_CSS_Manager', 'clear_cache' ) ) { + // !important, Clear the cache after images import. + Elementor\Plugin::instance()->posts_css_manager->clear_cache(); + self::log( 'Cleared Elementor cache.' ); + } + + } + + /** + * List out GP option names. + * + * @since 1.6 + * + * @return array + */ + public static function get_theme_settings() { + return array( + 'generate_settings', + 'generate_background_settings', + 'generate_blog_settings', + 'generate_hooks', + 'generate_page_header_settings', + 'generate_secondary_nav_settings', + 'generate_spacing_settings', + 'generate_menu_plus_settings', + 'generate_woocommerce_settings', + ); + } + + /** + * List out GP theme mods. + * + * @since 1.6 + * + * @return array + */ + public static function get_theme_mods() { + return array( + 'font_body_variants', + 'font_body_category', + 'font_site_title_variants', + 'font_site_title_category', + 'font_site_tagline_variants', + 'font_site_tagline_category', + 'font_navigation_variants', + 'font_navigation_category', + 'font_secondary_navigation_variants', + 'font_secondary_navigation_category', + 'font_buttons_variants', + 'font_buttons_category', + 'font_heading_1_variants', + 'font_heading_1_category', + 'font_heading_2_variants', + 'font_heading_2_category', + 'font_heading_3_variants', + 'font_heading_3_category', + 'font_heading_4_variants', + 'font_heading_4_category', + 'font_heading_5_variants', + 'font_heading_5_category', + 'font_heading_6_variants', + 'font_heading_6_category', + 'font_widget_title_variants', + 'font_widget_title_category', + 'font_footer_variants', + 'font_footer_category', + 'generate_copyright', + ); + } + + /** + * Build the loading icon. + * + * @since 1.6 + */ + public static function loading_icon() { + ?> + + + + + + + + + + + + + $attachment ) { + $downloaded_images[] = $this->import( $attachment ); + } + + return $downloaded_images; + } + + /** + * Get Hash Image. + * + * @since 1.6 + * @param string $attachment_url Attachment URL. + * @return string Hash string. + */ + private function get_hash_image( $attachment_url ) { + return sha1( $attachment_url ); + } + + /** + * Get Saved Image. + * + * @since 1.6 + * @param string $attachment Attachment Data. + * @return string Hash string. + */ + private function get_saved_image( $attachment ) { + + global $wpdb; + + // Already imported? Then return! + if ( isset( $this->already_imported_ids[ $attachment['id'] ] ) ) { + GeneratePress_Sites_Helper::log( 'Successfully replaced: ' . $attachment['url'] ); + + return $this->already_imported_ids[ $attachment['id'] ]; + } + + // 1. Is already imported in Batch Import Process? + $post_id = $wpdb->get_var( + $wpdb->prepare( + 'SELECT `post_id` FROM `' . $wpdb->postmeta . '` + WHERE `meta_key` = \'_generatepress_sites_image_hash\' + AND `meta_value` = %s + ;', + $this->get_hash_image( $attachment['url'] ) + ) + ); + + // 2. Is image already imported though XML? + if ( empty( $post_id ) ) { + // Get file name without extension. + // To check it exist in attachment. + $filename = preg_replace( '/\\.[^.\\s]{3,4}$/', '', basename( $attachment['url'] ) ); + + $post_id = $wpdb->get_var( + $wpdb->prepare( + 'SELECT `post_id` FROM `' . $wpdb->postmeta . '` + WHERE `meta_key` = \'_wp_attached_file\' + AND `meta_value` LIKE %s + ;', + '%' . $filename . '%' + ) + ); + + GeneratePress_Sites_Helper::log( 'Successfully replaced: ' . $attachment['url'] ); + } + + if ( $post_id ) { + $new_attachment = array( + 'id' => $post_id, + 'url' => wp_get_attachment_url( $post_id ), + ); + + $this->already_imported_ids[ $attachment['id'] ] = $new_attachment; + + return $new_attachment; + } + + return false; + } + + /** + * Import Image + * + * @since 1.6 + * @param array $attachment Attachment array. + * @return array Attachment array. + */ + public function import( $attachment ) { + + $saved_image = $this->get_saved_image( $attachment ); + + if ( $saved_image ) { + return $saved_image; + } + + $file_content = wp_remote_retrieve_body( wp_safe_remote_get( $attachment['url'] ) ); + + // Empty file content? + if ( empty( $file_content ) ) { + GeneratePress_Sites_Helper::log( 'Failed to replace: ' . $attachment['url'] ); + GeneratePress_Sites_Helper::log( 'Error: Failed wp_remote_retrieve_body().' ); + + return $attachment; + } + + // Extract the file name and extension from the URL. + $filename = basename( $attachment['url'] ); + + $upload = wp_upload_bits( + $filename, + null, + $file_content + ); + + $post = array( + 'post_title' => $filename, + 'guid' => $upload['url'], + ); + + $info = wp_check_filetype( $upload['file'] ); + + if ( $info ) { + $post['post_mime_type'] = $info['type']; + } else { + // For now just return the origin attachment. + return $attachment; + } + + $post_id = wp_insert_attachment( $post, $upload['file'] ); + + wp_update_attachment_metadata( + $post_id, + wp_generate_attachment_metadata( $post_id, $upload['file'] ) + ); + + update_post_meta( $post_id, '_generatepress_sites_image_hash', $this->get_hash_image( $attachment['url'] ) ); + + $new_attachment = array( + 'id' => $post_id, + 'url' => $upload['url'], + ); + + GeneratePress_Sites_Helper::log( 'Successfully replaced: ' . $attachment['url'] ); + + $this->already_imported_ids[ $attachment['id'] ] = $new_attachment; + + return $new_attachment; + } +} diff --git a/wp-content/plugins/gp-premium/sites/classes/class-site-restore.php b/wp-content/plugins/gp-premium/sites/classes/class-site-restore.php new file mode 100644 index 0000000..b9ddbbd --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/classes/class-site-restore.php @@ -0,0 +1,246 @@ + $key ) { + delete_option( $key ); + } + + if ( ! empty( $backup_data['modules'] ) ) { + foreach ( (array) $backup_data['modules'] as $name => $key ) { + update_option( $key, 'activated' ); + } + } + + // Theme options. + foreach ( $backup_data['theme_options']['mods'] as $key => $val ) { + // Only allow valid theme mods. + if ( ! in_array( $key, GeneratePress_Sites_Helper::get_theme_mods() ) ) { + GeneratePress_Sites_Helper::log( 'Bad theme mod key: ' . $key ); + continue; + } + + set_theme_mod( $key, $val ); + } + + foreach ( $backup_data['theme_options']['options'] as $key => $val ) { + // Only allow valid options. + if ( ! in_array( $key, GeneratePress_Sites_Helper::get_theme_settings() ) ) { + GeneratePress_Sites_Helper::log( 'Bad theme setting key: ' . $key ); + continue; + } + + update_option( $key, $val ); + } + } + + wp_send_json( __( 'Theme options restored.', 'gp-premium' ) ); + + die(); + } + + public function site_options() { + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + if ( ! empty( $backup_data ) ) { + foreach ( $backup_data['site_options'] as $key => $val ) { + if ( in_array( $key, ( array ) generatepress_sites_disallowed_options() ) ) { + GeneratePress_Sites_Helper::log( 'Disallowed option: ' . $key ); + continue; + } + + if ( 'nav_menu_locations' === $key || 'custom_logo' === $key ) { + set_theme_mod( $key, $val ); + } else { + update_option( $key, $val ); + } + } + } + + wp_send_json( __( 'Site options restored.', 'gp-premium' ) ); + + die(); + } + + public function content() { + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + if ( ! empty( $backup_data ) ) { + global $wpdb; + $post_ids = $wpdb->get_col( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_generatepress_sites_imported_post'" ); + $term_ids = $wpdb->get_col( "SELECT term_id FROM {$wpdb->termmeta} WHERE meta_key='_generatepress_sites_imported_term'" ); + + foreach ( $post_ids as $id ) { + wp_delete_post( $id, true ); + } + } + + wp_send_json( __( 'Content restored.', 'gp-premium' ) ); + + die(); + } + + public function plugins() { + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + if ( ! empty( $backup_data['plugins'] ) && ! empty( $backup_data['site_options'] ) ) { + update_option( 'active_plugins', $backup_data['plugins'] ); + } + + wp_send_json( __( 'Plugins restored.', 'gp-premium' ) ); + + die(); + } + + public function widgets() { + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + if ( ! empty( $backup_data['widgets'] ) ) { + update_option( 'sidebars_widgets', $backup_data['widgets'] ); + } + + wp_send_json( __( 'Widgets restored.', 'gp-premium' ) ); + + die(); + } + + public function css() { + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + if ( ! empty( $backup_data ) ) { + $css = ''; + $current_css = wp_get_custom_css_post(); + + if ( isset( $current_css->post_content ) ) { + // Remove existing library CSS. + $current_css->post_content = preg_replace( '#(/\\* GeneratePress Site CSS \\*/).*?(/\\* End GeneratePress Site CSS \\*/)#s', '', $current_css->post_content ); + } + + if ( ! empty( $backup_data['css'] ) ) { + $current_css->post_content .= $backup_data['css']; + } + + wp_update_custom_css_post( $current_css->post_content ); + } + + wp_send_json( __( 'CSS restored.', 'gp-premium' ) ); + + die(); + } + + public function clean_up() { + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + delete_option( 'generate_dynamic_css_output' ); + delete_option( 'generate_dynamic_css_cached_version' ); + delete_option( '_generatepress_site_library_backup' ); + + wp_send_json( __( 'Completed clean-up.', 'gp-premium' ) ); + + die(); + } +} + +GeneratePress_Sites_Restore::get_instance(); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/sites/classes/class-site-widget-importer.php b/wp-content/plugins/gp-premium/sites/classes/class-site-widget-importer.php new file mode 100644 index 0000000..b240927 --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/classes/class-site-widget-importer.php @@ -0,0 +1,259 @@ + true, + ) + ); + } + + // Hook before import. + do_action( 'wie_before_import' ); + + $data = apply_filters( 'wie_import_data', $data ); + + // Get all available widgets site supports. + $available_widgets = $this->wie_available_widgets(); + + // Get all existing widget instances. + $widget_instances = array(); + + foreach ( $available_widgets as $widget_data ) { + $widget_instances[ $widget_data['id_base'] ] = get_option( 'widget_' . $widget_data['id_base'] ); + } + + // Begin results. + $results = array(); + + // Loop import data's sidebars. + foreach ( $data as $sidebar_id => $widgets ) { + // Skip inactive widgets (should not be in export file). + if ( 'wp_inactive_widgets' === $sidebar_id ) { + continue; + } + + // Check if sidebar is available on this site. + // Otherwise add widgets to inactive, and say so. + if ( isset( $wp_registered_sidebars[ $sidebar_id ] ) ) { + $sidebar_available = true; + $use_sidebar_id = $sidebar_id; + $sidebar_message_type = 'success'; + $sidebar_message = ''; + } else { + $sidebar_available = false; + $use_sidebar_id = 'wp_inactive_widgets'; // Add to inactive if sidebar does not exist in theme. + $sidebar_message_type = 'error'; + $sidebar_message = esc_html__( 'Widget area does not exist in theme (using Inactive)', 'widget-importer-exporter' ); + } + + // Result for sidebar + // Sidebar name if theme supports it; otherwise ID. + $results[ $sidebar_id ]['name'] = ! empty( $wp_registered_sidebars[ $sidebar_id ]['name'] ) ? $wp_registered_sidebars[ $sidebar_id ]['name'] : $sidebar_id; + $results[ $sidebar_id ]['message_type'] = $sidebar_message_type; + $results[ $sidebar_id ]['message'] = $sidebar_message; + $results[ $sidebar_id ]['widgets'] = array(); + + // Loop widgets. + foreach ( $widgets as $widget_instance_id => $widget ) { + $fail = false; + + // Get id_base (remove -# from end) and instance ID number. + $id_base = preg_replace( '/-[0-9]+$/', '', $widget_instance_id ); + $instance_id_number = str_replace( $id_base . '-', '', $widget_instance_id ); + + // Does site support this widget? + if ( ! $fail && ! isset( $available_widgets[ $id_base ] ) ) { + $fail = true; + $widget_message_type = 'error'; + $widget_message = esc_html__( 'Site does not support widget', 'widget-importer-exporter' ); // Explain why widget not imported. + } + + // Filter to modify settings object before conversion to array and import + // Leave this filter here for backwards compatibility with manipulating objects (before conversion to array below) + // Ideally the newer wie_widget_settings_array below will be used instead of this. + $widget = apply_filters( 'wie_widget_settings', $widget ); + + // Convert multidimensional objects to multidimensional arrays + // Some plugins like Jetpack Widget Visibility store settings as multidimensional arrays + // Without this, they are imported as objects and cause fatal error on Widgets page + // If this creates problems for plugins that do actually intend settings in objects then may need to consider other approach: https://wordpress.org/support/topic/problem-with-array-of-arrays + // It is probably much more likely that arrays are used than objects, however. + $widget = json_decode( wp_json_encode( $widget ), true ); + + // Filter to modify settings array + // This is preferred over the older wie_widget_settings filter above + // Do before identical check because changes may make it identical to end result (such as URL replacements). + $widget = apply_filters( 'wie_widget_settings_array', $widget ); + + // Does widget with identical settings already exist in same sidebar? + if ( ! $fail && isset( $widget_instances[ $id_base ] ) ) { + // Get existing widgets in this sidebar. + $sidebars_widgets = get_option( 'sidebars_widgets' ); + $sidebar_widgets = isset( $sidebars_widgets[ $use_sidebar_id ] ) ? $sidebars_widgets[ $use_sidebar_id ] : array(); // Check Inactive if that's where will go. + + // Loop widgets with ID base. + $single_widget_instances = ! empty( $widget_instances[ $id_base ] ) ? $widget_instances[ $id_base ] : array(); + + foreach ( $single_widget_instances as $check_id => $check_widget ) { + // Is widget in same sidebar and has identical settings? + if ( in_array( "$id_base-$check_id", $sidebar_widgets, true ) && (array) $widget === $check_widget ) { + $fail = true; + $widget_message_type = 'warning'; + // Explain why widget not imported. + $widget_message = esc_html__( 'Widget already exists', 'widget-importer-exporter' ); + break; + } + } + } + + // No failure. + if ( ! $fail ) { + // Add widget instance + $single_widget_instances = get_option( 'widget_' . $id_base ); // All instances for that widget ID base, get fresh every time. + + $single_widget_instances = ! empty( $single_widget_instances ) ? $single_widget_instances : array( + '_multiwidget' => 1, // Start fresh if have to. + ); + + $single_widget_instances[] = $widget; // Add it. + + // Get the key it was given. + end( $single_widget_instances ); + + $new_instance_id_number = key( $single_widget_instances ); + + // If key is 0, make it 1 + // When 0, an issue can occur where adding a widget causes data from other widget to load, + // and the widget doesn't stick (reload wipes it). + if ( '0' === strval( $new_instance_id_number ) ) { + $new_instance_id_number = 1; + $single_widget_instances[ $new_instance_id_number ] = $single_widget_instances[0]; + unset( $single_widget_instances[0] ); + } + + // Move _multiwidget to end of array for uniformity. + if ( isset( $single_widget_instances['_multiwidget'] ) ) { + $multiwidget = $single_widget_instances['_multiwidget']; + unset( $single_widget_instances['_multiwidget'] ); + $single_widget_instances['_multiwidget'] = $multiwidget; + } + + // Update option with new widget. + update_option( 'widget_' . $id_base, $single_widget_instances ); + + // Assign widget instance to sidebar. + // Which sidebars have which widgets, get fresh every time. + $sidebars_widgets = get_option( 'sidebars_widgets' ); + + // Avoid rarely fatal error when the option is an empty string + // https://github.com/stevengliebe/widget-importer-exporter/pull/11. + if ( ! $sidebars_widgets ) { + $sidebars_widgets = array(); + } + + // Use ID number from new widget instance. + $new_instance_id = $id_base . '-' . $new_instance_id_number; + + // Add new instance to sidebar. + $sidebars_widgets[ $use_sidebar_id ][] = $new_instance_id; + + // Save the amended data. + update_option( 'sidebars_widgets', $sidebars_widgets ); + + // After widget import action. + $after_widget_import = array( + 'sidebar' => $use_sidebar_id, + 'sidebar_old' => $sidebar_id, + 'widget' => $widget, + 'widget_type' => $id_base, + 'widget_id' => $new_instance_id, + 'widget_id_old' => $widget_instance_id, + 'widget_id_num' => $new_instance_id_number, + 'widget_id_num_old' => $instance_id_number, + ); + + do_action( 'wie_after_widget_import', $after_widget_import ); + + // Success message. + if ( $sidebar_available ) { + $widget_message_type = 'success'; + $widget_message = esc_html__( 'Imported', 'widget-importer-exporter' ); + } else { + $widget_message_type = 'warning'; + $widget_message = esc_html__( 'Imported to Inactive', 'widget-importer-exporter' ); + } + } + + // Result for widget instance + $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['name'] = isset( $available_widgets[ $id_base ]['name'] ) ? $available_widgets[ $id_base ]['name'] : $id_base; // Widget name or ID if name not available (not supported by site). + $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['title'] = ! empty( $widget['title'] ) ? $widget['title'] : esc_html__( 'No Title', 'widget-importer-exporter' ); // Show "No Title" if widget instance is untitled. + $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['message_type'] = $widget_message_type; + $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['message'] = $widget_message; + } + } + + // Hook after import. + do_action( 'wie_after_import' ); + + // Return results. + return apply_filters( 'wie_import_results', $results ); + } +} diff --git a/wp-content/plugins/gp-premium/sites/classes/class-site.php b/wp-content/plugins/gp-premium/sites/classes/class-site.php new file mode 100644 index 0000000..ec8eaea --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/classes/class-site.php @@ -0,0 +1,1091 @@ + '', + 'name' => '', + 'preview_url' => '', + 'author_name' => '', + 'author_url' => '', + 'icon' => 'icon.png', + 'screenshot' => 'screenshot.png', + 'page_builder' => array(), + 'uploads_url' => array(), + 'min_version' => GP_PREMIUM_VERSION, + 'plugins' => '', + 'documentation' => '', + ) ); + + $this->helpers = new GeneratePress_Sites_Helper(); + + $this->directory = trailingslashit( $config['directory'] ); + + $provider = parse_url( $this->directory ); + + if ( ! isset( $provider['host'] ) ) { + return; + } + + if ( ! in_array( $provider['host'], ( array ) get_transient( 'generatepress_sites_trusted_providers' ) ) ) { + return; + } + + $this->name = $config['name']; + $this->slug = str_replace( ' ', '_', strtolower( $this->name ) ); + $this->preview_url = $config['preview_url']; + $this->author_name = $config['author_name']; + $this->author_url = $config['author_url']; + $this->description = $config['description']; + $this->icon = $config['icon']; + $this->screenshot = $config['screenshot']; + $this->page_builder = $config['page_builder']; + $this->min_version = $config['min_version']; + $this->uploads_url = $config['uploads_url']; + $this->plugins = $config['plugins']; + $this->documentation = $config['documentation']; + $this->installable = true; + + if ( empty( $this->min_version ) ) { + $this->min_version = GP_PREMIUM_VERSION; + } + + if ( version_compare( GP_PREMIUM_VERSION, $config['min_version'], '<' ) ) { + $this->installable = false; + } + + add_action( 'generate_inside_sites_container', array( $this, 'build_box' ) ); + add_action( "wp_ajax_generate_setup_demo_content_{$this->slug}", array( $this, 'setup_demo_content' ), 10, 0 ); + add_action( "wp_ajax_generate_check_plugins_{$this->slug}", array( $this, 'check_plugins' ), 10, 0 ); + add_action( "wp_ajax_generate_backup_options_{$this->slug}", array( $this, 'backup_options' ), 10, 0 ); + add_action( "wp_ajax_generate_import_options_{$this->slug}", array( $this, 'import_options' ), 10, 0 ); + add_action( "wp_ajax_generate_activate_plugins_{$this->slug}", array( $this, 'activate_plugins' ), 10, 0 ); + add_action( "wp_ajax_generate_import_site_options_{$this->slug}", array( $this, 'import_site_options' ), 10, 0 ); + add_action( "wp_ajax_generate_download_content_{$this->slug}", array( $this, 'download_content' ), 10, 0 ); + add_action( "wp_ajax_generate_import_content_{$this->slug}", array( $this, 'import_content' ), 10, 0 ); + add_action( "wp_ajax_generate_import_widgets_{$this->slug}", array( $this, 'import_widgets' ), 10, 0 ); + + // Don't do the WC setup. This wouldn't be necessary if they used an activation hook. + add_filter( 'woocommerce_prevent_automatic_wizard_redirect', '__return_true' ); + + } + + /** + * Build the site details, including the screenshot and description. + * + * @since 1.6 + */ + public function site_details() { + + printf( '
        + %s +
        ', + esc_attr( $this->name ) + ); + + ?> + +
        + documentation ) : ?> +
        +

        +

        + + +

        +
        + + +
        +

        + +

        + + +

        +
        + + author_name && 'GeneratePress' !== $this->author_name ) : ?> +
        +

        +

        + name + ); + ?> + author_name; ?>. +

        +
        + +
        + + +
        + + + + +
        + $this->slug, + 'preview_url' => $this->preview_url, + 'plugins' => $this->plugins, + ); + + $page_builders = array(); + foreach ( ( array ) $this->page_builder as $builder ) { + $page_builders = str_replace( ' ', '-', strtolower( $builder ) ); + } + + $site_classes = array( + 'site-box', + $page_builders, + ! $this->installable ? 'disabled-site' : '' + ); + + ?> +
        +
        +
        +
        +

        name; ?>

        + description ) { + echo ' ' . wpautop( $this->description ) . ''; + } + ?> + + installable ) : ?> +
        + + +
        + + + min_version ); ?> + + +
        +
        + +
        + +
        + +
        + author_name; ?> +

        name; ?>

        +
        +
        + + + + +
        + '', + 'disabled' => 'disabled', + 'style' => ! $options ? 'display: none;' : '', + ) + ); + + submit_button( + __( 'Import Options', 'gp-premium' ), + 'button-primary import-options site-action', + 'submit', + false, + array( + 'id' => '', + 'style' => $options ? 'display:none' : '', + ) + ); + + submit_button( + __( 'Import Content', 'gp-premium' ), + 'button-primary import-content site-action', + 'submit', + false, + array( + 'id' => '', + 'disabled' => 'disabled', + 'style' => 'display: none;', + ) + ); + + submit_button( + __( 'View Your Site', 'gp-premium' ), + 'button-primary view-site', + 'submit', + false, + array( + 'id' => '', + 'style' => 'display: none;', + ) + ); + } + + /** + * Backup our existing GeneratePress options. + * + * @since 1.6 + */ + public function backup_options() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $theme_mods = GeneratePress_Sites_Helper::get_theme_mods(); + $settings = GeneratePress_Sites_Helper::get_theme_settings(); + + $data = array( + 'mods' => array(), + 'options' => array() + ); + + foreach ( $theme_mods as $theme_mod ) { + $data['mods'][$theme_mod] = get_theme_mod( $theme_mod ); + } + + foreach ( $settings as $setting ) { + $data['options'][$setting] = get_option( $setting ); + } + + echo json_encode( $data ); + + die(); + + } + + /** + * Tells our JS which files exist. + * + * @since 1.8 + */ + public function setup_demo_content() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $settings = GeneratePress_Sites_Helper::get_options( $this->directory . 'options.json' ); + + $data['plugins'] = $settings['plugins']; + + if ( GeneratePress_Sites_Helper::file_exists( $this->directory . 'content.xml' ) ) { + $data['content'] = true; + } else { + $data['content'] = false; + } + + if ( GeneratePress_Sites_Helper::file_exists( $this->directory . 'widgets.wie' ) ) { + $data['widgets'] = true; + } else { + $data['widgets'] = false; + } + + // Backup our plugins early. + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + $backup_data['plugins'] = get_option( 'active_plugins', array() ); + update_option( '_generatepress_site_library_backup', $backup_data ); + + wp_send_json( $data ); + + die(); + + } + + /** + * Import our demo GeneratePress options. + * + * @since 1.6 + */ + public function import_options() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + if ( ! GeneratePress_Sites_Helper::file_exists( $this->directory . 'options.json' ) ) { + wp_send_json_error( __( 'No theme options exist.', 'gp-premium' ) ); + } + + // Delete existing backup. + delete_option( '_generatepress_site_library_backup' ); + + // Backup options. + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + $theme_mods = GeneratePress_Sites_Helper::get_theme_mods(); + $settings = GeneratePress_Sites_Helper::get_theme_settings(); + + $data = array( + 'mods' => array(), + 'options' => array() + ); + + foreach ( $theme_mods as $theme_mod ) { + $data['mods'][$theme_mod] = get_theme_mod( $theme_mod ); + } + + foreach ( $settings as $setting ) { + $data['options'][$setting] = get_option( $setting ); + } + + $backup_data['theme_options'] = $data; + + $modules = generatepress_get_site_premium_modules(); + + $active_modules = array(); + foreach ( $modules as $name => $key ) { + if ( 'activated' == get_option( $key ) ) { + $active_modules[ $name ] = $key; + } + } + + $backup_data['modules'] = $active_modules; + + $settings = GeneratePress_Sites_Helper::get_options( $this->directory . 'options.json' ); + + // Remove all existing theme options. + $option_keys = array( + 'generate_settings', + 'generate_background_settings', + 'generate_blog_settings', + 'generate_hooks', + 'generate_page_header_settings', + 'generate_secondary_nav_settings', + 'generate_spacing_settings', + 'generate_menu_plus_settings', + 'generate_woocommerce_settings', + ); + + foreach ( $option_keys as $key ) { + delete_option( $key ); + } + + // Need to backup these items before we remove all theme mods. + $backup_data['site_options']['nav_menu_locations'] = get_theme_mod( 'nav_menu_locations' ); + $backup_data['site_options']['custom_logo'] = get_theme_mod( 'custom_logo' ); + + // Remove existing theme mods. + remove_theme_mods(); + + // Remove existing activated premium modules. + $premium_modules = generatepress_get_site_premium_modules(); + + foreach ( $premium_modules as $name => $key ) { + delete_option( $key ); + } + + // Activate necessary modules. + foreach ( $settings['modules'] as $name => $key ) { + // Only allow valid premium modules. + if ( ! in_array( $key, $premium_modules ) ) { + GeneratePress_Sites_Helper::log( 'Bad premium module key: ' . $key ); + continue; + } + + update_option( $key, 'activated' ); + } + + // Set theme mods. + foreach ( $settings['mods'] as $key => $val ) { + // Only allow valid theme mods. + if ( ! in_array( $key, GeneratePress_Sites_Helper::get_theme_mods() ) ) { + GeneratePress_Sites_Helper::log( 'Bad theme mod key: ' . $key ); + continue; + } + + set_theme_mod( $key, $val ); + } + + // Set theme options. + foreach ( $settings['options'] as $key => $val ) { + // Only allow valid options. + if ( ! in_array( $key, GeneratePress_Sites_Helper::get_theme_settings() ) ) { + GeneratePress_Sites_Helper::log( 'Bad theme setting key: ' . $key ); + continue; + } + + // Import any images + if ( is_array( $val ) || is_object( $val ) ) { + foreach ( $val as $option_name => $option_value ) { + if ( is_string( $option_value ) && preg_match( '/\.(jpg|jpeg|png|gif)/i', $option_value ) ) { + + $data = GeneratePress_Sites_Helper::sideload_image( $option_value ); + + if ( ! is_wp_error( $data ) ) { + $val[$option_name] = $data->url; + } + + } + } + } + + update_option( $key, $val ); + } + + // Remove dynamic CSS cache. + delete_option( 'generate_dynamic_css_output' ); + delete_option( 'generate_dynamic_css_cached_version' ); + + // Custom CSS. + $css = $settings['custom_css']; + $css = '/* GeneratePress Site CSS */ ' . $css . ' /* End GeneratePress Site CSS */'; + + $current_css = wp_get_custom_css_post(); + + if ( isset( $current_css->post_content ) ) { + preg_match( '#(/\* GeneratePress Site CSS).*?(End GeneratePress Site CSS \*/)#s', $current_css->post_content, $matches ); + + if ( ! empty( $matches ) ) { + $backup_data['css'] = $matches[0]; + } + + $current_css->post_content = preg_replace( '#(/\\* GeneratePress Site CSS \\*/).*?(/\\* End GeneratePress Site CSS \\*/)#s', '', $current_css->post_content ); + $css = $current_css->post_content . $css; + } + + wp_update_custom_css_post( $css ); + + update_option( '_generatepress_site_library_backup', $backup_data ); + + die(); + + } + + public function download_content() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + // Increase PHP max execution time. + set_time_limit( apply_filters( 'generate_sites_content_import_time_limit', 300 ) ); + + $xml_path = $this->directory . 'content.xml'; + $xml_file = GeneratePress_Sites_Helper::download_file( $xml_path ); + $xml_path = $xml_file['data']['file']; + + if ( file_exists( $xml_path ) ) { + set_transient( 'generatepress_sites_content_file', $xml_path, HOUR_IN_SECONDS ); + } + + die(); + } + + /** + * Import our demo content. + * + * @since 1.6 + */ + public function import_content() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + // Increase PHP max execution time. + set_time_limit( apply_filters( 'generate_sites_content_import_time_limit', 300 ) ); + + // Disable import of authors. + add_filter( 'wxr_importer.pre_process.user', '__return_false' ); + + // Keep track of our progress. + add_action( 'wxr_importer.processed.post', array( $this, 'track_post' ) ); + add_action( 'wxr_importer.processed.term', array( $this, 'track_term' ) ); + + // Disables generation of multiple image sizes (thumbnails) in the content import step. + if ( ! apply_filters( 'generate_sites_regen_thumbnails', true ) ) { + add_filter( 'intermediate_image_sizes_advanced', '__return_null' ); + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + $backup_data['content'] = true; + update_option( '_generatepress_site_library_backup', $backup_data ); + + // Import content + $content = get_transient( 'generatepress_sites_content_file' ); + + if ( $content ) { + GeneratePress_Sites_Helper::import_xml( $content, $this->slug ); + delete_transient( 'generatepress_sites_content_file' ); + } + + die(); + + } + + /** + * Import our widgets. + * + * @since 1.6 + */ + public function import_widgets() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $widgets_path = $this->directory . 'widgets.wie'; + + $wie_file = GeneratePress_Sites_Helper::download_file( $widgets_path ); + $wie_path = $wie_file['data']['file']; + + $data = implode( '', file( $wie_path ) ); + $data = json_decode( $data ); + + GeneratePress_Sites_Helper::clear_widgets(); + + $widgets_importer = GeneratePress_Sites_Widget_Importer::instance(); + $widgets_importer->wie_import_data( $data ); + + die(); + + } + + /** + * Import any necessary site options. + * + * @since 1.6 + */ + public function import_site_options() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + $settings = GeneratePress_Sites_Helper::get_options( $this->directory . 'options.json' ); + + delete_option( 'generate_page_header_global_locations' ); + + foreach( $settings['site_options'] as $key => $val ) { + + switch( $key ) { + + case 'page_for_posts': + case 'page_on_front': + $backup_data['site_options'][ $key ] = get_option( $key ); + GeneratePress_Sites_Helper::set_reading_pages( $key, $val, $this->slug ); + break; + + case 'woocommerce_shop_page_id': + case 'woocommerce_cart_page_id': + case 'woocommerce_checkout_page_id': + case 'woocommerce_myaccount_page_id': + $backup_data['site_options'][ $key ] = get_option( $key ); + GeneratePress_Sites_Helper::set_woocommerce_pages( $key, $val, $this->slug ); + break; + + case 'nav_menu_locations': + GeneratePress_Sites_Helper::set_nav_menu_locations( $val ); + break; + + case 'page_header_global_locations': + GeneratePress_Sites_Helper::set_global_page_header_locations( $val, $this->slug ); + break; + + case 'page_headers': + GeneratePress_Sites_Helper::set_page_headers( $val, $this->slug ); + break; + + case 'element_locations': + GeneratePress_Sites_Helper::set_element_locations( $val, $this->slug ); + break; + + case 'element_exclusions': + GeneratePress_Sites_Helper::set_element_exclusions( $val, $this->slug ); + break; + + case 'custom_logo': + $data = GeneratePress_Sites_Helper::sideload_image( $val ); + + if ( ! is_wp_error( $data ) && isset( $data->attachment_id ) ) { + set_theme_mod( 'custom_logo', $data->attachment_id ); + update_post_meta( $data->attachment_id, '_wp_attachment_is_custom_header', get_option( 'stylesheet' ) ); + } else { + remove_theme_mod( 'custom_logo' ); + } + + break; + + default: + if ( in_array( $key, ( array ) generatepress_sites_disallowed_options() ) ) { + GeneratePress_Sites_Helper::log( 'Disallowed option: ' . $key ); + } else { + $backup_data['site_options'][ $key ] = get_option( $key ); + delete_option( $key ); + update_option( $key, $val ); + } + break; + + } + + } + + // Set our backed up options. + update_option( '_generatepress_site_library_backup', $backup_data ); + + // Update any custom menu link URLs. + GeneratePress_Sites_Helper::update_menu_urls( $this->preview_url ); + + // Clear page builder cache. + GeneratePress_Sites_Helper::clear_page_builder_cache(); + + wp_send_json( __( 'Site options imported', 'gp-premium' ) ); + + die(); + + } + + /** + * Activates our freshly installed plugins. + * + * @since 1.6 + */ + public function activate_plugins() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $settings = GeneratePress_Sites_Helper::get_options( $this->directory . 'options.json' ); + $plugins = $settings['plugins']; + + if ( ! empty( $plugins ) ) { + + $pro_plugins = GeneratePress_Sites_Helper::check_for_pro_plugins(); + + foreach( $plugins as $plugin ) { + // If the plugin has a pro version and it exists, activate it instead. + if ( array_key_exists( $plugin, $pro_plugins ) ) { + if ( file_exists( WP_PLUGIN_DIR . '/' . $pro_plugins[$plugin] ) ) { + $plugin = $pro_plugins[$plugin]; + } + } + + // Install BB lite if pro doesn't exist. + if ( 'bb-plugin/fl-builder.php' === $plugin && ! file_exists( WP_PLUGIN_DIR . '/bb-plugin/fl-builder.php' ) ) { + $plugin = 'beaver-builder-lite-version/fl-builder.php'; + } + + if ( ! is_plugin_active( $plugin ) ) { + activate_plugin( $plugin, '', false, true ); + } + } + + wp_send_json( __( 'Plugins activated', 'gp-premium' ) ); + + } + + die(); + + } + + /** + * Checks a few things: + * 1. Is the plugin installed already? + * 2. Is the plugin active already? + * 3. Can the plugin be downloaded from WordPress.org? + * + * @since 1.6 + */ + public function check_plugins() { + + check_ajax_referer( 'generate_sites_nonce', 'nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + if ( GeneratePress_Sites_Helper::file_exists( $this->directory . 'options.json' ) ) { + $data['options'] = true; + + $settings = GeneratePress_Sites_Helper::get_options( $this->directory . 'options.json' ); + $data['modules'] = $settings['modules']; + $data['plugins'] = $settings['plugins']; + + if ( ! is_array( $data['plugins'] ) ) { + return; + } + + $plugin_data = array(); + foreach( $data['plugins'] as $name => $slug ) { + $basename = strtok( $slug, '/' ); + $plugin_data[$name] = array( + 'name' => $name, + 'slug' => $slug, + 'installed' => GeneratePress_Sites_Helper::is_plugin_installed( $slug ) ? true : false, + 'active' => is_plugin_active( $slug ) ? true : false, + 'repo' => GeneratePress_Sites_Helper::file_exists( 'https://api.wordpress.org/plugins/info/1.0/' . $basename ) ? true : false, + ); + } + + $data['plugin_data'] = $plugin_data; + } + + wp_send_json( array( + 'plugins' => $data['plugins'], + 'plugin_data' => $data['plugin_data'], + ) ); + + die(); + + } + + /** + * Track Imported Post + * + * @param int $post_id Post ID. + * @return void + */ + function track_post( $post_id ) { + update_post_meta( $post_id, '_generatepress_sites_imported_post', true ); + } + + /** + * Track Imported Term + * + * @param int $term_id Term ID. + * @return void + */ + function track_term( $term_id ) { + $term = get_term( $term_id ); + + update_term_meta( $term_id, '_generatepress_sites_imported_term', true ); + } +} diff --git a/wp-content/plugins/gp-premium/sites/classes/class-sites-background-process.php b/wp-content/plugins/gp-premium/sites/classes/class-sites-background-process.php new file mode 100644 index 0000000..e181bef --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/classes/class-sites-background-process.php @@ -0,0 +1,34 @@ +import(); + } + + return false; + } + + protected function complete() { + + parent::complete(); + + } + + } + +} diff --git a/wp-content/plugins/gp-premium/sites/libs/wxr-importer/WPImporterLogger.php b/wp-content/plugins/gp-premium/sites/libs/wxr-importer/WPImporterLogger.php new file mode 100644 index 0000000..0818391 --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/libs/wxr-importer/WPImporterLogger.php @@ -0,0 +1,138 @@ +log( 'emergency', $message, $context ); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param array $context + * @return null + */ + public function alert( $message, array $context = array() ) { + return $this->log( 'alert', $message, $context ); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param array $context + * @return null + */ + public function critical( $message, array $context = array() ) { + return $this->log( 'critical', $message, $context ); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + * @return null + */ + public function error( $message, array $context = array()) { + return $this->log( 'error', $message, $context ); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param array $context + * @return null + */ + public function warning( $message, array $context = array() ) { + return $this->log( 'warning', $message, $context ); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + * @return null + */ + public function notice( $message, array $context = array() ) { + return $this->log( 'notice', $message, $context ); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param array $context + * @return null + */ + public function info( $message, array $context = array() ) { + return $this->log( 'info', $message, $context ); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + * @return null + */ + public function debug( $message, array $context = array() ) { + return $this->log( 'debug', $message, $context ); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * @return null + */ + public function log( $level, $message, array $context = array() ) { + $this->messages[] = array( + 'timestamp' => time(), + 'level' => $level, + 'message' => $message, + 'context' => $context, + ); + } +} diff --git a/wp-content/plugins/gp-premium/sites/libs/wxr-importer/WXRImportInfo.php b/wp-content/plugins/gp-premium/sites/libs/wxr-importer/WXRImportInfo.php new file mode 100644 index 0000000..a7e75aa --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/libs/wxr-importer/WXRImportInfo.php @@ -0,0 +1,16 @@ +` tag at the start of the file. + * + * @var string + */ + protected $version = '1.0'; + + // information to import from WXR file + protected $categories = array(); + protected $tags = array(); + protected $base_url = ''; + + // TODO: REMOVE THESE + protected $processed_terms = array(); + protected $processed_posts = array(); + protected $processed_menu_items = array(); + protected $menu_item_orphans = array(); + protected $missing_menu_items = array(); + + // NEW STYLE + protected $mapping = array(); + protected $requires_remapping = array(); + protected $exists = array(); + protected $user_slug_override = array(); + + protected $url_remap = array(); + protected $featured_images = array(); + + /** + * Logger instance. + * + * @var WP_Importer_Logger + */ + protected $logger; + + /** + * Constructor + * + * @param array $options { + * @var bool $prefill_existing_posts Should we prefill `post_exists` calls? (True prefills and uses more memory, false checks once per imported post and takes longer. Default is true.) + * @var bool $prefill_existing_comments Should we prefill `comment_exists` calls? (True prefills and uses more memory, false checks once per imported comment and takes longer. Default is true.) + * @var bool $prefill_existing_terms Should we prefill `term_exists` calls? (True prefills and uses more memory, false checks once per imported term and takes longer. Default is true.) + * @var bool $update_attachment_guids Should attachment GUIDs be updated to the new URL? (True updates the GUID, which keeps compatibility with v1, false doesn't update, and allows deduplication and reimporting. Default is false.) + * @var bool $fetch_attachments Fetch attachments from the remote server. (True fetches and creates attachment posts, false skips attachments. Default is false.) + * @var bool $aggressive_url_search Should we search/replace for URLs aggressively? (True searches all posts' content for old URLs and replaces, false checks for `` only. Default is false.) + * @var int $default_author User ID to use if author is missing or invalid. (Default is null, which leaves posts unassigned.) + * } + */ + public function __construct( $options = array() ) { + // Initialize some important variables + $empty_types = array( + 'post' => array(), + 'comment' => array(), + 'term' => array(), + 'user' => array(), + ); + + $this->mapping = $empty_types; + $this->mapping['user_slug'] = array(); + $this->mapping['term_id'] = array(); + $this->requires_remapping = $empty_types; + $this->exists = $empty_types; + + $this->options = wp_parse_args( $options, array( + 'prefill_existing_posts' => true, + 'prefill_existing_comments' => true, + 'prefill_existing_terms' => true, + 'update_attachment_guids' => false, + 'fetch_attachments' => false, + 'aggressive_url_search' => false, + 'default_author' => null, + ) ); + } + + public function set_logger( $logger ) { + $this->logger = $logger; + } + + /** + * Get a stream reader for the file. + * + * @param string $file Path to the XML file. + * @return XMLReader|WP_Error Reader instance on success, error otherwise. + */ + protected function get_reader( $file ) { + // Avoid loading external entities for security + $old_value = null; + if ( function_exists( 'libxml_disable_entity_loader' ) ) { + // $old_value = libxml_disable_entity_loader( true ); + } + + $reader = new \XMLReader(); + $status = $reader->open( $file ); + + if ( ! is_null( $old_value ) ) { + // libxml_disable_entity_loader( $old_value ); + } + + if ( ! $status ) { + return new \WP_Error( 'wxr_importer.cannot_parse', __( 'Could not open the file for parsing', 'wordpress-importer' ) ); + } + + return $reader; + } + + /** + * The main controller for the actual import stage. + * + * @param string $file Path to the WXR file for importing + */ + public function get_preliminary_information( $file ) { + // Let's run the actual importer now, woot + $reader = $this->get_reader( $file ); + if ( is_wp_error( $reader ) ) { + return $reader; + } + + // Set the version to compatibility mode first + $this->version = '1.0'; + + // Start parsing! + $data = new WXRImportInfo(); + while ( $reader->read() ) { + // Only deal with element opens + if ( $reader->nodeType !== \XMLReader::ELEMENT ) { + continue; + } + + switch ( $reader->name ) { + case 'wp:wxr_version': + // Upgrade to the correct version + $this->version = $reader->readString(); + + if ( version_compare( $this->version, self::MAX_WXR_VERSION, '>' ) ) { + $this->logger->warning( sprintf( + __( 'This WXR file (version %s) is newer than the importer (version %s) and may not be supported. Please consider updating.', 'wordpress-importer' ), + $this->version, + self::MAX_WXR_VERSION + ) ); + } + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'generator': + $data->generator = $reader->readString(); + $reader->next(); + break; + + case 'title': + $data->title = $reader->readString(); + $reader->next(); + break; + + case 'wp:base_site_url': + $data->siteurl = $reader->readString(); + $reader->next(); + break; + + case 'wp:base_blog_url': + $data->home = $reader->readString(); + $reader->next(); + break; + + case 'wp:author': + $node = $reader->expand(); + + $parsed = $this->parse_author_node( $node ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + $data->users[] = $parsed; + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'item': + $node = $reader->expand(); + $parsed = $this->parse_post_node( $node ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + if ( $parsed['data']['post_type'] === 'attachment' ) { + $data->media_count++; + } else { + $data->post_count++; + } + $data->comment_count += count( $parsed['comments'] ); + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'wp:category': + case 'wp:tag': + case 'wp:term': + $data->term_count++; + + // Handled everything in this node, move on to the next + $reader->next(); + break; + } + } + + $data->version = $this->version; + + return $data; + } + + /** + * The main controller for the actual import stage. + * + * @param string $file Path to the WXR file for importing + */ + public function parse_authors( $file ) { + // Let's run the actual importer now, woot + $reader = $this->get_reader( $file ); + if ( is_wp_error( $reader ) ) { + return $reader; + } + + // Set the version to compatibility mode first + $this->version = '1.0'; + + // Start parsing! + $authors = array(); + while ( $reader->read() ) { + // Only deal with element opens + if ( $reader->nodeType !== \XMLReader::ELEMENT ) { + continue; + } + + switch ( $reader->name ) { + case 'wp:wxr_version': + // Upgrade to the correct version + $this->version = $reader->readString(); + + if ( version_compare( $this->version, self::MAX_WXR_VERSION, '>' ) ) { + $this->logger->warning( sprintf( + __( 'This WXR file (version %s) is newer than the importer (version %s) and may not be supported. Please consider updating.', 'wordpress-importer' ), + $this->version, + self::MAX_WXR_VERSION + ) ); + } + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'wp:author': + $node = $reader->expand(); + + $parsed = $this->parse_author_node( $node ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + $authors[] = $parsed; + + // Handled everything in this node, move on to the next + $reader->next(); + break; + } + } + + return $authors; + } + + /** + * The main controller for the actual import stage. + * + * @param string $file Path to the WXR file for importing + */ + public function import( $file ) { + add_filter( 'import_post_meta_key', array( $this, 'is_valid_meta_key' ) ); + add_filter( 'http_request_timeout', array( &$this, 'bump_request_timeout' ) ); + + $result = $this->import_start( $file ); + if ( is_wp_error( $result ) ) { + return $result; + } + + // Let's run the actual importer now, woot + $reader = $this->get_reader( $file ); + if ( is_wp_error( $reader ) ) { + return $reader; + } + + // Set the version to compatibility mode first + $this->version = '1.0'; + + // Reset other variables + $this->base_url = ''; + + // Start parsing! + while ( $reader->read() ) { + // Only deal with element opens + if ( $reader->nodeType !== \XMLReader::ELEMENT ) { + continue; + } + + switch ( $reader->name ) { + case 'wp:wxr_version': + // Upgrade to the correct version + $this->version = $reader->readString(); + + if ( version_compare( $this->version, self::MAX_WXR_VERSION, '>' ) ) { + $this->logger->warning( sprintf( + __( 'This WXR file (version %s) is newer than the importer (version %s) and may not be supported. Please consider updating.', 'wordpress-importer' ), + $this->version, + self::MAX_WXR_VERSION + ) ); + } + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'wp:base_site_url': + $this->base_url = $reader->readString(); + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'item': + $node = $reader->expand(); + $parsed = $this->parse_post_node( $node ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + $this->process_post( $parsed['data'], $parsed['meta'], $parsed['comments'], $parsed['terms'] ); + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'wp:author': + $node = $reader->expand(); + + $parsed = $this->parse_author_node( $node ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + $status = $this->process_author( $parsed['data'], $parsed['meta'] ); + if ( is_wp_error( $status ) ) { + $this->log_error( $status ); + } + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'wp:category': + $node = $reader->expand(); + + $parsed = $this->parse_term_node( $node, 'category' ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + $status = $this->process_term( $parsed['data'], $parsed['meta'] ); + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'wp:tag': + $node = $reader->expand(); + + $parsed = $this->parse_term_node( $node, 'tag' ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + $status = $this->process_term( $parsed['data'], $parsed['meta'] ); + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + case 'wp:term': + $node = $reader->expand(); + + $parsed = $this->parse_term_node( $node ); + if ( is_wp_error( $parsed ) ) { + $this->log_error( $parsed ); + + // Skip the rest of this post + $reader->next(); + break; + } + + $status = $this->process_term( $parsed['data'], $parsed['meta'] ); + + // Handled everything in this node, move on to the next + $reader->next(); + break; + + default: + // Skip this node, probably handled by something already + break; + } + } + + // Now that we've done the main processing, do any required + // post-processing and remapping. + $this->post_process(); + + if ( $this->options['aggressive_url_search'] ) { + $this->replace_attachment_urls_in_content(); + } + + $this->remap_featured_images(); + + $this->import_end(); + } + + /** + * Log an error instance to the logger. + * + * @param WP_Error $error Error instance to log. + */ + protected function log_error( WP_Error $error ) { + $this->logger->warning( $error->get_error_message() ); + + // Log the data as debug info too + $data = $error->get_error_data(); + if ( ! empty( $data ) ) { + $this->logger->debug( var_export( $data, true ) ); + } + } + + /** + * Parses the WXR file and prepares us for the task of processing parsed data + * + * @param string $file Path to the WXR file for importing + */ + protected function import_start( $file ) { + if ( ! is_file( $file ) ) { + return new \WP_Error( 'wxr_importer.file_missing', __( 'The file does not exist, please try again.', 'wordpress-importer' ) ); + } + + // Suspend bunches of stuff in WP core + wp_defer_term_counting( true ); + wp_defer_comment_counting( true ); + wp_suspend_cache_invalidation( true ); + + // Prefill exists calls if told to + if ( $this->options['prefill_existing_posts'] ) { + $this->prefill_existing_posts(); + } + if ( $this->options['prefill_existing_comments'] ) { + $this->prefill_existing_comments(); + } + if ( $this->options['prefill_existing_terms'] ) { + $this->prefill_existing_terms(); + } + + /** + * Begin the import. + * + * Fires before the import process has begun. If you need to suspend + * caching or heavy processing on hooks, do so here. + */ + do_action( 'import_start' ); + } + + /** + * Performs post-import cleanup of files and the cache + */ + protected function import_end() { + // Re-enable stuff in core + wp_suspend_cache_invalidation( false ); + wp_cache_flush(); + foreach ( get_taxonomies() as $tax ) { + delete_option( "{$tax}_children" ); + _get_term_hierarchy( $tax ); + } + + wp_defer_term_counting( false ); + wp_defer_comment_counting( false ); + + /** + * Complete the import. + * + * Fires after the import process has finished. If you need to update + * your cache or re-enable processing, do so here. + */ + do_action( 'import_end' ); + } + + /** + * Set the user mapping. + * + * @param array $mapping List of map arrays (containing `old_slug`, `old_id`, `new_id`) + */ + public function set_user_mapping( $mapping ) { + foreach ( $mapping as $map ) { + if ( empty( $map['old_slug'] ) || empty( $map['old_id'] ) || empty( $map['new_id'] ) ) { + $this->logger->warning( __( 'Invalid author mapping', 'wordpress-importer' ) ); + $this->logger->debug( var_export( $map, true ) ); + continue; + } + + $old_slug = $map['old_slug']; + $old_id = $map['old_id']; + $new_id = $map['new_id']; + + $this->mapping['user'][ $old_id ] = $new_id; + $this->mapping['user_slug'][ $old_slug ] = $new_id; + } + } + + /** + * Set the user slug overrides. + * + * Allows overriding the slug in the import with a custom/renamed version. + * + * @param string[] $overrides Map of old slug to new slug. + */ + public function set_user_slug_overrides( $overrides ) { + foreach ( $overrides as $original => $renamed ) { + $this->user_slug_override[ $original ] = $renamed; + } + } + + /** + * Parse a post node into post data. + * + * @param DOMElement $node Parent node of post data (typically `item`). + * @return array|WP_Error Post data array on success, error otherwise. + */ + protected function parse_post_node( $node ) { + $data = array(); + $meta = array(); + $comments = array(); + $terms = array(); + + foreach ( $node->childNodes as $child ) { + // We only care about child elements + if ( $child->nodeType !== XML_ELEMENT_NODE ) { + continue; + } + + switch ( $child->tagName ) { + case 'wp:post_type': + $data['post_type'] = $child->textContent; + break; + + case 'title': + $data['post_title'] = $child->textContent; + break; + + case 'guid': + $data['guid'] = $child->textContent; + break; + + case 'dc:creator': + $data['post_author'] = $child->textContent; + break; + + case 'content:encoded': + $data['post_content'] = $child->textContent; + break; + + case 'excerpt:encoded': + $data['post_excerpt'] = $child->textContent; + break; + + case 'wp:post_id': + $data['post_id'] = $child->textContent; + break; + + case 'wp:post_date': + $data['post_date'] = $child->textContent; + break; + + case 'wp:post_date_gmt': + $data['post_date_gmt'] = $child->textContent; + break; + + case 'wp:comment_status': + $data['comment_status'] = $child->textContent; + break; + + case 'wp:ping_status': + $data['ping_status'] = $child->textContent; + break; + + case 'wp:post_name': + $data['post_name'] = $child->textContent; + break; + + case 'wp:status': + $data['post_status'] = $child->textContent; + + if ( $data['post_status'] === 'auto-draft' ) { + // Bail now + return new \WP_Error( + 'wxr_importer.post.cannot_import_draft', + __( 'Cannot import auto-draft posts' ), + $data + ); + } + break; + + case 'wp:post_parent': + $data['post_parent'] = $child->textContent; + break; + + case 'wp:menu_order': + $data['menu_order'] = $child->textContent; + break; + + case 'wp:post_password': + $data['post_password'] = $child->textContent; + break; + + case 'wp:is_sticky': + $data['is_sticky'] = $child->textContent; + break; + + case 'wp:attachment_url': + $data['attachment_url'] = $child->textContent; + break; + + case 'wp:postmeta': + $meta_item = $this->parse_meta_node( $child ); + if ( ! empty( $meta_item ) ) { + $meta[] = $meta_item; + } + break; + + case 'wp:comment': + $comment_item = $this->parse_comment_node( $child ); + if ( ! empty( $comment_item ) ) { + $comments[] = $comment_item; + } + break; + + case 'category': + $term_item = $this->parse_category_node( $child ); + if ( ! empty( $term_item ) ) { + $terms[] = $term_item; + } + break; + } + } + + return compact( 'data', 'meta', 'comments', 'terms' ); + } + + /** + * Create new posts based on import information + * + * Posts marked as having a parent which doesn't exist will become top level items. + * Doesn't create a new post if: the post type doesn't exist, the given post ID + * is already noted as imported or a post with the same title and date already exists. + * Note that new/updated terms, comments and meta are imported for the last of the above. + */ + protected function process_post( $data, $meta, $comments, $terms ) { + /** + * Pre-process post data. + * + * @param array $data Post data. (Return empty to skip.) + * @param array $meta Meta data. + * @param array $comments Comments on the post. + * @param array $terms Terms on the post. + */ + $data = apply_filters( 'wxr_importer.pre_process.post', $data, $meta, $comments, $terms ); + if ( empty( $data ) ) { + return false; + } + + $original_id = isset( $data['post_id'] ) ? (int) $data['post_id'] : 0; + $parent_id = isset( $data['post_parent'] ) ? (int) $data['post_parent'] : 0; + $author_id = isset( $data['post_author'] ) ? (int) $data['post_author'] : 0; + + // Have we already processed this? + if ( isset( $this->mapping['post'][ $original_id ] ) ) { + return; + } + + $post_type_object = get_post_type_object( $data['post_type'] ); + + // Is this type even valid? + if ( ! $post_type_object ) { + $this->logger->warning( sprintf( + __( 'Failed to import "%s": Invalid post type %s', 'wordpress-importer' ), + $data['post_title'], + $data['post_type'] + ) ); + return false; + } + + $post_exists = $this->post_exists( $data ); + if ( $post_exists ) { + $this->logger->info( sprintf( + __( '%s "%s" already exists.', 'wordpress-importer' ), + $post_type_object->labels->singular_name, + $data['post_title'] + ) ); + + /** + * Post processing already imported. + * + * @param array $data Raw data imported for the post. + */ + do_action( 'wxr_importer.process_already_imported.post', $data ); + + // Even though this post already exists, new comments might need importing + $this->process_comments( $comments, $original_id, $data, $post_exists ); + + return false; + } + + // Map the parent post, or mark it as one we need to fix + $requires_remapping = false; + if ( $parent_id ) { + if ( isset( $this->mapping['post'][ $parent_id ] ) ) { + $data['post_parent'] = $this->mapping['post'][ $parent_id ]; + } else { + $meta[] = array( 'key' => '_wxr_import_parent', 'value' => $parent_id ); + $requires_remapping = true; + + $data['post_parent'] = 0; + } + } + + // Map the author, or mark it as one we need to fix + $author = sanitize_user( $data['post_author'], true ); + if ( empty( $author ) ) { + // Missing or invalid author, use default if available. + $data['post_author'] = $this->options['default_author']; + } elseif ( isset( $this->mapping['user_slug'][ $author ] ) ) { + $data['post_author'] = $this->mapping['user_slug'][ $author ]; + } else { + $meta[] = array( 'key' => '_wxr_import_user_slug', 'value' => $author ); + $requires_remapping = true; + + $data['post_author'] = (int) get_current_user_id(); + } + + // Does the post look like it contains attachment images? + if ( preg_match( self::REGEX_HAS_ATTACHMENT_REFS, $data['post_content'] ) ) { + $meta[] = array( 'key' => '_wxr_import_has_attachment_refs', 'value' => true ); + $requires_remapping = true; + } + + // Whitelist to just the keys we allow + $postdata = array( + 'import_id' => $data['post_id'], + ); + $allowed = array( + 'post_author' => true, + 'post_date' => true, + 'post_date_gmt' => true, + 'post_content' => true, + 'post_excerpt' => true, + 'post_title' => true, + 'post_status' => true, + 'post_name' => true, + 'comment_status' => true, + 'ping_status' => true, + 'guid' => true, + 'post_parent' => true, + 'menu_order' => true, + 'post_type' => true, + 'post_password' => true, + ); + foreach ( $data as $key => $value ) { + if ( ! isset( $allowed[ $key ] ) ) { + continue; + } + + $postdata[ $key ] = $data[ $key ]; + } + + $postdata = apply_filters( 'wp_import_post_data_processed', $postdata, $data ); + + if ( 'attachment' === $postdata['post_type'] ) { + if ( ! $this->options['fetch_attachments'] ) { + $this->logger->notice( sprintf( + __( 'Skipping attachment "%s", fetching attachments disabled' ), + $data['post_title'] + ) ); + /** + * Post processing skipped. + * + * @param array $data Raw data imported for the post. + * @param array $meta Raw meta data, already processed by {@see process_post_meta}. + */ + do_action( 'wxr_importer.process_skipped.post', $data, $meta ); + return false; + } + $remote_url = ! empty( $data['attachment_url'] ) ? $data['attachment_url'] : $data['guid']; + $post_id = $this->process_attachment( $postdata, $meta, $remote_url ); + } else { + $post_id = wp_insert_post( $postdata, true ); + do_action( 'wp_import_insert_post', $post_id, $original_id, $postdata, $data ); + } + + if ( is_wp_error( $post_id ) ) { + $this->logger->error( sprintf( + __( 'Failed to import "%s" (%s)', 'wordpress-importer' ), + $data['post_title'], + $post_type_object->labels->singular_name + ) ); + $this->logger->debug( $post_id->get_error_message() ); + + /** + * Post processing failed. + * + * @param WP_Error $post_id Error object. + * @param array $data Raw data imported for the post. + * @param array $meta Raw meta data, already processed by {@see process_post_meta}. + * @param array $comments Raw comment data, already processed by {@see process_comments}. + * @param array $terms Raw term data, already processed. + */ + do_action( 'wxr_importer.process_failed.post', $post_id, $data, $meta, $comments, $terms ); + return false; + } + + // Ensure stickiness is handled correctly too + if ( $data['is_sticky'] === '1' ) { + stick_post( $post_id ); + } + + // map pre-import ID to local ID + $this->mapping['post'][ $original_id ] = (int) $post_id; + if ( $requires_remapping ) { + $this->requires_remapping['post'][ $post_id ] = true; + } + $this->mark_post_exists( $data, $post_id ); + + $this->logger->info( sprintf( + __( 'Imported "%s" (%s)', 'wordpress-importer' ), + $data['post_title'], + $post_type_object->labels->singular_name + ) ); + $this->logger->debug( sprintf( + __( 'Post %d remapped to %d', 'wordpress-importer' ), + $original_id, + $post_id + ) ); + + // Handle the terms too + $terms = apply_filters( 'wp_import_post_terms', $terms, $post_id, $data ); + + if ( ! empty( $terms ) ) { + $term_ids = array(); + foreach ( $terms as $term ) { + $taxonomy = $term['taxonomy']; + $key = sha1( $taxonomy . ':' . $term['slug'] ); + + if ( isset( $this->mapping['term'][ $key ] ) ) { + $term_ids[ $taxonomy ][] = (int) $this->mapping['term'][ $key ]; + } else { + $meta[] = array( 'key' => '_wxr_import_term', 'value' => $term ); + $requires_remapping = true; + } + } + + foreach ( $term_ids as $tax => $ids ) { + $tt_ids = wp_set_post_terms( $post_id, $ids, $tax ); + do_action( 'wp_import_set_post_terms', $tt_ids, $ids, $tax, $post_id, $data ); + } + } + + $this->process_comments( $comments, $post_id, $data ); + $this->process_post_meta( $meta, $post_id, $data ); + + if ( 'nav_menu_item' === $data['post_type'] ) { + $this->process_menu_item_meta( $post_id, $data, $meta ); + } + + /** + * Post processing completed. + * + * @param int $post_id New post ID. + * @param array $data Raw data imported for the post. + * @param array $meta Raw meta data, already processed by {@see process_post_meta}. + * @param array $comments Raw comment data, already processed by {@see process_comments}. + * @param array $terms Raw term data, already processed. + */ + do_action( 'wxr_importer.processed.post', $post_id, $data, $meta, $comments, $terms ); + } + + /** + * Attempt to create a new menu item from import data + * + * Fails for draft, orphaned menu items and those without an associated nav_menu + * or an invalid nav_menu term. If the post type or term object which the menu item + * represents doesn't exist then the menu item will not be imported (waits until the + * end of the import to retry again before discarding). + * + * @param array $item Menu item details from WXR file + */ + protected function process_menu_item_meta( $post_id, $data, $meta ) { + + $item_type = get_post_meta( $post_id, '_menu_item_type', true ); + $original_object_id = get_post_meta( $post_id, '_menu_item_object_id', true ); + $object_id = null; + + $this->logger->debug( sprintf( 'Processing menu item %s', $item_type ) ); + + $requires_remapping = false; + switch ( $item_type ) { + case 'taxonomy': + if ( isset( $this->mapping['term_id'][ $original_object_id ] ) ) { + $object_id = $this->mapping['term_id'][ $original_object_id ]; + } else { + add_post_meta( $post_id, '_wxr_import_menu_item', wp_slash( $original_object_id ) ); + $requires_remapping = true; + } + break; + + case 'post_type': + if ( isset( $this->mapping['post'][ $original_object_id ] ) ) { + $object_id = $this->mapping['post'][ $original_object_id ]; + } else { + add_post_meta( $post_id, '_wxr_import_menu_item', wp_slash( $original_object_id ) ); + $requires_remapping = true; + } + break; + + case 'custom': + // Custom refers to itself, wonderfully easy. + $object_id = $post_id; + break; + + default: + // associated object is missing or not imported yet, we'll retry later + $this->missing_menu_items[] = $item; + $this->logger->debug( 'Unknown menu item type' ); + break; + } + + if ( $requires_remapping ) { + $this->requires_remapping['post'][ $post_id ] = true; + } + + if ( empty( $object_id ) ) { + // Nothing needed here. + return; + } + + $this->logger->debug( sprintf( 'Menu item %d mapped to %d', $original_object_id, $object_id ) ); + update_post_meta( $post_id, '_menu_item_object_id', wp_slash( $object_id ) ); + } + + /** + * If fetching attachments is enabled then attempt to create a new attachment + * + * @param array $post Attachment post details from WXR + * @param string $url URL to fetch attachment from + * @return int|WP_Error Post ID on success, WP_Error otherwise + */ + protected function process_attachment( $post, $meta, $remote_url ) { + // try to use _wp_attached file for upload folder placement to ensure the same location as the export site + // e.g. location is 2003/05/image.jpg but the attachment post_date is 2010/09, see media_handle_upload() + $post['upload_date'] = $post['post_date']; + foreach ( $meta as $meta_item ) { + if ( $meta_item['key'] !== '_wp_attached_file' ) { + continue; + } + + if ( preg_match( '%^[0-9]{4}/[0-9]{2}%', $meta_item['value'], $matches ) ) { + $post['upload_date'] = $matches[0]; + } + break; + } + + // if the URL is absolute, but does not contain address, then upload it assuming base_site_url + if ( preg_match( '|^/[\w\W]+$|', $remote_url ) ) { + $remote_url = rtrim( $this->base_url, '/' ) . $remote_url; + } + + $upload = $this->fetch_remote_file( $remote_url, $post ); + if ( is_wp_error( $upload ) ) { + return $upload; + } + + $info = wp_check_filetype( $upload['file'] ); + if ( ! $info ) { + return new \WP_Error( 'attachment_processing_error', __( 'Invalid file type', 'wordpress-importer' ) ); + } + + $post['post_mime_type'] = $info['type']; + + // WP really likes using the GUID for display. Allow updating it. + // See https://core.trac.wordpress.org/ticket/33386 + if ( $this->options['update_attachment_guids'] ) { + $post['guid'] = $upload['url']; + } + + // as per wp-admin/includes/upload.php + $post_id = wp_insert_attachment( $post, $upload['file'] ); + if ( is_wp_error( $post_id ) ) { + return $post_id; + } + + $attachment_metadata = wp_generate_attachment_metadata( $post_id, $upload['file'] ); + wp_update_attachment_metadata( $post_id, $attachment_metadata ); + + // Map this image URL later if we need to + $this->url_remap[ $remote_url ] = $upload['url']; + + // If we have a HTTPS URL, ensure the HTTP URL gets replaced too + if ( substr( $remote_url, 0, 8 ) === 'https://' ) { + $insecure_url = 'http' . substr( $remote_url, 5 ); + $this->url_remap[ $insecure_url ] = $upload['url']; + } + + if ( $this->options['aggressive_url_search'] ) { + // remap resized image URLs, works by stripping the extension and remapping the URL stub. + /*if ( preg_match( '!^image/!', $info['type'] ) ) { + $parts = pathinfo( $remote_url ); + $name = basename( $parts['basename'], ".{$parts['extension']}" ); // PATHINFO_FILENAME in PHP 5.2 + + $parts_new = pathinfo( $upload['url'] ); + $name_new = basename( $parts_new['basename'], ".{$parts_new['extension']}" ); + + $this->url_remap[$parts['dirname'] . '/' . $name] = $parts_new['dirname'] . '/' . $name_new; + }*/ + } + + return $post_id; + } + + /** + * Parse a meta node into meta data. + * + * @param DOMElement $node Parent node of meta data (typically `wp:postmeta` or `wp:commentmeta`). + * @return array|null Meta data array on success, or null on error. + */ + protected function parse_meta_node( $node ) { + foreach ( $node->childNodes as $child ) { + // We only care about child elements + if ( $child->nodeType !== XML_ELEMENT_NODE ) { + continue; + } + + switch ( $child->tagName ) { + case 'wp:meta_key': + $key = $child->textContent; + break; + + case 'wp:meta_value': + $value = $child->textContent; + break; + } + } + + if ( empty( $key ) || empty( $value ) ) { + return null; + } + + return compact( 'key', 'value' ); + } + + /** + * Process and import post meta items. + * + * @param array $meta List of meta data arrays + * @param int $post_id Post to associate with + * @param array $post Post data + * @return int|WP_Error Number of meta items imported on success, error otherwise. + */ + protected function process_post_meta( $meta, $post_id, $post ) { + if ( empty( $meta ) ) { + return true; + } + + foreach ( $meta as $meta_item ) { + /** + * Pre-process post meta data. + * + * @param array $meta_item Meta data. (Return empty to skip.) + * @param int $post_id Post the meta is attached to. + */ + $meta_item = apply_filters( 'wxr_importer.pre_process.post_meta', $meta_item, $post_id ); + if ( empty( $meta_item ) ) { + return false; + } + + $key = apply_filters( 'import_post_meta_key', $meta_item['key'], $post_id, $post ); + $value = false; + + if ( '_edit_last' === $key ) { + $value = intval( $meta_item['value'] ); + if ( ! isset( $this->mapping['user'][ $value ] ) ) { + // Skip! + continue; + } + + $value = $this->mapping['user'][ $value ]; + } + + if ( $key ) { + // export gets meta straight from the DB so could have a serialized string + if ( ! $value ) { + $value = maybe_unserialize( $meta_item['value'] ); + } + + add_post_meta( $post_id, $key, $value ); + do_action( 'import_post_meta', $post_id, $key, $value ); + + // if the post has a featured image, take note of this in case of remap + if ( '_thumbnail_id' === $key ) { + $this->featured_images[ $post_id ] = (int) $value; + } + } + } + + return true; + } + + /** + * Parse a comment node into comment data. + * + * @param DOMElement $node Parent node of comment data (typically `wp:comment`). + * @return array Comment data array. + */ + protected function parse_comment_node( $node ) { + $data = array( + 'commentmeta' => array(), + ); + + foreach ( $node->childNodes as $child ) { + // We only care about child elements + if ( $child->nodeType !== XML_ELEMENT_NODE ) { + continue; + } + + switch ( $child->tagName ) { + case 'wp:comment_id': + $data['comment_id'] = $child->textContent; + break; + case 'wp:comment_author': + $data['comment_author'] = $child->textContent; + break; + + case 'wp:comment_author_email': + $data['comment_author_email'] = $child->textContent; + break; + + case 'wp:comment_author_IP': + $data['comment_author_IP'] = $child->textContent; + break; + + case 'wp:comment_author_url': + $data['comment_author_url'] = $child->textContent; + break; + + case 'wp:comment_user_id': + $data['comment_user_id'] = $child->textContent; + break; + + case 'wp:comment_date': + $data['comment_date'] = $child->textContent; + break; + + case 'wp:comment_date_gmt': + $data['comment_date_gmt'] = $child->textContent; + break; + + case 'wp:comment_content': + $data['comment_content'] = $child->textContent; + break; + + case 'wp:comment_approved': + $data['comment_approved'] = $child->textContent; + break; + + case 'wp:comment_type': + $data['comment_type'] = $child->textContent; + break; + + case 'wp:comment_parent': + $data['comment_parent'] = $child->textContent; + break; + + case 'wp:commentmeta': + $meta_item = $this->parse_meta_node( $child ); + if ( ! empty( $meta_item ) ) { + $data['commentmeta'][] = $meta_item; + } + break; + } + } + + return $data; + } + + /** + * Process and import comment data. + * + * @param array $comments List of comment data arrays. + * @param int $post_id Post to associate with. + * @param array $post Post data. + * @return int|WP_Error Number of comments imported on success, error otherwise. + */ + protected function process_comments( $comments, $post_id, $post, $post_exists = false ) { + + $comments = apply_filters( 'wp_import_post_comments', $comments, $post_id, $post ); + if ( empty( $comments ) ) { + return 0; + } + + $num_comments = 0; + + // Sort by ID to avoid excessive remapping later + usort( $comments, array( $this, 'sort_comments_by_id' ) ); + + foreach ( $comments as $key => $comment ) { + /** + * Pre-process comment data + * + * @param array $comment Comment data. (Return empty to skip.) + * @param int $post_id Post the comment is attached to. + */ + $comment = apply_filters( 'wxr_importer.pre_process.comment', $comment, $post_id ); + if ( empty( $comment ) ) { + return false; + } + + $original_id = isset( $comment['comment_id'] ) ? (int) $comment['comment_id'] : 0; + $parent_id = isset( $comment['comment_parent'] ) ? (int) $comment['comment_parent'] : 0; + $author_id = isset( $comment['comment_user_id'] ) ? (int) $comment['comment_user_id'] : 0; + + // if this is a new post we can skip the comment_exists() check + // TODO: Check comment_exists for performance + if ( $post_exists ) { + $existing = $this->comment_exists( $comment ); + if ( $existing ) { + + /** + * Comment processing already imported. + * + * @param array $comment Raw data imported for the comment. + */ + do_action( 'wxr_importer.process_already_imported.comment', $comment ); + + $this->mapping['comment'][ $original_id ] = $existing; + continue; + } + } + + // Remove meta from the main array + $meta = isset( $comment['commentmeta'] ) ? $comment['commentmeta'] : array(); + unset( $comment['commentmeta'] ); + + // Map the parent comment, or mark it as one we need to fix + $requires_remapping = false; + if ( $parent_id ) { + if ( isset( $this->mapping['comment'][ $parent_id ] ) ) { + $comment['comment_parent'] = $this->mapping['comment'][ $parent_id ]; + } else { + // Prepare for remapping later + $meta[] = array( 'key' => '_wxr_import_parent', 'value' => $parent_id ); + $requires_remapping = true; + + // Wipe the parent for now + $comment['comment_parent'] = 0; + } + } + + // Map the author, or mark it as one we need to fix + if ( $author_id ) { + if ( isset( $this->mapping['user'][ $author_id ] ) ) { + $comment['user_id'] = $this->mapping['user'][ $author_id ]; + } else { + // Prepare for remapping later + $meta[] = array( 'key' => '_wxr_import_user', 'value' => $author_id ); + $requires_remapping = true; + + // Wipe the user for now + $comment['user_id'] = 0; + } + } + + // Run standard core filters + $comment['comment_post_ID'] = $post_id; + $comment = wp_filter_comment( $comment ); + + // wp_insert_comment expects slashed data + $comment_id = wp_insert_comment( wp_slash( $comment ) ); + $this->mapping['comment'][ $original_id ] = $comment_id; + if ( $requires_remapping ) { + $this->requires_remapping['comment'][ $comment_id ] = true; + } + $this->mark_comment_exists( $comment, $comment_id ); + + /** + * Comment has been imported. + * + * @param int $comment_id New comment ID + * @param array $comment Comment inserted (`comment_id` item refers to the original ID) + * @param int $post_id Post parent of the comment + * @param array $post Post data + */ + do_action( 'wp_import_insert_comment', $comment_id, $comment, $post_id, $post ); + + // Process the meta items + foreach ( $meta as $meta_item ) { + $value = maybe_unserialize( $meta_item['value'] ); + add_comment_meta( $comment_id, wp_slash( $meta_item['key'] ), wp_slash( $value ) ); + } + + /** + * Post processing completed. + * + * @param int $post_id New post ID. + * @param array $comment Raw data imported for the comment. + * @param array $meta Raw meta data, already processed by {@see process_post_meta}. + * @param array $post_id Parent post ID. + */ + do_action( 'wxr_importer.processed.comment', $comment_id, $comment, $meta, $post_id ); + + $num_comments++; + } + + return $num_comments; + } + + protected function parse_category_node( $node ) { + $data = array( + // Default taxonomy to "category", since this is a `` tag + 'taxonomy' => 'category', + ); + $meta = array(); + + if ( $node->hasAttribute( 'domain' ) ) { + $data['taxonomy'] = $node->getAttribute( 'domain' ); + } + if ( $node->hasAttribute( 'nicename' ) ) { + $data['slug'] = $node->getAttribute( 'nicename' ); + } + + $data['name'] = $node->textContent; + + if ( empty( $data['slug'] ) ) { + return null; + } + + // Just for extra compatibility + if ( $data['taxonomy'] === 'tag' ) { + $data['taxonomy'] = 'post_tag'; + } + + return $data; + } + + /** + * Callback for `usort` to sort comments by ID + * + * @param array $a Comment data for the first comment + * @param array $b Comment data for the second comment + * @return int + */ + public static function sort_comments_by_id( $a, $b ) { + if ( empty( $a['comment_id'] ) ) { + return 1; + } + + if ( empty( $b['comment_id'] ) ) { + return -1; + } + + return $a['comment_id'] - $b['comment_id']; + } + + protected function parse_author_node( $node ) { + $data = array(); + $meta = array(); + foreach ( $node->childNodes as $child ) { + // We only care about child elements + if ( $child->nodeType !== XML_ELEMENT_NODE ) { + continue; + } + + switch ( $child->tagName ) { + case 'wp:author_login': + $data['user_login'] = $child->textContent; + break; + + case 'wp:author_id': + $data['ID'] = $child->textContent; + break; + + case 'wp:author_email': + $data['user_email'] = $child->textContent; + break; + + case 'wp:author_display_name': + $data['display_name'] = $child->textContent; + break; + + case 'wp:author_first_name': + $data['first_name'] = $child->textContent; + break; + + case 'wp:author_last_name': + $data['last_name'] = $child->textContent; + break; + } + } + + return compact( 'data', 'meta' ); + } + + protected function process_author( $data, $meta ) { + /** + * Pre-process user data. + * + * @param array $data User data. (Return empty to skip.) + * @param array $meta Meta data. + */ + $data = apply_filters( 'wxr_importer.pre_process.user', $data, $meta ); + if ( empty( $data ) ) { + return false; + } + + // Have we already handled this user? + $original_id = isset( $data['ID'] ) ? $data['ID'] : 0; + $original_slug = $data['user_login']; + + if ( isset( $this->mapping['user'][ $original_id ] ) ) { + $existing = $this->mapping['user'][ $original_id ]; + + // Note the slug mapping if we need to too + if ( ! isset( $this->mapping['user_slug'][ $original_slug ] ) ) { + $this->mapping['user_slug'][ $original_slug ] = $existing; + } + + return false; + } + + if ( isset( $this->mapping['user_slug'][ $original_slug ] ) ) { + $existing = $this->mapping['user_slug'][ $original_slug ]; + + // Ensure we note the mapping too + $this->mapping['user'][ $original_id ] = $existing; + + return false; + } + + // Allow overriding the user's slug + $login = $original_slug; + if ( isset( $this->user_slug_override[ $login ] ) ) { + $login = $this->user_slug_override[ $login ]; + } + + $userdata = array( + 'user_login' => sanitize_user( $login, true ), + 'user_pass' => wp_generate_password(), + ); + + $allowed = array( + 'user_email' => true, + 'display_name' => true, + 'first_name' => true, + 'last_name' => true, + ); + foreach ( $data as $key => $value ) { + if ( ! isset( $allowed[ $key ] ) ) { + continue; + } + + $userdata[ $key ] = $data[ $key ]; + } + + $user_id = wp_insert_user( wp_slash( $userdata ) ); + if ( is_wp_error( $user_id ) ) { + $this->logger->error( sprintf( + __( 'Failed to import user "%s"', 'wordpress-importer' ), + $userdata['user_login'] + ) ); + $this->logger->debug( $user_id->get_error_message() ); + + /** + * User processing failed. + * + * @param WP_Error $user_id Error object. + * @param array $userdata Raw data imported for the user. + */ + do_action( 'wxr_importer.process_failed.user', $user_id, $userdata ); + return false; + } + + if ( $original_id ) { + $this->mapping['user'][ $original_id ] = $user_id; + } + $this->mapping['user_slug'][ $original_slug ] = $user_id; + + $this->logger->info( sprintf( + __( 'Imported user "%s"', 'wordpress-importer' ), + $userdata['user_login'] + ) ); + $this->logger->debug( sprintf( + __( 'User %d remapped to %d', 'wordpress-importer' ), + $original_id, + $user_id + ) ); + + // TODO: Implement meta handling once WXR includes it + /** + * User processing completed. + * + * @param int $user_id New user ID. + * @param array $userdata Raw data imported for the user. + */ + do_action( 'wxr_importer.processed.user', $user_id, $userdata ); + } + + protected function parse_term_node( $node, $type = 'term' ) { + $data = array(); + $meta = array(); + + $tag_name = array( + 'id' => 'wp:term_id', + 'taxonomy' => 'wp:term_taxonomy', + 'slug' => 'wp:term_slug', + 'parent' => 'wp:term_parent', + 'name' => 'wp:term_name', + 'description' => 'wp:term_description', + ); + $taxonomy = null; + + // Special casing! + switch ( $type ) { + case 'category': + $tag_name['slug'] = 'wp:category_nicename'; + $tag_name['parent'] = 'wp:category_parent'; + $tag_name['name'] = 'wp:cat_name'; + $tag_name['description'] = 'wp:category_description'; + $tag_name['taxonomy'] = null; + + $data['taxonomy'] = 'category'; + break; + + case 'tag': + $tag_name['slug'] = 'wp:tag_slug'; + $tag_name['parent'] = null; + $tag_name['name'] = 'wp:tag_name'; + $tag_name['description'] = 'wp:tag_description'; + $tag_name['taxonomy'] = null; + + $data['taxonomy'] = 'post_tag'; + break; + } + + foreach ( $node->childNodes as $child ) { + // We only care about child elements + if ( $child->nodeType !== XML_ELEMENT_NODE ) { + continue; + } + + $key = array_search( $child->tagName, $tag_name ); + if ( $key ) { + $data[ $key ] = $child->textContent; + } + } + + if ( empty( $data['taxonomy'] ) ) { + return null; + } + + // Compatibility with WXR 1.0 + if ( $data['taxonomy'] === 'tag' ) { + $data['taxonomy'] = 'post_tag'; + } + + return compact( 'data', 'meta' ); + } + + protected function process_term( $data, $meta ) { + /** + * Pre-process term data. + * + * @param array $data Term data. (Return empty to skip.) + * @param array $meta Meta data. + */ + $data = apply_filters( 'wxr_importer.pre_process.term', $data, $meta ); + if ( empty( $data ) ) { + return false; + } + + $original_id = isset( $data['id'] ) ? (int) $data['id'] : 0; + $parent_id = isset( $data['parent'] ) ? (int) $data['parent'] : 0; + + $mapping_key = sha1( $data['taxonomy'] . ':' . $data['slug'] ); + $existing = $this->term_exists( $data ); + if ( $existing ) { + + /** + * Term processing already imported. + * + * @param array $data Raw data imported for the term. + */ + do_action( 'wxr_importer.process_already_imported.term', $data ); + + $this->mapping['term'][ $mapping_key ] = $existing; + $this->mapping['term_id'][ $original_id ] = $existing; + return false; + } + + // WP really likes to repeat itself in export files + if ( isset( $this->mapping['term'][ $mapping_key ] ) ) { + return false; + } + + $termdata = array(); + $allowed = array( + 'slug' => true, + 'description' => true, + ); + + // Map the parent comment, or mark it as one we need to fix + // TODO: add parent mapping and remapping + /*$requires_remapping = false; + if ( $parent_id ) { + if ( isset( $this->mapping['term'][ $parent_id ] ) ) { + $data['parent'] = $this->mapping['term'][ $parent_id ]; + } else { + // Prepare for remapping later + $meta[] = array( 'key' => '_wxr_import_parent', 'value' => $parent_id ); + $requires_remapping = true; + + // Wipe the parent for now + $data['parent'] = 0; + } + }*/ + + foreach ( $data as $key => $value ) { + if ( ! isset( $allowed[ $key ] ) ) { + continue; + } + + $termdata[ $key ] = $data[ $key ]; + } + + $result = wp_insert_term( $data['name'], $data['taxonomy'], $termdata ); + if ( is_wp_error( $result ) ) { + $this->logger->warning( sprintf( + __( 'Failed to import %s %s', 'wordpress-importer' ), + $data['taxonomy'], + $data['name'] + ) ); + $this->logger->debug( $result->get_error_message() ); + do_action( 'wp_import_insert_term_failed', $result, $data ); + + /** + * Term processing failed. + * + * @param WP_Error $result Error object. + * @param array $data Raw data imported for the term. + * @param array $meta Meta data supplied for the term. + */ + do_action( 'wxr_importer.process_failed.term', $result, $data, $meta ); + return false; + } + + $term_id = $result['term_id']; + + $this->mapping['term'][ $mapping_key ] = $term_id; + $this->mapping['term_id'][ $original_id ] = $term_id; + + $this->logger->info( sprintf( + __( 'Imported "%s" (%s)', 'wordpress-importer' ), + $data['name'], + $data['taxonomy'] + ) ); + $this->logger->debug( sprintf( + __( 'Term %d remapped to %d', 'wordpress-importer' ), + $original_id, + $term_id + ) ); + + do_action( 'wp_import_insert_term', $term_id, $data ); + + /** + * Term processing completed. + * + * @param int $term_id New term ID. + * @param array $data Raw data imported for the term. + */ + do_action( 'wxr_importer.processed.term', $term_id, $data ); + } + + /** + * Attempt to download a remote file attachment + * + * @param string $url URL of item to fetch + * @param array $post Attachment details + * @return array|WP_Error Local file location details on success, WP_Error otherwise + */ + protected function fetch_remote_file( $url, $post ) { + // extract the file name and extension from the url + $file_name = basename( $url ); + + // get placeholder file in the upload dir with a unique, sanitized filename + $upload = wp_upload_bits( $file_name, 0, '', $post['upload_date'] ); + if ( $upload['error'] ) { + return new \WP_Error( 'upload_dir_error', $upload['error'] ); + } + + // fetch the remote url and write it to the placeholder file + $response = wp_remote_get( $url, array( + 'stream' => true, + 'filename' => $upload['file'], + ) ); + + // request failed + if ( is_wp_error( $response ) ) { + unlink( $upload['file'] ); + return $response; + } + + $code = (int) wp_remote_retrieve_response_code( $response ); + + // make sure the fetch was successful + if ( $code !== 200 ) { + unlink( $upload['file'] ); + return new \WP_Error( + 'import_file_error', + sprintf( + __( 'Remote server returned %1$d %2$s for %3$s', 'wordpress-importer' ), + $code, + get_status_header_desc( $code ), + $url + ) + ); + } + + $filesize = filesize( $upload['file'] ); + $headers = wp_remote_retrieve_headers( $response ); + + if ( isset( $headers['content-length'] ) && $filesize !== (int) $headers['content-length'] ) { + unlink( $upload['file'] ); + return new \WP_Error( 'import_file_error', __( 'Remote file is incorrect size', 'wordpress-importer' ) ); + } + + if ( 0 === $filesize ) { + unlink( $upload['file'] ); + return new \WP_Error( 'import_file_error', __( 'Zero size file downloaded', 'wordpress-importer' ) ); + } + + $max_size = (int) $this->max_attachment_size(); + if ( ! empty( $max_size ) && $filesize > $max_size ) { + unlink( $upload['file'] ); + $message = sprintf( __( 'Remote file is too large, limit is %s', 'wordpress-importer' ), size_format( $max_size ) ); + return new \WP_Error( 'import_file_error', $message ); + } + + return $upload; + } + + protected function post_process() { + // Time to tackle any left-over bits + if ( ! empty( $this->requires_remapping['post'] ) ) { + $this->post_process_posts( $this->requires_remapping['post'] ); + } + if ( ! empty( $this->requires_remapping['comment'] ) ) { + $this->post_process_comments( $this->requires_remapping['comment'] ); + } + } + + protected function post_process_posts( $todo ) { + foreach ( $todo as $post_id => $_ ) { + $this->logger->debug( sprintf( + // Note: title intentionally not used to skip extra processing + // for when debug logging is off + __( 'Running post-processing for post %d', 'wordpress-importer' ), + $post_id + ) ); + + $data = array(); + + $parent_id = get_post_meta( $post_id, '_wxr_import_parent', true ); + if ( ! empty( $parent_id ) ) { + // Have we imported the parent now? + if ( isset( $this->mapping['post'][ $parent_id ] ) ) { + $data['post_parent'] = $this->mapping['post'][ $parent_id ]; + } else { + $this->logger->warning( sprintf( + __( 'Could not find the post parent for "%s" (post #%d)', 'wordpress-importer' ), + get_the_title( $post_id ), + $post_id + ) ); + $this->logger->debug( sprintf( + __( 'Post %d was imported with parent %d, but could not be found', 'wordpress-importer' ), + $post_id, + $parent_id + ) ); + } + } + + $author_slug = get_post_meta( $post_id, '_wxr_import_user_slug', true ); + if ( ! empty( $author_slug ) ) { + // Have we imported the user now? + if ( isset( $this->mapping['user_slug'][ $author_slug ] ) ) { + $data['post_author'] = $this->mapping['user_slug'][ $author_slug ]; + } else { + $this->logger->warning( sprintf( + __( 'Could not find the author for "%s" (post #%d)', 'wordpress-importer' ), + get_the_title( $post_id ), + $post_id + ) ); + $this->logger->debug( sprintf( + __( 'Post %d was imported with author "%s", but could not be found', 'wordpress-importer' ), + $post_id, + $author_slug + ) ); + } + } + + $has_attachments = get_post_meta( $post_id, '_wxr_import_has_attachment_refs', true ); + if ( ! empty( $has_attachments ) ) { + $post = get_post( $post_id ); + $content = $post->post_content; + + // Replace all the URLs we've got + $new_content = str_replace( array_keys( $this->url_remap ), $this->url_remap, $content ); + if ( $new_content !== $content ) { + $data['post_content'] = $new_content; + } + } + + if ( get_post_type( $post_id ) === 'nav_menu_item' ) { + $this->post_process_menu_item( $post_id ); + } + + // Do we have updates to make? + if ( empty( $data ) ) { + $this->logger->debug( sprintf( + __( 'Post %d was marked for post-processing, but none was required.', 'wordpress-importer' ), + $post_id + ) ); + continue; + } + + // Run the update + $data['ID'] = $post_id; + $result = wp_update_post( $data, true ); + if ( is_wp_error( $result ) ) { + $this->logger->warning( sprintf( + __( 'Could not update "%s" (post #%d) with mapped data', 'wordpress-importer' ), + get_the_title( $post_id ), + $post_id + ) ); + $this->logger->debug( $result->get_error_message() ); + continue; + } + + // Clear out our temporary meta keys + delete_post_meta( $post_id, '_wxr_import_parent' ); + delete_post_meta( $post_id, '_wxr_import_user_slug' ); + delete_post_meta( $post_id, '_wxr_import_has_attachment_refs' ); + } + } + + protected function post_process_menu_item( $post_id ) { + $menu_object_id = get_post_meta( $post_id, '_wxr_import_menu_item', true ); + if ( empty( $menu_object_id ) ) { + // No processing needed! + return; + } + + $menu_item_type = get_post_meta( $post_id, '_menu_item_type', true ); + switch ( $menu_item_type ) { + case 'taxonomy': + if ( isset( $this->mapping['term_id'][ $menu_object_id ] ) ) { + $menu_object = $this->mapping['term_id'][ $menu_object_id ]; + } + break; + + case 'post_type': + if ( isset( $this->mapping['post'][ $menu_object_id ] ) ) { + $menu_object = $this->mapping['post'][ $menu_object_id ]; + } + break; + + default: + // Cannot handle this. + return; + } + + if ( ! empty( $menu_object ) ) { + update_post_meta( $post_id, '_menu_item_object_id', wp_slash( $menu_object ) ); + } else { + $this->logger->warning( sprintf( + __( 'Could not find the menu object for "%s" (post #%d)', 'wordpress-importer' ), + get_the_title( $post_id ), + $post_id + ) ); + $this->logger->debug( sprintf( + __( 'Post %d was imported with object "%d" of type "%s", but could not be found', 'wordpress-importer' ), + $post_id, + $menu_object_id, + $menu_item_type + ) ); + } + + delete_post_meta( $post_id, '_wxr_import_menu_item' ); + } + + + protected function post_process_comments( $todo ) { + foreach ( $todo as $comment_id => $_ ) { + $data = array(); + + $parent_id = get_comment_meta( $comment_id, '_wxr_import_parent', true ); + if ( ! empty( $parent_id ) ) { + // Have we imported the parent now? + if ( isset( $this->mapping['comment'][ $parent_id ] ) ) { + $data['comment_parent'] = $this->mapping['comment'][ $parent_id ]; + } else { + $this->logger->warning( sprintf( + __( 'Could not find the comment parent for comment #%d', 'wordpress-importer' ), + $comment_id + ) ); + $this->logger->debug( sprintf( + __( 'Comment %d was imported with parent %d, but could not be found', 'wordpress-importer' ), + $comment_id, + $parent_id + ) ); + } + } + + $author_id = get_comment_meta( $comment_id, '_wxr_import_user', true ); + if ( ! empty( $author_id ) ) { + // Have we imported the user now? + if ( isset( $this->mapping['user'][ $author_id ] ) ) { + $data['user_id'] = $this->mapping['user'][ $author_id ]; + } else { + $this->logger->warning( sprintf( + __( 'Could not find the author for comment #%d', 'wordpress-importer' ), + $comment_id + ) ); + $this->logger->debug( sprintf( + __( 'Comment %d was imported with author %d, but could not be found', 'wordpress-importer' ), + $comment_id, + $author_id + ) ); + } + } + + // Do we have updates to make? + if ( empty( $data ) ) { + continue; + } + + // Run the update + $data['comment_ID'] = $comment_ID; + $result = wp_update_comment( wp_slash( $data ) ); + if ( empty( $result ) ) { + $this->logger->warning( sprintf( + __( 'Could not update comment #%d with mapped data', 'wordpress-importer' ), + $comment_id + ) ); + continue; + } + + // Clear out our temporary meta keys + delete_comment_meta( $comment_id, '_wxr_import_parent' ); + delete_comment_meta( $comment_id, '_wxr_import_user' ); + } + } + + /** + * Use stored mapping information to update old attachment URLs + */ + protected function replace_attachment_urls_in_content() { + global $wpdb; + // make sure we do the longest urls first, in case one is a substring of another + uksort( $this->url_remap, array( $this, 'cmpr_strlen' ) ); + + foreach ( $this->url_remap as $from_url => $to_url ) { + // remap urls in post_content + $query = $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, %s, %s)", $from_url, $to_url ); + $wpdb->query( $query ); + + // remap enclosure urls + $query = $wpdb->prepare( "UPDATE {$wpdb->postmeta} SET meta_value = REPLACE(meta_value, %s, %s) WHERE meta_key='enclosure'", $from_url, $to_url ); + $result = $wpdb->query( $query ); + } + } + + /** + * Update _thumbnail_id meta to new, imported attachment IDs + */ + function remap_featured_images() { + + if ( empty( $this->featured_images ) ) { + return; + } + + // cycle through posts that have a featured image + $this->logger->info( 'Starting remapping of featured images' ); + + foreach ( $this->featured_images as $post_id => $value ) { + if ( isset( $this->mapping['post'][ $value ] ) ) { + $new_id = $this->mapping['post'][ $value ]; + + // only update if there's a difference + if ( $new_id !== $value ) { + $this->logger->info( sprintf( 'Remapping featured image ID %d to new ID %d for post ID %d',$value, $new_id, $post_id ) ); + update_post_meta( $post_id, '_thumbnail_id', $new_id ); + } + } + } + } + + /** + * Decide if the given meta key maps to information we will want to import + * + * @param string $key The meta key to check + * @return string|bool The key if we do want to import, false if not + */ + public function is_valid_meta_key( $key ) { + // skip attachment metadata since we'll regenerate it from scratch + // skip _edit_lock as not relevant for import + if ( in_array( $key, array( '_wp_attached_file', '_wp_attachment_metadata', '_edit_lock' ) ) ) { + return false; + } + + return $key; + } + + /** + * Decide what the maximum file size for downloaded attachments is. + * Default is 0 (unlimited), can be filtered via import_attachment_size_limit + * + * @return int Maximum attachment file size to import + */ + protected function max_attachment_size() { + return apply_filters( 'import_attachment_size_limit', 0 ); + } + + /** + * Added to http_request_timeout filter to force timeout at 60 seconds during import + * + * @access protected + * @return int 60 + */ + function bump_request_timeout($val) { + return 60; + } + + // return the difference in length between two strings + function cmpr_strlen( $a, $b ) { + return strlen( $b ) - strlen( $a ); + } + + /** + * Prefill existing post data. + * + * This preloads all GUIDs into memory, allowing us to avoid hitting the + * database when we need to check for existence. With larger imports, this + * becomes prohibitively slow to perform SELECT queries on each. + * + * By preloading all this data into memory, it's a constant-time lookup in + * PHP instead. However, this does use a lot more memory, so for sites doing + * small imports onto a large site, it may be a better tradeoff to use + * on-the-fly checking instead. + */ + protected function prefill_existing_posts() { + global $wpdb; + $posts = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts}" ); + + foreach ( $posts as $item ) { + $this->exists['post'][ $item->guid ] = $item->ID; + } + } + + /** + * Does the post exist? + * + * @param array $data Post data to check against. + * @return int|bool Existing post ID if it exists, false otherwise. + */ + protected function post_exists( $data ) { + // Constant-time lookup if we prefilled + $exists_key = $data['guid']; + + $exists = null; + + if ( $this->options['prefill_existing_posts'] ) { + // Sites: fix for custom post types. The guids in the prefilled section are escaped, so these ones should be as well. + $exists_key = htmlentities( $exists_key ); + $exists = isset( $this->exists['post'][ $exists_key ] ) ? $this->exists['post'][ $exists_key ] : false; + } else if ( isset( $this->exists['post'][ $exists_key ] ) ) { + // No prefilling, but might have already handled it + $exists = $this->exists['post'][ $exists_key ]; + } else { + // Still nothing, try post_exists, and cache it + $exists = post_exists( $data['post_title'], $data['post_content'], $data['post_date'] ); + } + + /** + * Filter ID of the existing post corresponding to post currently importing. + * + * Return 0 to force the post to be imported. Filter the ID to be something else + * to override which existing post is mapped to the imported post. + * + * @see post_exists() + * + * @param int $post_exists Post ID, or 0 if post did not exist. + * @param array $data The post array to be inserted. + */ + $exists = apply_filters( 'wp_import_existing_post', $exists, $data ); + + $this->exists['post'][ $exists_key ] = $exists; + + return $exists; + } + + /** + * Mark the post as existing. + * + * @param array $data Post data to mark as existing. + * @param int $post_id Post ID. + */ + protected function mark_post_exists( $data, $post_id ) { + $exists_key = $data['guid']; + $this->exists['post'][ $exists_key ] = $post_id; + } + + /** + * Prefill existing comment data. + * + * @see self::prefill_existing_posts() for justification of why this exists. + */ + protected function prefill_existing_comments() { + global $wpdb; + $posts = $wpdb->get_results( "SELECT comment_ID, comment_author, comment_date FROM {$wpdb->comments}" ); + + foreach ( $posts as $item ) { + $exists_key = sha1( $item->comment_author . ':' . $item->comment_date ); + $this->exists['comment'][ $exists_key ] = $item->comment_ID; + } + } + + /** + * Does the comment exist? + * + * @param array $data Comment data to check against. + * @return int|bool Existing comment ID if it exists, false otherwise. + */ + protected function comment_exists( $data ) { + $exists_key = sha1( $data['comment_author'] . ':' . $data['comment_date'] ); + + // Constant-time lookup if we prefilled + if ( $this->options['prefill_existing_comments'] ) { + return isset( $this->exists['comment'][ $exists_key ] ) ? $this->exists['comment'][ $exists_key ] : false; + } + + // No prefilling, but might have already handled it + if ( isset( $this->exists['comment'][ $exists_key ] ) ) { + return $this->exists['comment'][ $exists_key ]; + } + + // Still nothing, try comment_exists, and cache it + $exists = comment_exists( $data['comment_author'], $data['comment_date'] ); + $this->exists['comment'][ $exists_key ] = $exists; + + return $exists; + } + + /** + * Mark the comment as existing. + * + * @param array $data Comment data to mark as existing. + * @param int $comment_id Comment ID. + */ + protected function mark_comment_exists( $data, $comment_id ) { + $exists_key = sha1( $data['comment_author'] . ':' . $data['comment_date'] ); + $this->exists['comment'][ $exists_key ] = $comment_id; + } + + /** + * Prefill existing term data. + * + * @see self::prefill_existing_posts() for justification of why this exists. + */ + protected function prefill_existing_terms() { + global $wpdb; + $query = "SELECT t.term_id, tt.taxonomy, t.slug FROM {$wpdb->terms} AS t"; + $query .= " JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id"; + $terms = $wpdb->get_results( $query ); + + foreach ( $terms as $item ) { + $exists_key = sha1( $item->taxonomy . ':' . $item->slug ); + $this->exists['term'][ $exists_key ] = $item->term_id; + } + } + + /** + * Does the term exist? + * + * @param array $data Term data to check against. + * @return int|bool Existing term ID if it exists, false otherwise. + */ + protected function term_exists( $data ) { + $exists_key = sha1( $data['taxonomy'] . ':' . $data['slug'] ); + + // Constant-time lookup if we prefilled + if ( $this->options['prefill_existing_terms'] ) { + return isset( $this->exists['term'][ $exists_key ] ) ? $this->exists['term'][ $exists_key ] : false; + } + + // No prefilling, but might have already handled it + if ( isset( $this->exists['term'][ $exists_key ] ) ) { + return $this->exists['term'][ $exists_key ]; + } + + // Still nothing, try comment_exists, and cache it + $exists = term_exists( $data['slug'], $data['taxonomy'] ); + if ( is_array( $exists ) ) { + $exists = $exists['term_id']; + } + + $this->exists['term'][ $exists_key ] = $exists; + + return $exists; + } + + /** + * Mark the term as existing. + * + * @param array $data Term data to mark as existing. + * @param int $term_id Term ID. + */ + protected function mark_term_exists( $data, $term_id ) { + $exists_key = sha1( $data['taxonomy'] . ':' . $data['slug'] ); + $this->exists['term'][ $exists_key ] = $term_id; + } +} diff --git a/wp-content/plugins/gp-premium/sites/sites.php b/wp-content/plugins/gp-premium/sites/sites.php new file mode 100644 index 0000000..415e2a7 --- /dev/null +++ b/wp-content/plugins/gp-premium/sites/sites.php @@ -0,0 +1,750 @@ +id ) { + return true; + } + + return false; +} + +add_filter( 'generate_dashboard_tabs', 'generate_sites_dashboard_tab' ); +/** + * Add the Sites tab to our Dashboard tabs. + * + * @since 1.6 + * + * @param array $tabs Existing tabs. + * @return array New tabs. + */ +function generate_sites_dashboard_tab( $tabs ) { + $tabs['Sites'] = array( + 'name' => __( 'Site Library', 'gp-premium' ), + 'url' => admin_url( 'themes.php?page=generatepress-site-library' ), + 'class' => generate_is_sites_dashboard() ? 'active' : '', + ); + + return $tabs; +} + +add_action( 'admin_menu', 'generate_site_library_register' ); +/** + * Register our Site Library page. + * + * @since 1.7 + */ +function generate_site_library_register() { + add_submenu_page( + 'themes.php', + __( 'Site Library', 'gp-premium' ), + __( 'Site Library', 'gp-premium' ), + 'manage_options', + 'generatepress-site-library', + 'generate_sites_container' + ); +} + +add_action( 'admin_head', 'generate_site_library_fix_menu' ); +/** + * Set our current menu item as the GeneratePress Dashboard. + * + * @since 1.7 + */ +function generate_site_library_fix_menu() { + global $parent_file, $submenu_file, $post_type; + + if ( generate_is_sites_dashboard() ) { + $parent_file = 'themes.php'; + $submenu_file = 'generate-options'; + } + + remove_submenu_page( 'themes.php', 'generatepress-site-library' ); +} + +add_action( 'admin_enqueue_scripts', 'generate_sites_do_enqueue_scripts' ); +/** + * Add our scripts for the site library. + * + * @since 1.8 + */ +function generate_sites_do_enqueue_scripts() { + if ( ! generate_is_sites_dashboard() ) { + return; + } + + $backup_data = get_option( '_generatepress_site_library_backup', array() ); + + wp_enqueue_script( + 'generate-sites-admin', + GENERATE_SITES_URL . 'assets/js/admin.js', + array( 'jquery', 'wp-util', 'updates', 'generate-sites-blazy' ), + GP_PREMIUM_VERSION, + true + ); + + wp_enqueue_script( + 'generate-sites-download', + GENERATE_SITES_URL . 'assets/js/download.js', + array( 'jquery', 'generate-sites-admin' ), + GP_PREMIUM_VERSION, + true + ); + + wp_enqueue_script( + 'generate-sites-blazy', + GENERATE_SITES_URL . 'assets/js/blazy.min.js', + array(), + GP_PREMIUM_VERSION, + true + ); + + wp_localize_script( + 'generate-sites-admin', + 'generate_sites_params', + array( + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'generate_sites_nonce' ), + 'importing_options' => __( 'Importing options', 'gp-premium' ), + 'backing_up_options' => __( 'Backing up options', 'gp-premium' ), + 'checking_demo_content' => __( 'Checking demo content', 'gp-premium' ), + 'downloading_content' => __( 'Downloading content', 'gp-premium' ), + 'importing_content' => __( 'Importing content', 'gp-premium' ), + 'importing_site_options' => __( 'Importing site options', 'gp-premium' ), + 'importing_widgets' => __( 'Importing widgets', 'gp-premium' ), + 'activating_plugins' => __( 'Activating plugins', 'gp-premium' ), + 'installing_plugins' => __( 'Installing plugins', 'gp-premium' ), + 'automatic_plugins' => __( 'Automatic', 'gp-premium' ), + 'manual_plugins' => __( 'Manual', 'gp-premium' ), + 'home_url' => home_url(), + 'restoreThemeOptions' => __( 'Restoring theme options', 'gp-premium' ), + 'restoreSiteOptions' => __( 'Restoring site options', 'gp-premium' ), + 'restoreContent' => __( 'Removing imported content', 'gp-premium' ), + 'restorePlugins' => __( 'Deactivating imported plugins', 'gp-premium' ), + 'restoreWidgets' => __( 'Restoring widgets', 'gp-premium' ), + 'restoreCSS' => __( 'Restoring CSS', 'gp-premium' ), + 'cleanUp' => __( 'Cleaning up', 'gp-premium' ), + 'hasContentBackup' => ! empty( $backup_data['content'] ), + 'confirmRemoval' => __( 'This process makes changes to your database. If you have existing data, be sure to create a backup as a precaution.', 'gp-premium' ), + ) + ); + + wp_enqueue_style( + 'generate-sites-admin', + GENERATE_SITES_URL . 'assets/css/admin.css', + array(), + GP_PREMIUM_VERSION + ); + + wp_enqueue_style( + 'generate-premium-dashboard', + plugin_dir_url( dirname(__FILE__) ) . 'inc/assets/dashboard.css', + array(), + GP_PREMIUM_VERSION + ); +} + +add_filter( 'admin_body_class', 'generate_sites_do_admin_body_classes' ); +/** + * Add a body class while in the Site Library. + * + * @since 1.8 + * + * @param array Current body classes. + * @return array Existing and our new body classes + */ +function generate_sites_do_admin_body_classes( $classes ) { + if ( generate_is_sites_dashboard() ) { + $classes .= ' generate-sites'; + } + + return $classes; +} + +add_action( 'generate_inside_site_library_container', 'generate_sites_add_tabs_wrapper_open', 4 ); +/** + * Add an opening wrapper element for our Dashboard tabs and page builder links. + * + * @since 1.8 + */ +function generate_sites_add_tabs_wrapper_open() { + echo '
        '; +} + +/** + * Adds our Site dashboard container. + * + * @since 1.6 + */ +function generate_sites_container() { + ?> +
        +
        +
        +
        + +
        + + +
        +
        +
        + '; + + if ( ! empty( $page_builders ) ) : ?> +
        + +
        + +
        +
        + +
        + +
        + +
        +
        + + +
        + +
        + + + + +
        +

        + +
        +

        +

        +
        + +
        + + + + +
        +
        + +
        + +
        + + + %2$s +
        ', + wp_nonce_url( admin_url( 'themes.php?page=generatepress-site-library' ), 'refresh_sites', 'refresh_sites_nonce' ), + __( 'Refresh Sites', 'gp-premium' ) + ); + ?> +
        +
        + get_post_types( array( 'public' => true ) ), + 'showposts' => -1, + 'meta_query' => array( + array( + 'key' => '_generate-select-page-header', + 'compare' => 'EXISTS', + ) + ) + ); + + $posts = get_posts( $args ); + $new_values = array(); + + foreach ( $posts as $post ) { + $page_header_id = get_post_meta( $post->ID, '_generate-select-page-header', true ); + + if ( $page_header_id ) { + $new_values[$post->ID] = $page_header_id; + } + } + + return $new_values; +} + +/** + * Get our Element display locations. + * + * @since 1.7 + * + * @return array + */ +function generate_sites_export_elements_location() { + $args = array( + 'post_type' => 'gp_elements', + 'showposts' => -1, + ); + + $posts = get_posts( $args ); + $new_values = array(); + + foreach ( $posts as $post ) { + $display_conditions = get_post_meta( $post->ID, '_generate_element_display_conditions', true ); + + if ( $display_conditions ) { + $new_values[$post->ID] = $display_conditions; + } + } + + return $new_values; +} + +/** + * Get our Element display locations. + * + * @since 1.7 + * + * @return array + */ +function generate_sites_export_elements_exclusion() { + $args = array( + 'post_type' => 'gp_elements', + 'showposts' => -1, + ); + + $posts = get_posts( $args ); + $new_values = array(); + + foreach ( $posts as $post ) { + $display_conditions = get_post_meta( $post->ID, '_generate_element_exclude_conditions', true ); + + if ( $display_conditions ) { + $new_values[$post->ID] = $display_conditions; + } + } + + return $new_values; +} + +/** + * List out compatible theme modules Sites can activate. + * + * @since 1.6 + * + * @return array + */ +function generatepress_get_site_premium_modules() { + return array( + 'Backgrounds' => 'generate_package_backgrounds', + 'Blog' => 'generate_package_blog', + 'Colors' => 'generate_package_colors', + 'Copyright' => 'generate_package_copyright', + 'Elements' => 'generate_package_elements', + 'Disable Elements' => 'generate_package_disable_elements', + 'Hooks' => 'generate_package_hooks', + 'Menu Plus' => 'generate_package_menu_plus', + 'Page Header' => 'generate_package_page_header', + 'Secondary Nav' => 'generate_package_secondary_nav', + 'Sections' => 'generate_package_sections', + 'Spacing' => 'generate_package_spacing', + 'Typography' => 'generate_package_typography', + 'WooCommerce' => 'generate_package_woocommerce', + ); +} + +/** + * Don't allow Sites to modify these options. + * + * @since 1.6 + * + * @return array + */ +function generatepress_sites_disallowed_options() { + return array( + 'admin_email', + 'siteurl', + 'home', + 'blog_charset', + 'blog_public', + 'current_theme', + 'stylesheet', + 'template', + 'default_role', + 'mailserver_login', + 'mailserver_pass', + 'mailserver_port', + 'mailserver_url', + 'permalink_structure', + 'rewrite_rules', + 'users_can_register', + ); +} + +add_action( 'generate_export_items', 'generatepress_sites_add_export_checkbox' ); +/** + * Add our GeneratePress Site export checkbox to the Export module. + * + * @since 1.7 + */ +function generatepress_sites_add_export_checkbox() { + ?> +
        + + + $key ) { + if ( 'activated' == get_option( $key ) ) { + $data['modules'][ $name ] = $key; + } + } + + // Site options + $data['site_options']['nav_menu_locations'] = get_theme_mod( 'nav_menu_locations' ); + $data['site_options']['custom_logo'] = wp_get_attachment_url( get_theme_mod( 'custom_logo' ) ); + $data['site_options']['show_on_front'] = get_option( 'show_on_front' ); + $data['site_options']['page_on_front'] = get_option( 'page_on_front' ); + $data['site_options']['page_for_posts'] = get_option( 'page_for_posts' ); + + // Page header + $data['site_options']['page_header_global_locations'] = get_option( 'generate_page_header_global_locations' ); + $data['site_options']['page_headers'] = generate_sites_export_page_headers(); + + // Elements + $data['site_options']['element_locations'] = generate_sites_export_elements_location(); + $data['site_options']['element_exclusions'] = generate_sites_export_elements_exclusion(); + + // Custom CSS. + if ( function_exists( 'wp_get_custom_css_post' ) ) { + $data['custom_css'] = wp_get_custom_css_post()->post_content; + } + + // WooCommerce. + if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) { + $data['site_options']['woocommerce_shop_page_id'] = get_option( 'woocommerce_shop_page_id' ); + $data['site_options']['woocommerce_cart_page_id'] = get_option( 'woocommerce_cart_page_id' ); + $data['site_options']['woocommerce_checkout_page_id'] = get_option( 'woocommerce_checkout_page_id' ); + $data['site_options']['woocommerce_myaccount_page_id'] = get_option( 'woocommerce_myaccount_page_id' ); + $data['site_options']['woocommerce_single_image_width'] = get_option( 'woocommerce_single_image_width' ); + $data['site_options']['woocommerce_thumbnail_image_width'] = get_option( 'woocommerce_thumbnail_image_width' ); + $data['site_options']['woocommerce_thumbnail_cropping'] = get_option( 'woocommerce_thumbnail_cropping' ); + $data['site_options']['woocommerce_shop_page_display'] = get_option( 'woocommerce_shop_page_display' ); + $data['site_options']['woocommerce_category_archive_display'] = get_option( 'woocommerce_category_archive_display' ); + $data['site_options']['woocommerce_default_catalog_orderby'] = get_option( 'woocommerce_default_catalog_orderby' ); + } + + // Elementor + if ( is_plugin_active( 'elementor/elementor.php' ) ) { + $data['site_options']['elementor_container_width'] = get_option( 'elementor_container_width' ); + $data['site_options']['elementor_cpt_support'] = get_option( 'elementor_cpt_support' ); + $data['site_options']['elementor_css_print_method'] = get_option( 'elementor_css_print_method' ); + $data['site_options']['elementor_default_generic_fonts'] = get_option( 'elementor_default_generic_fonts' ); + $data['site_options']['elementor_disable_color_schemes'] = get_option( 'elementor_disable_color_schemes' ); + $data['site_options']['elementor_disable_typography_schemes'] = get_option( 'elementor_disable_typography_schemes' ); + $data['site_options']['elementor_editor_break_lines'] = get_option( 'elementor_editor_break_lines' ); + $data['site_options']['elementor_exclude_user_roles'] = get_option( 'elementor_exclude_user_roles' ); + $data['site_options']['elementor_global_image_lightbox'] = get_option( 'elementor_global_image_lightbox' ); + $data['site_options']['elementor_page_title_selector'] = get_option( 'elementor_page_title_selector' ); + $data['site_options']['elementor_scheme_color'] = get_option( 'elementor_scheme_color' ); + $data['site_options']['elementor_scheme_color-picker'] = get_option( 'elementor_scheme_color-picker' ); + $data['site_options']['elementor_scheme_typography'] = get_option( 'elementor_scheme_typography' ); + $data['site_options']['elementor_space_between_widgets'] = get_option( 'elementor_space_between_widgets' ); + $data['site_options']['elementor_stretched_section_container'] = get_option( 'elementor_stretched_section_container' ); + } + + // Beaver Builder + if ( is_plugin_active( 'beaver-builder-lite-version/fl-builder.php' ) || is_plugin_active( 'bb-plugin/fl-builder.php' ) ) { + $data['site_options']['_fl_builder_enabled_icons'] = get_option( '_fl_builder_enabled_icons' ); + $data['site_options']['_fl_builder_enabled_modules'] = get_option( '_fl_builder_enabled_modules' ); + $data['site_options']['_fl_builder_post_types'] = get_option( '_fl_builder_post_types' ); + $data['site_options']['_fl_builder_color_presets'] = get_option( '_fl_builder_color_presets' ); + $data['site_options']['_fl_builder_services'] = get_option( '_fl_builder_services' ); + $data['site_options']['_fl_builder_settings'] = get_option( '_fl_builder_settings' ); + $data['site_options']['_fl_builder_user_access'] = get_option( '_fl_builder_user_access' ); + $data['site_options']['_fl_builder_enabled_templates'] = get_option( '_fl_builder_enabled_templates' ); + } + + // Menu Icons + if ( is_plugin_active( 'menu-icons/menu-icons.php' ) ) { + $data['site_options']['menu-icons'] = get_option( 'menu-icons' ); + } + + // Ninja Forms + if ( is_plugin_active( 'ninja-forms/ninja-forms.php' ) ) { + $data['site_options']['ninja_forms_settings'] = get_option( 'ninja_forms_settings' ); + } + + // Social Warfare + if ( is_plugin_active( 'social-warfare/social-warfare.php' ) ) { + $data['site_options']['socialWarfareOptions'] = get_option( 'socialWarfareOptions' ); + } + + // Elements Plus + if ( is_plugin_active( 'elements-plus/elements-plus.php' ) ) { + $data['site_options']['elements_plus_settings'] = get_option( 'elements_plus_settings' ); + } + + // Ank Google Map + if ( is_plugin_active( 'ank-google-map/ank-google-map.php' ) ) { + $data['site_options']['ank_google_map'] = get_option( 'ank_google_map' ); + } + + // GP Social Share + if ( is_plugin_active( 'gp-social-share-svg/gp-social-share.php' ) ) { + $data['site_options']['gp_social_settings'] = get_option( 'gp_social_settings' ); + } + + // Active plugins + $active_plugins = get_option( 'active_plugins' ); + $all_plugins = get_plugins(); + + $ignore = apply_filters( 'generate_sites_ignore_plugins', array( + 'gp-premium/gp-premium.php', + 'widget-importer-exporter/widget-importer-exporter.php' + ) ); + + foreach ( $ignore as $plugin ) { + unset( $all_plugins[ $plugin ] ); + } + + $activated_plugins = array(); + + foreach ( $active_plugins as $p ) { + if ( isset( $all_plugins[$p] ) ) { + $activated_plugins[$all_plugins[$p]['Name']] = $p; + } + } + + $data['plugins'] = $activated_plugins; + + return $data; + +} + +add_action( 'current_screen', 'generatepress_sites_init', 5 ); +/** + * Fetch our sites and trusted authors. Stores them in their own transients. + * We use current_screen instead of admin_init so we can check what admin page we're on. + * + * @since 1.6 + */ +function generatepress_sites_init() { + $screen = get_current_screen(); + + if ( 'appearance_page_generate-options' === $screen->id || 'appearance_page_generatepress-site-library' === $screen->id ) { + $remote_sites = get_transient( 'generatepress_sites' ); + $trusted_authors = get_transient( 'generatepress_sites_trusted_providers' ); + + if ( empty( $remote_sites ) ) { + $sites = array(); + + $data = wp_safe_remote_get( 'https://gpsites.co/wp-json/wp/v2/sites?per_page=100' ); + + if ( is_wp_error( $data ) ) { + set_transient( 'generatepress_sites', 'no results', 5 * MINUTE_IN_SECONDS ); + return; + } + + $data = json_decode( wp_remote_retrieve_body( $data ), true ); + + if ( ! is_array( $data ) ) { + set_transient( 'generatepress_sites', 'no results', 5 * MINUTE_IN_SECONDS ); + return; + } + + foreach( ( array ) $data as $site ) { + $sites[$site['name']] = array( + 'name' => $site['name'], + 'directory' => $site['directory'], + 'preview_url' => $site['preview_url'], + 'author_name' => $site['author_name'], + 'author_url' => $site['author_url'], + 'description' => $site['description'], + 'page_builder' => $site['page_builder'], + 'min_version' => $site['min_version'], + 'uploads_url' => $site['uploads_url'], + 'plugins' => $site['plugins'], + 'documentation' => $site['documentation'], + ); + } + + $sites = apply_filters( 'generate_add_sites', $sites ); + + set_transient( 'generatepress_sites', $sites, 24 * HOUR_IN_SECONDS ); + } + + if ( empty( $trusted_authors ) ) { + $trusted_authors = wp_safe_remote_get( 'https://gpsites.co/wp-json/sites/site' ); + + if ( is_wp_error( $trusted_authors ) || empty( $trusted_authors ) ) { + set_transient( 'generatepress_sites_trusted_providers', 'no results', 5 * MINUTE_IN_SECONDS ); + return; + } + + $trusted_authors = json_decode( wp_remote_retrieve_body( $trusted_authors ), true ); + + $authors = array(); + foreach ( ( array ) $trusted_authors['trusted_author'] as $author ) { + $authors[] = $author; + } + + set_transient( 'generatepress_sites_trusted_providers', $authors, 24 * HOUR_IN_SECONDS ); + } + } +} + +add_action( 'plugins_loaded', 'generatepress_sites_output' ); +/** + * Initiate our Sites once everything has loaded. + * We use current_screen instead of admin_init so we can check what admin page we're on. + * + * @since 1.6 + */ +function generatepress_sites_output() { + if ( ! class_exists( 'GeneratePress_Site' ) ) { + return; // Bail if we don't have the needed class. + } + + $sites = get_transient( 'generatepress_sites' ); + + if ( empty( $sites ) || ! is_array( $sites ) ) { + add_action( 'generate_inside_sites_container', 'generatepress_sites_no_results_error' ); + return; + } + + if ( apply_filters( 'generate_sites_randomize', true ) ) { + shuffle( $sites ); + } + + foreach( $sites as $site ) { + new GeneratePress_Site( $site ); + } +} + +/** + * Show an error message when no sites exist. + * + * @since 1.8.2 + */ +function generatepress_sites_no_results_error() { + printf( + '
        + %1$s %2$s +
        ', + __( 'No sites found.', 'gp-premium' ), + __( 'Why?', 'gp-premium' ), + 'https://docs.generatepress.com/article/site-library-unavailable/' + ); +} diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/content-spacing.php b/wp-content/plugins/gp-premium/spacing/functions/customizer/content-spacing.php new file mode 100644 index 0000000..2379a05 --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/content-spacing.php @@ -0,0 +1,229 @@ +add_section( + 'generate_spacing_content', + array( + 'title' => __( 'Content', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 10, + 'panel' => 'generate_spacing_panel' + ) +); + +// If we don't have a layout panel, use our old spacing section +if ( $wp_customize->get_panel( 'generate_layout_panel' ) ) { + $content_section = 'generate_layout_container'; +} else { + $content_section = 'generate_spacing_content'; +} + +// Take control of the container width control +// This control is handled by the free theme, but we take control of it here for consistency between control styles +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[container_width]', + array( + 'label' => __( 'Container Width', 'generatepress' ), + 'section' => 'generate_layout_container', + 'settings' => array( + 'desktop' => 'generate_settings[container_width]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 700, + 'max' => 2000, + 'step' => 5, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 0, + ) + ) +); + +// Separating space +$wp_customize->add_setting( + 'generate_spacing_settings[separator]', array( + 'default' => $defaults['separator'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[separator]', + array( + 'label' => __( 'Separating Space', 'gp-premium' ), + 'section' => $content_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[separator]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) +); + +// Content padding top +$wp_customize->add_setting( 'generate_spacing_settings[content_top]', + array( + 'default' => $defaults['content_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Content padding right +$wp_customize->add_setting( 'generate_spacing_settings[content_right]', + array( + 'default' => $defaults['content_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Content padding bottom +$wp_customize->add_setting( 'generate_spacing_settings[content_bottom]', + array( + 'default' => $defaults['content_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Content padding left +$wp_customize->add_setting( 'generate_spacing_settings[content_left]', + array( + 'default' => $defaults['content_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$content_padding_settings = array( + 'desktop_top' => 'generate_spacing_settings[content_top]', + 'desktop_right' => 'generate_spacing_settings[content_right]', + 'desktop_bottom' => 'generate_spacing_settings[content_bottom]', + 'desktop_left' => 'generate_spacing_settings[content_left]', +); + +// If mobile_content_top is set, the rest of them are too +// We have to check as these defaults are set in the theme +if ( isset( $defaults[ 'mobile_content_top' ] ) ) { + $content_padding_settings['mobile_top'] = 'generate_spacing_settings[mobile_content_top]'; + $content_padding_settings['mobile_right'] = 'generate_spacing_settings[mobile_content_right]'; + $content_padding_settings['mobile_bottom'] = 'generate_spacing_settings[mobile_content_bottom]'; + $content_padding_settings['mobile_left'] = 'generate_spacing_settings[mobile_content_left]'; + + // Mobile content padding top + $wp_customize->add_setting( 'generate_spacing_settings[mobile_content_top]', + array( + 'default' => $defaults['mobile_content_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + // Content padding right + $wp_customize->add_setting( 'generate_spacing_settings[mobile_content_right]', + array( + 'default' => $defaults['mobile_content_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + // Content padding bottom + $wp_customize->add_setting( 'generate_spacing_settings[mobile_content_bottom]', + array( + 'default' => $defaults['mobile_content_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + // Content padding left + $wp_customize->add_setting( 'generate_spacing_settings[mobile_content_left]', + array( + 'default' => $defaults['mobile_content_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); +} + +// Make use of the content padding settings +$wp_customize->add_control( + new GeneratePress_Spacing_Control( + $wp_customize, + 'content_spacing', + array( + 'type' => 'generatepress-spacing', + 'label' => esc_html__( 'Content Padding', 'gp-premium' ), + 'section' => $content_section, + 'settings' => $content_padding_settings, + 'element' => 'content', + 'priority' => 99 + ) + ) +); + +$wp_customize->add_setting( + 'generate_spacing_settings[content_element_separator]', array( + 'default' => $defaults['content_element_separator'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[content_element_separator]', + array( + 'label' => __( 'Content Separator', 'gp-premium' ), + 'sub_description' => __( 'The content separator controls the space between the featured image, title, content and entry meta.', 'gp-premium' ), + 'section' => $content_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[content_element_separator]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 10, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) +); diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/footer-spacing.php b/wp-content/plugins/gp-premium/spacing/functions/customizer/footer-spacing.php new file mode 100644 index 0000000..61f94ac --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/footer-spacing.php @@ -0,0 +1,190 @@ +add_section( + 'generate_spacing_footer', + array( + 'title' => __( 'Footer', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 20, + 'panel' => 'generate_spacing_panel' + ) +); + +// Use our layout panel if it exists +if ( $wp_customize->get_panel( 'generate_layout_panel' ) ) { + $footer_section = 'generate_layout_footer'; +} else { + $footer_section = 'generate_spacing_footer'; +} + +// Footer widget area padding top +$wp_customize->add_setting( 'generate_spacing_settings[footer_widget_container_top]', + array( + 'default' => $defaults['footer_widget_container_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer widget area padding right +$wp_customize->add_setting( 'generate_spacing_settings[footer_widget_container_right]', + array( + 'default' => $defaults['footer_widget_container_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer widget area padding bottom +$wp_customize->add_setting( 'generate_spacing_settings[footer_widget_container_bottom]', + array( + 'default' => $defaults['footer_widget_container_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer widget area padding left +$wp_customize->add_setting( 'generate_spacing_settings[footer_widget_container_left]', + array( + 'default' => $defaults['footer_widget_container_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer widget area padding top +$wp_customize->add_setting( 'generate_spacing_settings[mobile_footer_widget_container_top]', + array( + 'default' => $defaults['mobile_footer_widget_container_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer widget area padding right +$wp_customize->add_setting( 'generate_spacing_settings[mobile_footer_widget_container_right]', + array( + 'default' => $defaults['mobile_footer_widget_container_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer widget area padding bottom +$wp_customize->add_setting( 'generate_spacing_settings[mobile_footer_widget_container_bottom]', + array( + 'default' => $defaults['mobile_footer_widget_container_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer widget area padding left +$wp_customize->add_setting( 'generate_spacing_settings[mobile_footer_widget_container_left]', + array( + 'default' => $defaults['mobile_footer_widget_container_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Make use of the Footer widget area padding settings +$wp_customize->add_control( + new GeneratePress_Spacing_Control( + $wp_customize, + 'footer_widget_area_spacing', + array( + 'type' => 'generatepress-spacing', + 'label' => esc_html__( 'Footer Widget Area Padding', 'gp-premium' ), + 'section' => $footer_section, + 'settings' => array( + 'desktop_top' => 'generate_spacing_settings[footer_widget_container_top]', + 'desktop_right' => 'generate_spacing_settings[footer_widget_container_right]', + 'desktop_bottom' => 'generate_spacing_settings[footer_widget_container_bottom]', + 'desktop_left' => 'generate_spacing_settings[footer_widget_container_left]', + 'mobile_top' => 'generate_spacing_settings[mobile_footer_widget_container_top]', + 'mobile_right' => 'generate_spacing_settings[mobile_footer_widget_container_right]', + 'mobile_bottom' => 'generate_spacing_settings[mobile_footer_widget_container_bottom]', + 'mobile_left' => 'generate_spacing_settings[mobile_footer_widget_container_left]' + ), + 'element' => 'footer_widget_area', + 'priority' => 99 + ) + ) +); + +// Footer padding top +$wp_customize->add_setting( 'generate_spacing_settings[footer_top]', + array( + 'default' => $defaults['footer_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer padding right +$wp_customize->add_setting( 'generate_spacing_settings[footer_right]', + array( + 'default' => $defaults['footer_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer padding bottom +$wp_customize->add_setting( 'generate_spacing_settings[footer_bottom]', + array( + 'default' => $defaults['footer_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Footer padding left +$wp_customize->add_setting( 'generate_spacing_settings[footer_left]', + array( + 'default' => $defaults['footer_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Make use of the footer padding settings +$wp_customize->add_control( + new GeneratePress_Spacing_Control( + $wp_customize, + 'footer_spacing', + array( + 'type' => 'generatepress-spacing', + 'label' => esc_html__( 'Footer Padding', 'gp-premium' ), + 'section' => $footer_section, + 'settings' => array( + 'desktop_top' => 'generate_spacing_settings[footer_top]', + 'desktop_right' => 'generate_spacing_settings[footer_right]', + 'desktop_bottom' => 'generate_spacing_settings[footer_bottom]', + 'desktop_left' => 'generate_spacing_settings[footer_left]' + ), + 'element' => 'footer', + 'priority' => 105 + ) + ) +); diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/header-spacing.php b/wp-content/plugins/gp-premium/spacing/functions/customizer/header-spacing.php new file mode 100644 index 0000000..4dd2747 --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/header-spacing.php @@ -0,0 +1,122 @@ +add_section( + 'generate_spacing_header', + array( + 'title' => __( 'Header', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 5, + 'panel' => 'generate_spacing_panel' + ) +); + +// If we don't have a layout panel, use our old spacing section +$header_section = ( $wp_customize->get_panel( 'generate_layout_panel' ) ) ? 'generate_layout_header' : 'generate_spacing_header'; + +// Header top +$wp_customize->add_setting( 'generate_spacing_settings[header_top]', + array( + 'default' => $defaults['header_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Header right +$wp_customize->add_setting( 'generate_spacing_settings[header_right]', + array( + 'default' => $defaults['header_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Header bottom +$wp_customize->add_setting( 'generate_spacing_settings[header_bottom]', + array( + 'default' => $defaults['header_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Header left +$wp_customize->add_setting( 'generate_spacing_settings[header_left]', + array( + 'default' => $defaults['header_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_setting( 'generate_spacing_settings[mobile_header_top]', + array( + 'default' => $defaults['mobile_header_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Header right +$wp_customize->add_setting( 'generate_spacing_settings[mobile_header_right]', + array( + 'default' => $defaults['mobile_header_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Header bottom +$wp_customize->add_setting( 'generate_spacing_settings[mobile_header_bottom]', + array( + 'default' => $defaults['mobile_header_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Header left +$wp_customize->add_setting( 'generate_spacing_settings[mobile_header_left]', + array( + 'default' => $defaults['mobile_header_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Do something with our header controls +$wp_customize->add_control( + new GeneratePress_Spacing_Control( + $wp_customize, + 'header_spacing', + array( + 'type' => 'generatepress-spacing', + 'label' => esc_html__( 'Header Padding', 'gp-premium' ), + 'section' => $header_section, + 'settings' => array( + 'desktop_top' => 'generate_spacing_settings[header_top]', + 'desktop_right' => 'generate_spacing_settings[header_right]', + 'desktop_bottom' => 'generate_spacing_settings[header_bottom]', + 'desktop_left' => 'generate_spacing_settings[header_left]', + 'mobile_top' => 'generate_spacing_settings[mobile_header_top]', + 'mobile_right' => 'generate_spacing_settings[mobile_header_right]', + 'mobile_bottom' => 'generate_spacing_settings[mobile_header_bottom]', + 'mobile_left' => 'generate_spacing_settings[mobile_header_left]' + ), + 'element' => 'header', + ) + ) +); diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/js/customizer.js b/wp-content/plugins/gp-premium/spacing/functions/customizer/js/customizer.js new file mode 100644 index 0000000..131ed57 --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/js/customizer.js @@ -0,0 +1,551 @@ +function generate_spacing_live_update( name, id, selector, property, negative, divide, media, unit ) { + settings = typeof settings !== 'undefined' ? settings : 'generate_spacing_settings'; + wp.customize( settings + '[' + id + ']', function( value ) { + value.bind( function( newval ) { + negative = typeof negative !== 'undefined' ? negative : false; + media = typeof media !== 'undefined' ? media : ''; + divide = typeof divide !== 'undefined' ? divide : false; + unit = typeof unit !== 'undefined' ? unit : 'px'; + + // Get new value + newval = ( divide ) ? newval / 2 : newval; + + // Check if negative integer + negative = ( negative ) ? '-' : ''; + + var isTablet = ( 'tablet' == id.substring( 0, 6 ) ) ? true : false, + isMobile = ( 'mobile' == id.substring( 0, 6 ) ) ? true : false; + + if ( isTablet ) { + if ( '' == wp.customize(settings + '[' + id + ']').get() ) { + var desktopID = id.replace( 'tablet_', '' ); + newval = wp.customize(settings + '[' + desktopID + ']').get(); + } + } + + if ( isMobile ) { + if ( '' == wp.customize(settings + '[' + id + ']').get() ) { + var desktopID = id.replace( 'mobile_', '' ); + newval = wp.customize(settings + '[' + desktopID + ']').get(); + } + } + + // We're using a desktop value + if ( ! isTablet && ! isMobile ) { + + var tabletValue = ( typeof wp.customize(settings + '[tablet_' + id + ']') !== 'undefined' ) ? wp.customize(settings + '[tablet_' + id + ']').get() : '', + mobileValue = ( typeof wp.customize(settings + '[mobile_' + id + ']') !== 'undefined' ) ? wp.customize(settings + '[mobile_' + id + ']').get() : ''; + + // The tablet setting exists, mobile doesn't + if ( '' !== tabletValue && '' == mobileValue ) { + media = gp_spacing.desktop + ', ' + gp_spacing.mobile; + } + + // The tablet setting doesn't exist, mobile does + if ( '' == tabletValue && '' !== mobileValue ) { + media = gp_spacing.desktop + ', ' + gp_spacing.tablet; + } + + // The tablet setting doesn't exist, neither does mobile + if ( '' == tabletValue && '' == mobileValue ) { + media = gp_spacing.desktop + ', ' + gp_spacing.tablet + ', ' + gp_spacing.mobile; + } + + } + + // Check if media query + media_query = ( '' !== media ) ? 'media="' + media + '"' : ''; + + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#' + name ).not( ':last' ).remove(); + }, 50 ); + + jQuery('body').trigger('generate_spacing_updated'); + } ); + } ); +} + +/** + * Top bar padding + */ +generate_spacing_live_update( 'top_bar_top', 'top_bar_top', '.inside-top-bar', 'padding-top' ); +generate_spacing_live_update( 'top_bar_right', 'top_bar_right', '.inside-top-bar', 'padding-right' ); +generate_spacing_live_update( 'top_bar_bottom', 'top_bar_bottom', '.inside-top-bar', 'padding-bottom' ); +generate_spacing_live_update( 'top_bar_left', 'top_bar_left', '.inside-top-bar', 'padding-left' ); + +/** + * Header padding + */ +generate_spacing_live_update( 'header_top', 'header_top', '.inside-header', 'padding-top', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'header_right', 'header_right', '.inside-header', 'padding-right', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'header_bottom', 'header_bottom', '.inside-header', 'padding-bottom', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'header_left', 'header_left', '.inside-header', 'padding-left', false, false, gp_spacing.desktop ); + +generate_spacing_live_update( 'mobile_header_top', 'mobile_header_top', '.inside-header', 'padding-top', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_header_right', 'mobile_header_right', '.inside-header', 'padding-right', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_header_bottom', 'mobile_header_bottom', '.inside-header', 'padding-bottom', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_header_left', 'mobile_header_left', '.inside-header', 'padding-left', false, false, gp_spacing.mobile ); + +/** + * Content padding + */ +var content_areas = '.separate-containers .inside-article, \ + .separate-containers .comments-area, \ + .separate-containers .page-header, \ + .separate-containers .paging-navigation, \ + .one-container .site-content, \ + .inside-page-header, \ + .wp-block-group__inner-container'; + +generate_spacing_live_update( 'content_top', 'content_top', content_areas, 'padding-top', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'content_right', 'content_right', content_areas, 'padding-right', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'content_bottom', 'content_bottom', content_areas, 'padding-bottom', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'content_left', 'content_left', content_areas, 'padding-left', false, false, gp_spacing.desktop ); + +/* Mobile content padding */ +generate_spacing_live_update( 'mobile_content_top', 'mobile_content_top', content_areas, 'padding-top', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_content_right', 'mobile_content_right', content_areas, 'padding-right', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_content_bottom', 'mobile_content_bottom', content_areas, 'padding-bottom', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_content_left', 'mobile_content_left', content_areas, 'padding-left', false, false, gp_spacing.mobile ); + +generate_spacing_live_update( 'content-margin-right', 'content_right', '.one-container.right-sidebar .site-main,.one-container.both-right .site-main', 'margin-right' ); +generate_spacing_live_update( 'content-margin-left', 'content_left', '.one-container.left-sidebar .site-main,.one-container.both-left .site-main', 'margin-left' ); +generate_spacing_live_update( 'content-margin-right-both', 'content_right', '.one-container.both-sidebars .site-main', 'margin-right' ); +generate_spacing_live_update( 'content-margin-left-both', 'content_left', '.one-container.both-sidebars .site-main', 'margin-left' ); + +/* Content element separator */ + +generate_spacing_live_update( 'content_element_separator_top', 'content_element_separator', '.post-image, .page-content, .entry-content, .entry-summary, footer.entry-meta', 'margin-top', false, false, false, 'em' ); +generate_spacing_live_update( 'content_element_separator_bottom', 'content_element_separator', '.post-image-above-header .inside-article div.featured-image, .post-image-above-header .inside-article div.post-image', 'margin-bottom', false, false, false, 'em' ); + +/** + * Featured image padding + */ +var featured_image_no_padding_x = '.post-image-below-header.post-image-aligned-center .no-featured-image-padding .post-image, \ + .post-image-below-header.post-image-aligned-center .no-featured-image-padding .featured-image'; + +generate_spacing_live_update( 'featured_image_padding_right', 'content_right', featured_image_no_padding_x, 'margin-right', true, false, gp_spacing.desktop ); +generate_spacing_live_update( 'featured_image_padding_left', 'content_left', featured_image_no_padding_x, 'margin-left', true, false, gp_spacing.desktop ); +generate_spacing_live_update( 'mobile_featured_image_padding_right', 'mobile_content_right', featured_image_no_padding_x, 'margin-right', true, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_featured_image_padding_left', 'mobile_content_left', featured_image_no_padding_x, 'margin-left', true, false, gp_spacing.mobile ); + +var featured_image_no_padding_y = '.post-image-above-header.post-image-aligned-center .no-featured-image-padding .post-image, \ + .post-image-above-header.post-image-aligned-center .no-featured-image-padding .featured-image'; + +generate_spacing_live_update( 'featured_image_padding_top', 'content_top', featured_image_no_padding_y, 'margin-top', true, false, gp_spacing.desktop ); +generate_spacing_live_update( 'featured_image_padding_right', 'content_right', featured_image_no_padding_y, 'margin-right', true, false, gp_spacing.desktop ); +generate_spacing_live_update( 'featured_image_padding_left', 'content_left', featured_image_no_padding_y, 'margin-left', true, false, gp_spacing.desktop ); +generate_spacing_live_update( 'mobile_featured_image_padding_top', 'mobile_content_top', featured_image_no_padding_y, 'margin-top', true, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_featured_image_padding_right', 'mobile_content_right', featured_image_no_padding_y, 'margin-right', true, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_featured_image_padding_left', 'mobile_content_left', featured_image_no_padding_y, 'margin-left', true, false, gp_spacing.mobile ); + +/** + * Main navigation spacing + */ +var menu_items = '.main-navigation .main-nav ul li a,\ + .menu-toggle,\ + .main-navigation .mobile-bar-items a'; + +// Menu item width +generate_spacing_live_update( 'menu_item_padding_left', 'menu_item', menu_items + ', .slideout-navigation button.slideout-exit', 'padding-left', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'menu_item_padding_right', 'menu_item', menu_items + ', .slideout-navigation button.slideout-exit', 'padding-right', false, false, gp_spacing.desktop ); + +// Tablet menu item width +//generate_spacing_live_update( 'tablet_menu_item_padding_left', 'tablet_menu_item', menu_items, 'padding-left', false, false, gp_spacing.tablet ); +//generate_spacing_live_update( 'tablet_menu_item_padding_right', 'tablet_menu_item', menu_items, 'padding-right', false, false, gp_spacing.tablet ); + +// Mobile menu item width +generate_spacing_live_update( 'mobile_menu_item_padding_left', 'mobile_menu_item', '.menu-toggle,.main-navigation .mobile-bar-items a', 'padding-left', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_menu_item_padding_right', 'mobile_menu_item', '.menu-toggle,.main-navigation .mobile-bar-items a', 'padding-right', false, false, gp_spacing.mobile ); + +// Menu item height +generate_spacing_live_update( 'menu_item_height', 'menu_item_height', menu_items, 'line-height', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'navigation_logo_height', 'menu_item_height', '.main-navigation .navigation-logo img, .main-navigation .site-logo img', 'height', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'nav_title_height', 'menu_item_height', '.navigation-branding .main-title', 'line-height', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'mobile_header_logo_height', 'menu_item_height', '.mobile-header-navigation .mobile-header-logo img', 'height', false, false, gp_spacing.desktop ); + +//generate_spacing_live_update( 'tablet_menu_item_height', 'tablet_menu_item_height', menu_items, 'line-height', false, false, gp_spacing.tablet ); +//generate_spacing_live_update( 'tablet_navigation_logo_height', 'tablet_menu_item_height', '.main-navigation .navigation-logo img', 'height', false, false, gp_spacing.tablet ); +//generate_spacing_live_update( 'tablet_mobile_header_logo_height', 'tablet_menu_item_height', '.mobile-header-navigation .mobile-header-logo img', 'height', false, false, gp_spacing.tablet ); + +generate_spacing_live_update( 'mobile_menu_item_height', 'mobile_menu_item_height', menu_items, 'line-height', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_navigation_logo_height', 'mobile_menu_item_height', '.main-navigation .site-logo.navigation-logo img, .main-navigation .site-logo img, .main-navigation .navigation-branding img', 'height', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_nav_title_height', 'menu_item_height', '.navigation-branding .main-title', 'line-height', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_mobile_header_logo_height', 'mobile_menu_item_height', '.mobile-header-navigation .site-logo.mobile-header-logo img', 'height', false, false, gp_spacing.mobile ); + +// Off canvas menu item height +wp.customize( 'generate_spacing_settings[off_canvas_menu_item_height]', function( value ) { + value.bind( function( newval ) { + + if ( '' == newval ) { + newval = wp.customize('generate_spacing_settings[menu_item_height]').get(); + } + + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#off_canvas_menu_item_height' ).not( ':last' ).remove(); + }, 200 ); + + } ); +} ); + +/** + * Main sub-navigation spacing + */ +generate_spacing_live_update( 'sub_menu_item_height_top', 'sub_menu_item_height', '.main-navigation .main-nav ul ul li a', 'padding-top' ); +generate_spacing_live_update( 'sub_menu_item_height_right', 'menu_item', '.main-navigation .main-nav ul ul li a', 'padding-right', false, false, gp_spacing.desktop ); +//generate_spacing_live_update( 'tablet_sub_menu_item_height_right', 'tablet_menu_item', '.main-navigation .main-nav ul ul li a', 'padding-right', false, false, gp_spacing.tablet ); +generate_spacing_live_update( 'sub_menu_item_height_bottom', 'sub_menu_item_height', '.main-navigation .main-nav ul ul li a', 'padding-bottom' ); +generate_spacing_live_update( 'sub_menu_item_height_left', 'menu_item', '.main-navigation .main-nav ul ul li a', 'padding-left', false, false, gp_spacing.desktop ); +//generate_spacing_live_update( 'tablet_sub_menu_item_height_left', 'tablet_menu_item', '.main-navigation .main-nav ul ul li a', 'padding-left', false, false, gp_spacing.tablet ); +generate_spacing_live_update( 'sub_menu_item_offset', 'menu_item_height', '.main-navigation ul ul', 'top' ); + +/** + * Main navigation RTL arrow spacing + */ +generate_spacing_live_update( 'dropdown_menu_arrow', 'menu_item', '.menu-item-has-children .dropdown-menu-toggle', 'padding-right', false, false, gp_spacing.desktop ); +//generate_spacing_live_update( 'tablet_dropdown_menu_arrow', 'tablet_menu_item', '.menu-item-has-children .dropdown-menu-toggle', 'padding-right', false, false, gp_spacing.tablet ); + +/** + * Main sub-navigation arrow spacing + */ +generate_spacing_live_update( 'dropdown_submenu_arrow_top', 'sub_menu_item_height', '.menu-item-has-children ul .dropdown-menu-toggle', 'padding-top' ); +generate_spacing_live_update( 'dropdown_submenu_arrow_bottom', 'sub_menu_item_height', '.menu-item-has-children ul .dropdown-menu-toggle', 'padding-bottom' ); +generate_spacing_live_update( 'dropdown_submenu_arrow_margin', 'sub_menu_item_height', '.menu-item-has-children ul .dropdown-menu-toggle', 'margin-top', true ); + +/** + * Sub-Menu Width + */ +generate_spacing_live_update( 'sub_menu_width', 'sub_menu_width', '.main-navigation ul ul', 'width' ); + +/** + - * Sticky menu item height + - */ +wp.customize( 'generate_spacing_settings[sticky_menu_item_height]', function( value ) { + value.bind( function( newval ) { + + if ( '' == newval ) { + newval = wp.customize('generate_spacing_settings[menu_item_height]').get(); + } + + jQuery( 'head' ).append( '' ); + jQuery( 'head' ).append( '' ); + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#sticky_menu_item_height' ).not( ':last' ).remove(); + jQuery( 'style#sticky_menu_item_logo_height' ).not( ':last' ).remove(); + jQuery( 'style#sticky_menu_item_height_transition' ).remove(); + }, 200 ); + + } ); +} ); + +// Disable the transition while we resize +wp.customize( 'generate_spacing_settings[menu_item_height]', function( value ) { + value.bind( function( newval ) { + + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#menu_item_height_transition' ).remove(); + }, 200 ); + + } ); +} ); + +wp.customize( 'generate_spacing_settings[off_canvas_menu_item_height]', function( value ) { + value.bind( function( newval ) { + + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#off_canvas_menu_item_height_transition' ).remove(); + }, 200 ); + + } ); +} ); + +/** + * Widget padding + */ +generate_spacing_live_update( 'widget_top', 'widget_top', '.widget-area .widget, .one-container .widget-area .widget', 'padding-top', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'widget_right', 'widget_right', '.widget-area .widget, .one-container .widget-area .widget', 'padding-right', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'widget_bottom', 'widget_bottom', '.widget-area .widget, .one-container .widget-area .widget', 'padding-bottom', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'widget_left', 'widget_left', '.widget-area .widget, .one-container .widget-area .widget', 'padding-left', false, false, gp_spacing.desktop ); + +generate_spacing_live_update( 'mobile_widget_top', 'mobile_widget_top', '.widget-area .widget', 'padding-top', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_widget_right', 'mobile_widget_right', '.widget-area .widget', 'padding-right', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_widget_bottom', 'mobile_widget_bottom', '.widget-area .widget', 'padding-bottom', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_widget_left', 'mobile_widget_left', '.widget-area .widget', 'padding-left', false, false, gp_spacing.mobile ); + +/** + * Footer widget area + */ +generate_spacing_live_update( 'footer_widget_container_top', 'footer_widget_container_top', '.footer-widgets', 'padding-top', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'footer_widget_container_right', 'footer_widget_container_right', '.footer-widgets', 'padding-right', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'footer_widget_container_bottom', 'footer_widget_container_bottom', '.footer-widgets', 'padding-bottom', false, false, gp_spacing.desktop ); +generate_spacing_live_update( 'footer_widget_container_left', 'footer_widget_container_left', '.footer-widgets', 'padding-left', false, false, gp_spacing.desktop ); + +generate_spacing_live_update( 'mobile_footer_widget_container_top', 'mobile_footer_widget_container_top', '.footer-widgets', 'padding-top', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_footer_widget_container_right', 'mobile_footer_widget_container_right', '.footer-widgets', 'padding-right', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_footer_widget_container_bottom', 'mobile_footer_widget_container_bottom', '.footer-widgets', 'padding-bottom', false, false, gp_spacing.mobile ); +generate_spacing_live_update( 'mobile_footer_widget_container_left', 'mobile_footer_widget_container_left', '.footer-widgets', 'padding-left', false, false, gp_spacing.mobile ); + +/** + * Footer + */ +generate_spacing_live_update( 'footer_top', 'footer_top', '.site-info', 'padding-top' ); +generate_spacing_live_update( 'footer_right', 'footer_right', '.site-info', 'padding-right' ); +generate_spacing_live_update( 'footer_bottom', 'footer_bottom', '.site-info', 'padding-bottom' ); +generate_spacing_live_update( 'footer_left', 'footer_left', '.site-info', 'padding-left' ); + +/** + * Separator + */ + +/* Masonry */ +if ( jQuery( 'body' ).hasClass( 'masonry-enabled' ) ) { + generate_spacing_live_update( 'masonry_separator', 'separator', '.masonry-post .inside-article', 'margin-left' ); + generate_spacing_live_update( 'masonry_separator_bottom', 'separator', '.masonry-container > article', 'margin-bottom' ); + generate_spacing_live_update( 'masonry_separator_container', 'separator', '.masonry-container', 'margin-left', 'negative' ); + generate_spacing_live_update( 'masonry_separator_page_header_left', 'separator', '.masonry-enabled .page-header', 'margin-left' ); + generate_spacing_live_update( 'masonry_separator_page_header_bottom', 'separator', '.masonry-enabled .page-header', 'margin-bottom' ); + generate_spacing_live_update( 'masonry_separator_load_more', 'separator', '.separate-containers .site-main > .masonry-load-more', 'margin-bottom' ); +} + +/* Columns */ +if ( jQuery( 'body' ).hasClass( 'generate-columns-activated' ) ) { + generate_spacing_live_update( 'columns_bottom', 'separator', '.generate-columns', 'margin-bottom' ); + generate_spacing_live_update( 'columns_left', 'separator', '.generate-columns', 'padding-left' ); + generate_spacing_live_update( 'columns_container', 'separator', '.generate-columns-container', 'padding-left', 'negative' ); + generate_spacing_live_update( 'columns_page_header_bottom', 'separator', '.generate-columns-container .page-header', 'margin-bottom' ); + generate_spacing_live_update( 'columns_page_header_left', 'separator', '.generate-columns-container .page-header', 'margin-left' ); + generate_spacing_live_update( 'columns_pagination', 'separator', '.separate-containers .generate-columns-container > .paging-navigation', 'margin-left' ); +} + +/* Right sidebar */ +if ( jQuery( 'body' ).hasClass( 'right-sidebar' ) ) { + generate_spacing_live_update( 'right_sidebar_sepatator_top', 'separator', '.right-sidebar.separate-containers .site-main', 'margin-top' ); + generate_spacing_live_update( 'right_sidebar_sepatator_right', 'separator', '.right-sidebar.separate-containers .site-main', 'margin-right' ); + generate_spacing_live_update( 'right_sidebar_sepatator_bottom', 'separator', '.right-sidebar.separate-containers .site-main', 'margin-bottom' ); +} + +/* Left sidebar */ +if ( jQuery( 'body' ).hasClass( 'left-sidebar' ) ) { + generate_spacing_live_update( 'left_sidebar_sepatator_top', 'separator', '.left-sidebar.separate-containers .site-main', 'margin-top' ); + generate_spacing_live_update( 'left_sidebar_sepatator_left', 'separator', '.left-sidebar.separate-containers .site-main', 'margin-left' ); + generate_spacing_live_update( 'left_sidebar_sepatator_bottom', 'separator', '.left-sidebar.separate-containers .site-main', 'margin-bottom' ); +} + +/* Both sidebars */ +if ( jQuery( 'body' ).hasClass( 'both-sidebars' ) ) { + generate_spacing_live_update( 'both_sidebars_sepatator', 'separator', '.both-sidebars.separate-containers .site-main', 'margin' ); +} + +/* Both sidebars right */ +if ( jQuery( 'body' ).hasClass( 'both-right' ) ) { + generate_spacing_live_update( 'both_right_sidebar_sepatator_top', 'separator', '.both-right.separate-containers .site-main', 'margin-top' ); + generate_spacing_live_update( 'both_right_sidebar_sepatator_right', 'separator', '.both-right.separate-containers .site-main', 'margin-right' ); + generate_spacing_live_update( 'both_right_sidebar_sepatator_bottom', 'separator', '.both-right.separate-containers .site-main', 'margin-bottom' ); + generate_spacing_live_update( 'both_right_left_sidebar', 'separator', '.both-right.separate-containers .inside-left-sidebar', 'margin-right', false, true ); + generate_spacing_live_update( 'both_right_right_sidebar', 'separator', '.both-right.separate-containers .inside-right-sidebar', 'margin-left', false, true ); +} + +/* Both sidebars left */ +if ( jQuery( 'body' ).hasClass( 'both-left' ) ) { + generate_spacing_live_update( 'both_left_sidebar_sepatator_top', 'separator', '.both-left.separate-containers .site-main', 'margin-top' ); + generate_spacing_live_update( 'both_left_sidebar_sepatator_right', 'separator', '.both-left.separate-containers .site-main', 'margin-bottom' ); + generate_spacing_live_update( 'both_left_sidebar_sepatator_bottom', 'separator', '.both-left.separate-containers .site-main', 'margin-left' ); + generate_spacing_live_update( 'both_left_left_sidebar', 'separator', '.both-left.separate-containers .inside-left-sidebar', 'margin-right', false, true ); + generate_spacing_live_update( 'both_left_right_sidebar', 'separator', '.both-left.separate-containers .inside-right-sidebar', 'margin-left', false, true ); +} + +/* Main element margin */ +generate_spacing_live_update( 'site_main_separator_top', 'separator', '.separate-containers .site-main', 'margin-top' ); +generate_spacing_live_update( 'site_main_separator_bottom', 'separator', '.separate-containers .site-main', 'margin-bottom' ); + +/* Page header element */ +generate_spacing_live_update( 'page_header_separator_top', 'separator', + '.separate-containers .page-header-image, \ + .separate-containers .page-header-contained, \ + .separate-containers .page-header-image-single, \ + .separate-containers .page-header-content-single', 'margin-top' ); + +/* Top and bottom sidebar margin */ +generate_spacing_live_update( 'right_sidebar_separator_top', 'separator', '.separate-containers .inside-right-sidebar, .separate-containers .inside-left-sidebar', 'margin-top' ); +generate_spacing_live_update( 'right_sidebar_separator_bottom', 'separator', '.separate-containers .inside-right-sidebar, .separate-containers .inside-left-sidebar', 'margin-bottom' ); + +/* Element separators */ +generate_spacing_live_update( 'content_separator', 'separator', + '.separate-containers .widget, \ + .separate-containers .site-main > *, \ + .separate-containers .page-header, \ + .widget-area .main-navigation', 'margin-bottom' ); + +/** + * Right sidebar width + */ +wp.customize( 'generate_spacing_settings[right_sidebar_width]', function( value ) { + value.bind( function( newval ) { + var body = jQuery( 'body' ); + + if ( jQuery( '#right-sidebar' ).length ) { + + // Left sidebar width + var left_sidebar = ( jQuery( '#left-sidebar' ).length ) ? wp.customize.value('generate_spacing_settings[left_sidebar_width]')() : 0; + + // Right sidebar class + jQuery( "#right-sidebar" ).removeClass(function (index, css) { + return (css.match (/(^|\s)grid-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-grid-\S+/g) || []).join(' '); + }).addClass( 'grid-' + newval ).addClass( 'tablet-grid-' + newval ).addClass( 'grid-parent' ); + + // Content area class + jQuery( ".content-area" ).removeClass(function (index, css) { + return (css.match (/(^|\s)grid-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-grid-\S+/g) || []).join(' '); + }).addClass( 'grid-' + ( 100 - newval - left_sidebar ) ).addClass( 'tablet-grid-' + ( 100 - newval - left_sidebar ) ).addClass( 'grid-parent' ); + + if ( body.hasClass( 'both-sidebars' ) ) { + var content_width = ( 100 - newval - left_sidebar ); + jQuery( '#left-sidebar' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)push-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-push-\S+/g) || []).join(' '); + }).addClass( 'pull-' + ( content_width ) ).addClass( 'tablet-pull-' + ( content_width ) ); + } + + if ( body.hasClass( 'both-left' ) ) { + var total_sidebar_width = ( parseInt( left_sidebar ) + parseInt( newval ) ); + + jQuery( '#right-sidebar' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).addClass( 'pull-' + ( 100 - total_sidebar_width ) ).addClass( 'tablet-pull-' + ( 100 - total_sidebar_width ) ); + + jQuery( '#left-sidebar' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).addClass( 'pull-' + ( 100 - total_sidebar_width ) ).addClass( 'tablet-pull-' + ( 100 - total_sidebar_width ) ); + + jQuery( '.content-area' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)push-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-push-\S+/g) || []).join(' '); + }).addClass( 'push-' + ( total_sidebar_width ) ).addClass( 'tablet-push-' + ( total_sidebar_width ) ); + } + jQuery('body').trigger('generate_spacing_updated'); + } + } ); +} ); + +/** + * Left sidebar width + */ +wp.customize( 'generate_spacing_settings[left_sidebar_width]', function( value ) { + value.bind( function( newval ) { + var body = jQuery( 'body' ); + if ( jQuery( '#left-sidebar' ).length ) { + // Right sidebar width + var right_sidebar = ( jQuery( '#right-sidebar' ).length ) ? wp.customize.value('generate_spacing_settings[right_sidebar_width]')() : 0; + + // Right sidebar class + jQuery( "#left-sidebar" ).removeClass(function (index, css) { + return (css.match (/(^|\s)grid-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-grid-\S+/g) || []).join(' '); + }).addClass( 'grid-' + newval ).addClass( 'tablet-grid-' + newval ).addClass( 'grid-parent' ); + + // Content area class + jQuery( ".content-area" ).removeClass(function (index, css) { + return (css.match (/(^|\s)grid-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-grid-\S+/g) || []).join(' '); + }).addClass( 'grid-' + ( 100 - newval - right_sidebar ) ).addClass( 'tablet-grid-' + ( 100 - newval - right_sidebar ) ).addClass( 'grid-parent' ); + + if ( body.hasClass( 'left-sidebar' ) ) { + jQuery( '#left-sidebar' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)push-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-push-\S+/g) || []).join(' '); + }).addClass( 'pull-' + ( 100 - newval ) ).addClass( 'tablet-pull-' + ( 100 - newval ) ); + + jQuery( '.content-area' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)push-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-push-\S+/g) || []).join(' '); + }).addClass( 'push-' + newval ).addClass( 'tablet-push-' + newval ).addClass( 'grid-' + ( 100 - newval ) ).addClass( 'tablet-grid-' + ( 100 - newval ) ); + } + + if ( body.hasClass( 'both-sidebars' ) ) { + var content_width = ( 100 - newval - right_sidebar ); + jQuery( '#left-sidebar' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)push-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-push-\S+/g) || []).join(' '); + }).addClass( 'pull-' + ( content_width ) ).addClass( 'tablet-pull-' + ( content_width ) ); + + jQuery( '.content-area' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)push-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-push-\S+/g) || []).join(' '); + }).addClass( 'push-' + ( newval ) ).addClass( 'tablet-push-' + ( newval ) ); + } + + if ( body.hasClass( 'both-left' ) ) { + var content_width = ( 100 - newval - right_sidebar ); + var total_sidebar_width = ( parseInt( right_sidebar ) + parseInt( newval ) ); + + jQuery( '#right-sidebar' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).addClass( 'pull-' + ( 100 - total_sidebar_width ) ).addClass( 'tablet-pull-' + ( 100 - total_sidebar_width ) ); + + jQuery( '#left-sidebar' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).addClass( 'pull-' + ( 100 - total_sidebar_width ) ).addClass( 'tablet-pull-' + ( 100 - total_sidebar_width ) ); + + jQuery( '.content-area' ).removeClass(function (index, css) { + return (css.match (/(^|\s)pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-pull-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)push-\S+/g) || []).join(' '); + }).removeClass(function (index, css) { + return (css.match (/(^|\s)tablet-push-\S+/g) || []).join(' '); + }).addClass( 'push-' + ( total_sidebar_width ) ).addClass( 'tablet-push-' + ( total_sidebar_width ) ); + } + jQuery('body').trigger('generate_spacing_updated'); + } + } ); +} ); diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/navigation-spacing.php b/wp-content/plugins/gp-premium/spacing/functions/customizer/navigation-spacing.php new file mode 100644 index 0000000..54ec0e6 --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/navigation-spacing.php @@ -0,0 +1,269 @@ +add_section( + 'generate_spacing_navigation', + array( + 'title' => __( 'Primary Navigation', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 15, + 'panel' => 'generate_spacing_panel' + ) +); + +// If our new Layout section doesn't exist, use the old navigation section +$navigation_section = ( $wp_customize->get_panel( 'generate_layout_panel' ) ) ? 'generate_layout_navigation' : 'generate_spacing_navigation'; + +// Menu item width +$wp_customize->add_setting( + 'generate_spacing_settings[menu_item]', array( + 'default' => $defaults['menu_item'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_setting( + 'generate_spacing_settings[mobile_menu_item]', array( + 'default' => $defaults['mobile_menu_item'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[menu_item]', + array( + 'label' => __( 'Menu Item Width', 'gp-premium' ), + 'section' => $navigation_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[menu_item]', + 'mobile' => 'generate_spacing_settings[mobile_menu_item]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 220, + ) + ) +); + +// Menu item height +$wp_customize->add_setting( + 'generate_spacing_settings[menu_item_height]', array( + 'default' => $defaults['menu_item_height'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_setting( + 'generate_spacing_settings[mobile_menu_item_height]', array( + 'default' => $defaults['mobile_menu_item_height'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[menu_item_height]', + array( + 'label' => __( 'Menu Item Height', 'gp-premium' ), + 'section' => $navigation_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[menu_item_height]', + 'mobile' => 'generate_spacing_settings[mobile_menu_item_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 20, + 'max' => 150, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 20, + 'max' => 150, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 240, + ) + ) +); + +// Sub-menu item height +$wp_customize->add_setting( + 'generate_spacing_settings[sub_menu_item_height]', array( + 'default' => $defaults['sub_menu_item_height'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[sub_menu_item_height]', + array( + 'label' => __( 'Sub-Menu Item Height', 'gp-premium' ), + 'section' => $navigation_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[sub_menu_item_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 50, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 260, + ) + ) +); + +if ( isset( $defaults['sub_menu_width'] ) ) { + // Sub-menu item height + $wp_customize->add_setting( + 'generate_spacing_settings[sub_menu_width]', array( + 'default' => $defaults['sub_menu_width'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[sub_menu_width]', + array( + 'label' => __( 'Sub-Menu Width', 'gp-premium' ), + 'section' => $navigation_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[sub_menu_width]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 100, + 'max' => 500, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 265, + ) + ) + ); +} + +// Sticky menu height +$wp_customize->add_setting( + 'generate_spacing_settings[sticky_menu_item_height]', array( + 'default' => $defaults['sticky_menu_item_height'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[sticky_menu_item_height]', + array( + 'label' => __( 'Menu Item Height', 'gp-premium' ), + 'section' => 'menu_plus_sticky_menu', + 'settings' => array( + 'desktop' => 'generate_spacing_settings[sticky_menu_item_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 20, + 'max' => 150, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 150, + 'active_callback' => 'generate_sticky_navigation_activated', + ) + ) +); + +// Off canvas menu height +$wp_customize->add_setting( + 'generate_spacing_settings[off_canvas_menu_item_height]', array( + 'default' => $defaults['off_canvas_menu_item_height'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[off_canvas_menu_item_height]', + array( + 'label' => __( 'Menu Item Height', 'gp-premium' ), + 'section' => 'menu_plus_slideout_menu', + 'settings' => array( + 'desktop' => 'generate_spacing_settings[off_canvas_menu_item_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 20, + 'max' => 150, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 200, + 'active_callback' => 'generate_slideout_navigation_activated', + ) + ) +); diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/secondary-nav-spacing.php b/wp-content/plugins/gp-premium/spacing/functions/customizer/secondary-nav-spacing.php new file mode 100644 index 0000000..12398c8 --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/secondary-nav-spacing.php @@ -0,0 +1,147 @@ +get_section( 'secondary_nav_section' ) ) { + return; + } + + // Get our controls + require_once GP_LIBRARY_DIRECTORY . 'customizer-helpers.php'; + + // Get our defaults + $defaults = generate_secondary_nav_get_defaults(); + + // Remove our old label control if it exists + // It only would if the user is using an old Secondary Nav add-on version + if ( $wp_customize->get_control( 'generate_secondary_navigation_spacing_title' ) ) $wp_customize->remove_control( 'generate_secondary_navigation_spacing_title' ); + + // Menu item width + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_menu_item]', array( + 'default' => $defaults['secondary_menu_item'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_secondary_nav_settings[secondary_menu_item]', + array( + 'label' => __( 'Menu Item Width', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'settings' => array( + 'desktop' => 'generate_secondary_nav_settings[secondary_menu_item]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 220, + ) + ) + ); + + // Menu item height + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_menu_item_height]', array( + 'default' => $defaults['secondary_menu_item_height'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_secondary_nav_settings[secondary_menu_item_height]', + array( + 'label' => __( 'Menu Item Height', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'settings' => array( + 'desktop' => 'generate_secondary_nav_settings[secondary_menu_item_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 20, + 'max' => 150, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 240, + ) + ) + ); + + // Sub-menu height + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_sub_menu_item_height]', array( + 'default' => $defaults['secondary_sub_menu_item_height'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_secondary_nav_settings[secondary_sub_menu_item_height]', + array( + 'label' => __( 'Sub-Menu Item Height', 'gp-premium' ), + 'section' => 'secondary_nav_section', + 'settings' => array( + 'desktop' => 'generate_secondary_nav_settings[secondary_sub_menu_item_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 50, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 260, + ) + ) + ); + } +} diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/sidebar-spacing.php b/wp-content/plugins/gp-premium/spacing/functions/customizer/sidebar-spacing.php new file mode 100644 index 0000000..ac6845c --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/sidebar-spacing.php @@ -0,0 +1,196 @@ +add_section( + 'generate_spacing_sidebar', + array( + 'title' => __( 'Sidebars', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 15, + 'panel' => 'generate_spacing_panel' + ) +); + +// Add our controls to the Layout panel if it exists +// If not, use the old section +$widget_section = ( $wp_customize->get_panel( 'generate_layout_panel' ) ) ? 'generate_layout_sidebars' : 'generate_spacing_sidebar'; + +// Widget padding top +$wp_customize->add_setting( 'generate_spacing_settings[widget_top]', + array( + 'default' => $defaults['widget_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Widget padding right +$wp_customize->add_setting( 'generate_spacing_settings[widget_right]', + array( + 'default' => $defaults['widget_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Widget padding bottom +$wp_customize->add_setting( 'generate_spacing_settings[widget_bottom]', + array( + 'default' => $defaults['widget_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Widget padding left +$wp_customize->add_setting( 'generate_spacing_settings[widget_left]', + array( + 'default' => $defaults['widget_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Widget padding top +$wp_customize->add_setting( 'generate_spacing_settings[mobile_widget_top]', + array( + 'default' => $defaults['mobile_widget_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Widget padding right +$wp_customize->add_setting( 'generate_spacing_settings[mobile_widget_right]', + array( + 'default' => $defaults['mobile_widget_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Widget padding bottom +$wp_customize->add_setting( 'generate_spacing_settings[mobile_widget_bottom]', + array( + 'default' => $defaults['mobile_widget_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Widget padding left +$wp_customize->add_setting( 'generate_spacing_settings[mobile_widget_left]', + array( + 'default' => $defaults['mobile_widget_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +// Make use of the widget padding settings +$wp_customize->add_control( + new GeneratePress_Spacing_Control( + $wp_customize, + 'widget_spacing', + array( + 'type' => 'generatepress-spacing', + 'label' => esc_html__( 'Widget Padding', 'gp-premium' ), + 'section' => $widget_section, + 'settings' => array( + 'desktop_top' => 'generate_spacing_settings[widget_top]', + 'desktop_right' => 'generate_spacing_settings[widget_right]', + 'desktop_bottom' => 'generate_spacing_settings[widget_bottom]', + 'desktop_left' => 'generate_spacing_settings[widget_left]', + 'mobile_top' => 'generate_spacing_settings[mobile_widget_top]', + 'mobile_right' => 'generate_spacing_settings[mobile_widget_right]', + 'mobile_bottom' => 'generate_spacing_settings[mobile_widget_bottom]', + 'mobile_left' => 'generate_spacing_settings[mobile_widget_left]' + ), + 'element' => 'widget', + 'priority' => 99 + ) + ) +); + +// Left sidebar width +$wp_customize->add_setting( + 'generate_spacing_settings[left_sidebar_width]', array( + 'default' => $defaults['left_sidebar_width'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[left_sidebar_width]', + array( + 'label' => esc_html__( 'Left Sidebar Width', 'gp-premium' ), + 'section' => $widget_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[left_sidebar_width]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 15, + 'max' => 50, + 'step' => 5, + 'edit' => false, + 'unit' => '%', + ), + ), + 'priority' => 125, + ) + ) +); + +// Right sidebar width +$wp_customize->add_setting( + 'generate_spacing_settings[right_sidebar_width]', array( + 'default' => $defaults['right_sidebar_width'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) +); + +$wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_spacing_settings[right_sidebar_width]', + array( + 'label' => esc_html__( 'Right Sidebar Width', 'gp-premium' ), + 'section' => $widget_section, + 'settings' => array( + 'desktop' => 'generate_spacing_settings[right_sidebar_width]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 15, + 'max' => 50, + 'step' => 5, + 'edit' => false, + 'unit' => '%', + ), + ), + 'priority' => 125, + ) + ) +); diff --git a/wp-content/plugins/gp-premium/spacing/functions/customizer/top-bar-spacing.php b/wp-content/plugins/gp-premium/spacing/functions/customizer/top-bar-spacing.php new file mode 100644 index 0000000..84c9631 --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/customizer/top-bar-spacing.php @@ -0,0 +1,69 @@ +add_setting( 'generate_spacing_settings[top_bar_top]', + array( + 'default' => $defaults['top_bar_top'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + // Widget padding right + $wp_customize->add_setting( 'generate_spacing_settings[top_bar_right]', + array( + 'default' => $defaults['top_bar_right'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + // Widget padding bottom + $wp_customize->add_setting( 'generate_spacing_settings[top_bar_bottom]', + array( + 'default' => $defaults['top_bar_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + // Widget padding left + $wp_customize->add_setting( 'generate_spacing_settings[top_bar_left]', + array( + 'default' => $defaults['top_bar_left'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + // Make use of the widget padding settings + $wp_customize->add_control( + new GeneratePress_Spacing_Control( + $wp_customize, + 'top_bar_spacing', + array( + 'type' => 'generatepress-spacing', + 'label' => esc_html__( 'Top Bar Padding', 'gp-premium' ), + 'section' => 'generate_top_bar', + 'settings' => array( + 'desktop_top' => 'generate_spacing_settings[top_bar_top]', + 'desktop_right' => 'generate_spacing_settings[top_bar_right]', + 'desktop_bottom' => 'generate_spacing_settings[top_bar_bottom]', + 'desktop_left' => 'generate_spacing_settings[top_bar_left]' + ), + 'element' => 'top_bar', + 'priority' => 99, + 'active_callback' => 'generate_premium_is_top_bar_active', + ) + ) + ); +} diff --git a/wp-content/plugins/gp-premium/spacing/functions/functions.php b/wp-content/plugins/gp-premium/spacing/functions/functions.php new file mode 100644 index 0000000..4ad2352 --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/functions.php @@ -0,0 +1,298 @@ +register_control_type( 'GeneratePress_Pro_Range_Slider_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Spacing_Control' ); + } + + // Add our Spacing panel + // This is only used if the Layout panel in the free theme doesn't exist + if ( class_exists( 'WP_Customize_Panel' ) ) { + if ( ! $wp_customize->get_panel( 'generate_spacing_panel' ) ) { + $wp_customize->add_panel( 'generate_spacing_panel', array( + 'capability' => 'edit_theme_options', + 'theme_supports' => '', + 'title' => __( 'Spacing', 'gp-premium' ), + 'description' => __( 'Change the spacing for various elements using pixels.', 'gp-premium' ), + 'priority' => 35 + ) ); + } + } + + require_once plugin_dir_path( __FILE__ ) . 'customizer/top-bar-spacing.php'; + require_once plugin_dir_path( __FILE__ ) . 'customizer/header-spacing.php'; + require_once plugin_dir_path( __FILE__ ) . 'customizer/content-spacing.php'; + require_once plugin_dir_path( __FILE__ ) . 'customizer/sidebar-spacing.php'; + require_once plugin_dir_path( __FILE__ ) . 'customizer/navigation-spacing.php'; + require_once plugin_dir_path( __FILE__ ) . 'customizer/footer-spacing.php'; + + } +} + +if ( ! function_exists( 'generate_right_sidebar_width' ) ) { + add_filter( 'generate_right_sidebar_width', 'generate_right_sidebar_width' ); + /* + * Set our right sidebar width + */ + function generate_right_sidebar_width( $width ) { + // Bail if we don't have our defaults + if ( ! function_exists( 'generate_spacing_get_defaults' ) ) { + return $width; + } + + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + return absint( $spacing_settings['right_sidebar_width'] ); + } +} + +if ( ! function_exists( 'generate_left_sidebar_width' ) ) { + add_filter( 'generate_left_sidebar_width', 'generate_left_sidebar_width' ); + /* + * Set our left sidebar width + */ + function generate_left_sidebar_width( $width ) { + // Bail if we don't have our defaults + if ( ! function_exists( 'generate_spacing_get_defaults' ) ) { + return $width; + } + + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + return absint( $spacing_settings['left_sidebar_width'] ); + } +} + +if ( ! function_exists( 'generate_spacing_customizer_live_preview' ) ) { + add_action( 'customize_preview_init', 'generate_spacing_customizer_live_preview' ); + /* + * Add our live preview JS + */ + function generate_spacing_customizer_live_preview() { + wp_enqueue_script( + 'generate-spacing-customizer', + trailingslashit( plugin_dir_url( __FILE__ ) ) . 'customizer/js/customizer.js', + array( 'jquery','customize-preview' ), + GENERATE_SPACING_VERSION, + true + ); + + wp_localize_script( 'generate-spacing-customizer', 'gp_spacing', array( + 'mobile' => generate_premium_get_media_query( 'mobile' ), + 'tablet' => generate_premium_get_media_query( 'tablet' ), + 'desktop' => generate_premium_get_media_query( 'desktop' ), + ) ); + } +} + +if ( ! function_exists( 'generate_include_spacing_defaults' ) ) { + /** + * Check if we should include our default.css file + * @since 1.3.42 + */ + function generate_include_spacing_defaults() { + return true; + } +} + +if ( ! function_exists( 'generate_spacing_premium_defaults' ) ) { + add_filter( 'generate_spacing_option_defaults', 'generate_spacing_premium_defaults' ); + /** + * Add premium spacing defaults + * + * @since 1.3 + */ + function generate_spacing_premium_defaults( $defaults ) { + $defaults['mobile_menu_item'] = ''; + $defaults['mobile_menu_item_height'] = ''; + $defaults['sticky_menu_item_height'] = ''; + $defaults['off_canvas_menu_item_height'] = ''; + $defaults['content_element_separator'] = '2'; // em + + $defaults['mobile_header_top'] = ''; + $defaults['mobile_header_right'] = ''; + $defaults['mobile_header_bottom'] = ''; + $defaults['mobile_header_left'] = ''; + + $defaults['mobile_widget_top'] = ''; + $defaults['mobile_widget_right'] = ''; + $defaults['mobile_widget_bottom'] = ''; + $defaults['mobile_widget_left'] = ''; + + $defaults['mobile_footer_widget_container_top'] = ''; + $defaults['mobile_footer_widget_container_right'] = ''; + $defaults['mobile_footer_widget_container_bottom'] = ''; + $defaults['mobile_footer_widget_container_left'] = ''; + + return $defaults; + } +} + +if ( ! function_exists( 'generate_spacing_premium_css' ) ) { + add_action( 'wp_enqueue_scripts', 'generate_spacing_premium_css', 105 ); + /** + * Add premium spacing CSS + * + * @since 1.3 + */ + function generate_spacing_premium_css() { + + // Bail if we don't have our defaults + if ( ! function_exists( 'generate_spacing_get_defaults' ) ) { + return; + } + + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + require_once GP_LIBRARY_DIRECTORY . 'class-make-css.php'; + $premium_css = new GeneratePress_Pro_CSS; + + // Mobile spacing + $premium_css->start_media_query( generate_premium_get_media_query( 'mobile-menu' ) ); + + if ( '' !== $spacing_settings[ 'mobile_menu_item' ] ) { + $premium_css->set_selector( '.menu-toggle,.main-navigation .mobile-bar-items a' ); + $premium_css->add_property( 'padding-left', absint( $spacing_settings['mobile_menu_item'] ), false, 'px' ); + $premium_css->add_property( 'padding-right', absint( $spacing_settings['mobile_menu_item'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings[ 'mobile_menu_item_height' ] ) { + $premium_css->set_selector( '.main-navigation .main-nav ul li a,.menu-toggle,.main-navigation .mobile-bar-items a' ); + $premium_css->add_property( 'line-height', absint( $spacing_settings['mobile_menu_item_height'] ), false, 'px' ); + + $premium_css->set_selector( '.main-navigation .site-logo.navigation-logo img, .mobile-header-navigation .site-logo.mobile-header-logo img, .navigation-search input' ); + $premium_css->add_property( 'height', absint( $spacing_settings['mobile_menu_item_height'] ), false, 'px' ); + } + + $premium_css->stop_media_query(); + + $premium_css->start_media_query( generate_premium_get_media_query( 'mobile' ) ); + + $premium_css->set_selector( '.inside-header' ); + + if ( '' !== $spacing_settings['mobile_header_top'] ) { + $premium_css->add_property( 'padding-top', absint( $spacing_settings['mobile_header_top'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_header_right'] ) { + $premium_css->add_property( 'padding-right', absint( $spacing_settings['mobile_header_right'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_header_bottom'] ) { + $premium_css->add_property( 'padding-bottom', absint( $spacing_settings['mobile_header_bottom'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_header_left'] ) { + $premium_css->add_property( 'padding-left', absint( $spacing_settings['mobile_header_left'] ), false, 'px' ); + } + + $premium_css->set_selector( '.widget-area .widget' ); + + if ( '' !== $spacing_settings['mobile_widget_top'] ) { + $premium_css->add_property( 'padding-top', absint( $spacing_settings['mobile_widget_top'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_widget_right'] ) { + $premium_css->add_property( 'padding-right', absint( $spacing_settings['mobile_widget_right'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_widget_bottom'] ) { + $premium_css->add_property( 'padding-bottom', absint( $spacing_settings['mobile_widget_bottom'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_widget_left'] ) { + $premium_css->add_property( 'padding-left', absint( $spacing_settings['mobile_widget_left'] ), false, 'px' ); + } + + $premium_css->set_selector( '.footer-widgets' ); + + if ( '' !== $spacing_settings['mobile_footer_widget_container_top'] ) { + $premium_css->add_property( 'padding-top', absint( $spacing_settings['mobile_footer_widget_container_top'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_footer_widget_container_right'] ) { + $premium_css->add_property( 'padding-right', absint( $spacing_settings['mobile_footer_widget_container_right'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_footer_widget_container_bottom'] ) { + $premium_css->add_property( 'padding-bottom', absint( $spacing_settings['mobile_footer_widget_container_bottom'] ), false, 'px' ); + } + + if ( '' !== $spacing_settings['mobile_footer_widget_container_left'] ) { + $premium_css->add_property( 'padding-left', absint( $spacing_settings['mobile_footer_widget_container_left'] ), false, 'px' ); + } + + $premium_css->stop_media_query(); + + $premium_css->set_selector( '.post-image, .page-content, .entry-content, .entry-summary, footer.entry-meta' ); + $premium_css->add_property( 'margin-top', floatval( $spacing_settings['content_element_separator'] ), '2', 'em' ); + + $premium_css->set_selector( '.post-image-above-header .inside-article div.featured-image, .post-image-above-header .inside-article div.post-image' ); + $premium_css->add_property( 'margin-bottom', floatval( $spacing_settings['content_element_separator'] ), '2', 'em' ); + + if ( function_exists( 'generate_menu_plus_get_defaults' ) ) { + $menu_plus = wp_parse_args( + get_option( 'generate_menu_plus_settings', array() ), + generate_menu_plus_get_defaults() + ); + + if ( 'false' !== $menu_plus[ 'sticky_menu' ] && '' !== $spacing_settings[ 'sticky_menu_item_height' ] ) { + $premium_css->start_media_query( generate_premium_get_media_query( 'tablet' ) . ',' . generate_premium_get_media_query( 'desktop' ) ); + + $premium_css->set_selector( '.main-navigation.sticky-navigation-transition .main-nav > ul > li > a,.sticky-navigation-transition .menu-toggle,.main-navigation.sticky-navigation-transition .mobile-bar-items a, .sticky-navigation-transition .navigation-branding .main-title' ); + $premium_css->add_property( 'line-height', absint( $spacing_settings[ 'sticky_menu_item_height' ] ), false, 'px' ); + + $premium_css->set_selector( '.main-navigation.sticky-navigation-transition .site-logo img, .main-navigation.sticky-navigation-transition .navigation-search input, .main-navigation.sticky-navigation-transition .navigation-branding img' ); + $premium_css->add_property( 'height', absint( $spacing_settings[ 'sticky_menu_item_height' ] ), false, 'px' ); + + $premium_css->stop_media_query(); + } + + if ( 'false' !== $menu_plus[ 'slideout_menu' ] ) { + $premium_css->set_selector( '.main-navigation.slideout-navigation .main-nav > ul > li > a' ); + if ( '' !== $spacing_settings['off_canvas_menu_item_height'] ) { + $premium_css->add_property( 'line-height', absint( $spacing_settings['off_canvas_menu_item_height'] ), false, 'px' ); + } + } + } + + if ( '' !== $premium_css->css_output() ) { + wp_add_inline_style( 'generate-style', $premium_css->css_output() ); + } + } +} diff --git a/wp-content/plugins/gp-premium/spacing/functions/migration.php b/wp-content/plugins/gp-premium/spacing/functions/migration.php new file mode 100644 index 0000000..1eac04b --- /dev/null +++ b/wp-content/plugins/gp-premium/spacing/functions/migration.php @@ -0,0 +1,102 @@ +register_control_type( 'GeneratePress_Pro_Range_Slider_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Pro_Typography_Customize_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Section_Shortcut_Control' ); + } + + // Add the typography panel + if ( class_exists( 'WP_Customize_Panel' ) ) { + $wp_customize->add_panel( 'generate_typography_panel', array( + 'priority' => 30, + 'capability' => 'edit_theme_options', + 'theme_supports' => '', + 'title' => __( 'Typography', 'gp-premium' ), + 'description' => '', + ) ); + } + + // Body section + $wp_customize->add_section( + 'font_section', + array( + 'title' => __( 'Body', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 30, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_body_typography_shortcuts', + array( + 'section' => 'font_section', + 'element' => __( 'Body', 'gp-premium' ), + 'shortcuts' => array( + 'colors' => 'body_section', + 'backgrounds' => 'generate_backgrounds_body', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 0, + ) + ) + ); + + // Font family + $wp_customize->add_setting( + 'generate_settings[font_body]', + array( + 'default' => $defaults['font_body'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Variants + $wp_customize->add_setting( + 'font_body_variants', + array( + 'default' => $defaults['font_body_variants'], + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + // Category + $wp_customize->add_setting( + 'font_body_category', + array( + 'default' => $defaults['font_body_category'], + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Font weight + $wp_customize->add_setting( + 'generate_settings[body_font_weight]', + array( + 'default' => $defaults['body_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Text transform + $wp_customize->add_setting( + 'generate_settings[body_font_transform]', + array( + 'default' => $defaults['body_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'body_typography', + array( + 'section' => 'font_section', + 'priority' => 1, + 'settings' => array( + 'family' => 'generate_settings[font_body]', + 'variant' => 'font_body_variants', + 'category' => 'font_body_category', + 'weight' => 'generate_settings[body_font_weight]', + 'transform' => 'generate_settings[body_font_transform]', + ), + ) + ) + ); + + // Font size + $wp_customize->add_setting( + 'generate_settings[body_font_size]', + array( + 'default' => $defaults['body_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[body_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_section', + 'priority' => 40, + 'settings' => array( + 'desktop' => 'generate_settings[body_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 25, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Line height + $wp_customize->add_setting( + 'generate_settings[body_line_height]', + array( + 'default' => $defaults['body_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[body_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_section', + 'priority' => 45, + 'settings' => array( + 'desktop' => 'generate_settings[body_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 1, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => '', + ), + ), + ) + ) + ); + + // Paragraph margin + $wp_customize->add_setting( + 'generate_settings[paragraph_margin]', + array( + 'default' => $defaults['paragraph_margin'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[paragraph_margin]', + array( + 'description' => __( 'Paragraph margin', 'gp-premium' ), + 'section' => 'font_section', + 'priority' => 47, + 'settings' => array( + 'desktop' => 'generate_settings[paragraph_margin]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + + // Top bar section + $wp_customize->add_section( + 'generate_top_bar_typography', + array( + 'title' => __( 'Top Bar', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 30, + 'panel' => 'generate_typography_panel' + ) + ); + + if ( isset( $defaults[ 'font_top_bar' ] ) && function_exists( 'generate_is_top_bar_active' ) ) { + + // Font family + $wp_customize->add_setting( + 'generate_settings[font_top_bar]', + array( + 'default' => $defaults['font_top_bar'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Category + $wp_customize->add_setting( + 'font_top_bar_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Variants + $wp_customize->add_setting( + 'font_top_bar_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + // Font weight + $wp_customize->add_setting( + 'generate_settings[top_bar_font_weight]', + array( + 'default' => $defaults['top_bar_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + + // Text transform + $wp_customize->add_setting( + 'generate_settings[top_bar_font_transform]', + array( + 'default' => $defaults['top_bar_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'top_bar_typography', + array( + 'section' => 'generate_top_bar_typography', + 'settings' => array( + 'family' => 'generate_settings[font_top_bar]', + 'variant' => 'font_top_bar_variants', + 'category' => 'font_top_bar_category', + 'weight' => 'generate_settings[top_bar_font_weight]', + 'transform' => 'generate_settings[top_bar_font_transform]', + ), + 'active_callback' => 'generate_premium_is_top_bar_active', + ) + ) + ); + + } + + if ( isset( $defaults[ 'top_bar_font_size' ] ) && function_exists( 'generate_is_top_bar_active' ) ) { + // Font size + $wp_customize->add_setting( + 'generate_settings[top_bar_font_size]', + array( + 'default' => $defaults['top_bar_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[top_bar_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'generate_top_bar_typography', + 'priority' => 75, + 'settings' => array( + 'desktop' => 'generate_settings[top_bar_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 25, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'active_callback' => 'generate_premium_is_top_bar_active', + ) + ) + ); + } + + // Header section + $wp_customize->add_section( + 'font_header_section', + array( + 'title' => __( 'Header', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 40, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_header_typography_shortcuts', + array( + 'section' => 'font_header_section', + 'element' => __( 'Header', 'gp-premium' ), + 'shortcuts' => array( + 'layout' => 'generate_layout_header', + 'colors' => 'header_color_section', + 'backgrounds' => 'generate_backgrounds_header', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + // Font family + $wp_customize->add_setting( + 'generate_settings[font_site_title]', + array( + 'default' => $defaults['font_site_title'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Category + $wp_customize->add_setting( + 'font_site_title_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Variants + $wp_customize->add_setting( + 'font_site_title_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + // Font weight + $wp_customize->add_setting( + 'generate_settings[site_title_font_weight]', + array( + 'default' => $defaults['site_title_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Text transform + $wp_customize->add_setting( + 'generate_settings[site_title_font_transform]', + array( + 'default' => $defaults['site_title_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'site_title_typography', + array( + 'label' => __( 'Site Title', 'gp-premium' ), + 'section' => 'font_header_section', + 'settings' => array( + 'family' => 'generate_settings[font_site_title]', + 'variant' => 'font_site_title_variants', + 'category' => 'font_site_title_category', + 'weight' => 'generate_settings[site_title_font_weight]', + 'transform' => 'generate_settings[site_title_font_transform]', + ), + 'priority' => 50, + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[site_title_font_size]', + array( + 'default' => $defaults['site_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[tablet_site_title_font_size]', + array( + 'default' => $defaults['tablet_site_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[mobile_site_title_font_size]', + array( + 'default' => $defaults['mobile_site_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[site_title_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_header_section', + 'priority' => 75, + 'settings' => array( + 'desktop' => 'generate_settings[site_title_font_size]', + 'tablet' => 'generate_settings[tablet_site_title_font_size]', + 'mobile' => 'generate_settings[mobile_site_title_font_size]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 200, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'tablet' => array( + 'min' => 10, + 'max' => 200, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 10, + 'max' => 200, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Tagline font family + $wp_customize->add_setting( + 'generate_settings[font_site_tagline]', + array( + 'default' => $defaults['font_site_tagline'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Category + $wp_customize->add_setting( + 'font_site_tagline_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Variants + $wp_customize->add_setting( + 'font_site_tagline_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + // Font weight + $wp_customize->add_setting( + 'generate_settings[site_tagline_font_weight]', + array( + 'default' => $defaults['site_tagline_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Text transform + $wp_customize->add_setting( + 'generate_settings[site_tagline_font_transform]', + array( + 'default' => $defaults['site_tagline_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_site_tagline_control', + array( + 'label' => __( 'Site Tagline', 'gp-premium' ), + 'section' => 'font_header_section', + 'settings' => array( + 'family' => 'generate_settings[font_site_tagline]', + 'variant' => 'font_site_tagline_variants', + 'category' => 'font_site_tagline_category', + 'weight' => 'generate_settings[site_tagline_font_weight]', + 'transform' => 'generate_settings[site_tagline_font_transform]', + ), + 'priority' => 80, + ) + ) + ); + + // Font size + $wp_customize->add_setting( + 'generate_settings[site_tagline_font_size]', + array( + 'default' => $defaults['site_tagline_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[site_tagline_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_header_section', + 'priority' => 105, + 'settings' => array( + 'desktop' => 'generate_settings[site_tagline_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 50, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Primary navigation section + $wp_customize->add_section( + 'font_navigation_section', + array( + 'title' => __( 'Primary Navigation', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 50, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_primary_navigation_typography_shortcuts', + array( + 'section' => 'font_navigation_section', + 'element' => __( 'Primary Navigation', 'gp-premium' ), + 'shortcuts' => array( + 'layout' => 'generate_layout_navigation', + 'colors' => 'navigation_color_section', + 'backgrounds' => 'generate_backgrounds_navigation', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + // Font family + $wp_customize->add_setting( + 'generate_settings[font_navigation]', + array( + 'default' => $defaults['font_navigation'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Category + $wp_customize->add_setting( + 'font_navigation_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Variants + $wp_customize->add_setting( + 'font_navigation_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + // Font weight + $wp_customize->add_setting( + 'generate_settings[navigation_font_weight]', + array( + 'default' => $defaults['navigation_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Text transform + $wp_customize->add_setting( + 'generate_settings[navigation_font_transform]', + array( + 'default' => $defaults['navigation_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'google_font_site_navigation_control', + array( + 'section' => 'font_navigation_section', + 'settings' => array( + 'family' => 'generate_settings[font_navigation]', + 'variant' => 'font_navigation_variants', + 'category' => 'font_navigation_category', + 'weight' => 'generate_settings[navigation_font_weight]', + 'transform' => 'generate_settings[navigation_font_transform]', + ), + 'priority' => 120, + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[navigation_font_size]', + array( + 'default' => $defaults['navigation_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[tablet_navigation_font_size]', + array( + 'default' => $defaults['tablet_navigation_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[mobile_navigation_font_size]', + array( + 'default' => $defaults['mobile_navigation_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[navigation_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_navigation_section', + 'priority' => 165, + 'settings' => array( + 'desktop' => 'generate_settings[navigation_font_size]', + 'tablet' => 'generate_settings[tablet_navigation_font_size]', + 'mobile' => 'generate_settings[mobile_navigation_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 30, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'tablet' => array( + 'min' => 6, + 'max' => 30, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 6, + 'max' => 30, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Buttons section + $wp_customize->add_section( + 'font_buttons_section', + array( + 'title' => __( 'Buttons', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 55, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_buttons_typography_shortcuts', + array( + 'section' => 'font_buttons_section', + 'element' => __( 'Button', 'gp-premium' ), + 'shortcuts' => array( + 'colors' => 'buttons_color_section', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + if ( isset( $defaults['font_buttons'] ) ) { + $wp_customize->add_setting( + 'generate_settings[font_buttons]', + array( + 'default' => $defaults['font_buttons'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_buttons_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_buttons_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[buttons_font_weight]', + array( + 'default' => $defaults['buttons_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[buttons_font_transform]', + array( + 'default' => $defaults['buttons_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_buttons_control', + array( + 'section' => 'font_buttons_section', + 'settings' => array( + 'family' => 'generate_settings[font_buttons]', + 'variant' => 'font_buttons_variants', + 'category' => 'font_buttons_category', + 'weight' => 'generate_settings[buttons_font_weight]', + 'transform' => 'generate_settings[buttons_font_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[buttons_font_size]', + array( + 'default' => $defaults['buttons_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'buttons_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_buttons_section', + 'settings' => array( + 'desktop' => 'generate_settings[buttons_font_size]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 5, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } + + // Headings section + $wp_customize->add_section( + 'font_content_section', + array( + 'title' => __( 'Headings', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 60, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_headings_typography_shortcuts', + array( + 'section' => 'font_content_section', + 'element' => __( 'Content', 'gp-premium' ), + 'shortcuts' => array( + 'layout' => 'generate_layout_container', + 'colors' => 'content_color_section', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[font_heading_1]', + array( + 'default' => $defaults['font_heading_1'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_1_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_1_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_1_weight]', + array( + 'default' => $defaults['heading_1_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_1_transform]', + array( + 'default' => $defaults['heading_1_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_heading_1_control', + array( + 'label' => __( 'Heading 1 (H1)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_1]', + 'variant' => 'font_heading_1_variants', + 'category' => 'font_heading_1_category', + 'weight' => 'generate_settings[heading_1_weight]', + 'transform' => 'generate_settings[heading_1_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_1_font_size]', + array( + 'default' => $defaults['heading_1_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[mobile_heading_1_font_size]', + array( + 'default' => $defaults['mobile_heading_1_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'h1_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_1_font_size]', + 'mobile' => 'generate_settings[mobile_heading_1_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + if ( isset( $defaults['heading_1_line_height'] ) ) { + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_1_line_height]', + array( + 'default' => $defaults['heading_1_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_1_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_1_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + } + + if ( isset( $defaults['heading_1_margin_bottom'] ) ) { + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_1_margin_bottom]', + array( + 'default' => $defaults['heading_1_margin_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_1_margin_bottom]', + array( + 'description' => __( 'Bottom margin', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_1_margin_bottom]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } + + $wp_customize->add_setting( + 'generate_settings[single_post_title_weight]', + array( + 'default' => $defaults['single_post_title_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[single_post_title_transform]', + array( + 'default' => $defaults['single_post_title_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'single_content_title_control', + array( + 'label' => __( 'Single Content Title (H1)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'weight' => 'generate_settings[single_post_title_weight]', + 'transform' => 'generate_settings[single_post_title_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[single_post_title_font_size]', + array( + 'default' => $defaults['single_post_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[single_post_title_font_size_mobile]', + array( + 'default' => $defaults['single_post_title_font_size_mobile'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'single_post_title_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[single_post_title_font_size]', + 'mobile' => 'generate_settings[single_post_title_font_size_mobile]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[single_post_title_line_height]', + array( + 'default' => $defaults['single_post_title_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer_empty', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[single_post_title_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[single_post_title_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + + // H2 + $wp_customize->add_setting( + 'generate_settings[font_heading_2]', + array( + 'default' => $defaults['font_heading_2'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_2_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_2_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_2_weight]', + array( + 'default' => $defaults['heading_2_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_2_transform]', + array( + 'default' => $defaults['heading_2_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_heading_2_control', + array( + 'label' => __( 'Heading 2 (H2)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_2]', + 'variant' => 'font_heading_2_variants', + 'category' => 'font_heading_2_category', + 'weight' => 'generate_settings[heading_2_weight]', + 'transform' => 'generate_settings[heading_2_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_2_font_size]', + array( + 'default' => $defaults['heading_2_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[mobile_heading_2_font_size]', + array( + 'default' => $defaults['mobile_heading_2_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'h2_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_2_font_size]', + 'mobile' => 'generate_settings[mobile_heading_2_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + if ( isset( $defaults['heading_2_line_height'] ) ) { + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_2_line_height]', + array( + 'default' => $defaults['heading_2_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_2_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_2_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + } + + if ( isset( $defaults['heading_2_margin_bottom'] ) ) { + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_2_margin_bottom]', + array( + 'default' => $defaults['heading_2_margin_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_2_margin_bottom]', + array( + 'description' => __( 'Bottom margin', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_2_margin_bottom]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } + + $wp_customize->add_setting( + 'generate_settings[archive_post_title_weight]', + array( + 'default' => $defaults['archive_post_title_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[archive_post_title_transform]', + array( + 'default' => $defaults['archive_post_title_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'archive_content_title_control', + array( + 'label' => __( 'Archive Content Title (H2)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'weight' => 'generate_settings[archive_post_title_weight]', + 'transform' => 'generate_settings[archive_post_title_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[archive_post_title_font_size]', + array( + 'default' => $defaults['archive_post_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[archive_post_title_font_size_mobile]', + array( + 'default' => $defaults['archive_post_title_font_size_mobile'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'archive_post_title_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[archive_post_title_font_size]', + 'mobile' => 'generate_settings[archive_post_title_font_size_mobile]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[archive_post_title_line_height]', + array( + 'default' => $defaults['archive_post_title_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer_empty', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[archive_post_title_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[archive_post_title_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + + // H3 + $wp_customize->add_setting( + 'generate_settings[font_heading_3]', + array( + 'default' => $defaults['font_heading_3'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_3_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_3_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_3_weight]', + array( + 'default' => $defaults['heading_3_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_3_transform]', + array( + 'default' => $defaults['heading_3_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_heading_3_control', + array( + 'label' => __( 'Heading 3 (H3)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_3]', + 'variant' => 'font_heading_3_variants', + 'category' => 'font_heading_3_category', + 'weight' => 'generate_settings[heading_3_weight]', + 'transform' => 'generate_settings[heading_3_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_3_font_size]', + array( + 'default' => $defaults['heading_3_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'h3_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_3_font_size]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + if ( isset( $defaults['heading_3_line_height'] ) ) { + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_3_line_height]', + array( + 'default' => $defaults['heading_3_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_3_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_3_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + } + + if ( isset( $defaults['heading_3_margin_bottom'] ) ) { + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_3_margin_bottom]', + array( + 'default' => $defaults['heading_3_margin_bottom'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_3_margin_bottom]', + array( + 'description' => __( 'Bottom margin', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_3_margin_bottom]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } + + if ( isset( $defaults['font_heading_4'] ) ) { + // H4 + $wp_customize->add_setting( + 'generate_settings[font_heading_4]', + array( + 'default' => $defaults['font_heading_4'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_4_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_4_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_4_weight]', + array( + 'default' => $defaults['heading_4_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_4_transform]', + array( + 'default' => $defaults['heading_4_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_heading_4_control', + array( + 'label' => __( 'Heading 4 (H4)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_4]', + 'variant' => 'font_heading_4_variants', + 'category' => 'font_heading_4_category', + 'weight' => 'generate_settings[heading_4_weight]', + 'transform' => 'generate_settings[heading_4_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_4_font_size]', + array( + 'default' => $defaults['heading_4_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'h4_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_4_font_size]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_4_line_height]', + array( + 'default' => $defaults['heading_4_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer_empty', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_4_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_4_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + } + + if ( isset( $defaults['font_heading_5'] ) ) { + // H5 + $wp_customize->add_setting( + 'generate_settings[font_heading_5]', + array( + 'default' => $defaults['font_heading_5'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_5_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_5_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_5_weight]', + array( + 'default' => $defaults['heading_5_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_5_transform]', + array( + 'default' => $defaults['heading_5_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_heading_5_control', + array( + 'label' => __( 'Heading 5 (H5)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_5]', + 'variant' => 'font_heading_5_variants', + 'category' => 'font_heading_5_category', + 'weight' => 'generate_settings[heading_5_weight]', + 'transform' => 'generate_settings[heading_5_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_5_font_size]', + array( + 'default' => $defaults['heading_5_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'h5_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_5_font_size]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_5_line_height]', + array( + 'default' => $defaults['heading_5_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer_empty', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_5_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_5_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + } + + if ( isset( $defaults['font_heading_6'] ) ) { + // H5 + $wp_customize->add_setting( + 'generate_settings[font_heading_6]', + array( + 'default' => $defaults['font_heading_6'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_6_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_6_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_6_weight]', + array( + 'default' => $defaults['heading_6_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_6_transform]', + array( + 'default' => $defaults['heading_6_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_heading_6_control', + array( + 'label' => __( 'Heading 6 (H6)', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_6]', + 'variant' => 'font_heading_6_variants', + 'category' => 'font_heading_6_category', + 'weight' => 'generate_settings[heading_6_weight]', + 'transform' => 'generate_settings[heading_6_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_6_font_size]', + array( + 'default' => $defaults['heading_6_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'h6_font_sizes', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_6_font_size]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Line height + $wp_customize->add_setting( + 'generate_settings[heading_6_line_height]', + array( + 'default' => $defaults['heading_6_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_decimal_integer_empty', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_6_line_height]', + array( + 'description' => __( 'Line height', 'gp-premium' ), + 'section' => 'font_content_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_6_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + } + + // Widgets section + $wp_customize->add_section( + 'font_widget_section', + array( + 'title' => __( 'Widgets', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 60, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_widgets_typography_shortcuts', + array( + 'section' => 'font_widget_section', + 'element' => __( 'Widgets', 'gp-premium' ), + 'shortcuts' => array( + 'layout' => 'generate_layout_sidebars', + 'colors' => 'sidebar_widget_color_section', + 'backgrounds' => 'generate_backgrounds_sidebars', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + // Font family + $wp_customize->add_setting( + 'generate_settings[font_widget_title]', + array( + 'default' => $defaults['font_widget_title'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Category + $wp_customize->add_setting( + 'font_widget_title_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Variants + $wp_customize->add_setting( + 'font_widget_title_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + // Font weight + $wp_customize->add_setting( + 'generate_settings[widget_title_font_weight]', + array( + 'default' => $defaults['widget_title_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Text transform + $wp_customize->add_setting( + 'generate_settings[widget_title_font_transform]', + array( + 'default' => $defaults['widget_title_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'google_font_widget_title_control', + array( + 'label' => __( 'Widget Titles', 'gp-premium' ), + 'section' => 'font_widget_section', + 'settings' => array( + 'family' => 'generate_settings[font_widget_title]', + 'variant' => 'font_widget_title_variants', + 'category' => 'font_widget_title_category', + 'weight' => 'generate_settings[widget_title_font_weight]', + 'transform' => 'generate_settings[widget_title_font_transform]', + ), + ) + ) + ); + + // Font size + $wp_customize->add_setting( + 'generate_settings[widget_title_font_size]', + array( + 'default' => $defaults['widget_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[widget_title_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_widget_section', + 'settings' => array( + 'desktop' => 'generate_settings[widget_title_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 30, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + if ( isset( $defaults['widget_title_separator'] ) ) { + $wp_customize->add_setting( + 'generate_settings[widget_title_separator]', + array( + 'default' => $defaults['widget_title_separator'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[widget_title_separator]', + array( + 'description' => __( 'Bottom margin', 'gp-premium' ), + 'section' => 'font_widget_section', + 'settings' => array( + 'desktop' => 'generate_settings[widget_title_separator]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } + + // Widget content font size + $wp_customize->add_setting( + 'generate_settings[widget_content_font_size]', + array( + 'default' => $defaults['widget_content_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[widget_content_font_size]', + array( + 'description' => __( 'Content font size', 'gp-premium' ), + 'section' => 'font_widget_section', + 'priority' => 240, + 'settings' => array( + 'desktop' => 'generate_settings[widget_content_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 30, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Footer section + $wp_customize->add_section( + 'font_footer_section', + array( + 'title' => __( 'Footer', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 70, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_footer_typography_shortcuts', + array( + 'section' => 'font_footer_section', + 'element' => __( 'Footer', 'gp-premium' ), + 'shortcuts' => array( + 'layout' => 'generate_layout_footer', + 'colors' => 'footer_color_section', + 'backgrounds' => 'generate_backgrounds_footer', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + if ( isset( $defaults['font_footer'] ) ) { + // H5 + $wp_customize->add_setting( + 'generate_settings[font_footer]', + array( + 'default' => $defaults['font_footer'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_footer_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_footer_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[footer_weight]', + array( + 'default' => $defaults['footer_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[footer_transform]', + array( + 'default' => $defaults['footer_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'font_footer_control', + array( + 'section' => 'font_footer_section', + 'settings' => array( + 'family' => 'generate_settings[font_footer]', + 'variant' => 'font_footer_variants', + 'category' => 'font_footer_category', + 'weight' => 'generate_settings[footer_weight]', + 'transform' => 'generate_settings[footer_transform]', + ), + ) + ) + ); + } + + // Font size + $wp_customize->add_setting( + 'generate_settings[footer_font_size]', + array( + 'default' => $defaults['footer_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[footer_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'font_footer_section', + 'settings' => array( + 'desktop' => 'generate_settings[footer_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 30, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } +} + +if ( ! function_exists( 'generate_enqueue_google_fonts' ) ) { + add_action( 'wp_enqueue_scripts', 'generate_enqueue_google_fonts', 0 ); + /** + * Enqueue Google Fonts. + * + * @since 0.1 + */ + function generate_enqueue_google_fonts() { + // Bail if we don't have our defaults function + if ( ! function_exists( 'generate_get_default_fonts' ) ) { + return; + } + + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_default_fonts() + ); + + // List our non-Google fonts + $not_google = str_replace( ' ', '+', generate_typography_default_fonts() ); + + // Grab our font family settings + $font_settings = array( + 'font_body', + 'font_top_bar', + 'font_site_title', + 'font_site_tagline', + 'font_navigation', + 'font_widget_title', + 'font_buttons', + 'font_heading_1', + 'font_heading_2', + 'font_heading_3', + 'font_heading_4', + 'font_heading_5', + 'font_heading_6', + 'font_footer', + ); + + // Create our Google Fonts array + $google_fonts = array(); + if ( ! empty( $font_settings ) ) { + + foreach ( $font_settings as $key ) { + + // If the key isn't set, move on + if ( ! isset( $generate_settings[$key] ) ) { + continue; + } + + // If our value is still using the old format, fix it + if ( strpos( $generate_settings[$key], ':' ) !== false ) { + $generate_settings[$key] = current( explode( ':', $generate_settings[$key] ) ); + } + + // Replace the spaces in the names with a plus + $value = str_replace( ' ', '+', $generate_settings[$key] ); + + // Grab the variants using the plain name + $variants = generate_get_google_font_variants( $generate_settings[$key], $key, generate_get_default_fonts() ); + + // If we have variants, add them to our value + $value = ! empty( $variants ) ? $value . ':' . $variants : $value; + + // Make sure we don't add the same font twice + if ( ! in_array( $value, $google_fonts ) ) { + $google_fonts[] = $value; + } + + } + + } + + // Ignore any non-Google fonts + $google_fonts = array_diff($google_fonts, $not_google); + + // Separate each different font with a bar + $google_fonts = implode('|', $google_fonts); + + // Apply a filter to the output + $google_fonts = apply_filters( 'generate_typography_google_fonts', $google_fonts ); + + // Get the subset + $subset = apply_filters( 'generate_fonts_subset','' ); + + // Set up our arguments + $font_args = array(); + $font_args[ 'family' ] = $google_fonts; + if ( '' !== $subset ) { + $font_args[ 'subset' ] = urlencode( $subset ); + } + + $display = apply_filters( 'generate_google_font_display', '' ); + + if ( $display ) { + $font_args['display'] = $display; + } + + // Create our URL using the arguments + $fonts_url = add_query_arg( $font_args, '//fonts.googleapis.com/css' ); + + // Enqueue our fonts + if ( $google_fonts ) { + wp_enqueue_style('generate-fonts', $fonts_url, array(), null, 'all' ); + } + } +} + +if ( ! function_exists( 'generate_get_all_google_fonts' ) ) { + /** + * Return an array of all of our Google Fonts + * @since 1.3.0 + */ + function generate_get_all_google_fonts( $amount = 'all' ) { + ob_start(); + include wp_normalize_path( dirname( __FILE__ ) . '/google-fonts.json' ); // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude + $fonts_json = ob_get_clean(); + $google_fonts = json_decode( $fonts_json ); + + // Loop through them and put what we need into our fonts array + $fonts = array(); + foreach ( (array) $google_fonts as $item ) { + + // Grab what we need from our big list + $atts = array( + 'name' => $item->family, + 'category' => $item->category, + 'variants' => $item->variants + ); + + // Create an ID using our font family name + $id = strtolower( str_replace( ' ', '_', $item->family ) ); + + // Add our attributes to our new array + $fonts[ $id ] = $atts; + } + + if ( 'all' !== $amount ) { + $fonts = array_slice( $fonts, 0, $amount ); + } + + // Alphabetize our fonts + if ( apply_filters( 'generate_alphabetize_google_fonts', true ) ) { + asort( $fonts ); + } + + // Filter to allow us to modify the fonts array + return apply_filters( 'generate_google_fonts_array', $fonts ); + } +} + +if ( ! function_exists( 'generate_get_all_google_fonts_ajax' ) ) { + add_action( 'wp_ajax_generate_get_all_google_fonts_ajax', 'generate_get_all_google_fonts_ajax' ); + /** + * Return an array of all of our Google Fonts. + * + * @since 1.3.0 + */ + function generate_get_all_google_fonts_ajax() { + // Bail if the nonce doesn't check out + if ( ! isset( $_POST[ 'gp_customize_nonce' ] ) || ! wp_verify_nonce( $_POST[ 'gp_customize_nonce' ], 'gp_customize_nonce' ) ) { + wp_die(); + } + + // Do another nonce check + check_ajax_referer( 'gp_customize_nonce', 'gp_customize_nonce' ); + + // Bail if user can't edit theme options + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die(); + } + + // Get all of our fonts + $fonts = apply_filters( 'generate_typography_customize_list', generate_get_all_google_fonts() ); + + // Send all of our fonts in JSON format + echo wp_json_encode( $fonts ); + + // Exit + die(); + } +} + +if ( ! function_exists( 'generate_get_google_font_variants' ) ) { + /** + * Wrapper function to find variants for chosen Google Fonts + * Example: generate_get_google_font_variation( 'Open Sans' ) + * + * @since 1.3.0 + */ + function generate_get_google_font_variants( $font, $key = '', $default = '' ) { + // Bail if we don't have our defaults function + if ( ! function_exists( 'generate_get_default_fonts' ) ) { + return; + } + + // Don't need variants if we're using a system font + if ( in_array( $font, generate_typography_default_fonts() ) ) { + return; + } + + // Return if we have our variants saved + if ( '' !== $key && get_theme_mod( $key . '_variants' ) ) { + return get_theme_mod( $key . '_variants' ); + } + + // Make sure we have defaults + if ( '' == $default ) { + $default = generate_get_default_fonts(); + } + + // If our default font is selected and the category isn't saved, we already know the category + if ( $default[ $key ] == $font ) { + return $default[ $key . '_variants' ]; + } + + // Grab all of our fonts + // It's a big list, so hopefully we're not even still reading + $fonts = generate_get_all_google_fonts(); + + // Get the ID from our font + $id = strtolower( str_replace( ' ', '_', $font ) ); + + // If the ID doesn't exist within our fonts, we can bail + if ( ! array_key_exists( $id, $fonts ) ) { + return; + } + + // Grab all of the variants associated with our font + $variants = $fonts[$id]['variants']; + + // Loop through them and put them into an array, then turn them into a comma separated list + $output = array(); + if ( $variants ) { + foreach ( $variants as $variant ) { + $output[] = $variant; + } + + return implode(',', apply_filters( 'generate_typography_variants', $output )); + } + } +} + +if ( ! function_exists( 'generate_get_google_font_category' ) ) { + /** + * Wrapper function to find the category for chosen Google Font + * Example: generate_get_google_font_category( 'Open Sans' ) + * + * @since 1.3.0 + */ + function generate_get_google_font_category( $font, $key = '', $default = '' ) { + // Bail if we don't have our defaults function + if ( ! function_exists( 'generate_get_default_fonts' ) ) { + return; + } + + // Don't need a category if we're using a system font + if ( in_array( $font, generate_typography_default_fonts() ) ) { + return; + } + + // Return if we have our variants saved + if ( '' !== $key && get_theme_mod( $key . '_category' ) ) { + return ', ' . get_theme_mod( $key . '_category' ); + } + + // Make sure we have defaults + if ( '' == $default ) { + $default = generate_get_default_fonts(); + } + + // If our default font is selected and the category isn't saved, we already know the category + if ( $default[ $key ] == $font ) { + return ', ' . $default[ $key . '_category' ]; + } + + // Get all of our fonts + // It's a big list, so hopefully we're not even still reading + $fonts = generate_get_all_google_fonts(); + + // Get the ID from our font + $id = strtolower( str_replace( ' ', '_', $font ) ); + + // If the ID doesn't exist within our fonts, we can bail + if ( ! array_key_exists( $id, $fonts ) ) { + return; + } + + // Let's grab our category to go with our font + $category = ! empty( $fonts[$id]['category'] ) ? ', ' . $fonts[$id]['category'] : ''; + + // Return it to be used by our function + return $category; + + } +} + +if ( ! function_exists( 'generate_get_font_family_css' ) ) { + /** + * Wrapper function to create font-family value for CSS. + * + * @since 1.3.0 + */ + function generate_get_font_family_css( $font, $settings, $default ) { + $generate_settings = wp_parse_args( + get_option( $settings, array() ), + $default + ); + + // We don't want to wrap quotes around these values + $no_quotes = array( + 'inherit', + 'Arial, Helvetica, sans-serif', + 'Georgia, Times New Roman, Times, serif', + 'Helvetica', + 'Impact', + 'Segoe UI, Helvetica Neue, Helvetica, sans-serif', + 'Tahoma, Geneva, sans-serif', + 'Trebuchet MS, Helvetica, sans-serif', + 'Verdana, Geneva, sans-serif', + apply_filters( 'generate_typography_system_stack', '-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"' ) + ); + + // Get our font + $font_family = $generate_settings[ $font ]; + + if ( 'System Stack' == $font_family ) { + $font_family = apply_filters( 'generate_typography_system_stack', '-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"' ); + } + + // If our value is still using the old format, fix it + if ( strpos( $font_family, ':' ) !== false ) { + $font_family = current( explode( ':', $font_family ) ); + } + + // Set up our wrapper + if ( in_array( $font_family, $no_quotes ) ) { + $wrapper_start = null; + $wrapper_end = null; + } else { + $wrapper_start = '"'; + $wrapper_end = '"' . generate_get_google_font_category( $font_family, $font, $default ); + } + + // Output the CSS + $output = ( 'inherit' == $font_family ) ? 'inherit' : $wrapper_start . $font_family . $wrapper_end; + return $output; + } +} + +if ( ! function_exists( 'generate_typography_customizer_live_preview' ) ) { + add_action( 'customize_preview_init', 'generate_typography_customizer_live_preview' ); + /** + * Add our live preview JS + */ + function generate_typography_customizer_live_preview() { + wp_enqueue_script( + 'generate-typography-customizer', + trailingslashit( plugin_dir_url( __FILE__ ) ) . 'js/customizer.js', + array( 'jquery','customize-preview' ), + GENERATE_FONT_VERSION, + true + ); + + wp_localize_script( 'generate-typography-customizer', 'gp_typography', array( + 'mobile' => generate_premium_get_media_query( 'mobile' ), + 'tablet' => generate_premium_get_media_query( 'tablet' ), + 'desktop' => generate_premium_get_media_query( 'desktop' ), + ) ); + } +} + +if ( ! function_exists( 'generate_typography_default_fonts' ) ) { + /** + * Get our system fonts + */ + function generate_typography_default_fonts() { + $fonts = array( + 'inherit', + 'System Stack', + 'Arial, Helvetica, sans-serif', + 'Century Gothic', + 'Comic Sans MS', + 'Courier New', + 'Georgia, Times New Roman, Times, serif', + 'Helvetica', + 'Impact', + 'Lucida Console', + 'Lucida Sans Unicode', + 'Palatino Linotype', + 'Segoe UI, Helvetica Neue, Helvetica, sans-serif', + 'Tahoma, Geneva, sans-serif', + 'Trebuchet MS, Helvetica, sans-serif', + 'Verdana, Geneva, sans-serif' + ); + + return apply_filters( 'generate_typography_default_fonts', $fonts ); + } +} + +if ( ! function_exists( 'generate_include_typography_defaults' ) ) { + /** + * Check if we should include our default.css file + * @since 1.3.42 + */ + function generate_include_typography_defaults() { + return true; + } +} + +if ( ! function_exists( 'generate_typography_premium_css_defaults' ) ) { + add_filter( 'generate_font_option_defaults', 'generate_typography_premium_css_defaults' ); + /** + * Add premium control defaults + * + * @since 1.3 + */ + function generate_typography_premium_css_defaults( $defaults ) { + $defaults['tablet_site_title_font_size'] = ''; + $defaults['tablet_navigation_font_size'] = ''; + $defaults['mobile_navigation_font_size'] = ''; + + $defaults['single_post_title_weight'] = ''; + $defaults['single_post_title_transform'] = ''; + $defaults['single_post_title_font_size'] = ''; + $defaults['single_post_title_font_size_mobile'] = ''; + $defaults['single_post_title_line_height'] = ''; + + $defaults['archive_post_title_weight'] = ''; + $defaults['archive_post_title_transform'] = ''; + $defaults['archive_post_title_font_size'] = ''; + $defaults['archive_post_title_font_size_mobile'] = ''; + $defaults['archive_post_title_line_height'] = ''; + + return $defaults; + } +} + +if ( ! function_exists( 'generate_typography_premium_css' ) ) { + add_action( 'wp_enqueue_scripts', 'generate_typography_premium_css', 100 ); + /** + * Add premium control CSS + * + * @since 1.3 + */ + function generate_typography_premium_css() { + if ( ! function_exists( 'generate_get_default_fonts' ) ) { + return; + } + + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_default_fonts() + ); + + // Initiate our CSS class + require_once GP_LIBRARY_DIRECTORY . 'class-make-css.php'; + $premium_css = new GeneratePress_Pro_CSS; + + $site_title_family = false; + if ( function_exists( 'generate_get_font_family_css' ) ) { + $site_title_family = generate_get_font_family_css( 'font_site_title', 'generate_settings', generate_get_default_fonts() ); + } + + $premium_css->set_selector( 'h1.entry-title' ); + $premium_css->add_property( 'font-weight', esc_attr( $generate_settings['single_post_title_weight'] ) ); + $premium_css->add_property( 'text-transform', esc_attr( $generate_settings['single_post_title_transform'] ) ); + + if ( '' !== $generate_settings['single_post_title_font_size'] ) { + $premium_css->add_property( 'font-size', absint( $generate_settings['single_post_title_font_size'] ), false, 'px' ); + } + + if ( '' !== $generate_settings['single_post_title_line_height'] ) { + $premium_css->add_property( 'line-height', floatval( $generate_settings['single_post_title_line_height'] ), false, 'em' ); + } + + $premium_css->set_selector( 'h2.entry-title' ); + $premium_css->add_property( 'font-weight', esc_attr( $generate_settings['archive_post_title_weight'] ) ); + $premium_css->add_property( 'text-transform', esc_attr( $generate_settings['archive_post_title_transform'] ) ); + + if ( '' !== $generate_settings['archive_post_title_font_size'] ) { + $premium_css->add_property( 'font-size', absint( $generate_settings['archive_post_title_font_size'] ), false, 'px' ); + } + + if ( '' !== $generate_settings['archive_post_title_line_height'] ) { + $premium_css->add_property( 'line-height', floatval( $generate_settings['archive_post_title_line_height'] ), false, 'em' ); + } + + $premium_css->set_selector( '.navigation-branding .main-title' ); + $premium_css->add_property( 'font-weight', esc_attr( $generate_settings['site_title_font_weight'] ) ); + $premium_css->add_property( 'text-transform', esc_attr( $generate_settings['site_title_font_transform'] ) ); + $premium_css->add_property( 'font-size', absint( $generate_settings['site_title_font_size'] ), false, 'px' ); + + if ( $site_title_family ) { + $premium_css->add_property( 'font-family', 'inherit' !== $generate_settings['font_site_title'] ? $site_title_family : null ); + } + + $premium_css->start_media_query( generate_premium_get_media_query( 'tablet' ) ); + if ( '' !== $generate_settings[ 'tablet_navigation_font_size' ] ) { + $premium_css->set_selector( '.main-navigation:not(.slideout-navigation) a, .menu-toggle' ); + $premium_css->add_property( 'font-size', absint( $generate_settings[ 'tablet_navigation_font_size' ] ), false, 'px' ); + + $tablet_subnav_font_size = $generate_settings['tablet_navigation_font_size'] - 1; + + if ( $generate_settings['tablet_navigation_font_size'] >= 17 ) { + $tablet_subnav_font_size = $generate_settings['tablet_navigation_font_size'] - 3; + } + + $premium_css->set_selector( '.main-navigation:not(.slideout-navigation) .main-nav ul ul li a' ); + $premium_css->add_property( 'font-size', absint( $tablet_subnav_font_size ), false, 'px' ); + } + + if ( '' !== $generate_settings['tablet_site_title_font_size'] ) { + $premium_css->set_selector( '.main-title, .navigation-branding .main-title' ); + $premium_css->add_property( 'font-size', absint( $generate_settings['tablet_site_title_font_size'] ), false, 'px' ); + } + $premium_css->stop_media_query(); + + $premium_css->start_media_query( generate_premium_get_media_query( 'mobile' ) ); + $premium_css->set_selector( 'h1.entry-title' ); + + if ( '' !== $generate_settings['single_post_title_font_size_mobile'] ) { + $premium_css->add_property( 'font-size', absint( $generate_settings['single_post_title_font_size_mobile'] ), false, 'px' ); + } + + $premium_css->set_selector( 'h2.entry-title' ); + + if ( '' !== $generate_settings['archive_post_title_font_size_mobile'] ) { + $premium_css->add_property( 'font-size', absint( $generate_settings['archive_post_title_font_size_mobile'] ), false, 'px' ); + } + $premium_css->stop_media_query(); + + $premium_css->start_media_query( generate_premium_get_media_query( 'mobile-menu' ) ); + if ( '' !== $generate_settings[ 'mobile_navigation_font_size' ] ) { + $premium_css->set_selector( '.main-navigation:not(.slideout-navigation) a, .menu-toggle' ); + $premium_css->add_property( 'font-size', absint( $generate_settings[ 'mobile_navigation_font_size' ] ), false, 'px' ); + + $mobile_subnav_font_size = $generate_settings['mobile_navigation_font_size'] - 1; + + if ( $generate_settings['mobile_navigation_font_size'] >= 17 ) { + $mobile_subnav_font_size = $generate_settings['mobile_navigation_font_size'] - 3; + } + + $premium_css->set_selector( '.main-navigation:not(.slideout-navigation) .main-nav ul ul li a' ); + $premium_css->add_property( 'font-size', absint( $mobile_subnav_font_size ), false, 'px' ); + } + + if ( '' !== $generate_settings['mobile_site_title_font_size'] ) { + $premium_css->set_selector( '.navigation-branding .main-title' ); + $premium_css->add_property( 'font-size', absint( $generate_settings['mobile_site_title_font_size'] ), false, 'px' ); + } + $premium_css->stop_media_query(); + + wp_add_inline_style( 'generate-style', $premium_css->css_output() ); + } +} diff --git a/wp-content/plugins/gp-premium/typography/functions/google-fonts.json b/wp-content/plugins/gp-premium/typography/functions/google-fonts.json new file mode 100644 index 0000000..a574abc --- /dev/null +++ b/wp-content/plugins/gp-premium/typography/functions/google-fonts.json @@ -0,0 +1,6835 @@ +[ + { + "family": "Roboto", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Open Sans", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ] + }, + { + "family": "Lato", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Slabo 27px", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Oswald", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Roboto Condensed", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Source Sans Pro", + "category": "sans-serif", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Montserrat", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Raleway", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "PT Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Roboto Slab", + "category": "serif", + "variants": [ + "100", + "300", + "regular", + "700" + ] + }, + { + "family": "Merriweather", + "category": "serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Open Sans Condensed", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "700" + ] + }, + { + "family": "Droid Sans", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Lora", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Ubuntu", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ] + }, + { + "family": "Droid Serif", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Playfair Display", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Arimo", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Noto Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "PT Serif", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Titillium Web", + "category": "sans-serif", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "900" + ] + }, + { + "family": "PT Sans Narrow", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Muli", + "category": "sans-serif", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Indie Flower", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Bitter", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Poppins", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Inconsolata", + "category": "monospace", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Dosis", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Fjalla One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Oxygen", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ] + }, + { + "family": "Hind", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Cabin", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Anton", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Arvo", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Noto Serif", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Crimson Text", + "category": "serif", + "variants": [ + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Lobster", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Yanone Kaffeesatz", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "700" + ] + }, + { + "family": "Nunito", + "category": "sans-serif", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Bree Serif", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Catamaran", + "category": "sans-serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Libre Baskerville", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Abel", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Josefin Sans", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Fira Sans", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Gloria Hallelujah", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Abril Fatface", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Exo 2", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Merriweather Sans", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "800", + "800italic" + ] + }, + { + "family": "Pacifico", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Roboto Mono", + "category": "monospace", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ] + }, + { + "family": "Varela Round", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Asap", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ] + }, + { + "family": "Amatic SC", + "category": "handwriting", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Quicksand", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "700" + ] + }, + { + "family": "Karla", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Ubuntu Condensed", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Signika", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "600", + "700" + ] + }, + { + "family": "Alegreya", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Questrial", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Rubik", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Shadows Into Light", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "PT Sans Caption", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Archivo Narrow", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Play", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Cuprum", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Dancing Script", + "category": "handwriting", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Rokkitt", + "category": "serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Work Sans", + "category": "sans-serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Francois One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Vollkorn", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Source Code Pro", + "category": "monospace", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "900" + ] + }, + { + "family": "Exo", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Maven Pro", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "700", + "900" + ] + }, + { + "family": "Architects Daughter", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Orbitron", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "700", + "900" + ] + }, + { + "family": "Pathway Gothic One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Acme", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Ropa Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Patua One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "EB Garamond", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Lobster Two", + "category": "display", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Crete Round", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Cinzel", + "category": "serif", + "variants": [ + "regular", + "700", + "900" + ] + }, + { + "family": "Josefin Slab", + "category": "serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Source Serif Pro", + "category": "serif", + "variants": [ + "regular", + "600", + "700" + ] + }, + { + "family": "Alegreya Sans", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Comfortaa", + "category": "display", + "variants": [ + "300", + "regular", + "700" + ] + }, + { + "family": "Russo One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "News Cycle", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "ABeeZee", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Yellowtail", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Noticia Text", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Monda", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Quattrocento Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Hammersmith One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Libre Franklin", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Satisfy", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Pontano Sans", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Righteous", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Poiret One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "BenchNine", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ] + }, + { + "family": "Arapey", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Kaushan Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Economica", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Kanit", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Old Standard TT", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Sanchez", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Courgette", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Quattrocento", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Domine", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Gudea", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Permanent Marker", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Armata", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Cantarell", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Archivo Black", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Istok Web", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Cardo", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Playfair Display SC", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Passion One", + "category": "display", + "variants": [ + "regular", + "700", + "900" + ] + }, + { + "family": "Tinos", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Cookie", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Cormorant Garamond", + "category": "serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Philosopher", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Yantramanav", + "category": "sans-serif", + "variants": [ + "100", + "300", + "regular", + "500", + "700", + "900" + ] + }, + { + "family": "Chewy", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Antic Slab", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Handlee", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Teko", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Boogaloo", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Vidaloka", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Audiowide", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Coming Soon", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Alfa Slab One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Cabin Condensed", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Ruda", + "category": "sans-serif", + "variants": [ + "regular", + "700", + "900" + ] + }, + { + "family": "Ek Mukta", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Changa One", + "category": "display", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Tangerine", + "category": "handwriting", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Great Vibes", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Sintony", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Khand", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Bevan", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Kalam", + "category": "handwriting", + "variants": [ + "300", + "regular", + "700" + ] + }, + { + "family": "Days One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Bangers", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rajdhani", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Droid Sans Mono", + "category": "monospace", + "variants": [ + "regular" + ] + }, + { + "family": "Kreon", + "category": "serif", + "variants": [ + "300", + "regular", + "700" + ] + }, + { + "family": "Rambla", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Shrikhand", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fredoka One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Shadows Into Light Two", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Playball", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Neuton", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "italic", + "700", + "800" + ] + }, + { + "family": "Copse", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Didact Gothic", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Signika Negative", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "600", + "700" + ] + }, + { + "family": "Amiri", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Gentium Book Basic", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Glegoo", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Oleo Script", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Voltaire", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Actor", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Amaranth", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Paytone One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Volkhov", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Sorts Mill Goudy", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Bad Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Coda", + "category": "display", + "variants": [ + "regular", + "800" + ] + }, + { + "family": "Damion", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Sacramento", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Squada One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rock Salt", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Adamina", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Alice", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Cantata One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Luckiest Guy", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rochester", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Covered By Your Grace", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Heebo", + "category": "sans-serif", + "variants": [ + "100", + "300", + "regular", + "500", + "700", + "800", + "900" + ] + }, + { + "family": "VT323", + "category": "monospace", + "variants": [ + "regular" + ] + }, + { + "family": "Nothing You Could Do", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Patrick Hand", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Gentium Basic", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Nobile", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Rancho", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Marck Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Special Elite", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Julius Sans One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Varela", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "PT Mono", + "category": "monospace", + "variants": [ + "regular" + ] + }, + { + "family": "Alex Brush", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Homemade Apple", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Scada", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Jura", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600" + ] + }, + { + "family": "Antic", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Gochi Hand", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Sarala", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Electrolize", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sigmar One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Candal", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Prata", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Homenaje", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Pinyon Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Unica One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Basic", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Neucha", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Convergence", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Molengo", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Caveat Brush", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Monoton", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Calligraffitti", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Kameron", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Share", + "category": "display", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Alegreya Sans SC", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Enriqueta", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Martel", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Black Ops One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Just Another Hand", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Caveat", + "category": "handwriting", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "PT Serif Caption", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Ultra", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Ubuntu Mono", + "category": "monospace", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Carme", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Cousine", + "category": "monospace", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Cherry Cream Soda", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Reenie Beanie", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Hind Siliguri", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Bubblegum Sans", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Aldrich", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Lustria", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Alef", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Freckle Face", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fanwood Text", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Advent Pro", + "category": "sans-serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Allura", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Ceviche One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Press Start 2P", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Overlock", + "category": "display", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Niconne", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Limelight", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Frank Ruhl Libre", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "700", + "900" + ] + }, + { + "family": "Allerta Stencil", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Marcellus", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Pragati Narrow", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Michroma", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Fauna One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Syncopate", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Telex", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Marvel", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Cabin Sketch", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Hanuman", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Cairo", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "900" + ] + }, + { + "family": "Chivo", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Allerta", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Fugaz One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Viga", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Ruslan Display", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Nixie One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Marmelad", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Average", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Spinnaker", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Leckerli One", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Judson", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Lusitana", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Montserrat Alternates", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Contrail One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Oranienbaum", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Hind Vadodara", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Rufina", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Quantico", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Concert One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Marcellus SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Jockey One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Parisienne", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Carter One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Arbutus Slab", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Slabo 13px", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Tauri", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Goudy Bookletter 1911", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Carrois Gothic", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sue Ellen Francisco", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Walter Turncoat", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Annie Use Your Telescope", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Puritan", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Grand Hotel", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Yesteryear", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Jaldi", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Khula", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "600", + "700", + "800" + ] + }, + { + "family": "Cinzel Decorative", + "category": "display", + "variants": [ + "regular", + "700", + "900" + ] + }, + { + "family": "Crafty Girls", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Merienda", + "category": "handwriting", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Hind Guntur", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Cutive", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Prompt", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Coustard", + "category": "serif", + "variants": [ + "regular", + "900" + ] + }, + { + "family": "Arima Madurai", + "category": "display", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "700", + "800", + "900" + ] + }, + { + "family": "Doppio One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Radley", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Fontdiner Swanky", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Iceland", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Alegreya SC", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ] + }, + { + "family": "Halant", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Schoolbell", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Waiting for the Sunrise", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Italianno", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Fredericka the Great", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Average Sans", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Rosario", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Mr Dafoe", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Port Lligat Slab", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Aclonica", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Graduate", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Racing Sans One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Berkshire Swash", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Forum", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Anonymous Pro", + "category": "monospace", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Love Ya Like A Sister", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Nunito Sans", + "category": "sans-serif", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Magra", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Lateef", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Assistant", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800" + ] + }, + { + "family": "Six Caps", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Gilda Display", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Oregano", + "category": "display", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Metrophobic", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Lalezar", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Caudex", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Kelly Slab", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Reem Kufi", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Cambay", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Gruppo", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Give You Glory", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "GFS Didot", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Duru Sans", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Andika", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Tenor Sans", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Knewave", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Averia Serif Libre", + "category": "display", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Eczar", + "category": "serif", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Inder", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Martel Sans", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Trocchi", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Wire One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Petit Formal Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Mako", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Frijole", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Zeyada", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Slackey", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Karma", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Mate", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Belleza", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Montez", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Quando", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Capriola", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Lilita One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Trirong", + "category": "serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Lekton", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Just Me Again Down Here", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Bowlby One SC", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "The Girl Next Door", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Happy Monkey", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Merienda One", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Alike", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Chelsea Market", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Unkempt", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Anaheim", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Strait", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Brawler", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Clicker Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Delius", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Mouse Memoirs", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "IM Fell Double Pica", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Crushed", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rammetto One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Prosto One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Kranky", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "IM Fell English", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Aladin", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Mr De Haviland", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "NTR", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Londrina Solid", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Skranji", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Allan", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Baumans", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ovo", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Changa", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Lemon", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Federo", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Herr Von Muellerhoff", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Arizonia", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Bowlby One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Orienta", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Short Stack", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Bungee Inline", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Andada", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Baloo Paaji", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Oxygen Mono", + "category": "monospace", + "variants": [ + "regular" + ] + }, + { + "family": "Yeseva One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "UnifrakturMaguntia", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Bentham", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Londrina Outline", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Pompiere", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Gabriela", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Qwigley", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Square", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Poly", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Sniglet", + "category": "display", + "variants": [ + "regular", + "800" + ] + }, + { + "family": "Patrick Hand SC", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Gravitas One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Khmer", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Shojumaru", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Kurale", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Gafata", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Biryani", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Cambo", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Titan One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Carrois Gothic SC", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "La Belle Aurore", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Holtwood One SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Oleo Script Swash Caps", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Headland One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Cherry Swash", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Belgrano", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Norican", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Mountains of Christmas", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Julee", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Ramabhadra", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Mallanna", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Kristi", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Imprima", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Lily Script One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Chau Philomene One", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Bilbo Swash Caps", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Finger Paint", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Voces", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Itim", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Megrim", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Simonetta", + "category": "display", + "variants": [ + "regular", + "italic", + "900", + "900italic" + ] + }, + { + "family": "Cutive Mono", + "category": "monospace", + "variants": [ + "regular" + ] + }, + { + "family": "Stardos Stencil", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "IM Fell DW Pica", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Unna", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Loved by the King", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Prociono", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Corben", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Amiko", + "category": "sans-serif", + "variants": [ + "regular", + "600", + "700" + ] + }, + { + "family": "Denk One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Palanquin", + "category": "sans-serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Baloo", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fondamento", + "category": "handwriting", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Seaweed Script", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Shanti", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Wendy One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Raleway Dots", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Amethysta", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Vast Shadow", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Stalemate", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Fira Mono", + "category": "monospace", + "variants": [ + "regular", + "500", + "700" + ] + }, + { + "family": "Expletus Sans", + "category": "display", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Scheherazade", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Fenix", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Delius Swash Caps", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Rouge Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Life Savers", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "IM Fell English SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Meddon", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Tienne", + "category": "serif", + "variants": [ + "regular", + "700", + "900" + ] + }, + { + "family": "Over the Rainbow", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Share Tech Mono", + "category": "monospace", + "variants": [ + "regular" + ] + }, + { + "family": "Abhaya Libre", + "category": "serif", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Kotta One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Pridi", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Euphoria Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Engagement", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Podkova", + "category": "serif", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Salsa", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Sofia", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Suranna", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Mada", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "900" + ] + }, + { + "family": "Chonburi", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ledger", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Italiana", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Dawning of a New Day", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Nokora", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Angkor", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Medula One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Taviraj", + "category": "serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Vampiro One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Englebert", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Mono", + "category": "monospace", + "variants": [ + "regular" + ] + }, + { + "family": "Dorsa", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Averia Sans Libre", + "category": "display", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Cedarville Cursive", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Geo", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Rationale", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Balthazar", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sunshiney", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Aguafina Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Mystery Quest", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fjord One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Fira Sans Extra Condensed", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Kadwa", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "McLaren", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rye", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Sail", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Athiti", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Rosarivo", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Kite One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Odor Mean Chey", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Numans", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Artifika", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Poller One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Gurajada", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Inika", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Mandali", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Bungee Shade", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Suwannaphum", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Mate SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Creepster", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Arsenal", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Montserrat Subrayada", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Metamorphous", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Palanquin Dark", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Coda Caption", + "category": "sans-serif", + "variants": [ + "800" + ] + }, + { + "family": "Dynalight", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Maitree", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "IM Fell French Canon", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Amarante", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Quintessential", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Codystar", + "category": "display", + "variants": [ + "300", + "regular" + ] + }, + { + "family": "Cantora One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Aref Ruqaa", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Griffy", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Revalia", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Buenard", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Donegal One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "IM Fell DW Pica SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Habibi", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Share Tech", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Flamenco", + "category": "display", + "variants": [ + "300", + "regular" + ] + }, + { + "family": "Mitr", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Maiden Orange", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Diplomata SC", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Cormorant", + "category": "serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Delius Unicase", + "category": "handwriting", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Stoke", + "category": "serif", + "variants": [ + "300", + "regular" + ] + }, + { + "family": "Vibur", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Sarpanch", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Baloo Bhaina", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Baloo Tamma", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Averia Libre", + "category": "display", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Esteban", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Battambang", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Bokor", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Wallpoet", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "IM Fell Great Primer", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Tulpen One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Proza Libre", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ] + }, + { + "family": "IM Fell French Canon SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Vesper Libre", + "category": "serif", + "variants": [ + "regular", + "500", + "700", + "900" + ] + }, + { + "family": "Rozha One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sansita", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Kavoon", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Della Respira", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Milonga", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Condiment", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Junge", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "New Rocker", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Chicle", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Mrs Saint Delafield", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "League Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Miniver", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Galindo", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Moul", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Amatica SC", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Stint Ultra Expanded", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Yrsa", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Stint Ultra Condensed", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Suez One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Text Me One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Buda", + "category": "display", + "variants": [ + "300" + ] + }, + { + "family": "Ruluko", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sonsie One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Krona One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Elsie", + "category": "display", + "variants": [ + "regular", + "900" + ] + }, + { + "family": "Pangolin", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Linden Hill", + "category": "serif", + "variants": [ + "regular", + "italic" + ] + }, + { + "family": "Secular One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "IM Fell Double Pica SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Alike Angular", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sancreek", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Bilbo", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Antic Didone", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Paprika", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Asul", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "David Libre", + "category": "serif", + "variants": [ + "regular", + "500", + "700" + ] + }, + { + "family": "Almendra", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Sriracha", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Miriam Libre", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Ribeye", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Swanky and Moo Moo", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Trade Winds", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Overlock SC", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Round", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Cagliostro", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Glass Antiqua", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Offside", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "El Messiri", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Bigshot One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "IM Fell Great Primer SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Akronim", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fira Sans Condensed", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Nosifer", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Autour One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Pirata One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Port Lligat Sans", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Scope One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sumana", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Lemonada", + "category": "display", + "variants": [ + "300", + "regular", + "600", + "700" + ] + }, + { + "family": "Montaga", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Iceberg", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ruthie", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Content", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Henny Penny", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Slim", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Hind Madurai", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Harmattan", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "UnifrakturCook", + "category": "display", + "variants": [ + "700" + ] + }, + { + "family": "Sarina", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Bubbler One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Dekko", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Redressed", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Laila", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Faster One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Arya", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Peralta", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Meie Script", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Overpass", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ] + }, + { + "family": "Monsieur La Doulaise", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Bungee", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Snippet", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Emilys Candy", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Trykker", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "MedievalSharp", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Space Mono", + "category": "monospace", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Croissant One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Monofett", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Lovers Quarrel", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Oldenburg", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Galdeano", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Spicy Rice", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Wellfleet", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Germania One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "GFS Neohellenic", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ] + }, + { + "family": "Baloo Thambi", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Jolly Lodger", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rubik Mono One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Pattaya", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Joti One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Siemreap", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ranga", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Chango", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Miltonian Tattoo", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Koulen", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Eagle Lake", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Flat", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Petrona", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Jacques Francois", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Amita", + "category": "handwriting", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Plaster", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ramaraja", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Sura", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Kenia", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fresca", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Jomhuria", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Lancelot", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Pavanam", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Rum Raisin", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Almendra SC", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Purple Purse", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Kumar One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Modern Antiqua", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Piedra", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Irish Grover", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Molle", + "category": "handwriting", + "variants": [ + "italic" + ] + }, + { + "family": "Cormorant Infant", + "category": "serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ] + }, + { + "family": "Margarine", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Sahitya", + "category": "serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Mukta Vaani", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Astloch", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Snowburst One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rhodium Libre", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Smythe", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Asset", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ewert", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Keania One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ranchers", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Gorditas", + "category": "display", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Sirin Stencil", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Averia Gruesa Libre", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Trochut", + "category": "display", + "variants": [ + "regular", + "italic", + "700" + ] + }, + { + "family": "Baloo Chettan", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Kdam Thmor", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Timmana", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Original Surfer", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Supermercado One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Mirza", + "category": "display", + "variants": [ + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Passero One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Oval", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Caesar Dressing", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Taprom", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fascinate", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Seymour One", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Freehand", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ravi Prakash", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Coiny", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Atomic Age", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Jacques Francois Shadow", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Diplomata", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Dr Sugiyama", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Miltonian", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ribeye Marrow", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Elsie Swash Caps", + "category": "display", + "variants": [ + "regular", + "900" + ] + }, + { + "family": "Felipa", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Galada", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Script", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Bayon", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Underdog", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Devonshire", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Atma", + "category": "display", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Londrina Shadow", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Sofadi One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Tillana", + "category": "handwriting", + "variants": [ + "regular", + "500", + "600", + "700", + "800" + ] + }, + { + "family": "Inknut Antiqua", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ] + }, + { + "family": "Goblin One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rakkas", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Metal", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Farsan", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Londrina Sketch", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Nova Cut", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "BioRhyme", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "700", + "800" + ] + }, + { + "family": "Warnes", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Romanesco", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Fascinate Inline", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Mrs Sheppards", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Princess Sofia", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Modak", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Spirax", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Cormorant Upright", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Geostar Fill", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Cormorant SC", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Baloo Bhai", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Sree Krushnadevaraya", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Smokum", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Arbutus", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fruktur", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Geostar", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Marko One", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Erica One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Yatra One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Uncial Antiqua", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Combo", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Gidugu", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Aubrey", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Jim Nightshade", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Butterfly Kids", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Metal Mania", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Macondo", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Chenla", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Miss Fajardose", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Macondo Swash Caps", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Barrio", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Sevillana", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Bigelow Rules", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Rasa", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Risque", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Federant", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Dangrek", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Chathura", + "category": "sans-serif", + "variants": [ + "100", + "300", + "regular", + "700", + "800" + ] + }, + { + "family": "Almendra Display", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Chela One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Bonbon", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Stalinist One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Mr Bedfort", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Eater", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Fasthand", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Mogra", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Padauk", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ] + }, + { + "family": "Preahvihear", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Flavors", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Ruge Boogie", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Tenali Ramakrishna", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Unlock", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Butcherman", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Baloo Da", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Lakki Reddy", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Cormorant Unicase", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ] + }, + { + "family": "Katibeh", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Asar", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Emblema One", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Moulpali", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Meera Inimai", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Kantumruy", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ] + }, + { + "family": "Suravaram", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Bungee Hairline", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Overpass Mono", + "category": "monospace", + "variants": [ + "300", + "regular", + "600", + "700" + ] + }, + { + "family": "Peddana", + "category": "serif", + "variants": [ + "regular" + ] + }, + { + "family": "Bahiana", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Kumar One Outline", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Hanalei Fill", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Dhurjati", + "category": "sans-serif", + "variants": [ + "regular" + ] + }, + { + "family": "Hanalei", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "Kavivanar", + "category": "handwriting", + "variants": [ + "regular" + ] + }, + { + "family": "Bungee Outline", + "category": "display", + "variants": [ + "regular" + ] + }, + { + "family": "BioRhyme Expanded", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "700", + "800" + ] + } +] diff --git a/wp-content/plugins/gp-premium/typography/functions/js/customizer.js b/wp-content/plugins/gp-premium/typography/functions/js/customizer.js new file mode 100644 index 0000000..a396822 --- /dev/null +++ b/wp-content/plugins/gp-premium/typography/functions/js/customizer.js @@ -0,0 +1,247 @@ +function gp_premium_typography_live_update( id, selector, property, unit, media, settings ) { + settings = typeof settings !== 'undefined' ? settings : 'generate_settings'; + wp.customize( settings + '[' + id + ']', function( value ) { + value.bind( function( newval ) { + // Get our unit if applicable + unit = typeof unit !== 'undefined' ? unit : ''; + + var isTablet = ( 'tablet' == id.substring( 0, 6 ) ) ? true : false, + isMobile = ( 'mobile' == id.substring( 0, 6 ) ) ? true : false; + + if ( isTablet ) { + if ( '' == wp.customize(settings + '[' + id + ']').get() ) { + var desktopID = id.replace( 'tablet_', '' ); + newval = wp.customize(settings + '[' + desktopID + ']').get(); + } + } + + if ( isMobile ) { + if ( '' == wp.customize(settings + '[' + id + ']').get() ) { + var desktopID = id.replace( 'mobile_', '' ); + newval = wp.customize(settings + '[' + desktopID + ']').get(); + } + } + + if ( 'buttons_font_size' == id && '' == wp.customize('generate_settings[buttons_font_size]').get() ) { + newval = wp.customize('generate_settings[body_font_size]').get(); + } + + if ( 'single_post_title_weight' == id && '' == wp.customize('generate_settings[single_post_title_weight]').get() ) { + newval = wp.customize('generate_settings[heading_1_weight]').get(); + } + + if ( 'single_post_title_transform' == id && '' == wp.customize('generate_settings[single_post_title_transform]').get() ) { + newval = wp.customize('generate_settings[heading_1_transform]').get(); + } + + if ( 'archive_post_title_weight' == id && '' == wp.customize('generate_settings[archive_post_title_weight]').get() ) { + newval = wp.customize('generate_settings[heading_2_weight]').get(); + } + + if ( 'archive_post_title_transform' == id && '' == wp.customize('generate_settings[archive_post_title_transform]').get() ) { + newval = wp.customize('generate_settings[heading_2_transform]').get(); + } + + // We're using a desktop value + if ( ! isTablet && ! isMobile ) { + + var tabletValue = ( typeof wp.customize(settings + '[tablet_' + id + ']') !== 'undefined' ) ? wp.customize(settings + '[tablet_' + id + ']').get() : '', + mobileValue = ( typeof wp.customize(settings + '[mobile_' + id + ']') !== 'undefined' ) ? wp.customize(settings + '[mobile_' + id + ']').get() : ''; + + // The tablet setting exists, mobile doesn't + if ( '' !== tabletValue && '' == mobileValue ) { + media = gp_typography.desktop + ', ' + gp_typography.mobile; + } + + // The tablet setting doesn't exist, mobile does + if ( '' == tabletValue && '' !== mobileValue ) { + media = gp_typography.desktop + ', ' + gp_typography.tablet; + } + + // The tablet setting doesn't exist, neither does mobile + if ( '' == tabletValue && '' == mobileValue ) { + media = gp_typography.desktop + ', ' + gp_typography.tablet + ', ' + gp_typography.mobile; + } + + } + + // Check if media query + media_query = typeof media !== 'undefined' ? 'media="' + media + '"' : ''; + + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#' + id ).not( ':last' ).remove(); + }, 1000); + + setTimeout("jQuery('body').trigger('generate_spacing_updated');", 1000); + } ); + } ); +} + +/** + * Body font size, weight and transform + */ +gp_premium_typography_live_update( 'body_font_size', 'body, button, input, select, textarea', 'font-size', 'px' ); +gp_premium_typography_live_update( 'body_line_height', 'body', 'line-height', '' ); +gp_premium_typography_live_update( 'paragraph_margin', 'p, .entry-content > [class*="wp-block-"]:not(:last-child)', 'margin-bottom', 'em' ); +gp_premium_typography_live_update( 'body_font_weight', 'body, button, input, select, textarea', 'font-weight' ); +gp_premium_typography_live_update( 'body_font_transform', 'body, button, input, select, textarea', 'text-transform' ); + +/** + * Top bar font size, weight and transform + */ +gp_premium_typography_live_update( 'top_bar_font_size', '.top-bar', 'font-size', 'px' ); +gp_premium_typography_live_update( 'top_bar_font_weight', '.top-bar', 'font-weight' ); +gp_premium_typography_live_update( 'top_bar_font_transform', '.top-bar', 'text-transform' ); + +/** + * Site title font size, weight and transform + */ +gp_premium_typography_live_update( 'site_title_font_size', '.main-title, .navigation-branding .main-title', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'tablet_site_title_font_size', '.main-title, .navigation-branding .main-title', 'font-size', 'px', gp_typography.tablet ); +gp_premium_typography_live_update( 'mobile_site_title_font_size', '.main-title, .navigation-branding .main-title', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'site_title_font_weight', '.main-title, .navigation-branding .main-title', 'font-weight' ); +gp_premium_typography_live_update( 'site_title_font_transform', '.main-title, .navigation-branding .main-title', 'text-transform' ); + +/** + * Site description font size, weight and transform + */ +gp_premium_typography_live_update( 'site_tagline_font_size', '.site-description', 'font-size', 'px' ); +gp_premium_typography_live_update( 'site_tagline_font_weight', '.site-description', 'font-weight' ); +gp_premium_typography_live_update( 'site_tagline_font_transform', '.site-description', 'text-transform' ); + +/** + * Main navigation font size, weight and transform + */ +gp_premium_typography_live_update( 'navigation_font_size', '.main-navigation a, .menu-toggle', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'tablet_navigation_font_size', '.main-navigation a, .menu-toggle', 'font-size', 'px', gp_typography.tablet ); +gp_premium_typography_live_update( 'mobile_navigation_font_size', '.main-navigation:not(.slideout-navigation) a, .menu-toggle', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'navigation_font_weight', '.main-navigation a, .menu-toggle', 'font-weight' ); +gp_premium_typography_live_update( 'navigation_font_transform', '.main-navigation a, .menu-toggle', 'text-transform' ); + +/** + * Site title when in navigation. + */ + gp_premium_typography_live_update( 'navigation_site_title_font_size', '.navigation-branding .main-title', 'font-size', 'px', gp_typography.desktop ); + gp_premium_typography_live_update( 'tablet_navigation_site_title_font_size', '.navigation-branding .main-title', 'font-size', 'px', gp_typography.tablet ); + gp_premium_typography_live_update( 'mobile_navigation_site_title_font_size', '.navigation-branding .main-title', 'font-size', 'px', gp_typography.mobile ); + +/** + * Secondary navigation font size, weight and transform + */ +gp_premium_typography_live_update( 'secondary_navigation_font_size', '.secondary-navigation .main-nav ul li a,.secondary-navigation .menu-toggle, .secondary-navigation .top-bar', 'font-size', 'px', '', 'generate_secondary_nav_settings' ); +gp_premium_typography_live_update( 'secondary_navigation_font_weight', '.secondary-navigation .main-nav ul li a,.secondary-navigation .menu-toggle, .secondary-navigation .top-bar', 'font-weight', '', '', 'generate_secondary_nav_settings' ); +gp_premium_typography_live_update( 'secondary_navigation_font_transform', '.secondary-navigation .main-nav ul li a,.secondary-navigation .menu-toggle, .secondary-navigation .top-bar', 'text-transform', '', '', 'generate_secondary_nav_settings' ); + +/** + * Buttons + */ +gp_premium_typography_live_update( 'buttons_font_size', 'button:not(.menu-toggle),html input[type="button"],input[type="reset"],input[type="submit"],.button,.button:visited,.wp-block-button .wp-block-button__link,.woocommerce #respond input#submit, .woocommerce a.button, .woocommerce button.button, .woocommerce input.button', 'font-size', 'px' ); +gp_premium_typography_live_update( 'buttons_font_weight', 'button:not(.menu-toggle),html input[type="button"],input[type="reset"],input[type="submit"],.button,.button:visited,.wp-block-button .wp-block-button__link,.woocommerce #respond input#submit, .woocommerce a.button, .woocommerce button.button, .woocommerce input.button', 'font-weight' ); +gp_premium_typography_live_update( 'buttons_font_transform', 'button:not(.menu-toggle),html input[type="button"],input[type="reset"],input[type="submit"],.button,.button:visited,.wp-block-button .wp-block-button__link,.woocommerce #respond input#submit, .woocommerce a.button, .woocommerce button.button, .woocommerce input.button', 'text-transform' ); + +/** + * H1 font size, weight and transform + */ +gp_premium_typography_live_update( 'heading_1_font_size', 'h1', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'mobile_heading_1_font_size', 'h1', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'heading_1_weight', 'h1', 'font-weight' ); +gp_premium_typography_live_update( 'heading_1_transform', 'h1', 'text-transform' ); +gp_premium_typography_live_update( 'heading_1_line_height', 'h1', 'line-height', 'em' ); +gp_premium_typography_live_update( 'heading_1_margin_bottom', 'h1', 'margin-bottom', 'px' ); + +/** + * Single content title (h1) + */ +gp_premium_typography_live_update( 'single_post_title_font_size', 'h1.entry-title', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'single_post_title_font_size_mobile', 'h1.entry-title', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'single_post_title_weight', 'h1.entry-title', 'font-weight' ); +gp_premium_typography_live_update( 'single_post_title_transform', 'h1.entry-title', 'text-transform' ); +gp_premium_typography_live_update( 'single_post_title_line_height', 'h1.entry-title', 'line-height', 'em' ); + +/** + * H2 font size, weight and transform + */ +gp_premium_typography_live_update( 'heading_2_font_size', 'h2', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'mobile_heading_2_font_size', 'h2', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'heading_2_weight', 'h2', 'font-weight' ); +gp_premium_typography_live_update( 'heading_2_transform', 'h2', 'text-transform' ); +gp_premium_typography_live_update( 'heading_2_line_height', 'h2', 'line-height', 'em' ); +gp_premium_typography_live_update( 'heading_2_margin_bottom', 'h2', 'margin-bottom', 'px' ); + +/** + * Archive post title (h1) + */ +gp_premium_typography_live_update( 'archive_post_title_font_size', 'h2.entry-title', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'archive_post_title_font_size_mobile', 'h2.entry-title', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'archive_post_title_weight', 'h2.entry-title', 'font-weight' ); +gp_premium_typography_live_update( 'archive_post_title_transform', 'h2.entry-title', 'text-transform' ); +gp_premium_typography_live_update( 'archive_post_title_line_height', 'h2.entry-title', 'line-height', 'em' ); + +/** + * H3 font size, weight and transform + */ +gp_premium_typography_live_update( 'heading_3_font_size', 'h3', 'font-size', 'px' ); +gp_premium_typography_live_update( 'heading_3_weight', 'h3', 'font-weight' ); +gp_premium_typography_live_update( 'heading_3_transform', 'h3', 'text-transform' ); +gp_premium_typography_live_update( 'heading_3_line_height', 'h3', 'line-height', 'em' ); +gp_premium_typography_live_update( 'heading_3_margin_bottom', 'h3', 'margin-bottom', 'px' ); + +/** + * H4 font size, weight and transform + */ +gp_premium_typography_live_update( 'heading_4_font_size', 'h4', 'font-size', 'px' ); +gp_premium_typography_live_update( 'heading_4_weight', 'h4', 'font-weight' ); +gp_premium_typography_live_update( 'heading_4_transform', 'h4', 'text-transform' ); +gp_premium_typography_live_update( 'heading_4_line_height', 'h4', 'line-height', 'em' ); + +/** + * H5 font size, weight and transform + */ +gp_premium_typography_live_update( 'heading_5_font_size', 'h5', 'font-size', 'px' ); +gp_premium_typography_live_update( 'heading_5_weight', 'h5', 'font-weight' ); +gp_premium_typography_live_update( 'heading_5_transform', 'h5', 'text-transform' ); +gp_premium_typography_live_update( 'heading_5_line_height', 'h5', 'line-height', 'em' ); + +/** + * H6 font size, weight and transform + */ +gp_premium_typography_live_update( 'heading_6_font_size', 'h6', 'font-size', 'px' ); +gp_premium_typography_live_update( 'heading_6_weight', 'h6', 'font-weight' ); +gp_premium_typography_live_update( 'heading_6_transform', 'h6', 'text-transform' ); +gp_premium_typography_live_update( 'heading_6_line_height', 'h6', 'line-height', 'em' ); + +/** + * Widget title font size, weight and transform + */ +gp_premium_typography_live_update( 'widget_title_font_size', '.widget-title', 'font-size', 'px' ); +gp_premium_typography_live_update( 'widget_title_font_weight', '.widget-title', 'font-weight' ); +gp_premium_typography_live_update( 'widget_title_font_transform', '.widget-title', 'text-transform' ); +gp_premium_typography_live_update( 'widget_title_separator', '.widget-title', 'margin-bottom', 'px' ); +gp_premium_typography_live_update( 'widget_content_font_size', '.sidebar .widget, .footer-widgets .widget', 'font-size', 'px' ); + +/** + * Footer font size, weight and transform + */ +gp_premium_typography_live_update( 'footer_font_size', '.site-info', 'font-size', 'px' ); +gp_premium_typography_live_update( 'footer_weight', '.site-info', 'font-weight' ); +gp_premium_typography_live_update( 'footer_transform', '.site-info', 'text-transform' ); +gp_premium_typography_live_update( 'footer_line_height', '.site-info', 'line-height', 'em' ); + +/** + * WooCommerce product title + */ +gp_premium_typography_live_update( 'wc_product_title_font_size', '.woocommerce ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce ul.products li.product .woocommerce-loop-category__title', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'mobile_wc_product_title_font_size', '.woocommerce ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce ul.products li.product .woocommerce-loop-category__title', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'wc_product_title_font_weight', '.woocommerce ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce ul.products li.product .woocommerce-loop-category__title', 'font-weight' ); +gp_premium_typography_live_update( 'wc_product_title_font_transform', '.woocommerce ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce ul.products li.product .woocommerce-loop-category__title', 'text-transform' ); + +gp_premium_typography_live_update( 'wc_related_product_title_font_size', '.woocommerce .up-sells ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce .cross-sells ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce .related ul.products li.product .woocommerce-LoopProduct-link h2', 'font-size', 'px' ); + +/** + * Slideout navigation font size, weight and transform + */ +gp_premium_typography_live_update( 'slideout_font_size', '.slideout-navigation.main-navigation .main-nav ul li a', 'font-size', 'px', gp_typography.desktop ); +gp_premium_typography_live_update( 'slideout_mobile_font_size', '.slideout-navigation.main-navigation .main-nav ul li a', 'font-size', 'px', gp_typography.mobile ); +gp_premium_typography_live_update( 'slideout_font_weight', '.slideout-navigation.main-navigation .main-nav ul li a', 'font-weight' ); +gp_premium_typography_live_update( 'slideout_font_transform', '.slideout-navigation.main-navigation .main-nav ul li a', 'text-transform' ); diff --git a/wp-content/plugins/gp-premium/typography/functions/migration.php b/wp-content/plugins/gp-premium/typography/functions/migration.php new file mode 100644 index 0000000..7ec3176 --- /dev/null +++ b/wp-content/plugins/gp-premium/typography/functions/migration.php @@ -0,0 +1,360 @@ + $generate_settings[ $setting ], + 'variants' => $variants, + 'category' => $category ? $category : 'sans-serif', + ); + } + + if ( function_exists( 'generate_secondary_nav_get_defaults' ) ) { + $secondary_nav_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + $secondary_nav_id = strtolower( str_replace( ' ', '_', $secondary_nav_settings[ 'font_secondary_navigation' ] ) ); + + if ( ! array_key_exists( $secondary_nav_id, $select_fonts ) && ! in_array( $secondary_nav_settings[ 'font_secondary_navigation' ], generate_typography_default_fonts() ) ) { + $variants = get_theme_mod( 'font_secondary_navigation_variants', array() ); + $category = get_theme_mod( 'font_secondary_navigation_category' ); + + if ( ! empty( $variants ) && ! is_array( $variants ) ) { + $variants = explode( ',', $variants ); + } + + if ( ! $variants ) { + if ( ! $all_fonts ) { + $all_fonts = generate_get_all_google_fonts(); + } + + if ( array_key_exists( $secondary_nav_id, $all_fonts ) ) { + $variants = $all_fonts[ $secondary_nav_id ]['variants']; + } + } + + if ( ! $category ) { + if ( ! $all_fonts ) { + $all_fonts = generate_get_all_google_fonts(); + } + + if ( array_key_exists( $secondary_nav_id, $all_fonts ) ) { + $category = $all_fonts[ $secondary_nav_id ]['category']; + } + } + + $fonts[ $secondary_nav_id ] = array( + 'name' => $secondary_nav_settings[ 'font_secondary_navigation' ], + 'variants' => $variants, + 'category' => $category ? $category : 'sans-serif', + ); + } + } + + return $fonts; + } +} + +if ( ! function_exists( 'generate_typography_set_font_data' ) ) { + add_action( 'admin_init', 'generate_typography_set_font_data' ); + /** + * This function will check to see if your category and variants are saved + * If not, it will set them for you, and won't run again + * + * @since 1.2.90 + */ + function generate_typography_set_font_data() { + // Bail if we don't have our defaults + if ( ! function_exists( 'generate_get_default_fonts' ) ) { + return; + } + + // Get our defaults + $defaults = generate_get_default_fonts(); + + // Get our settings + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_default_fonts() + ); + + // We need to loop through these settings + $font_settings = array( + 'font_body', + 'font_site_title', + 'font_site_tagline', + 'font_navigation', + 'font_widget_title', + 'font_heading_1', + 'font_heading_2', + 'font_heading_3' + ); + + // Add secondary navigation to the array last if it exists + if ( function_exists( 'generate_secondary_nav_get_defaults' ) ) { + $font_settings[ 'font_secondary_navigation' ] = 'font_secondary_navigation'; + } + + // Start looping + foreach( $font_settings as $setting ) { + + // Change our variables for the secondary navigation - this will run last + if ( function_exists( 'generate_secondary_nav_get_defaults' ) && 'font_secondary_navigation' == $setting ) { + $generate_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + $defaults = generate_secondary_nav_get_defaults(); + } + + // We don't need to do this if we're using the default font, as these values have defaults already + if ( $defaults[ $setting ] == $generate_settings[ $setting ] ) { + continue; + } + + // Don't need to continue if we're using a system font or our default font + if ( in_array( $generate_settings[ $setting ], generate_typography_default_fonts() ) || 'Open Sans' == $generate_settings[ $setting ] ) { + continue; + } + + // Don't continue if our category and variants are already set + if ( get_theme_mod( $setting . '_category' ) && get_theme_mod( $setting . '_variants' ) ) { + continue; + } + + // Get all of our fonts + $fonts = generate_get_all_google_fonts(); + + // Get the ID from our font + $id = strtolower( str_replace( ' ', '_', $generate_settings[ $setting ] ) ); + + // If the ID doesn't exist within our fonts, we can bail + if ( ! array_key_exists( $id, $fonts ) ) { + continue; + } + + // Let's grab our category to go with our font + $category = ! empty( $fonts[$id]['category'] ) ? $fonts[$id]['category'] : ''; + + // Grab all of the variants associated with our font + $variants = $fonts[$id]['variants']; + + // Loop through our variants and put them into an array, then turn them into a comma separated list + $output = array(); + if ( $variants ) { + foreach ( $variants as $variant ) { + $output[] = $variant; + } + + $variants = implode( ',', $output ); + } + + // Set our theme mods with our new settings + if ( '' !== $category ) { + set_theme_mod( $setting . '_category', $category ); + } + + if ( '' !== $variants ) { + set_theme_mod( $setting . '_variants', $variants ); + } + } + } +} diff --git a/wp-content/plugins/gp-premium/typography/functions/secondary-nav-fonts.php b/wp-content/plugins/gp-premium/typography/functions/secondary-nav-fonts.php new file mode 100644 index 0000000..7f18693 --- /dev/null +++ b/wp-content/plugins/gp-premium/typography/functions/secondary-nav-fonts.php @@ -0,0 +1,177 @@ +get_section( 'secondary_nav_section' ) ) { + return; + } + + // Get our controls + require_once GP_LIBRARY_DIRECTORY . 'customizer-helpers.php'; + + // Get our defaults + $defaults = generate_secondary_nav_get_defaults(); + + // Register our custom controls + if ( method_exists( $wp_customize,'register_control_type' ) ) { + $wp_customize->register_control_type( 'GeneratePress_Pro_Typography_Customize_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Pro_Range_Slider_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Section_Shortcut_Control' ); + } + + // Add our section + $wp_customize->add_section( + 'secondary_font_section', + array( + 'title' => __( 'Secondary Navigation', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'description' => '', + 'priority' => 51, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_secondary_navigation_typography_shortcuts', + array( + 'section' => 'secondary_font_section', + 'element' => __( 'Secondary Navigation', 'gp-premium' ), + 'shortcuts' => array( + 'layout' => 'secondary_nav_section', + 'colors' => 'secondary_navigation_color_section', + 'backgrounds' => 'secondary_bg_images_section', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + // Font family + $wp_customize->add_setting( + 'generate_secondary_nav_settings[font_secondary_navigation]', + array( + 'default' => $defaults['font_secondary_navigation'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Category + $wp_customize->add_setting( + 'font_secondary_navigation_category', + array( + 'default' => $defaults['font_secondary_navigation_category'], + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + // Variants + $wp_customize->add_setting( + 'font_secondary_navigation_variants', + array( + 'default' => $defaults['font_secondary_navigation_variants'], + 'sanitize_callback' => 'generate_premium_sanitize_variants' + ) + ); + + // Font weight + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_navigation_font_weight]', + array( + 'default' => $defaults['secondary_navigation_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Font transform + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_navigation_font_transform]', + array( + 'default' => $defaults['secondary_navigation_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'google_font_site_secondary_navigation_control', + array( + 'section' => 'secondary_font_section', + 'settings' => array( + 'family' => 'generate_secondary_nav_settings[font_secondary_navigation]', + 'variant' => 'font_secondary_navigation_variants', + 'category' => 'font_secondary_navigation_category', + 'weight' => 'generate_secondary_nav_settings[secondary_navigation_font_weight]', + 'transform' => 'generate_secondary_nav_settings[secondary_navigation_font_transform]', + ), + ) + ) + ); + + // Font size + $wp_customize->add_setting( + 'generate_secondary_nav_settings[secondary_navigation_font_size]', + array( + 'default' => $defaults['secondary_navigation_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_secondary_nav_settings[secondary_navigation_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'secondary_font_section', + 'priority' => 165, + 'settings' => array( + 'desktop' => 'generate_secondary_nav_settings[secondary_navigation_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 30, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } +} diff --git a/wp-content/plugins/gp-premium/typography/functions/slideout-nav-fonts.php b/wp-content/plugins/gp-premium/typography/functions/slideout-nav-fonts.php new file mode 100644 index 0000000..6de9607 --- /dev/null +++ b/wp-content/plugins/gp-premium/typography/functions/slideout-nav-fonts.php @@ -0,0 +1,150 @@ +register_control_type( 'GeneratePress_Pro_Range_Slider_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Pro_Typography_Customize_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Section_Shortcut_Control' ); + } + + // Bail if Menu Plus isn't activated + if ( ! $wp_customize->get_section( 'menu_plus_slideout_menu' ) ) { + return; + } + + $wp_customize->add_section( + 'generate_slideout_typography', + array( + 'title' => __( 'Off Canvas Panel', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 52, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_off_canvas_panel_typography_shortcuts', + array( + 'section' => 'generate_slideout_typography', + 'element' => esc_html__( 'Off Canvas Panel', 'gp-premium' ), + 'shortcuts' => array( + 'colors' => 'slideout_color_section', + 'layout' => 'menu_plus_slideout_menu', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 1, + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[slideout_font_weight]', + array( + 'default' => $defaults['slideout_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Text transform + $wp_customize->add_setting( + 'generate_settings[slideout_font_transform]', + array( + 'default' => $defaults['slideout_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'slideout_navigation_typography', + array( + 'label' => esc_html__( 'Menu Items', 'gp-premium' ), + 'section' => 'generate_slideout_typography', + 'settings' => array( + 'weight' => 'generate_settings[slideout_font_weight]', + 'transform' => 'generate_settings[slideout_font_transform]', + ), + ) + ) + ); + + // Font size + $wp_customize->add_setting( + 'generate_settings[slideout_font_size]', + array( + 'default' => $defaults['slideout_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[slideout_mobile_font_size]', + array( + 'default' => $defaults['slideout_mobile_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[slideout_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'generate_slideout_typography', + 'settings' => array( + 'desktop' => 'generate_settings[slideout_font_size]', + 'mobile' => 'generate_settings[slideout_mobile_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); +} diff --git a/wp-content/plugins/gp-premium/typography/functions/woocommerce-fonts.php b/wp-content/plugins/gp-premium/typography/functions/woocommerce-fonts.php new file mode 100644 index 0000000..e4f9659 --- /dev/null +++ b/wp-content/plugins/gp-premium/typography/functions/woocommerce-fonts.php @@ -0,0 +1,180 @@ +register_control_type( 'GeneratePress_Pro_Range_Slider_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Pro_Typography_Customize_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Section_Shortcut_Control' ); + } + + // Bail if WooCommerce isn't activated + if ( ! $wp_customize->get_section( 'generate_woocommerce_typography' ) ) { + return; + } + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_woocommerce_typography_shortcuts', + array( + 'section' => 'generate_woocommerce_typography', + 'element' => __( 'WooCommerce', 'gp-premium' ), + 'shortcuts' => array( + 'layout' => 'generate_woocommerce_layout', + 'colors' => 'generate_woocommerce_colors', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 0, + ) + ) + ); + + // WooCommerce + $wp_customize->add_setting( + 'generate_settings[wc_product_title_font_weight]', + array( + 'default' => $defaults['wc_product_title_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + // Text transform + $wp_customize->add_setting( + 'generate_settings[wc_product_title_font_transform]', + array( + 'default' => $defaults['wc_product_title_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Typography_Customize_Control( + $wp_customize, + 'google_wc_product_title_control', + array( + 'label' => __( 'Shop Product Titles', 'gp-premium' ), + 'section' => 'generate_woocommerce_typography', + 'settings' => array( + 'weight' => 'generate_settings[wc_product_title_font_weight]', + 'transform' => 'generate_settings[wc_product_title_font_transform]', + ), + ) + ) + ); + + // Font size + $wp_customize->add_setting( + 'generate_settings[wc_product_title_font_size]', + array( + 'default' => $defaults['wc_product_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[mobile_wc_product_title_font_size]', + array( + 'default' => $defaults['mobile_wc_product_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[wc_product_title_font_size]', + array( + 'description' => __( 'Font size', 'gp-premium' ), + 'section' => 'generate_woocommerce_typography', + 'priority' => 240, + 'settings' => array( + 'desktop' => 'generate_settings[wc_product_title_font_size]', + 'mobile' => 'generate_settings[mobile_wc_product_title_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + // Font size + $wp_customize->add_setting( + 'generate_settings[wc_related_product_title_font_size]', + array( + 'default' => $defaults['wc_related_product_title_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'generate_settings[wc_related_product_title_font_size]', + array( + 'description' => __( 'Related/upsell title font size', 'gp-premium' ), + 'section' => 'generate_woocommerce_typography', + 'priority' => 240, + 'settings' => array( + 'desktop' => 'generate_settings[wc_related_product_title_font_size]', + 'mobile' => 'generate_settings[mobile_wc_product_title_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + } +} diff --git a/wp-content/plugins/gp-premium/typography/generate-fonts.php b/wp-content/plugins/gp-premium/typography/generate-fonts.php new file mode 100644 index 0000000..2efa243 --- /dev/null +++ b/wp-content/plugins/gp-premium/typography/generate-fonts.php @@ -0,0 +1,19 @@ + *:not(:first-child) { + margin-top: 10px; + margin-bottom: 0; +} + +.woocommerce ul.products li.product .woocommerce-LoopProduct-link > .secondary-image + img { + margin-top: 0; +} + +.woocommerce ul.products li.product .onsale, +.woocommerce span.onsale { + position: relative; + border-radius: 0; + min-height: 15px; + min-width: initial; + font-weight: inherit; + font-size: inherit; + padding: 8px 13px; + line-height: 1; + display: inline-block; + top: auto; + left: auto; + font-size: 80%; + text-transform: uppercase; + font-weight: bold; +} + +.woocommerce ul.products li.product.sales-flash-overlay .onsale { + position: absolute; + top: 0; + right: 0; + margin: 0; +} + +.single-product span.onsale { + margin-bottom: 15px; +} + +.woocommerce-product-gallery { + margin-right: 4%; +} + +.rtl .woocommerce-product-gallery { + margin-right: 0; + margin-left: 4%; +} + +.woocommerce div.product div.images .flex-control-thumbs li { + max-width: 100px; + padding-top: 5px; + padding-right: 5px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.woocommerce ul.products li.product .woocommerce-loop-product__title { + padding: 0; +} + +.woocommerce .page-header-image-single { + display: none; +} + +.woocommerce .entry-content, +.woocommerce .product .entry-summary { + margin-top: 0; +} + +.related.products { + clear: both; +} + +.checkout-subscribe-prompt.clear { + visibility: visible; + height: initial; + width: initial; +} + +.woocommerce .add_to_cart_button + .added_to_cart { + display: none; +} + +.woocommerce-result-count { + font-size: 14px; + padding: 10px 0; + border: 1px solid transparent; +} + +.woocommerce-ordering select { + font-size: 14px; + font-weight: 500; + padding: 10px 40px 10px 12px; + -webkit-appearance: none; + -moz-appearance: none; + width: 100%; + background: transparent; + border-color: rgba(0,0,0,0.1); + color: inherit; + cursor: pointer; +} + +.woocommerce-ordering select::-ms-expand { + display: none; +} + +.woocommerce-ordering:after { + content: "\e903"; + font-family: "GP Premium"; + display: inline-block; + position: absolute; + pointer-events: none; + color: inherit; + top: 10px; + right: 15px; + font-size: 16px; +} + +.woocommerce-ordering select option { + color: initial; +} + +.woocommerce .woocommerce-ordering, +.woocommerce .woocommerce-result-count { + margin-bottom: 30px; +} + +.woocommerce-variation-add-to-cart { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +/* Columns */ + +@supports( display: grid ) { + #wc-column-container .product { + float: none; + width: auto; + margin: 0; + } + + .woocommerce .wc-columns-container .products::after, + .woocommerce .wc-columns-container .products::before, + .woocommerce .related ul.products::after, + .woocommerce .related ul.products::before, + .woocommerce .up-sells ul.products::after, + .woocommerce .up-sells ul.products::before { + display: none; + } + + .wc-columns-container .products, + .woocommerce .related ul.products, + .woocommerce .up-sells ul.products { + display: -ms-grid; + display: grid; + grid-gap: 50px; + width: 100%; + } + + .wc-columns-container.wc-columns-6 .products, + .wc-related-upsell-columns-6 .related ul.products, + .wc-related-upsell-columns-6 .up-sells ul.products { + -ms-grid-columns: 1fr 50px 1fr 50px 1fr 50px 1fr 50px 1fr 50px 1fr; + grid-template-columns: repeat(6, 1fr); + } + + .wc-columns-container.wc-columns-5 .products, + .wc-related-upsell-columns-5 .related ul.products, + .wc-related-upsell-columns-5 .up-sells ul.products { + -ms-grid-columns: 1fr 50px 1fr 50px 1fr 50px 1fr 50px 1fr; + grid-template-columns: repeat(5, 1fr); + } + + .woocommerce .wc-columns-container.wc-columns-4 .products, + .wc-related-upsell-columns-4 .related ul.products, + .wc-related-upsell-columns-4 .up-sells ul.products { + -ms-grid-columns: (1fr)[4]; + grid-template-columns: repeat(4, 1fr); + } + + .woocommerce .wc-columns-container.wc-columns-3 .products, + .wc-related-upsell-columns-3 .related ul.products, + .wc-related-upsell-columns-3 .up-sells ul.products { + -ms-grid-columns: (1fr)[3]; + grid-template-columns: repeat(3, 1fr); + } + + .woocommerce .wc-columns-container.wc-columns-2 .products, + .wc-related-upsell-columns-2 .related ul.products, + .wc-related-upsell-columns-2 .up-sells ul.products { + -ms-grid-columns: (1fr)[2]; + grid-template-columns: repeat(2, 1fr); + } + + .woocommerce .wc-columns-container.wc-columns-1 .products, + .wc-related-upsell-columns-1 .related ul.products, + .wc-related-upsell-columns-1 .up-sells ul.products { + width: 100%; + } + + .woocommerce .wc-columns-1 ul.products li.product, + .woocommerce-page .wc-columns-1 ul.products li.product { + margin-left: 0; + margin-right: 0; + } +} + +/* Mini Cart */ + +#wc-mini-cart ul.woocommerce-mini-cart { + position: relative; + left: auto; + right: auto; + opacity: 1; + pointer-events: auto; + height: auto; + width: auto; + float: none; + background-color: transparent; + box-shadow: 0 0 0; + visibility: visible; +} + +.wc-mini-cart { + position: absolute; + width: 300px; + right: 0; + box-shadow: 0 2px 2px rgba(0,0,0,0.1); + z-index: 99999; + left: -99999px; + opacity: 0; + height: 0; + overflow: hidden; + pointer-events: none; + transition: opacity 80ms linear; + transition-delay: 0s; + visibility: hidden; +} + +.wc-menu-item:hover .wc-mini-cart, +.wc-menu-item.sfHover .wc-mini-cart { + left: auto; + opacity: 1; + transition-delay: 150ms; + pointer-events: auto; + height: auto; + overflow: visible; + visibility: visible; +} + +.sidebar .wc-mini-cart { + right: 100%; + top: 0; +} + +.sidebar .wc-mini-cart .widget { + background: none; +} + +body:not(.using-mouse) .wc-menu-item.sfHover .wc-mini-cart { + display: none; +} + +.wc-menu-item .sub-menu { + left: auto; + right: 0; + width: 300px; +} + +.wc-menu-item .wc-mini-cart .widget_shopping_cart_content li:hover a, +.wc-menu-item .wc-mini-cart .widget_shopping_cart_content li.sfHover a { + background: none; +} + +.wc-menu-item .wc-mini-cart .widget_shopping_cart { + padding: 15px; +} + +.woocommerce.widget_shopping_cart .cart_list li { + padding: 0 0 0 4em; + margin: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + min-height: 3em; +} + +.woocommerce.widget_shopping_cart { + font-size: 14px; +} + +.widget_shopping_cart .woocommerce-mini-cart__buttons { + margin-bottom: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.woocommerce.widget_shopping_cart .woocommerce-mini-cart__buttons a { + margin: 0; + width: calc(50% - 10px); + text-align: center; + padding: 10px 15px; + line-height: inherit; + font-size: 14px; +} + +.woocommerce.widget_shopping_cart .woocommerce-mini-cart__buttons a:first-child { + margin-right: 2px; +} + +.woocommerce.widget_shopping_cart .woocommerce-mini-cart__buttons a:last-child { + margin-left: 2px; +} + +.woocommerce.widget_shopping_cart .cart_list li a.remove { + right: 0; + left: auto; + height: 20px; + width: 20px; + border-width: 1px; + border-style: solid; + border-radius: 50%; + padding: 0; + font-size: 16px; + line-height: 17px; + font-weight: normal; + position: relative; + float: right; +} + +.woocommerce ul.cart_list li img { + position: absolute; + left: 0; + width: 3em; + height: auto; + top: 0; + margin-left: 0; +} + +#wc-mini-cart .woocommerce-mini-cart-item a { + padding: 0; +} + +.woocommerce-mini-cart-item .quantity { + font-size: 12px; + display: block; +} + +.woocommerce.widget_shopping_cart .total { + margin: 15px 0; + padding: 15px; + background: rgba(0,0,0,0.05); + border: 0; + font-size: 14px; +} + +#wc-mini-cart .total { + padding: 15px; + margin: 15px -15px 15px; + text-align: left; +} + +#generate-slideout-menu .total { + padding: 10px 20px; + margin: 20px -20px 20px; +} + +#generate-slideout-menu.do-overlay .total { + margin: 20px 0; +} + +.woocommerce.widget_shopping_cart a.button.wc-forward:after { + display: none; +} + +.woocommerce.widget_shopping_cart .cart_list li.woocommerce-mini-cart-item:not(:last-child) { + margin-bottom: 15px; +} + +.slideout-widget .widget_shopping_cart_content, +.slideout-widget .widget_shopping_cart_content a { + font-size: 14px; +} + +#generate-slideout-menu.do-overlay li.woocommerce-mini-cart-item { + text-align: left; +} + +#wc-mini-cart a:not(.button) { + font-family: inherit; +} + +.wc-menu-item:not(.has-items) .wc-mini-cart { + display: none; +} + +.woocommerce-mini-cart__empty-message { + margin-bottom: 0; +} + +.secondary-nav-aligned-right .secondary-navigation ul.woocommerce-mini-cart, +.secondary-nav-aligned-center .secondary-navigation ul.woocommerce-mini-cart { + font-size: inherit; +} + +#wc-mini-cart .widgettitle { + display: none; +} + +/* Related/Upsell products */ + +@supports (display: grid) { + .woocommerce .related ul.products li.product, + .woocommerce .up-sells ul.products li.product { + width: auto; + margin-left: 0; + margin-right: 0; + } +} + +.woocommerce #respond input#submit, +.woocommerce a.button, +.woocommerce button.button, +.woocommerce input.button { + border-radius: 0px; + font-weight: inherit; + font-size: inherit; + line-height: inherit; + padding: 10px 20px; +} + +ul.products .woocommerce-text-align-center { + text-align: center; +} + +ul.products li.product.woocommerce-text-align-center .price, +ul.products li.product.woocommerce-text-align-center .star-rating { + margin-left: auto; + margin-right: auto; +} + +ul.products li.product.woocommerce-text-align-right .price, +ul.products li.product.woocommerce-text-align-right .star-rating { + margin-left: auto; +} + +.woocommerce .star-rating:before { + color: rgba(0,0,0,0.4); +} + +.woocommerce p.stars a { + color: rgba(0,0,0,0.4); +} + +.woocommerce ul.products li.product .price del { + display: inline; + padding-right: 10px; +} + +ul.products .woocommerce-text-align-right { + text-align: right; +} + +/*-------------------------------------------------------------- +# Single Product +--------------------------------------------------------------*/ + +.woocommerce #content div.product div.images, +.woocommerce div.product div.images, +.woocommerce-page #content div.product div.images, +.woocommerce-page div.product div.images { + width: 50%; +} + +.woocommerce #content div.product div.summary, +.woocommerce div.product div.summary, +.woocommerce-page #content div.product div.summary, +.woocommerce-page div.product div.summary { + width: auto; + float: none; + overflow: hidden; +} + +.product_meta { + font-size: 80%; + border-top: 1px solid rgba( 0,0,0,0.1 ); + padding-top: 30px; +} + +.product_meta > span { + display: block; +} + +.up-sells { + margin-top: 40px; +} + +.woocommerce div.product form.cart, +.add-to-cart-panel form.cart { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.woocommerce div.product form.cart > *:not(.quantity):not(.single_add_to_cart_button) { + width: 100%; +} + +.add-to-cart-panel form.cart { + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.woocommerce .quantity .qty { + height: 100%; + width: auto; + max-width: 80px; + background: transparent; + border: 1px solid rgba(0,0,0,0.1); + padding: 0 10px; + height: 50px; +} + +.do-quantity-buttons .quantity:not(.buttons-added) .qty { + width: 50px; +} + +.do-quantity-buttons div.quantity, +.add-to-cart-panel .cart.do-quantity-buttons div.quantity { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.woocommerce form .quantity.buttons-added .qty, +.woocommerce form .quantity.buttons-added .minus, +.woocommerce form .quantity.buttons-added .plus, +.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):before, +.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):after { + display: block; + width: 50px; + height: 100%; + min-height: 50px; + background-color: transparent; + border: 1px solid rgba(0,0,0,0.1); + margin: 0; + padding: 0; + text-align: center; + vertical-align: middle; + -moz-appearance: textfield !important; + -webkit-appearance: none; + border-radius: 0; + color: inherit; + box-sizing: border-box; +} + +.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):before, +.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):after, +.woocommerce form .quantity.buttons-added .minus, +.woocommerce form .quantity.buttons-added .plus { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):before { + content: "-"; + border-right: 0; +} + +.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):after { + content: "+"; + border-left: 0; +} + +.woocommerce form .quantity.buttons-added .qty:focus { + border-color: rgba(0,0,0,0.1); +} + +.do-quantity-buttons form .quantity input[type=number]::-webkit-inner-spin-button, +.do-quantity-buttons form .quantity input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.woocommerce form .quantity.buttons-added .minus, +.do-quantity-buttons form .quantity:not(.buttons-added):before { + border-right-width: 0; +} + +.woocommerce form .quantity.buttons-added .plus, +.do-quantity-buttons form .quantity:not(.buttons-added):after { + border-left-width: 0; +} + +.do-quantity-buttons .elementor-add-to-cart form .quantity:not(.buttons-added):before, +.do-quantity-buttons .elementor-add-to-cart form .quantity:not(.buttons-added):after, +.do-quantity-buttons form .quantity.hidden { + display: none; +} + +.woocommerce div.product form.cart div.quantity.hidden { + margin: 0; +} + +/*-------------------------------------------------------------- +## Tabs +--------------------------------------------------------------*/ + +.woocommerce div.product .woocommerce-tabs ul.tabs li::after, +.woocommerce div.product .woocommerce-tabs ul.tabs li::before, +.woocommerce div.product .woocommerce-tabs ul.tabs::before { + display: none; + border: 0; +} + +.woocommerce div.product .woocommerce-tabs ul.tabs { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin-left: 0; + padding-left: 0; +} + +.woocommerce div.product .woocommerce-tabs ul.tabs li { + background-color: rgba(0,0,0,0.02); + margin: 0; + border-radius: 0; + border-width: 1px 1px 0 0; + border-color: rgba(0,0,0,0.08); +} + +.woocommerce div.product .woocommerce-tabs ul.tabs li:first-child { + border-left-width: 1px; +} + +.woocommerce-ordering { + float: left; + margin-right: 1em; + margin-bottom: 0; + position: relative; + padding: 0; +} + +/*-------------------------------------------------------------- +# Menu Item +--------------------------------------------------------------*/ + +nav li.wc-menu-item { + float: right; +} + +.cart-contents > span { + line-height: 0; +} + +.cart-contents > span:not(:empty) { + margin-left: 10px; +} + +nav span.count { + font-size: 0.8em; + opacity: 0.5; +} + +/*-------------------------------------------------------------- +# Cart +--------------------------------------------------------------*/ + +.woocommerce a.remove { + color: inherit !important; + background: transparent !important; + border: 1px solid !important; + border-color: inherit; + font-weight: normal; + font-size: 16px; + width: 20px; + height: 20px; + line-height: 17px; + font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important; +} + +.woocommerce a.remove:hover { + color: inherit!important; + background: transparent !important; + opacity: 0.7; +} + +.woocommerce .star-rating:before { + opacity: 0.25; + content: "SSSSS"; +} + +.woocommerce div.product .woocommerce-product-rating { + margin: 1em 0; +} + +.woocommerce div.product p.price, +.woocommerce div.product span.price { + color: inherit; +} + +.wc-has-gallery .secondary-image { + position: absolute; + opacity: 0; + transition: opacity 100ms ease-in-out; + left:50%; + -webkit-transform: translate(-50%,0px); + -ms-transform: translate(-50%,0px); + transform: translate(-50%,0px); +} + +.woocommerce ul.products li.product a img { + margin-bottom: 0; +} + +.woocommerce div.product .woocommerce-tabs ul.tabs li a, +.woocommerce div.product .woocommerce-tabs ul.tabs li.active a { + color: initial; +} + +.woocommerce ul.products li.product .price, .woocommerce div.product p.price { + font-weight: bold; +} + +div.woocommerce-message a.button, +div.woocommerce-message a.button:hover, +div.woocommerce-message a.button:focus, +div.woocommerce-info a.button, +div.woocommerce-info a.button:hover, +div.woocommerce-info a.button:focus, +div.woocommerce-error a.button, +div.woocommerce-error a.button:hover, +div.woocommerce-error a.button:focus { + background: transparent; + padding: 0; +} + +.woocommerce-error a, +.woocommerce-info a, +.woocommerce-message a { + font-weight: bold; +} + +.woocommerce-error, +.woocommerce-info, +.woocommerce-message { + padding: 20px 30px; + border: 0; + border-left: 10px solid rgba(0,0,0,0.3); +} + +.woocommerce-message::before, +.woocommerce-info::before, +.woocommerce-error::before { + display: none; +} + +a.button.wc-forward:after { + content: "\e901"; + font-family: "GP Premium"; + line-height: 1em; + speak: none; + padding-left: 10px; + position: relative; + top: 2px; +} + +.rtl a.button.wc-forward:after { + display: none; +} + +.woocommerce-checkout .col2-set .col-2, +.woocommerce-checkout .col2-set .col-1 { + float: none; + width: 100%; + margin: 0; +} + +.woocommerce-checkout .col2-set { + width: 52.9411764706%; + float: left; + margin-right: 5.8823529412%; +} + +.rtl.woocommerce-checkout .col2-set { + float: right; + margin-right: 0; + margin-left: 5.8823529412%; +} + +#customer_details+#wc_checkout_add_ons, +#order_review, +#order_review_heading { + width: 41.1764705882%; + float: right; + margin-right: 0; +} + +.woocommerce-additional-fields > h3 { + margin-top: 20px; +} + +.woocommerce table.shop_table, +.woocommerce table.shop_table tfoot th, +.woocommerce table.shop_table tfoot td { + border: 0; + border-radius: 0; +} + +.woocommerce table.shop_table th { + background-color: rgba( 0,0,0,0.03 ) +} + +.woocommerce table.shop_table th, +.woocommerce table.shop_table td { + padding: 20px; + border: 0; +} + +.woocommerce table.shop_table td { + background-color: rgba( 0,0,0,0.005 ); + border-bottom: 1px solid rgba(0,0,0,0.1); +} + +#add_payment_method .cart-collaterals .cart_totals tr td, +#add_payment_method .cart-collaterals .cart_totals tr th, +.woocommerce-cart .cart-collaterals .cart_totals tr td, +.woocommerce-cart .cart-collaterals .cart_totals tr th, +.woocommerce-checkout .cart-collaterals .cart_totals tr td, +.woocommerce-checkout .cart-collaterals .cart_totals tr th { + border-top: 0; +} + +#add_payment_method #payment, +.woocommerce-cart #payment, +.woocommerce-checkout #payment, +#add_payment_method #payment div.payment_box, +.woocommerce-cart #payment div.payment_box, +.woocommerce-checkout #payment div.payment_box { + background-color: transparent; + color: inherit; +} + +#add_payment_method #payment div.payment_box:before, +.woocommerce-cart #payment div.payment_box:before, +.woocommerce-checkout #payment div.payment_box:before { + display: none; +} + +#payment .payment_methods>.wc_payment_method>label { + padding: 20px; + background-color:rgba(0,0,0,0.04); + display:block; + cursor: pointer; +} + +#payment .payment_methods li.wc_payment_method>input[type=radio]:first-child:checked+label { + font-weight: bold; + background-color: rgba(0,0,0,0.07); +} + +#payment .payment_methods li.wc_payment_method>input[type=radio]:first-child { + clip: rect(1px,1px,1px,1px); + position: absolute!important; +} + +#payment .payment_methods>.wc_payment_method>label:before { + display: inline-block; + font-size: inherit; + -webkit-font-smoothing: antialiased; + content: "\e902"; + margin-right: .5407911001em; + -webkit-transition: color,ease,.2s; + -moz-transition: color,ease,.2s; + transition: color,ease,.2s; + font-family: "GP Premium"; +} + +#payment .payment_methods li.wc_payment_method>input[type=radio]:first-child:checked+label:before { + content: "\e904"; +} + +#add_payment_method #payment ul.payment_methods, +.woocommerce-cart #payment ul.payment_methods, +.woocommerce-checkout #payment ul.payment_methods { + padding: 0; + border: 0; +} + +.woocommerce #payment #place_order, +.woocommerce-page #payment #place_order { + float: none; + width: 100%; + padding-top:20px; + padding-bottom: 20px; + font-weight: bold; + font-size: 150%; +} + +#add_payment_method #payment div.form-row, +.woocommerce-cart #payment div.form-row, +.woocommerce-checkout #payment div.form-row { + padding-left:0; + padding-right: 0; + padding-top: 0; +} + +#add_payment_method #payment ul.payment_methods li img, +.woocommerce-cart #payment ul.payment_methods li img, +.woocommerce-checkout #payment ul.payment_methods li img { + float: right; +} + +#add_payment_method #payment .payment_method_paypal .about_paypal, +.woocommerce-cart #payment .payment_method_paypal .about_paypal, +.woocommerce-checkout #payment .payment_method_paypal .about_paypal { + float: none; + display: inline-block; + line-height: 1; +} + +a.checkout-button:after { + display: none; +} + +.woocommerce #content table.cart td.actions .input-text, +.woocommerce table.cart td.actions .input-text, +.woocommerce-page #content table.cart td.actions .input-text, +.woocommerce-page table.cart td.actions .input-text { + width: 150px; + padding: 10px 15px; +} + +.woocommerce .coupon .button { + border: 1px solid transparent; +} + +.woocommerce ul.products li.product .woocommerce-product-details__short-description p:last-child { + margin-bottom: 0; +} + +.wc-product-image { + text-align: center; +} + +.woocommerce-text-align-left .wc-product-image { + text-align: left; +} + +.woocommerce-text-align-right .wc-product-image { + text-align: right; +} + +.inside-wc-product-image { + position: relative; + display: inline-block; +} + +.woocommerce ul.products li.product.woocommerce-image-align-left .wc-product-image { + float: left; + margin-right: 2em; +} + +.woocommerce ul.products li.product.woocommerce-image-align-right .wc-product-image { + float: right; + margin-left: 2em; +} + +.woocommerce ul.products li.product.woocommerce-image-align-left a .wc-product-image img, +.woocommerce ul.products li.product.woocommerce-image-align-right a .wc-product-image img { + width: auto; +} + +.woocommerce-cart ul.products li.product.woocommerce-image-align-left .wc-product-image, +.woocommerce-cart ul.products li.product.woocommerce-image-align-right .wc-product-image { + float: none; + margin: 0; +} + +.woocommerce-cart ul.products li.product.woocommerce-image-align-left a .wc-product-image img, +.woocommerce-cart ul.products li.product.woocommerce-image-align-right a .wc-product-image img { + width: 100%; +} + +.woocommerce .widget_price_filter .price_slider_amount .button { + font-size: 1em; + line-height: normal; +} + +.woocommerce .related ul.products li.product a img, +.woocommerce .up-sells ul.products li.product a img { + margin-bottom: 0; +} + +.woocommerce-review-link { + font-size: 80%; +} + +.woocommerce-Reviews .comment-reply-title { + font-size: 120%; + font-weight: bold; + display: block; + margin-bottom: 10px; +} + +.woocommerce-MyAccount-navigation ul { + margin: 0; + border-top: 1px solid rgba(0,0,0,0.1); +} + +.site-main .woocommerce-MyAccount-navigation li { + margin: 0; + padding: 0; +} + +.woocommerce-MyAccount-navigation li a { + display: block; + padding: 20px 0; + border-bottom: 1px solid rgba(0,0,0,0.1); + font-size: 85%; +} + +.woocommerce-MyAccount-navigation li.is-active a { + font-weight: bold; +} + +.woocommerce-MyAccount-navigation li a:hover { + border-bottom: 1px solid rgba(0,0,0,0.2); +} + +.woocommerce-MyAccount-navigation li.is-active a:after { + font-family: "GP Premium"; + content: "\e901"; + float: right; + font-weight:bold; + font-size: 115%; +} + +.woocommerce-account .woocommerce-MyAccount-navigation { + width: 25%; +} + +.woocommerce #payment .terms { + padding: 20px; +} + +h2.woocommerce-loop-category__title mark { + background: none; + font-size: 80%; + opacity: 0.5; +} + +.woocommerce form.checkout_coupon, +.woocommerce form.login, +.woocommerce form.register { + padding: 0; + margin: 0 0 1.5em; + border: 0; +} + +#ship-to-different-address { + padding: 3px; + font-size: inherit; +} + +.woocommerce-image-align-left .products ul, +.woocommerce-image-align-left ul.products, +.woocommerce-image-align-left .products ul:after, +.woocommerce-image-align-left ul.products:after, +.woocommerce-image-align-right .products ul, +.woocommerce-image-align-right ul.products, +.woocommerce-image-align-right .products ul:after, +.woocommerce-image-align-right ul.products:after { + clear: none; +} + +.woocommerce nav.woocommerce-pagination { + margin-top: 60px; + clear: both; +} + +.woocommerce input.button:disabled, +.woocommerce input.button:disabled[disabled], +.woocommerce input.button:disabled:hover, +.woocommerce input.button:disabled[disabled]:hover { + background-color: transparent; + color: initial; + opacity: 0.3; +} + +.entry-summary + .up-sells { + clear: both; +} + +.woocommerce form .form-row input.input-text, +.woocommerce form .form-row textarea { + line-height: 1.5; +} + +.main-navigation a.cart-contents:not(.has-svg-icon):before, +.secondary-navigation a.cart-contents:not(.has-svg-icon):before { + content: "\f07a"; + display: inline-block; + font-family: "GP Premium"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.main-navigation a.cart-contents:not(.has-svg-icon).shopping-bag:before, +.secondary-navigation a.cart-contents:not(.has-svg-icon).shopping-bag:before { + content: "\f290"; +} + +.main-navigation a.cart-contents:not(.has-svg-icon).shopping-basket:before, +.secondary-navigation a.cart-contents:not(.has-svg-icon).shopping-basket:before { + content: "\f291"; +} + +.cart-contents > span.number-of-items { + font-size: 11px; + display: inline-block; + background: rgba(255,255,255,0.1); + line-height: 1.7em; + height: 1.7em; + width: 1.7em; + text-align: center; + border-radius: 50%; + margin-left: 5px; + position: relative; + top: -5px; + display: none; +} + +.cart-contents > span.number-of-items.no-items { + display: none; +} + +.woocommerce-MyAccount-navigation ul { + list-style-type: none; +} + + +/* Fix BlockUI */ +form.checkout:after, +form.checkout:before { + content: ''; + display: table; +} + +form.checkout:after { + clear: both; +} + +/* Add to Cart panel */ + +.add-to-cart-panel { + position: fixed; + top: 0; + left: 0; + right: 0; + background: #fff; + padding: 20px; + opacity: 0; + transition: opacity 500ms ease-in-out, transform 500ms ease-in-out; + box-shadow: 0 2px 2px -2px rgba(0,0,0,.2); + z-index: 50; + font-size: 90%; + box-sizing: border-box; + -webkit-transform: translateY(-100%); + -ms-transform: translateY(-100%); + transform: translateY(-100%); +} + +.add-to-cart-panel.item-added, +.add-to-cart-panel.show-sticky-add-to-cart { + opacity: 1; +} + +.add-to-cart-panel > div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.add-to-cart-panel .continue-shopping { + margin-right: auto; +} + +.add-to-cart-panel .continue-shopping .gp-icon { + display: none; +} + +.add-to-cart-panel .cart-info { + margin-right: 20px; +} + +.add-to-cart-panel img { + height: 50px; + width: auto; + vertical-align: middle; +} + +.add-to-cart-panel .product-title { + margin-left: 20px; + margin-right: auto; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.add-to-cart-panel .product-price { + margin-right: 20px; +} + +.add-to-cart-panel div.quantity { + margin-right: 4px; +} + +.add-to-cart-panel .cart-data { + font-size: 12px; +} + +.add-to-cart-panel del { + opacity: 0.4; +} + +.do-quantity-buttons input.qty::-webkit-outer-spin-button, +.do-quantity-buttons input.qty::-webkit-inner-spin-button { + -webkit-appearance: none; +} diff --git a/wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce.min.css b/wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce.min.css new file mode 100644 index 0000000..c0454d9 --- /dev/null +++ b/wp-content/plugins/gp-premium/woocommerce/functions/css/woocommerce.min.css @@ -0,0 +1 @@ +@supports (display:grid){.woocommerce ul.products li.product{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.product_meta>span,.woocommerce ul.products li.product.woocommerce-image-align-left,.woocommerce ul.products li.product.woocommerce-image-align-right{display:block}.woocommerce ul.products li.product .woocommerce-LoopProduct-link{display:block;margin-bottom:auto}.woocommerce ul.products li.product .button{margin-left:auto;margin-right:auto}.woocommerce ul.products li.product.woocommerce-text-align-left .button{margin-left:0}.woocommerce ul.products li.product.woocommerce-text-align-right .button{margin-right:0}.woocommerce ul.products li.product .woocommerce-LoopProduct-link>:not(:first-child){margin-top:10px;margin-bottom:0}.woocommerce ul.products li.product .woocommerce-LoopProduct-link>.secondary-image+img{margin-top:0}.woocommerce span.onsale,.woocommerce ul.products li.product .onsale{position:relative;border-radius:0;min-height:15px;min-width:initial;padding:8px 13px;line-height:1;display:inline-block;top:auto;left:auto;font-size:80%;text-transform:uppercase;font-weight:700}.woocommerce ul.products li.product.sales-flash-overlay .onsale{position:absolute;top:0;right:0;margin:0}.single-product span.onsale{margin-bottom:15px}.woocommerce-product-gallery{margin-right:4%}.rtl .woocommerce-product-gallery{margin-right:0;margin-left:4%}.woocommerce div.product div.images .flex-control-thumbs li{max-width:100px;padding-top:5px;padding-right:5px;-webkit-box-sizing:border-box;box-sizing:border-box}#wc-mini-cart .woocommerce-mini-cart-item a,.woocommerce ul.products li.product .woocommerce-loop-product__title{padding:0}.woocommerce .page-header-image-single{display:none}.woocommerce .entry-content,.woocommerce .product .entry-summary{margin-top:0}.related.products{clear:both}.checkout-subscribe-prompt.clear{visibility:visible;height:initial;width:initial}.woocommerce .add_to_cart_button+.added_to_cart{display:none}.woocommerce-result-count{font-size:14px;padding:10px 0;border:1px solid transparent}.woocommerce-ordering select{font-size:14px;font-weight:500;padding:10px 40px 10px 12px;-webkit-appearance:none;-moz-appearance:none;width:100%;background:0 0;border-color:rgba(0,0,0,.1);color:inherit;cursor:pointer}.woocommerce-ordering select::-ms-expand{display:none}.woocommerce-ordering:after{content:"\e903";font-family:"GP Premium";display:inline-block;position:absolute;pointer-events:none;color:inherit;top:10px;right:15px;font-size:16px}.woocommerce div.product .woocommerce-tabs ul.tabs li a,.woocommerce div.product .woocommerce-tabs ul.tabs li.active a,.woocommerce-ordering select option{color:initial}.woocommerce .woocommerce-ordering,.woocommerce .woocommerce-result-count{margin-bottom:30px}.add-to-cart-panel form.cart,.woocommerce div.product form.cart,.woocommerce-variation-add-to-cart{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}@supports (display:grid){#wc-column-container .product{float:none;width:auto;margin:0}.woocommerce .related ul.products::after,.woocommerce .related ul.products::before,.woocommerce .up-sells ul.products::after,.woocommerce .up-sells ul.products::before,.woocommerce .wc-columns-container .products::after,.woocommerce .wc-columns-container .products::before{display:none}.wc-columns-container .products,.woocommerce .related ul.products,.woocommerce .up-sells ul.products{display:-ms-grid;display:grid;grid-gap:50px;width:100%}.wc-columns-container.wc-columns-6 .products,.wc-related-upsell-columns-6 .related ul.products,.wc-related-upsell-columns-6 .up-sells ul.products{-ms-grid-columns:1fr 50px 1fr 50px 1fr 50px 1fr 50px 1fr 50px 1fr;grid-template-columns:repeat(6,1fr)}.wc-columns-container.wc-columns-5 .products,.wc-related-upsell-columns-5 .related ul.products,.wc-related-upsell-columns-5 .up-sells ul.products{-ms-grid-columns:1fr 50px 1fr 50px 1fr 50px 1fr 50px 1fr;grid-template-columns:repeat(5,1fr)}.wc-related-upsell-columns-4 .related ul.products,.wc-related-upsell-columns-4 .up-sells ul.products,.woocommerce .wc-columns-container.wc-columns-4 .products{-ms-grid-columns:(1fr)[4];grid-template-columns:repeat(4,1fr)}.wc-related-upsell-columns-3 .related ul.products,.wc-related-upsell-columns-3 .up-sells ul.products,.woocommerce .wc-columns-container.wc-columns-3 .products{-ms-grid-columns:(1fr)[3];grid-template-columns:repeat(3,1fr)}.wc-related-upsell-columns-2 .related ul.products,.wc-related-upsell-columns-2 .up-sells ul.products,.woocommerce .wc-columns-container.wc-columns-2 .products{-ms-grid-columns:(1fr)[2];grid-template-columns:repeat(2,1fr)}.wc-related-upsell-columns-1 .related ul.products,.wc-related-upsell-columns-1 .up-sells ul.products,.woocommerce .wc-columns-container.wc-columns-1 .products{width:100%}.woocommerce .wc-columns-1 ul.products li.product,.woocommerce-page .wc-columns-1 ul.products li.product{margin-left:0;margin-right:0}}#wc-mini-cart ul.woocommerce-mini-cart{position:relative;left:auto;right:auto;opacity:1;pointer-events:auto;height:auto;width:auto;float:none;background-color:transparent;box-shadow:0 0 0;visibility:visible}.wc-mini-cart{position:absolute;width:300px;right:0;box-shadow:0 2px 2px rgba(0,0,0,.1);z-index:99999;left:-99999px;opacity:0;height:0;overflow:hidden;pointer-events:none;transition:opacity 80ms linear;transition-delay:0s;visibility:hidden}.wc-menu-item.sfHover .wc-mini-cart,.wc-menu-item:hover .wc-mini-cart{left:auto;opacity:1;transition-delay:150ms;pointer-events:auto;height:auto;overflow:visible;visibility:visible}.sidebar .wc-mini-cart{right:100%;top:0}.sidebar .wc-mini-cart .widget,.wc-menu-item .wc-mini-cart .widget_shopping_cart_content li.sfHover a,.wc-menu-item .wc-mini-cart .widget_shopping_cart_content li:hover a{background:0 0}body:not(.using-mouse) .wc-menu-item.sfHover .wc-mini-cart{display:none}.wc-menu-item .sub-menu{left:auto;right:0;width:300px}.wc-menu-item .wc-mini-cart .widget_shopping_cart{padding:15px}.woocommerce.widget_shopping_cart .cart_list li{padding:0 0 0 4em;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:3em}.woocommerce.widget_shopping_cart{font-size:14px}.widget_shopping_cart .woocommerce-mini-cart__buttons{margin-bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex}.woocommerce.widget_shopping_cart .woocommerce-mini-cart__buttons a{margin:0;width:calc(50% - 10px);text-align:center;padding:10px 15px;line-height:inherit;font-size:14px}.woocommerce.widget_shopping_cart .woocommerce-mini-cart__buttons a:first-child{margin-right:2px}.woocommerce.widget_shopping_cart .woocommerce-mini-cart__buttons a:last-child{margin-left:2px}.woocommerce.widget_shopping_cart .cart_list li a.remove{right:0;left:auto;height:20px;width:20px;border-width:1px;border-style:solid;border-radius:50%;padding:0;font-size:16px;line-height:17px;font-weight:400;position:relative;float:right}.woocommerce ul.cart_list li img{position:absolute;left:0;width:3em;height:auto;top:0;margin-left:0}.woocommerce-mini-cart-item .quantity{font-size:12px;display:block}.woocommerce.widget_shopping_cart .total{margin:15px 0;padding:15px;background:rgba(0,0,0,.05);border:0;font-size:14px}#wc-mini-cart .total{padding:15px;margin:15px -15px;text-align:left}#generate-slideout-menu .total{padding:10px 20px;margin:20px -20px}#generate-slideout-menu.do-overlay .total{margin:20px 0}#wc-mini-cart .widgettitle,.woocommerce-error::before,.woocommerce-info::before,.woocommerce-message::before,.woocommerce.widget_shopping_cart a.button.wc-forward:after{display:none}.woocommerce.widget_shopping_cart .cart_list li.woocommerce-mini-cart-item:not(:last-child){margin-bottom:15px}.slideout-widget .widget_shopping_cart_content,.slideout-widget .widget_shopping_cart_content a{font-size:14px}#generate-slideout-menu.do-overlay li.woocommerce-mini-cart-item{text-align:left}#wc-mini-cart a:not(.button){font-family:inherit}.wc-menu-item:not(.has-items) .wc-mini-cart{display:none}.woocommerce .related ul.products li.product a img,.woocommerce .up-sells ul.products li.product a img,.woocommerce ul.products li.product a img,.woocommerce-mini-cart__empty-message{margin-bottom:0}.secondary-nav-aligned-center .secondary-navigation ul.woocommerce-mini-cart,.secondary-nav-aligned-right .secondary-navigation ul.woocommerce-mini-cart{font-size:inherit}@supports (display:grid){.woocommerce .related ul.products li.product,.woocommerce .up-sells ul.products li.product{width:auto;margin-left:0;margin-right:0}}.woocommerce #respond input#submit,.woocommerce a.button,.woocommerce button.button,.woocommerce input.button{border-radius:0;font-weight:inherit;font-size:inherit;line-height:inherit;padding:10px 20px}ul.products .woocommerce-text-align-center{text-align:center}ul.products li.product.woocommerce-text-align-center .price,ul.products li.product.woocommerce-text-align-center .star-rating{margin-left:auto;margin-right:auto}ul.products li.product.woocommerce-text-align-right .price,ul.products li.product.woocommerce-text-align-right .star-rating{margin-left:auto}.woocommerce .star-rating:before,.woocommerce p.stars a{color:rgba(0,0,0,.4)}.woocommerce ul.products li.product .price del{display:inline;padding-right:10px}ul.products .woocommerce-text-align-right{text-align:right}.woocommerce #content div.product div.images,.woocommerce div.product div.images,.woocommerce-page #content div.product div.images,.woocommerce-page div.product div.images{width:50%}.woocommerce #content div.product div.summary,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.summary{width:auto;float:none;overflow:hidden}.product_meta{font-size:80%;border-top:1px solid rgba(0,0,0,.1);padding-top:30px}.up-sells{margin-top:40px}.woocommerce div.product form.cart>:not(.quantity):not(.single_add_to_cart_button){width:100%}.add-to-cart-panel form.cart{-ms-flex-negative:0;flex-shrink:0}.woocommerce .quantity .qty{width:auto;max-width:80px;background:0 0;border:1px solid rgba(0,0,0,.1);padding:0 10px;height:50px}.do-quantity-buttons .quantity:not(.buttons-added) .qty{width:50px}.add-to-cart-panel .cart.do-quantity-buttons div.quantity,.add-to-cart-panel>div,.do-quantity-buttons div.quantity{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):after,.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):before,.woocommerce form .quantity.buttons-added .minus,.woocommerce form .quantity.buttons-added .plus,.woocommerce form .quantity.buttons-added .qty{display:block;width:50px;height:100%;min-height:50px;background-color:transparent;border:1px solid rgba(0,0,0,.1);margin:0;padding:0;text-align:center;vertical-align:middle;-moz-appearance:textfield!important;-webkit-appearance:none;border-radius:0;color:inherit;box-sizing:border-box}.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):after,.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):before,.woocommerce form .quantity.buttons-added .minus,.woocommerce form .quantity.buttons-added .plus{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):before{content:"-";border-right:0}.do-quantity-buttons form .quantity:not(.buttons-added):not(.hidden):after{content:"+";border-left:0}.woocommerce form .quantity.buttons-added .qty:focus{border-color:rgba(0,0,0,.1)}.do-quantity-buttons form .quantity input[type=number]::-webkit-inner-spin-button,.do-quantity-buttons form .quantity input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.do-quantity-buttons form .quantity:not(.buttons-added):before,.woocommerce form .quantity.buttons-added .minus{border-right-width:0}.do-quantity-buttons form .quantity:not(.buttons-added):after,.woocommerce form .quantity.buttons-added .plus{border-left-width:0}.do-quantity-buttons .elementor-add-to-cart form .quantity:not(.buttons-added):after,.do-quantity-buttons .elementor-add-to-cart form .quantity:not(.buttons-added):before,.do-quantity-buttons form .quantity.hidden{display:none}.woocommerce div.product form.cart div.quantity.hidden{margin:0}.woocommerce div.product .woocommerce-tabs ul.tabs li::after,.woocommerce div.product .woocommerce-tabs ul.tabs li::before,.woocommerce div.product .woocommerce-tabs ul.tabs::before{display:none;border:0}.woocommerce div.product .woocommerce-tabs ul.tabs{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:0;padding-left:0}.woocommerce div.product .woocommerce-tabs ul.tabs li{background-color:rgba(0,0,0,.02);margin:0;border-radius:0;border-width:1px 1px 0 0;border-color:rgba(0,0,0,.08)}.woocommerce div.product .woocommerce-tabs ul.tabs li:first-child{border-left-width:1px}.woocommerce-ordering{float:left;margin-right:1em;margin-bottom:0;position:relative;padding:0}#add_payment_method #payment ul.payment_methods li img,.woocommerce-cart #payment ul.payment_methods li img,.woocommerce-checkout #payment ul.payment_methods li img,nav li.wc-menu-item{float:right}.cart-contents>span{line-height:0}.cart-contents>span:not(:empty){margin-left:10px}nav span.count{font-size:.8em;opacity:.5}.woocommerce a.remove{color:inherit!important;background:0 0!important;border:1px solid!important;border-color:inherit;font-weight:400;font-size:16px;width:20px;height:20px;line-height:17px;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"!important}.woocommerce a.remove:hover{color:inherit!important;background:0 0!important;opacity:.7}.woocommerce .star-rating:before{opacity:.25;content:"SSSSS"}.woocommerce div.product .woocommerce-product-rating{margin:1em 0}.woocommerce div.product p.price,.woocommerce div.product span.price{color:inherit}.wc-has-gallery .secondary-image{position:absolute;opacity:0;transition:opacity 100ms ease-in-out;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.woocommerce div.product p.price,.woocommerce ul.products li.product .price,.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{font-weight:700}div.woocommerce-error a.button,div.woocommerce-error a.button:focus,div.woocommerce-error a.button:hover,div.woocommerce-info a.button,div.woocommerce-info a.button:focus,div.woocommerce-info a.button:hover,div.woocommerce-message a.button,div.woocommerce-message a.button:focus,div.woocommerce-message a.button:hover{background:0 0;padding:0}.woocommerce-error,.woocommerce-info,.woocommerce-message{padding:20px 30px;border:0;border-left:10px solid rgba(0,0,0,.3)}a.button.wc-forward:after{content:"\e901";font-family:"GP Premium";line-height:1em;speak:none;padding-left:10px;position:relative;top:2px}#add_payment_method #payment div.payment_box:before,.cart-contents>span.number-of-items.no-items,.rtl a.button.wc-forward:after,.woocommerce-cart #payment div.payment_box:before,.woocommerce-checkout #payment div.payment_box:before,a.checkout-button:after{display:none}.woocommerce-checkout .col2-set .col-1,.woocommerce-checkout .col2-set .col-2{float:none;width:100%;margin:0}.woocommerce-checkout .col2-set{width:52.9411764706%;float:left;margin-right:5.8823529412%}.rtl.woocommerce-checkout .col2-set{float:right;margin-right:0;margin-left:5.8823529412%}#customer_details+#wc_checkout_add_ons,#order_review,#order_review_heading{width:41.1764705882%;float:right;margin-right:0}.woocommerce-additional-fields>h3{margin-top:20px}.woocommerce table.shop_table,.woocommerce table.shop_table tfoot td,.woocommerce table.shop_table tfoot th{border:0;border-radius:0}.woocommerce table.shop_table th{background-color:rgba(0,0,0,.03);padding:20px;border:0}.woocommerce table.shop_table td{padding:20px;border:0;background-color:rgba(0,0,0,.005);border-bottom:1px solid rgba(0,0,0,.1)}#add_payment_method .cart-collaterals .cart_totals tr td,#add_payment_method .cart-collaterals .cart_totals tr th,.woocommerce-cart .cart-collaterals .cart_totals tr td,.woocommerce-cart .cart-collaterals .cart_totals tr th,.woocommerce-checkout .cart-collaterals .cart_totals tr td,.woocommerce-checkout .cart-collaterals .cart_totals tr th{border-top:0}#add_payment_method #payment,#add_payment_method #payment div.payment_box,.woocommerce-cart #payment,.woocommerce-cart #payment div.payment_box,.woocommerce-checkout #payment,.woocommerce-checkout #payment div.payment_box{background-color:transparent;color:inherit}#payment .payment_methods>.wc_payment_method>label{padding:20px;background-color:rgba(0,0,0,.04);display:block;cursor:pointer}#payment .payment_methods li.wc_payment_method>input[type=radio]:first-child:checked+label{font-weight:700;background-color:rgba(0,0,0,.07)}#payment .payment_methods li.wc_payment_method>input[type=radio]:first-child{clip:rect(1px,1px,1px,1px);position:absolute!important}#payment .payment_methods>.wc_payment_method>label:before{display:inline-block;font-size:inherit;-webkit-font-smoothing:antialiased;content:"\e902";margin-right:.5407911001em;-webkit-transition:color,ease,.2s;-moz-transition:color,ease,.2s;transition:color,ease,.2s;font-family:"GP Premium"}#payment .payment_methods li.wc_payment_method>input[type=radio]:first-child:checked+label:before{content:"\e904"}#add_payment_method #payment ul.payment_methods,.woocommerce-cart #payment ul.payment_methods,.woocommerce-checkout #payment ul.payment_methods{padding:0;border:0}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:none;width:100%;padding-top:20px;padding-bottom:20px;font-weight:700;font-size:150%}#add_payment_method #payment div.form-row,.woocommerce-cart #payment div.form-row,.woocommerce-checkout #payment div.form-row{padding-left:0;padding-right:0;padding-top:0}#add_payment_method #payment .payment_method_paypal .about_paypal,.woocommerce-cart #payment .payment_method_paypal .about_paypal,.woocommerce-checkout #payment .payment_method_paypal .about_paypal{float:none;display:inline-block;line-height:1}.woocommerce #content table.cart td.actions .input-text,.woocommerce table.cart td.actions .input-text,.woocommerce-page #content table.cart td.actions .input-text,.woocommerce-page table.cart td.actions .input-text{width:150px;padding:10px 15px}.woocommerce .coupon .button{border:1px solid transparent}.woocommerce ul.products li.product .woocommerce-product-details__short-description p:last-child{margin-bottom:0}.wc-product-image{text-align:center}.woocommerce-text-align-left .wc-product-image{text-align:left}.woocommerce-text-align-right .wc-product-image{text-align:right}.inside-wc-product-image{position:relative;display:inline-block}.woocommerce ul.products li.product.woocommerce-image-align-left .wc-product-image{float:left;margin-right:2em}.woocommerce ul.products li.product.woocommerce-image-align-right .wc-product-image{float:right;margin-left:2em}.woocommerce ul.products li.product.woocommerce-image-align-left a .wc-product-image img,.woocommerce ul.products li.product.woocommerce-image-align-right a .wc-product-image img{width:auto}.woocommerce-cart ul.products li.product.woocommerce-image-align-left .wc-product-image,.woocommerce-cart ul.products li.product.woocommerce-image-align-right .wc-product-image{float:none;margin:0}.woocommerce-cart ul.products li.product.woocommerce-image-align-left a .wc-product-image img,.woocommerce-cart ul.products li.product.woocommerce-image-align-right a .wc-product-image img{width:100%}.woocommerce .widget_price_filter .price_slider_amount .button{font-size:1em;line-height:normal}.woocommerce-review-link{font-size:80%}.woocommerce-Reviews .comment-reply-title{font-size:120%;font-weight:700;display:block;margin-bottom:10px}.woocommerce-MyAccount-navigation ul{margin:0;border-top:1px solid rgba(0,0,0,.1);list-style-type:none}.site-main .woocommerce-MyAccount-navigation li{margin:0;padding:0}.woocommerce-MyAccount-navigation li a{display:block;padding:20px 0;border-bottom:1px solid rgba(0,0,0,.1);font-size:85%}.woocommerce-MyAccount-navigation li.is-active a{font-weight:700}.woocommerce-MyAccount-navigation li a:hover{border-bottom:1px solid rgba(0,0,0,.2)}.woocommerce-MyAccount-navigation li.is-active a:after{font-family:"GP Premium";content:"\e901";float:right;font-weight:700;font-size:115%}.woocommerce-account .woocommerce-MyAccount-navigation{width:25%}.woocommerce #payment .terms{padding:20px}h2.woocommerce-loop-category__title mark{background:0 0;font-size:80%;opacity:.5}.woocommerce form.checkout_coupon,.woocommerce form.login,.woocommerce form.register{padding:0;margin:0 0 1.5em;border:0}#ship-to-different-address{padding:3px;font-size:inherit}.woocommerce-image-align-left .products ul,.woocommerce-image-align-left .products ul:after,.woocommerce-image-align-left ul.products,.woocommerce-image-align-left ul.products:after,.woocommerce-image-align-right .products ul,.woocommerce-image-align-right .products ul:after,.woocommerce-image-align-right ul.products,.woocommerce-image-align-right ul.products:after{clear:none}.woocommerce nav.woocommerce-pagination{margin-top:60px;clear:both}.woocommerce input.button:disabled,.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled],.woocommerce input.button:disabled[disabled]:hover{background-color:transparent;color:initial;opacity:.3}.entry-summary+.up-sells{clear:both}.woocommerce form .form-row input.input-text,.woocommerce form .form-row textarea{line-height:1.5}.main-navigation a.cart-contents:not(.has-svg-icon):before,.secondary-navigation a.cart-contents:not(.has-svg-icon):before{content:"\f07a";display:inline-block;font-family:"GP Premium";speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.main-navigation a.cart-contents:not(.has-svg-icon).shopping-bag:before,.secondary-navigation a.cart-contents:not(.has-svg-icon).shopping-bag:before{content:"\f290"}.main-navigation a.cart-contents:not(.has-svg-icon).shopping-basket:before,.secondary-navigation a.cart-contents:not(.has-svg-icon).shopping-basket:before{content:"\f291"}.cart-contents>span.number-of-items{font-size:11px;background:rgba(255,255,255,.1);line-height:1.7em;height:1.7em;width:1.7em;text-align:center;border-radius:50%;margin-left:5px;position:relative;top:-5px;display:none}form.checkout:after,form.checkout:before{content:'';display:table}form.checkout:after{clear:both}.add-to-cart-panel{position:fixed;top:0;left:0;right:0;background:#fff;padding:20px;opacity:0;transition:opacity 500ms ease-in-out,transform 500ms ease-in-out;box-shadow:0 2px 2px -2px rgba(0,0,0,.2);z-index:50;font-size:90%;box-sizing:border-box;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%)}.add-to-cart-panel.item-added,.add-to-cart-panel.show-sticky-add-to-cart{opacity:1}.add-to-cart-panel .continue-shopping{margin-right:auto}.add-to-cart-panel .continue-shopping .gp-icon{display:none}.add-to-cart-panel .cart-info{margin-right:20px}.add-to-cart-panel img{height:50px;width:auto;vertical-align:middle}.add-to-cart-panel .product-title{margin-left:20px;margin-right:auto;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.add-to-cart-panel .product-price{margin-right:20px}.add-to-cart-panel div.quantity{margin-right:4px}.add-to-cart-panel .cart-data{font-size:12px}.add-to-cart-panel del{opacity:.4}.do-quantity-buttons input.qty::-webkit-inner-spin-button,.do-quantity-buttons input.qty::-webkit-outer-spin-button{-webkit-appearance:none} diff --git a/wp-content/plugins/gp-premium/woocommerce/functions/customizer/customizer.php b/wp-content/plugins/gp-premium/woocommerce/functions/customizer/customizer.php new file mode 100644 index 0000000..8897d67 --- /dev/null +++ b/wp-content/plugins/gp-premium/woocommerce/functions/customizer/customizer.php @@ -0,0 +1,1031 @@ +register_control_type( 'GeneratePress_Title_Customize_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Pro_Range_Slider_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Information_Customize_Control' ); + $wp_customize->register_control_type( 'GeneratePress_Section_Shortcut_Control' ); + } + + $wp_customize->add_section( + 'generate_woocommerce_layout', + array( + 'title' => __( 'WooCommerce', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 100, + 'panel' => 'generate_layout_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Section_Shortcut_Control( + $wp_customize, + 'generate_woocommerce_layout_shortcuts', + array( + 'section' => 'generate_woocommerce_layout', + 'element' => __( 'WooCommerce', 'gp-premium' ), + 'shortcuts' => array( + 'colors' => 'generate_woocommerce_colors', + 'typography' => 'generate_woocommerce_typography', + ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + 'priority' => 0, + ) + ) + ); + + $wp_customize->add_control( + new GeneratePress_Title_Customize_Control( + $wp_customize, + 'generate_woocommerce_general_title', + array( + 'section' => 'generate_woocommerce_layout', + 'type' => 'generatepress-customizer-title', + 'title' => __( 'General','generate-woocommerce' ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname' + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[cart_menu_item]', + array( + 'default' => $defaults['cart_menu_item'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[cart_menu_item]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display cart in menu', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[cart_menu_item]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[menu_mini_cart]', + array( + 'default' => $defaults['menu_mini_cart'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[menu_mini_cart]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display mini cart sub-menu', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[menu_mini_cart]', + 'active_callback' => 'generate_premium_wc_menu_item_active', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[cart_menu_item_icon]', + array( + 'default' => $defaults['cart_menu_item_icon'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[cart_menu_item_icon]', + array( + 'type' => 'select', + 'label' => __( 'Menu Item Icon', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'choices' => array( + 'shopping-cart' => __( 'Shopping Cart', 'gp-premium' ), + 'shopping-bag' => __( 'Shopping Bag', 'gp-premium' ), + 'shopping-basket' => __( 'Shopping Basket', 'gp-premium' ), + ), + 'settings' => 'generate_woocommerce_settings[cart_menu_item_icon]', + 'active_callback' => 'generatepress_wc_menu_cart_active', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[cart_menu_item_content]', + array( + 'default' => $defaults['cart_menu_item_content'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[cart_menu_item_content]', + array( + 'type' => 'select', + 'label' => __( 'Menu Item Content', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'choices' => array( + 'amount' => __( 'Amount', 'gp-premium' ), + 'number' => __( 'Number of Items', 'gp-premium' ), + ), + 'settings' => 'generate_woocommerce_settings[cart_menu_item_content]', + 'active_callback' => 'generatepress_wc_menu_cart_active', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[breadcrumbs]', + array( + 'default' => $defaults['breadcrumbs'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[breadcrumbs]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display breadcrumbs', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[breadcrumbs]', + ) + ); + + $wp_customize->add_control( + new GeneratePress_Title_Customize_Control( + $wp_customize, + 'generate_woocommerce_shop_page_title', + array( + 'section' => 'generate_woocommerce_layout', + 'type' => 'generatepress-customizer-title', + 'title' => __( 'Shop','generate-woocommerce' ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname' + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[sidebar_layout]', + array( + 'default' => $defaults['sidebar_layout'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[sidebar_layout]', + array( + 'type' => 'select', + 'label' => __( 'Sidebar Layout', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'choices' => array( + 'left-sidebar' => __( 'Sidebar / Content', 'gp-premium' ), + 'right-sidebar' => __( 'Content / Sidebar', 'gp-premium' ), + 'no-sidebar' => __( 'Content (no sidebars)', 'gp-premium' ), + 'both-sidebars' => __( 'Sidebar / Content / Sidebar', 'gp-premium' ), + 'both-left' => __( 'Sidebar / Sidebar / Content', 'gp-premium' ), + 'both-right' => __( 'Content / Sidebar / Sidebar', 'gp-premium' ) + ), + 'settings' => 'generate_woocommerce_settings[sidebar_layout]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[columns]', array( + 'default' => $defaults['columns'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[tablet_columns]', array( + 'default' => $defaults['tablet_columns'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[mobile_columns]', array( + 'default' => $defaults['mobile_columns'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'gp_woocommerce_columns', + array( + 'label' => __( 'Product Columns', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => array( + 'desktop' => 'generate_woocommerce_settings[columns]', + 'tablet' => 'generate_woocommerce_settings[tablet_columns]', + 'mobile' => 'generate_woocommerce_settings[mobile_columns]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 1, + 'max' => 6, + 'step' => 1, + 'edit' => false, + 'unit' => 'Col', + ), + 'tablet' => array( + 'min' => 1, + 'max' => 3, + 'step' => 1, + 'edit' => false, + 'unit' => 'Col', + ), + 'mobile' => array( + 'min' => 1, + 'max' => 3, + 'step' => 1, + 'edit' => false, + 'unit' => 'Col', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[columns_gap]', array( + 'default' => $defaults['columns_gap'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[tablet_columns_gap]', array( + 'default' => $defaults['tablet_columns_gap'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint' + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[mobile_columns_gap]', array( + 'default' => $defaults['mobile_columns_gap'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'generate_premium_sanitize_empty_absint' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'gp_woocommerce_column_gap', + array( + 'label' => __( 'Column Gap', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => array( + 'desktop' => 'generate_woocommerce_settings[columns_gap]', + 'tablet' => 'generate_woocommerce_settings[tablet_columns_gap]', + 'mobile' => 'generate_woocommerce_settings[mobile_columns_gap]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 100, + 'step' => 5, + 'edit' => true, + 'unit' => 'px', + ), + 'tablet' => array( + 'min' => 0, + 'max' => 100, + 'step' => 5, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 0, + 'max' => 100, + 'step' => 5, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_image_alignment]', + array( + 'default' => $defaults['product_archive_image_alignment'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_image_alignment]', + array( + 'type' => 'radio', + 'label' => __( 'Image Alignment', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'choices' => array( + 'left' => __( 'Left', 'gp-premium' ), + 'center' => __( 'Center', 'gp-premium' ), + 'right' => __( 'Right', 'gp-premium' ), + ), + 'settings' => 'generate_woocommerce_settings[product_archive_image_alignment]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[products_per_page]', + array( + 'default' => $defaults['products_per_page'], + 'type' => 'option', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[products_per_page]', + array( + 'type' => 'text', + 'label' => __( 'Products Per Page', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[products_per_page]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_alignment]', + array( + 'default' => $defaults['product_archive_alignment'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_alignment]', + array( + 'type' => 'radio', + 'label' => __( 'Text Alignment', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'choices' => array( + 'left' => __( 'Left', 'gp-premium' ), + 'center' => __( 'Center', 'gp-premium' ), + 'right' => __( 'Right', 'gp-premium' ), + ), + 'settings' => 'generate_woocommerce_settings[product_archive_alignment]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[off_canvas_panel_on_add_to_cart]', + array( + 'default' => $defaults['off_canvas_panel_on_add_to_cart'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[off_canvas_panel_on_add_to_cart]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display cart panel on add to cart', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[off_canvas_panel_on_add_to_cart]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[shop_page_title]', + array( + 'default' => $defaults['shop_page_title'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[shop_page_title]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display page title', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[shop_page_title]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_results_count]', + array( + 'default' => $defaults['product_results_count'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_results_count]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display product results count', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_results_count]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_sorting]', + array( + 'default' => $defaults['product_sorting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_sorting]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display product sorting', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_sorting]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_image]', + array( + 'default' => $defaults['product_archive_image'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_image]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display product image', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_image]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_secondary_image]', + array( + 'default' => $defaults['product_secondary_image'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_secondary_image]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display secondary image on hover', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_secondary_image]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_title]', + array( + 'default' => $defaults['product_archive_title'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_title]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display product title', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_title]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_sale_flash]', + array( + 'default' => $defaults['product_archive_sale_flash'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_sale_flash]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display sale flash', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_sale_flash]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_sale_flash_overlay]', + array( + 'default' => $defaults['product_archive_sale_flash_overlay'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_sale_flash_overlay]', + array( + 'type' => 'checkbox', + 'label' => __( 'Sale flash over image', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_sale_flash_overlay]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_rating]', + array( + 'default' => $defaults['product_archive_rating'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_rating]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display rating', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_rating]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_price]', + array( + 'default' => $defaults['product_archive_price'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_price]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display price', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_price]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_add_to_cart]', + array( + 'default' => $defaults['product_archive_add_to_cart'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_add_to_cart]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display add to cart button', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_add_to_cart]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_archive_description]', + array( + 'default' => $defaults['product_archive_description'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_archive_description]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display short description', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_archive_description]', + ) + ); + + $wp_customize->add_control( + new GeneratePress_Title_Customize_Control( + $wp_customize, + 'generate_woocommerce_single_product_title', + array( + 'section' => 'generate_woocommerce_layout', + 'type' => 'generatepress-customizer-title', + 'title' => __( 'Single Product','generate-woocommerce' ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname' + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[single_sidebar_layout]', + array( + 'default' => $defaults['single_sidebar_layout'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_choices' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[single_sidebar_layout]', + array( + 'type' => 'select', + 'label' => __( 'Sidebar Layout', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'choices' => array( + 'inherit' => __( 'Inherit','generate-woocommerce' ), + 'left-sidebar' => __( 'Sidebar / Content', 'gp-premium' ), + 'right-sidebar' => __( 'Content / Sidebar', 'gp-premium' ), + 'no-sidebar' => __( 'Content (no sidebars)', 'gp-premium' ), + 'both-sidebars' => __( 'Sidebar / Content / Sidebar', 'gp-premium' ), + 'both-left' => __( 'Sidebar / Sidebar / Content', 'gp-premium' ), + 'both-right' => __( 'Content / Sidebar / Sidebar', 'gp-premium' ) + ), + 'settings' => 'generate_woocommerce_settings[single_sidebar_layout]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[single_product_image_width]', array( + 'default' => $defaults['single_product_image_width'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'gp_woocommerce_single_product_image_width', + array( + 'label' => __( 'Product Image Area Width', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => array( + 'desktop' => 'generate_woocommerce_settings[single_product_image_width]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 100, + 'step' => 5, + 'edit' => true, + 'unit' => '%', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[sticky_add_to_cart_panel]', + array( + 'default' => $defaults['sticky_add_to_cart_panel'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[sticky_add_to_cart_panel]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display add to cart panel on scroll', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[sticky_add_to_cart_panel]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[quantity_buttons]', + array( + 'default' => $defaults['quantity_buttons'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[quantity_buttons]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display quantity buttons', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[quantity_buttons]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[single_product_sale_flash]', + array( + 'default' => $defaults['single_product_sale_flash'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[single_product_sale_flash]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display sale flash', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[single_product_sale_flash]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_tabs]', + array( + 'default' => $defaults['product_tabs'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_tabs]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display product tabs', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_tabs]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_related]', + array( + 'default' => $defaults['product_related'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_related]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display related products', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_related]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_upsells]', + array( + 'default' => $defaults['product_upsells'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_upsells]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display upsell products', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_upsells]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[related_upsell_columns]', array( + 'default' => $defaults['related_upsell_columns'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[tablet_related_upsell_columns]', array( + 'default' => $defaults['tablet_related_upsell_columns'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[mobile_related_upsell_columns]', array( + 'default' => $defaults['mobile_related_upsell_columns'], + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'sanitize_callback' => 'absint' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Pro_Range_Slider_Control( + $wp_customize, + 'gp_woocommerce_related_upsell_columns', + array( + 'label' => __( 'Related/Upsell Columns', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => array( + 'desktop' => 'generate_woocommerce_settings[related_upsell_columns]', + 'tablet' => 'generate_woocommerce_settings[tablet_related_upsell_columns]', + 'mobile' => 'generate_woocommerce_settings[mobile_related_upsell_columns]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 1, + 'max' => 6, + 'step' => 1, + 'edit' => false, + 'unit' => 'Col', + ), + 'tablet' => array( + 'min' => 1, + 'max' => 3, + 'step' => 1, + 'edit' => false, + 'unit' => 'Col', + ), + 'mobile' => array( + 'min' => 1, + 'max' => 3, + 'step' => 1, + 'edit' => false, + 'unit' => 'Col', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_meta]', + array( + 'default' => $defaults['product_meta'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_meta]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display product meta data', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_meta]', + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[product_description]', + array( + 'default' => $defaults['product_description'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[product_description]', + array( + 'type' => 'checkbox', + 'label' => __( 'Display short description', 'gp-premium' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[product_description]', + ) + ); + + $wp_customize->add_section( + 'generate_woocommerce_colors', + array( + 'title' => __( 'WooCommerce', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 200, + 'panel' => 'generate_colors_panel' + ) + ); + + $wp_customize->add_section( + 'generate_woocommerce_typography', + array( + 'title' => __( 'WooCommerce', 'gp-premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 200, + 'panel' => 'generate_typography_panel' + ) + ); + + $wp_customize->add_control( + new GeneratePress_Title_Customize_Control( + $wp_customize, + 'generate_woocommerce_checkout_title', + array( + 'section' => 'generate_woocommerce_layout', + 'type' => 'generatepress-customizer-title', + 'title' => __( 'Checkout','generate-woocommerce' ), + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname' + ) + ) + ); + + $wp_customize->add_setting( + 'generate_woocommerce_settings[distraction_free]', + array( + 'default' => $defaults['distraction_free'], + 'type' => 'option', + 'sanitize_callback' => 'generate_premium_sanitize_checkbox' + ) + ); + + $wp_customize->add_control( + 'generate_woocommerce_settings[distraction_free]', + array( + 'type' => 'checkbox', + 'label' => __( 'Distraction-free mode', 'gp-premium' ), + 'description' => __( 'Remove unnecessary distractions like sidebars, footer widgets and sticky menus.','generate-woocommerce' ), + 'section' => 'generate_woocommerce_layout', + 'settings' => 'generate_woocommerce_settings[distraction_free]', + ) + ); + +} diff --git a/wp-content/plugins/gp-premium/woocommerce/functions/customizer/js/customizer.js b/wp-content/plugins/gp-premium/woocommerce/functions/customizer/js/customizer.js new file mode 100644 index 0000000..5b63e24 --- /dev/null +++ b/wp-content/plugins/gp-premium/woocommerce/functions/customizer/js/customizer.js @@ -0,0 +1,6 @@ +jQuery( document ).ready( function($) { + $( '#customize-control-generate_woocommerce_primary_button_message a' ).on( 'click', function( e ) { + e.preventDefault(); + wp.customize.control( 'generate_settings[form_button_background_color]' ).focus(); + }); +}); \ No newline at end of file diff --git a/wp-content/plugins/gp-premium/woocommerce/functions/functions.php b/wp-content/plugins/gp-premium/woocommerce/functions/functions.php new file mode 100644 index 0000000..a43ffa0 --- /dev/null +++ b/wp-content/plugins/gp-premium/woocommerce/functions/functions.php @@ -0,0 +1,1229 @@ + true, + 'cart_menu_item_icon' => 'shopping-cart', + 'cart_menu_item_content' => 'amount', + 'menu_mini_cart' => false, + 'off_canvas_panel_on_add_to_cart' => false, + 'sticky_add_to_cart_panel' => false, + 'sidebar_layout' => 'right-sidebar', + 'single_sidebar_layout' => 'inherit', + 'products_per_page' => 9, + 'columns' => 4, + 'tablet_columns' => 2, + 'mobile_columns' => 1, + 'columns_gap' => 50, + 'tablet_columns_gap' => '', + 'mobile_columns_gap' => '', + 'related_upsell_columns' => 4, + 'tablet_related_upsell_columns' => 2, + 'mobile_related_upsell_columns' => 1, + 'product_archive_image_alignment' => 'center', + 'product_archive_alignment' => 'center', + 'shop_page_title' => true, + 'product_results_count' => true, + 'product_sorting' => true, + 'product_archive_image' => true, + 'product_secondary_image' => true, + 'product_archive_title' => true, + 'product_archive_sale_flash' => true, + 'product_archive_sale_flash_overlay' => true, + 'product_archive_rating' => true, + 'product_archive_price' => true, + 'product_archive_add_to_cart' => true, + 'single_product_sale_flash' => true, + 'single_product_image_width' => '50', + 'product_tabs' => true, + 'product_related' => true, + 'product_upsells' => true, + 'product_meta' => true, + 'product_description' => true, + 'quantity_buttons' => true, + 'breadcrumbs' => true, + 'distraction_free' => true, + 'product_archive_description' => false, + ) ); +} + +add_filter( 'generate_color_option_defaults', 'generatepress_wc_color_defaults' ); +/** + * Set the WC color option defaults. + * + * @since 1.3 + */ +function generatepress_wc_color_defaults( $defaults ) { + $defaults[ 'wc_alt_button_background' ] = '#1e73be'; + $defaults[ 'wc_alt_button_background_hover' ] = '#377fbf'; + $defaults[ 'wc_alt_button_text' ] = '#ffffff'; + $defaults[ 'wc_alt_button_text_hover' ] = '#ffffff'; + $defaults[ 'wc_rating_stars' ] = '#ffa200'; + $defaults[ 'wc_sale_sticker_background' ] = '#222222'; + $defaults[ 'wc_sale_sticker_text' ] = '#ffffff'; + $defaults[ 'wc_price_color' ] = '#222222'; + $defaults[ 'wc_product_tab' ] = '#222222'; + $defaults[ 'wc_product_tab_highlight' ] = '#1e73be'; + $defaults[ 'wc_success_message_background' ] = '#0b9444'; + $defaults[ 'wc_success_message_text' ] = '#ffffff'; + $defaults[ 'wc_info_message_background' ] = '#1e73be'; + $defaults[ 'wc_info_message_text' ] = '#ffffff'; + $defaults[ 'wc_error_message_background' ] = '#e8626d'; + $defaults[ 'wc_error_message_text' ] = '#ffffff'; + $defaults[ 'wc_product_title_color' ] = ''; + $defaults[ 'wc_product_title_color_hover' ] = ''; + + $defaults['wc_mini_cart_background_color'] = '#ffffff'; + $defaults['wc_mini_cart_text_color'] = '#000000'; + $defaults['wc_mini_cart_button_background'] = ''; + $defaults['wc_mini_cart_button_text'] = ''; + $defaults['wc_mini_cart_button_background_hover'] = ''; + $defaults['wc_mini_cart_button_text_hover'] = ''; + + $defaults['wc_panel_cart_background_color'] = '#ffffff'; + $defaults['wc_panel_cart_text_color'] = '#000000'; + $defaults['wc_panel_cart_button_background'] = ''; + $defaults['wc_panel_cart_button_text'] = ''; + $defaults['wc_panel_cart_button_background_hover'] = ''; + $defaults['wc_panel_cart_button_text_hover'] = ''; + + $defaults['wc_price_slider_background_color'] = '#dddddd'; + $defaults['wc_price_slider_bar_color'] = '#666666'; + + return $defaults; +} + +add_filter( 'generate_font_option_defaults', 'generatepress_wc_typography_defaults' ); +/** + * Set the WC typography option defaults. + * + * @since 1.3 + */ +function generatepress_wc_typography_defaults( $defaults ) { + $defaults[ 'wc_product_title_font_weight' ] = 'normal'; + $defaults[ 'wc_product_title_font_transform' ] = 'none'; + $defaults[ 'wc_product_title_font_size' ] = '20'; + $defaults[ 'mobile_wc_product_title_font_size' ] = ''; + $defaults[ 'wc_related_product_title_font_size' ] = '20'; + return $defaults; +} + +add_filter( 'generate_navigation_class', 'generatepress_wc_navigation_class' ); +/** + * Add navigation class when the menu icon is enabled. + * + * @since 1.3 + */ +function generatepress_wc_navigation_class( $classes ) { + $classes[] = ( generatepress_wc_get_setting( 'cart_menu_item' ) ) ? 'wc-menu-cart-activated' : ''; + return $classes; +} + +add_filter( 'post_class', 'generatepress_wc_post_class' ); +add_filter( 'product_cat_class', 'generatepress_wc_post_class' ); +/** + * Add post classes to the products. + * + * @since 1.3 + * + * @param array $classes Existing product classes. + * @return array + */ +function generatepress_wc_post_class( $classes ) { + if ( 'product' == get_post_type() ) { + $classes[] = ( generatepress_wc_get_setting( 'product_archive_sale_flash_overlay' ) && generatepress_wc_get_setting( 'product_archive_image' ) ) ? 'sales-flash-overlay' : ''; + $classes[] = 'woocommerce-text-align-' . generatepress_wc_get_setting( 'product_archive_alignment' ); + + if ( is_single() ) { + $classes[] = 'wc-related-upsell-columns-' . generatepress_wc_get_setting( 'related_upsell_columns' ); + $classes[] = 'wc-related-upsell-tablet-columns-' . generatepress_wc_get_setting( 'tablet_related_upsell_columns' ); + $classes[] = 'wc-related-upsell-mobile-columns-' . generatepress_wc_get_setting( 'mobile_related_upsell_columns' ); + } else { + $classes[] = 'woocommerce-image-align-' . generatepress_wc_get_setting( 'product_archive_image_alignment' ); + } + } + + if ( 'product' === get_post_type() || is_cart() ) { + if ( generatepress_wc_get_setting( 'quantity_buttons' ) ) { + $classes[] = 'do-quantity-buttons'; + } + } + + return $classes; +} + +add_action( 'woocommerce_before_shop_loop', 'generatepress_wc_before_shop_loop' ); +/** + * Add opening element inside shop page. + * + * @since 1.3 + */ +function generatepress_wc_before_shop_loop() { + $classes = apply_filters( 'generate_woocommerce_container_classes', array( + 'wc-columns-container', + 'wc-columns-' . generatepress_wc_get_setting( 'columns' ), + 'wc-tablet-columns-' . generatepress_wc_get_setting( 'tablet_columns' ), + 'wc-mobile-columns-' . generatepress_wc_get_setting( 'mobile_columns' ), + ) ); + + $classes = array_map('esc_attr', $classes); + echo '
        '; +} + +add_action( 'woocommerce_after_shop_loop', 'generatepress_wc_after_shop_loop' ); +/** + * Add closing element inside shop page. + * + * @since 1.3 + */ +function generatepress_wc_after_shop_loop() { + echo '
        '; +} + +add_action( 'wp_enqueue_scripts', 'generatepress_wc_scripts', 100 ); +/** + * Add scripts and styles. + * + * @since 1.3 + */ +function generatepress_wc_scripts() { + $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + wp_enqueue_style( 'generate-woocommerce', plugin_dir_url( __FILE__ ) . "css/woocommerce{$suffix}.css", array(), GENERATE_WOOCOMMERCE_VERSION ); + wp_enqueue_style( 'generate-woocommerce-mobile', plugin_dir_url( __FILE__ ) . "css/woocommerce-mobile{$suffix}.css", array(), GENERATE_WOOCOMMERCE_VERSION, generate_premium_get_media_query( 'mobile' ) ); + //wp_enqueue_style( 'generate-woocommerce-tablet', plugin_dir_url( __FILE__ ) . "css/woocommerce-tablet{$suffix}.css", array(), GENERATE_WOOCOMMERCE_VERSION, apply_filters( 'generate_tablet_media_query', '(min-width: 769px) and (max-width: 1024px)' ) ); + + wp_enqueue_script( 'generate-woocommerce', plugin_dir_url( __FILE__ ) . "js/woocommerce{$suffix}.js", array( 'jquery' ), GENERATE_WOOCOMMERCE_VERSION, true ); + + wp_localize_script( + 'generate-woocommerce', + 'generateWooCommerce', + array( + 'quantityButtons' => generatepress_wc_get_setting( 'quantity_buttons' ), + 'stickyAddToCart' => generatepress_wc_show_sticky_add_to_cart(), + 'addToCartPanel' => ! is_singular() && generatepress_wc_get_setting( 'off_canvas_panel_on_add_to_cart' ), + ) + ); + + if ( generatepress_wc_get_setting( 'distraction_free' ) && is_checkout() ) { + wp_dequeue_script( 'generate-advanced-sticky' ); + wp_dequeue_script( 'generate-sticky' ); + } + + $font_icons = true; + + if ( function_exists( 'generate_get_option' ) ) { + if ( 'font' !== generate_get_option( 'icons' ) ) { + $font_icons = false; + } + } + + if ( $font_icons ) { + wp_enqueue_style( 'gp-premium-icons' ); + } +} + +/** + * Wrapper class to get the options. + * + * @since 1.3 + * + * @return string $setting The option name. + * @return string The value. + */ +function generatepress_wc_get_setting( $setting ) { + $settings = wp_parse_args( + get_option( 'generate_woocommerce_settings', array() ), + generatepress_wc_defaults() + ); + + return $settings[ $setting ]; +} + +add_filter( 'generate_sidebar_layout', 'generatepress_wc_sidebar_layout' ); +/** + * Set the WC sidebars. + * + * @since 1.3 + * + * @param string Existing layout + * @return string New layout + */ +function generatepress_wc_sidebar_layout( $layout ) { + if ( is_woocommerce() ) { + $layout = generatepress_wc_get_setting( 'sidebar_layout' ); + + if ( is_single() ) { + if ( 'inherit' !== generatepress_wc_get_setting( 'single_sidebar_layout' ) ) { + $layout = generatepress_wc_get_setting( 'single_sidebar_layout' ); + } + + if ( get_post_meta( get_the_ID(), '_generate-sidebar-layout-meta', true ) ) { + $layout = get_post_meta( get_the_ID(), '_generate-sidebar-layout-meta', true ); + } + } + } + + return $layout; +} + +add_filter( 'loop_shop_columns', 'generatepress_wc_product_columns', 999 ); +/** + * Set the WC column number. + * + * @since 1.3 + */ +function generatepress_wc_product_columns() { + return generatepress_wc_get_setting( 'columns' ); +} + +add_filter( 'loop_shop_per_page', 'generatepress_wc_products_per_page', 20 ); +/** + * Set the WC products per page. + * + * @since 1.3 + */ +function generatepress_wc_products_per_page() { + return generatepress_wc_get_setting( 'products_per_page' ); +} + +add_action( 'wp', 'generatepress_wc_setup' ); +/** + * Set up WC. + * + * @since 1.3 + */ +function generatepress_wc_setup() { + + // Add support for WC features + add_theme_support( 'wc-product-gallery-zoom' ); + add_theme_support( 'wc-product-gallery-lightbox' ); + add_theme_support( 'wc-product-gallery-slider' ); + + remove_action( 'wp_enqueue_scripts','generate_woocommerce_css', 100 ); + + remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 ); + add_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 10 ); + + add_action( 'woocommerce_before_shop_loop_item_title' , 'generatepress_wc_image_wrapper_open', 8 ); + add_action( 'woocommerce_before_subcategory_title' , 'generatepress_wc_image_wrapper_open', 8 ); + add_action( 'woocommerce_shop_loop_item_title' , 'generatepress_wc_image_wrapper_close', 8 ); + add_action( 'woocommerce_before_subcategory_title' , 'generatepress_wc_image_wrapper_close', 20 ); + + $archive_results_count = generatepress_wc_get_setting( 'product_results_count' ); + $archive_sorting = generatepress_wc_get_setting( 'product_sorting' ); + $archive_image = generatepress_wc_get_setting( 'product_archive_image' ); + $archive_sale_flash = generatepress_wc_get_setting( 'product_archive_sale_flash' ); + $archive_sale_flash_overlay = generatepress_wc_get_setting( 'product_archive_sale_flash_overlay' ); + $archive_rating = generatepress_wc_get_setting( 'product_archive_rating' ); + $archive_price = generatepress_wc_get_setting( 'product_archive_price' ); + $archive_add_to_cart = generatepress_wc_get_setting( 'product_archive_add_to_cart' ); + $archive_title = generatepress_wc_get_setting( 'product_archive_title' ); + $single_product_sale_flash = generatepress_wc_get_setting( 'single_product_sale_flash' ); + $product_tabs = generatepress_wc_get_setting( 'product_tabs' ); + $product_related = generatepress_wc_get_setting( 'product_related' ); + $product_upsells = generatepress_wc_get_setting( 'product_upsells' ); + $product_meta = generatepress_wc_get_setting( 'product_meta' ); + $product_description = generatepress_wc_get_setting( 'product_description' ); + $breadcrumbs = generatepress_wc_get_setting( 'breadcrumbs' ); + $page_title = generatepress_wc_get_setting( 'shop_page_title' ); + $distraction_free = generatepress_wc_get_setting( 'distraction_free' ); + $archive_description = generatepress_wc_get_setting( 'product_archive_description' ); + + if ( false === $page_title ) { + add_filter( 'woocommerce_show_page_title' , '__return_false' ); + } + + if ( false === $archive_results_count ) { + remove_action( 'woocommerce_after_shop_loop', 'woocommerce_result_count', 20 ); + remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20 ); + } + + if ( false === $archive_sorting ) { + remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 10 ); + } + + if ( false === $archive_image ) { + remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 ); + } + + if ( false === $archive_sale_flash_overlay ) { + remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash', 10 ); + add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash', 6 ); + } + + if ( false === $archive_sale_flash ) { + if ( false === $archive_sale_flash_overlay ) { + remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash', 6 ); + } else { + remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash', 10 ); + } + } + + if ( false === $single_product_sale_flash ) { + remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_sale_flash', 10 ); + } + + if ( false === $archive_rating ) { + remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 ); + } + + if ( false === $archive_price ) { + remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); + } + + if ( false === $archive_add_to_cart ) { + remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 ); + } + + if ( false === $archive_title ) { + remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 ); + } + + if ( false === $product_tabs ) { + remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_product_data_tabs', 10 ); + } + + if ( false === $product_related ) { + remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 ); + } + + if ( false === $product_upsells ) { + remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 ); + } + + if ( false === $product_meta ) { + remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40 ); + } + + if ( false === $product_description ) { + remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_excerpt', 20 ); + } + + if ( false === $breadcrumbs ) { + remove_action( 'woocommerce_before_main_content','woocommerce_breadcrumb', 20, 0); + } + + if ( true === $distraction_free ) { + add_filter( 'generate_sidebar_layout','generatepress_wc_checkout_sidebar_layout' ); + add_filter( 'generate_footer_widgets','generatepress_wc_checkout_footer_widgets' ); + } + + if ( true === $archive_description && ! is_single() && ! is_cart() ) { + add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_single_excerpt', 5 ); + add_action( 'woocommerce_after_subcategory_title', 'generatepress_wc_category_description', 12 ); + } +} + +/** + * Set the WC checkout sidebar layout. + * + * @since 1.3 + * + * @param string $sidebar Existing sidebar layout. + * @return string New sidebar layout. + */ +function generatepress_wc_checkout_sidebar_layout( $layout ) { + if ( is_checkout() ) { + return 'no-sidebar'; + } + + return $layout; +} + +/** + * Set the WC checkout footer widgets. + * + * @since 1.3 + * + * @param int $widgets Existing number of widgets. + * @return int New number of widgets. + */ +function generatepress_wc_checkout_footer_widgets( $widgets ) { + if ( is_checkout() ) { + return '0'; + } + + return $widgets; +} + +add_filter( 'wp_nav_menu_items', 'generatepress_wc_menu_cart', 10, 2 ); +/** + * Add the WC cart menu item. + * + * @since 1.3 + * + * @param string $nav The HTML list content for the menu items. + * @param stdClass $args An object containing wp_nav_menu() arguments. + * @return string The search icon menu item. + */ +function generatepress_wc_menu_cart( $nav, $args ) { + // If our primary menu is set, add the search icon + if ( $args->theme_location == apply_filters( 'generate_woocommerce_menu_item_location', 'primary' ) && generatepress_wc_get_setting( 'cart_menu_item' ) ) { + $has_items = false; + + if ( ! WC()->cart->is_empty() ) { + $has_items = 'has-items'; + } + + return sprintf( + '%1$s + ', + $nav, + generatepress_wc_cart_link(), + is_cart() ? 'current-menu-item' : '', + $has_items + ); + } + + // Our primary menu isn't set, return the regular nav + return $nav; +} + +/** + * Build the menu cart link. + * + * @since 1.3 + */ +function generatepress_wc_cart_link() { + // Kept for backward compatibility. + $legacy_icon = apply_filters( 'generate_woocommerce_menu_cart_icon', '' ); + + // Get the icon type. + $icon_type = generatepress_wc_get_setting( 'cart_menu_item_icon' ); + + $icon = ''; + + if ( function_exists( 'generate_get_svg_icon' ) ) { + $icon = generate_get_svg_icon( $icon_type ); + } + + ob_start(); + + $no_items = ''; + + if ( ! WC()->cart->get_cart_contents_count() > 0 ) { + $no_items = 'no-items'; + } + + printf( + '%5$s%6$s%7$s%8$s', + esc_url( wc_get_cart_url() ), + esc_attr( $icon_type ), + $icon ? 'has-svg-icon' : '', + esc_attr__( 'View your shopping cart', 'gp-premium' ), + $icon, + sprintf ( + _n( + '%d', + '%d', + WC()->cart->get_cart_contents_count() + ), + WC()->cart->get_cart_contents_count() + ), + $legacy_icon, + WC()->cart->subtotal > 0 ? wp_kses_data( WC()->cart->get_cart_subtotal() ) : '' + ); + + if ( generatepress_wc_get_setting( 'menu_mini_cart' ) && ! is_cart() ) : ?> + + cart->subtotal > 0 ) ? '' . wp_kses_data( WC()->cart->get_cart_subtotal() ) . '' : ''; + $fragments['.cart-contents span.number-of-items'] = ( WC()->cart->get_cart_contents_count() > 0 ) ? '' . wp_kses_data( WC()->cart->get_cart_contents_count() ) . '' : ''; + + return $fragments; +} + +add_action( 'generate_inside_navigation', 'generatepress_wc_mobile_cart_link' ); +add_action( 'generate_inside_mobile_header', 'generatepress_wc_mobile_cart_link' ); +/** + * Add the cart icon in the mobile menu. + * + * @since 1.3 + */ +function generatepress_wc_mobile_cart_link() { + if ( ! generatepress_wc_get_setting( 'cart_menu_item' ) || 'primary' !== apply_filters( 'generate_woocommerce_menu_item_location', 'primary' ) ) { + return; + } + + $has_items = false; + + if ( ! WC()->cart->is_empty() ) { + $has_items = ' has-items'; + } + ?> +
        + + +
        + set_selector( '.woocommerce ul.products li.product .woocommerce-LoopProduct-link' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_product_title_color' ] ) ); + + // Product title color hover + $css->set_selector( '.woocommerce ul.products li.product .woocommerce-LoopProduct-link:hover' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_product_title_color_hover' ] ) ); + + // Product title font size + $css->set_selector( '.woocommerce ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce ul.products li.product .woocommerce-loop-category__title' ); + $css->add_property( 'font-weight', esc_attr( $settings[ 'wc_product_title_font_weight' ] ) ); + $css->add_property( 'text-transform', esc_attr( $settings[ 'wc_product_title_font_transform' ] ) ); + $css->add_property( 'font-size', esc_attr( $settings[ 'wc_product_title_font_size' ] ), false, 'px' ); + + $css->set_selector( '.woocommerce .up-sells ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce .cross-sells ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce .related ul.products li.product .woocommerce-LoopProduct-link h2' ); + if ( '' !== $settings[ 'wc_related_product_title_font_size' ] ) { + $css->add_property( 'font-size', esc_attr( $settings[ 'wc_related_product_title_font_size' ] ), false, 'px' ); + } + + // Primary button + $css->set_selector( '.woocommerce #respond input#submit, .woocommerce a.button, .woocommerce button.button, .woocommerce input.button' ); + $css->add_property( 'color', esc_attr( $settings[ 'form_button_text_color' ] ) ); + $css->add_property( 'background-color', esc_attr( $settings[ 'form_button_background_color' ] ) ); + + if ( isset( $settings[ 'buttons_font_size' ] ) ) { + $css->add_property( 'font-weight', esc_attr( $settings[ 'buttons_font_weight' ] ) ); + $css->add_property( 'text-transform', esc_attr( $settings[ 'buttons_font_transform' ] ) ); + + if ( '' !== $settings[ 'buttons_font_size' ] ) { + $css->add_property( 'font-size', absint( $settings[ 'buttons_font_size' ] ), false, 'px' ); + } + } + + // Primary button hover + $css->set_selector( '.woocommerce #respond input#submit:hover, .woocommerce a.button:hover, .woocommerce button.button:hover, .woocommerce input.button:hover' ); + $css->add_property( 'color', esc_attr( $settings[ 'form_button_text_color_hover' ] ) ); + $css->add_property( 'background-color', esc_attr( $settings[ 'form_button_background_color_hover' ] ) ); + + // Alt button + $css->set_selector( '.woocommerce #respond input#submit.alt, .woocommerce a.button.alt, .woocommerce button.button.alt, .woocommerce input.button.alt, .woocommerce #respond input#submit.alt.disabled, .woocommerce #respond input#submit.alt.disabled:hover, .woocommerce #respond input#submit.alt:disabled, .woocommerce #respond input#submit.alt:disabled:hover, .woocommerce #respond input#submit.alt:disabled[disabled], .woocommerce #respond input#submit.alt:disabled[disabled]:hover, .woocommerce a.button.alt.disabled, .woocommerce a.button.alt.disabled:hover, .woocommerce a.button.alt:disabled, .woocommerce a.button.alt:disabled:hover, .woocommerce a.button.alt:disabled[disabled], .woocommerce a.button.alt:disabled[disabled]:hover, .woocommerce button.button.alt.disabled, .woocommerce button.button.alt.disabled:hover, .woocommerce button.button.alt:disabled, .woocommerce button.button.alt:disabled:hover, .woocommerce button.button.alt:disabled[disabled], .woocommerce button.button.alt:disabled[disabled]:hover, .woocommerce input.button.alt.disabled, .woocommerce input.button.alt.disabled:hover, .woocommerce input.button.alt:disabled, .woocommerce input.button.alt:disabled:hover, .woocommerce input.button.alt:disabled[disabled], .woocommerce input.button.alt:disabled[disabled]:hover' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_alt_button_text' ] ) ); + $css->add_property( 'background-color', esc_attr( $settings[ 'wc_alt_button_background' ] ) ); + + // Alt button hover + $css->set_selector( '.woocommerce #respond input#submit.alt:hover, .woocommerce a.button.alt:hover, .woocommerce button.button.alt:hover, .woocommerce input.button.alt:hover' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_alt_button_text_hover' ] ) ); + $css->add_property( 'background-color', esc_attr( $settings[ 'wc_alt_button_background_hover' ] ) ); + + // Star rating + $css->set_selector( '.woocommerce .star-rating span:before, .woocommerce p.stars:hover a::before' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_rating_stars' ] ) ); + + // Sale sticker + $css->set_selector( '.woocommerce span.onsale' ); + $css->add_property( 'background-color', esc_attr( $settings[ 'wc_sale_sticker_background' ] ) ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_sale_sticker_text' ] ) ); + + // Price + $css->set_selector( '.woocommerce ul.products li.product .price, .woocommerce div.product p.price' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_price_color' ] ) ); + + // Product tab + $css->set_selector( '.woocommerce div.product .woocommerce-tabs ul.tabs li a' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_product_tab' ] ) ); + + // Highlight product tab + $css->set_selector( '.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover, .woocommerce div.product .woocommerce-tabs ul.tabs li.active a' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_product_tab_highlight' ] ) ); + + // Success message + $css->set_selector( '.woocommerce-message' ); + $css->add_property( 'background-color', esc_attr( $settings[ 'wc_success_message_background' ] ) ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_success_message_text' ] ) ); + + $css->set_selector( 'div.woocommerce-message a.button, div.woocommerce-message a.button:focus, div.woocommerce-message a.button:hover, div.woocommerce-message a, div.woocommerce-message a:focus, div.woocommerce-message a:hover' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_success_message_text' ] ) ); + + // Info message + $css->set_selector( '.woocommerce-info' ); + $css->add_property( 'background-color', esc_attr( $settings[ 'wc_info_message_background' ] ) ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_info_message_text' ] ) ); + + $css->set_selector( 'div.woocommerce-info a.button, div.woocommerce-info a.button:focus, div.woocommerce-info a.button:hover, div.woocommerce-info a, div.woocommerce-info a:focus, div.woocommerce-info a:hover' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_info_message_text' ] ) ); + + // Info message + $css->set_selector( '.woocommerce-error' ); + $css->add_property( 'background-color', esc_attr( $settings[ 'wc_error_message_background' ] ) ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_error_message_text' ] ) ); + + $css->set_selector( 'div.woocommerce-error a.button, div.woocommerce-error a.button:focus, div.woocommerce-error a.button:hover, div.woocommerce-error a, div.woocommerce-error a:focus, div.woocommerce-error a:hover' ); + $css->add_property( 'color', esc_attr( $settings[ 'wc_error_message_text' ] ) ); + + // Archive short description + $css->set_selector( '.woocommerce-product-details__short-description' ); + if ( '' !== $settings[ 'content_text_color' ] ) { + $css->add_property( 'color', esc_attr( $settings[ 'content_text_color' ] ) ); + } else { + $css->add_property( 'color', esc_attr( $settings[ 'text_color' ] ) ); + } + + $css->set_selector( '#wc-mini-cart' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_mini_cart_background_color'] ) ); + $css->add_property( 'color', esc_attr( $settings['wc_mini_cart_text_color'] ) ); + + $css->set_selector( '#wc-mini-cart a:not(.button), #wc-mini-cart a.remove' ); + $css->add_property( 'color', esc_attr( $settings['wc_mini_cart_text_color'] ) ); + + $css->set_selector( '#wc-mini-cart .button' ); + if ( $settings['wc_mini_cart_button_background'] ) { + $css->add_property( 'background-color', esc_attr( $settings['wc_mini_cart_button_background'] ) ); + } + + if ( $settings['wc_mini_cart_button_text'] ) { + $css->add_property( 'color', esc_attr( $settings['wc_mini_cart_button_text'] ) ); + } else { + $css->add_property( 'color', esc_attr( $settings['form_button_text_color'] ) ); + } + + $css->set_selector( '#wc-mini-cart .button:hover, #wc-mini-cart .button:focus, #wc-mini-cart .button:active' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_mini_cart_button_background_hover'] ) ); + + if ( $settings['wc_mini_cart_button_text_hover'] ) { + $css->add_property( 'color', esc_attr( $settings['wc_mini_cart_button_text_hover'] ) ); + } else { + $css->add_property( 'color', esc_attr( $settings['form_button_text_color_hover'] ) ); + } + + $css->set_selector( '.woocommerce #content div.product div.images, .woocommerce div.product div.images, .woocommerce-page #content div.product div.images, .woocommerce-page div.product div.images' ); + $css->add_property( 'width', absint( generatepress_wc_get_setting( 'single_product_image_width' ) ), false, '%' ); + + if ( function_exists( 'generate_get_font_family_css' ) ) { + $buttons_family = generate_get_font_family_css( 'font_buttons', 'generate_settings', generate_get_default_fonts() ); + $css->set_selector( '.woocommerce.widget_shopping_cart .woocommerce-mini-cart__buttons a' ); + $css->add_property( 'font-family', $buttons_family ); + } + + $css->set_selector( '.add-to-cart-panel' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_panel_cart_background_color'] ) ); + $css->add_property( 'color', esc_attr( $settings['wc_panel_cart_text_color'] ) ); + + $css->set_selector( '.add-to-cart-panel a:not(.button)' ); + $css->add_property( 'color', esc_attr( $settings['wc_panel_cart_text_color'] ) ); + + $css->set_selector( '#wc-sticky-cart-panel .button' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_panel_cart_button_background'] ) ); + $css->add_property( 'color', esc_attr( $settings['wc_panel_cart_button_text'] ) ); + + $css->set_selector( '#wc-sticky-cart-panel .button:hover, #wc-sticky-cart-panel .button:focus, #wc-sticky-cart-panel .button:active' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_panel_cart_button_background_hover'] ) ); + $css->add_property( 'color', esc_attr( $settings['wc_panel_cart_button_text_hover'] ) ); + + $transparent_border_color = $settings['text_color']; + + if ( $settings['content_text_color'] ) { + $transparent_border_color = $settings['content_text_color']; + } + + $transparent_border_color = generate_premium_check_text_color( $transparent_border_color ); + + if ( 'light' === $transparent_border_color ) { + $transparent_border_elements = '.woocommerce-ordering select, .variations .value select'; + + if ( generatepress_wc_get_setting( 'quantity_buttons' ) ) { + $transparent_border_elements = '.woocommerce form .quantity.buttons-added .qty, .woocommerce form .quantity.buttons-added .minus, .woocommerce form .quantity.buttons-added .plus, .do-quantity-buttons form .quantity:not(.buttons-added):before, .do-quantity-buttons form .quantity:not(.buttons-added):after, .woocommerce-ordering select, .variations .value select'; + } + + $css->set_selector( $transparent_border_elements ); + $css->add_property( 'border-color', 'rgba(255,255,255,0.1)' ); + + if ( generatepress_wc_get_setting( 'sticky_add_to_cart_panel' ) ) { + $css->set_selector( '#wc-sticky-cart-panel .quantity.buttons-added .qty, #wc-sticky-cart-panel .quantity.buttons-added .minus, #wc-sticky-cart-panel .quantity.buttons-added .plus' ); + $css->add_property( 'border-color', 'rgba(255,255,255,0.1)' ); + } + } + + $css->set_selector( '.woocommerce .widget_price_filter .price_slider_wrapper .ui-widget-content' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_price_slider_background_color'] ) ); + + $css->set_selector( '.woocommerce .widget_price_filter .ui-slider .ui-slider-range, .woocommerce .widget_price_filter .ui-slider .ui-slider-handle' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_price_slider_bar_color'] ) ); + + if ( 'number' === generatepress_wc_get_setting( 'cart_menu_item_content' ) ) { + $nav_text_color = generate_premium_check_text_color( $settings['navigation_text_color'] ); + + $css->set_selector( '.cart-contents > span.number-of-items' ); + if ( 'light' === $nav_text_color ) { + $css->add_property( 'background-color', 'rgba(255,255,255,0.1)' ); + } else { + $css->add_property( 'background-color', 'rgba(0,0,0,0.05)' ); + } + + $css->set_selector( '.cart-contents .amount' ); + $css->add_property( 'display', 'none' ); + + $css->set_selector( '.cart-contents > span.number-of-items' ); + $css->add_property( 'display', 'inline-block' ); + } + + $font_icons = true; + + if ( function_exists( 'generate_get_option' ) ) { + if ( 'font' !== generate_get_option( 'icons' ) ) { + $font_icons = false; + } + } + + if ( ! $font_icons ) { + $css->set_selector( '.woocommerce-MyAccount-navigation li.is-active a:after, a.button.wc-forward:after' ); + $css->add_property( 'display', 'none' ); + + $css->set_selector( '#payment .payment_methods>.wc_payment_method>label:before' ); + $css->add_property( 'font-family', 'WooCommerce' ); + $css->add_property( 'content', '"\e039"' ); + + $css->set_selector( '#payment .payment_methods li.wc_payment_method>input[type=radio]:first-child:checked+label:before' ); + $css->add_property( 'content', '"\e03c"' ); + + $css->set_selector( '.woocommerce-ordering:after' ); + $css->add_property( 'font-family', 'WooCommerce' ); + $css->add_property( 'content', '"\e00f"' ); + } + + $css->set_selector( '.wc-columns-container .products, .woocommerce .related ul.products, .woocommerce .up-sells ul.products' ); + + if ( '' !== generatepress_wc_get_setting( 'columns_gap' ) ) { + $css->add_property( 'grid-gap', generatepress_wc_get_setting( 'columns_gap' ), false, 'px' ); + } + + $css->start_media_query( generate_premium_get_media_query( 'tablet' ) ); + $css->set_selector( '.wc-columns-container .products, .woocommerce .related ul.products, .woocommerce .up-sells ul.products' ); + + if ( '' !== generatepress_wc_get_setting( 'tablet_columns_gap' ) ) { + $css->add_property( 'grid-gap', generatepress_wc_get_setting( 'tablet_columns_gap' ), false, 'px' ); + } + + if ( 3 === generatepress_wc_get_setting( 'tablet_columns' ) ) { + $css->set_selector( '.woocommerce .wc-columns-container.wc-tablet-columns-3 .products' ); + $css->add_property( '-ms-grid-columns', '(1fr)[3]' ); + $css->add_property( 'grid-template-columns', 'repeat(3, 1fr)' ); + } + + if ( 2 === generatepress_wc_get_setting( 'tablet_columns' ) ) { + $css->set_selector( '.woocommerce .wc-columns-container.wc-tablet-columns-2 .products' ); + $css->add_property( '-ms-grid-columns', '(1fr)[2]' ); + $css->add_property( 'grid-template-columns', 'repeat(2, 1fr)' ); + } + + if ( 1 === generatepress_wc_get_setting( 'tablet_columns' ) ) { + $css->set_selector( '.woocommerce .wc-columns-container.wc-tablet-columns-1 .products' ); + $css->add_property( 'width', '100%' ); + $css->add_property( '-ms-grid-columns', '1fr' ); + $css->add_property( 'grid-template-columns', '1fr' ); + } + + if ( 3 === generatepress_wc_get_setting( 'tablet_related_upsell_columns' ) ) { + $css->set_selector( '.wc-related-upsell-tablet-columns-3 .related ul.products, .wc-related-upsell-tablet-columns-3 .up-sells ul.products' ); + $css->add_property( '-ms-grid-columns', '(1fr)[3]' ); + $css->add_property( 'grid-template-columns', 'repeat(3, 1fr)' ); + } + + if ( 2 === generatepress_wc_get_setting( 'tablet_related_upsell_columns' ) ) { + $css->set_selector( '.wc-related-upsell-tablet-columns-2 .related ul.products, .wc-related-upsell-tablet-columns-2 .up-sells ul.products' ); + $css->add_property( '-ms-grid-columns', '(1fr)[2]' ); + $css->add_property( 'grid-template-columns', 'repeat(2, 1fr)' ); + } + + if ( 1 === generatepress_wc_get_setting( 'tablet_related_upsell_columns' ) ) { + $css->set_selector( '.wc-related-upsell-tablet-columns-1 .related ul.products, .wc-related-upsell-tablet-columns-1 .up-sells ul.products' ); + $css->add_property( 'width', '100%' ); + $css->add_property( '-ms-grid-columns', '1fr' ); + $css->add_property( 'grid-template-columns', '1fr' ); + } + $css->stop_media_query(); + + $css->start_media_query( generate_premium_get_media_query( 'mobile' ) ); + $css->set_selector( '.woocommerce ul.products li.product .woocommerce-LoopProduct-link h2, .woocommerce ul.products li.product .woocommerce-loop-category__title' ); + if ( '' !== $settings[ 'mobile_wc_product_title_font_size' ] ) { + $css->add_property( 'font-size', esc_attr( $settings[ 'mobile_wc_product_title_font_size' ] ), false, 'px' ); + } + + $css->set_selector( '.add-to-cart-panel .continue-shopping' ); + $css->add_property( 'background-color', esc_attr( $settings['wc_panel_cart_background_color'] ) ); + + $css->set_selector( '.wc-columns-container .products, .woocommerce .related ul.products, .woocommerce .up-sells ul.products' ); + + if ( '' !== generatepress_wc_get_setting( 'mobile_columns_gap' ) ) { + $css->add_property( 'grid-gap', generatepress_wc_get_setting( 'mobile_columns_gap' ), false, 'px' ); + } + $css->stop_media_query(); + + $css->start_media_query( generate_premium_get_media_query( 'mobile-menu' ) ); + $css->set_selector( '.mobile-bar-items + .menu-toggle' ); + $css->add_property( 'text-align', 'left' ); + + $css->set_selector( 'nav.toggled .main-nav li.wc-menu-item' ); + $css->add_property( 'display', 'none !important' ); + + $css->set_selector( 'body.nav-search-enabled .wc-menu-cart-activated:not(#mobile-header) .mobile-bar-items' ); + $css->add_property( 'float', 'right' ); + $css->add_property( 'position', 'relative' ); + + $css->set_selector( '.nav-search-enabled .wc-menu-cart-activated:not(#mobile-header) .menu-toggle' ); + $css->add_property( 'float', 'left' ); + $css->add_property( 'width', 'auto' ); + + $css->set_selector( '.mobile-bar-items.wc-mobile-cart-items' ); + $css->add_property( 'z-index', '1' ); + $css->stop_media_query(); + + return $css->css_output(); +} + +add_action( 'wp_enqueue_scripts', 'generatepress_wc_enqueue_css', 100 ); +/** + * Enqueue our dynamic CSS. + * + * @since 1.3 + */ +function generatepress_wc_enqueue_css() { + wp_add_inline_style( 'generate-woocommerce', generatepress_wc_css() ); +} + +/** + * Open WC image wrapper. + * + * @since 1.3 + */ +function generatepress_wc_image_wrapper_open() { + if ( generatepress_wc_get_setting( 'product_archive_image' ) ) { + echo '
        '; + } +} + +/** + * Close WC image wrapper. + * + * @since 1.3 + */ +function generatepress_wc_image_wrapper_close() { + if ( generatepress_wc_get_setting( 'product_archive_image' ) ) { + echo '
        '; + } +} + +add_filter( 'post_class', 'generatepress_wc_product_has_gallery' ); +add_filter( 'product_cat_class', 'generatepress_wc_product_has_gallery' ); +/** + * Add product image post classes to products. + * + * @since 1.3 + * + * @param array $classes Existing classes. + * @return array New classes. + */ +function generatepress_wc_product_has_gallery( $classes ) { + + $post_type = get_post_type( get_the_ID() ); + + if ( 'product' == $post_type && method_exists( 'WC_Product', 'get_gallery_image_ids' ) ) { + + $product = new WC_Product( get_the_ID() ); + $attachment_ids = $product->get_gallery_image_ids(); + + if ( $attachment_ids && generatepress_wc_get_setting( 'product_secondary_image' ) && generatepress_wc_get_setting( 'product_archive_image' ) && has_post_thumbnail() ) { + $classes[] = 'wc-has-gallery'; + } + } + + return $classes; +} + +add_action( 'woocommerce_before_shop_loop_item_title', 'generatepress_wc_secondary_product_image' ); +/** + * Add secondary product image. + * + * @since 1.3 + */ +function generatepress_wc_secondary_product_image() { + $post_type = get_post_type( get_the_ID() ); + + if ( 'product' == $post_type && method_exists( 'WC_Product', 'get_gallery_image_ids' ) ) { + $product = new WC_Product( get_the_ID() ); + $attachment_ids = $product->get_gallery_image_ids(); + + if ( $attachment_ids && generatepress_wc_get_setting( 'product_secondary_image' ) && generatepress_wc_get_setting( 'product_archive_image' ) && has_post_thumbnail() ) { + $secondary_image_id = $attachment_ids['0']; + echo wp_get_attachment_image( $secondary_image_id, 'shop_catalog', '', $attr = array( 'class' => 'secondary-image attachment-shop-catalog' ) ); + } + } +} + +add_filter('woocommerce_product_get_rating_html', 'generatepress_wc_rating_html', 10, 2); +/** + * Always show ratings area to make sure products are similar heights. + * + * @since 1.3.1 + * + * @param string $rating_html + * @param int $rating + * @return string + */ +function generatepress_wc_rating_html( $rating_html, $rating ) { + if ( $rating > 0 ) { + $title = sprintf( __( 'Rated %s out of 5', 'gp-premium' ), $rating ); + } else { + $title = __( 'Not yet rated','generate-woocommerce' ); + $rating = 0; + } + + $rating_html = '
        '; + $rating_html .= '' . $rating . ' ' . __( 'out of 5', 'gp-premium' ) . ''; + $rating_html .= '
        '; + return $rating_html; +} + +/** + * Add WC category description. + * + * @since 1.3 + * + * @param array $category + * @return string + */ +function generatepress_wc_category_description( $category ) { + $prod_term = get_term( $category->term_id, 'product_cat' ); + $description = $prod_term->description; + echo '
        ' . $description . '
        '; +} + +add_action( 'generate_after_footer', 'generatepress_wc_add_to_cart_helper' ); +/** + * Adds a sticky/slide down navigation with add to cart details. + * + * @since 1.8 + */ +function generatepress_wc_add_to_cart_helper() { + if ( ! generatepress_wc_get_setting( 'off_canvas_panel_on_add_to_cart' ) && ! generatepress_wc_get_setting( 'sticky_add_to_cart_panel' ) ) { + return; + } + + $outer_classes = array( + 'add-to-cart-panel', + ); + + $inner_classes = array( + 'inside-add-to-cart-panel', + ); + + if ( function_exists( 'generate_get_option' ) ) { + if ( 'contained-nav' === generate_get_option( 'nav_layout_setting' ) ) { + $outer_classes[] = 'grid-container grid-parent'; + } + + if ( 'contained' === generate_get_option( 'nav_inner_width' ) ) { + $inner_classes[] = 'grid-container grid-parent'; + } + } + ?> +
        +
        + + +
        + + +
        + +
        +
        + +
        + +
        + cart->get_cart_contents_count() ), WC()->cart->get_cart_contents_count() ); ?> - cart->get_cart_total(); ?> +
        +
        + +
        + +
        + +
        + +
        + +
        + +
        + + get_price() ) : ?> +
        + get_price_html(); ?> +
        + + + is_type( 'simple' ) ) : ?> +
        + apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ), + 'max_value' => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ), + ); + + echo woocommerce_quantity_input( $args, $product, false ); + ?> + +
        + is_type( 'variable' ) ) : ?> + + is_type( 'external' ) ) : ?> +
        + +
        + + +
        +
        + ' . sprintf ( _n( '%d item', '%d items', WC()->cart->get_cart_contents_count(), 'gp-premium' ), WC()->cart->get_cart_contents_count() ) . ' - ' . WC()->cart->get_cart_total() . ''; + + return $fragments; +} + +/** + * If we should display the sticky add to cart panel. + * + * @since 1.8 + */ +function generatepress_wc_show_sticky_add_to_cart() { + $product = wc_get_product( get_the_ID() ); + $show = false; + + if ( ! $product || ! generatepress_wc_get_setting( 'sticky_add_to_cart_panel' ) || ! is_singular( 'product' ) ) { + return false; + } + + if ( ( $product->is_type( 'simple' ) || $product->is_type( 'variable' ) ) && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) { + $show = true; + } + + if ( $product->is_type( 'external' ) ) { + $show = true; + } + + return $show; +} + +/** + * Checks if a color is light or dark. + * + * @since 1.8 + * + * @param string $color + * @return string + */ +function generate_premium_check_text_color( $color ) { + $r = hexdec( substr( $color, 1, 2 ) ); + $g = hexdec( substr( $color, 3, 2 ) ); + $b = hexdec( substr( $color, 5, 2 ) ); + $yiq = ( ( $r * 299 ) + ( $g * 587 ) + ( $b * 114 ) ) / 1000; + + return ( $yiq >= 128 ) ? 'light' : 'dark'; +} diff --git a/wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.js b/wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.js new file mode 100644 index 0000000..d7298b5 --- /dev/null +++ b/wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.js @@ -0,0 +1,285 @@ +jQuery( document ).ready( function( $ ) { + var throttle = function(fn, threshhold, scope) { + threshhold || (threshhold = 250); + var last, + deferTimer; + + return function () { + var context = scope || this; + + var now = +new Date, + args = arguments; + + if (last && now < last + threshhold) { + // hold on to it + clearTimeout(deferTimer); + deferTimer = setTimeout(function () { + last = now; + fn.apply(context, args); + }, threshhold); + } else { + last = now; + fn.apply(context, args); + } + }; + }; + + $( '.wc-has-gallery .wc-product-image' ).hover( + function() { + $( this ).find( '.secondary-image' ).css( 'opacity','1' ); + }, function() { + $( this ).find( '.secondary-image' ).css( 'opacity','0' ); + } + ); + + $( 'body' ).on( 'added_to_cart', function() { + if ( ! $( '.wc-menu-item' ).hasClass( 'has-items' ) ) { + $( '.wc-menu-item' ).addClass( 'has-items' ); + } + + if ( ! $( '.wc-mobile-cart-items' ).hasClass( 'has-items' ) ) { + $( '.wc-mobile-cart-items' ).addClass( 'has-items' ); + } + } ); + + $( 'body' ).on( 'removed_from_cart', function() { + var numberOfItems = $( '.number-of-items' ); + + if ( numberOfItems.length ) { + if ( numberOfItems.hasClass( 'no-items' ) ) { + $( '.wc-menu-item' ).removeClass( 'has-items' ); + $( '.wc-mobile-cart-items' ).removeClass( 'has-items' ); + } + } + } ); + + if ( generateWooCommerce.addToCartPanel ) { + $( document.body ).on( "added_to_cart", function() { + var adminBar = $( '#wpadminbar' ), + stickyNav = $( '.navigation-stick' ), + top = 0; + + if ( adminBar.length ) { + top = adminBar.outerHeight(); + } + + if ( stickyNav.length && '0px' === stickyNav.css( 'top' ) ) { + top = top + stickyNav.outerHeight(); + } + + $( '.add-to-cart-panel' ).addClass( 'item-added' ).css( { + '-webkit-transform': 'translateY(' + top + 'px)', + '-ms-transform': 'translateY(' + top + 'px)', + 'transform': 'translateY(' + top + 'px)' + } ); + } ); + + $( '.add-to-cart-panel .continue-shopping' ).on( 'click', function( e ) { + e.preventDefault(); + + $( '.add-to-cart-panel' ).removeClass( 'item-added' ).css( { + '-webkit-transform': 'translateY(-100%)', + '-ms-transform': 'translateY(-100%)', + 'transform': 'translateY(-100%)' + } ); + } ); + + $( window ).on( 'scroll', throttle( function() { + var panel = $( '.add-to-cart-panel' ); + + if ( panel.hasClass( 'item-added' ) ) { + panel.removeClass( 'item-added' ).css( { + '-webkit-transform': 'translateY(-100%)', + '-ms-transform': 'translateY(-100%)', + 'transform': 'translateY(-100%)' + } ); + } + }, 250 ) ); + } + + if ( generateWooCommerce.stickyAddToCart ) { + var lastScroll = 0; + $( window ).on( 'scroll', throttle( function() { + var adminBar = $( '#wpadminbar' ), + stickyNav = $( '.navigation-stick' ), + top = 0, + scrollTop = $( window ).scrollTop(), + panel = $( '.add-to-cart-panel' ), + panelPosition = panel.offset().top + panel.outerHeight(), + button = $( '.single_add_to_cart_button' ), + buttonTop = button.offset().top, + buttonHeight = button.outerHeight(), + footerTop = $( '.site-footer' ).offset().top; + + if ( adminBar.length ) { + top = adminBar.outerHeight(); + } + + if ( stickyNav.length ) { + if ( stickyNav.hasClass( 'auto-hide-sticky' ) ) { + if ( scrollTop < lastScroll && '0px' === stickyNav.css( 'top' ) ) { + top = top + stickyNav.outerHeight(); + } else { + top = top; + } + + lastScroll = scrollTop; + } else { + top = top + stickyNav.outerHeight(); + } + } + + if ( scrollTop > ( buttonTop + buttonHeight ) && panelPosition < footerTop ) { + panel.addClass( 'show-sticky-add-to-cart' ).css( { + '-webkit-transform': 'translateY(' + top + 'px)', + '-ms-transform': 'translateY(' + top + 'px)', + 'transform': 'translateY(' + top + 'px)' + } ); + } else { + panel.removeClass( 'show-sticky-add-to-cart' ).css( { + '-webkit-transform': '', + '-ms-transform': '', + 'transform': '' + } ); + } + }, 250 ) ); + + $( '.go-to-variables' ).on( 'click', function( e ) { + e.preventDefault(); + + var offset = 0, + stickyNav = $( '.navigation-stick' ), + adminBar = $( '#wpadminbar' ); + + if ( stickyNav.length ) { + offset = stickyNav.outerHeight(); + } + + if ( adminBar.length ) { + offset = offset + adminBar.outerHeight(); + } + + $( 'html, body' ).animate({ + scrollTop: $( '.variations' ).offset().top - offset + }, 250 ); + } ); + } + + $( document ).on( 'ready', function() { + "use strict"; + + if ( generateWooCommerce.quantityButtons ) { + generateQuantityButtons(); + } + } ); + + $( document ).ajaxComplete( function() { + "use strict"; + + if ( generateWooCommerce.quantityButtons ) { + generateQuantityButtons(); + } + } ); + + function generateQuantityButtons( quantitySelector ) { + var quantityBoxes, + cart = $( '.woocommerce div.product form.cart' ); + + if ( cart.closest( '.elementor-add-to-cart' ).length ) { + $( '.elementor.product' ).removeClass( 'do-quantity-buttons' ); + return; + } + + if ( ! quantitySelector ) { + quantitySelector = '.qty'; + } + + quantityBoxes = $( 'div.quantity:not(.buttons-added), td.quantity:not(.buttons-added)' ).find( quantitySelector ); + + if ( quantityBoxes && 'date' !== quantityBoxes.prop( 'type' ) && 'hidden' !== quantityBoxes.prop( 'type' ) ) { + + // Add plus and minus icons + quantityBoxes.parent().addClass( 'buttons-added' ).prepend('-'); + quantityBoxes.after('+'); + + // Target quantity inputs on product pages + $( 'input' + quantitySelector + ':not(.product-quantity input' + quantitySelector + ')' ).each( function() { + var min = parseFloat( $( this ).attr( 'min' ) ); + + if ( min && min > 0 && parseFloat( $( this ).val() ) < min ) { + $( this ).val( min ); + } + }); + + // Quantity input + if ( $( 'body' ).hasClass( 'single-product' ) && ! cart.hasClass( 'grouped_form' ) ) { + var quantityInput = $( '.woocommerce form input[type=number].qty' ); + quantityInput.on( 'keyup', function() { + var qty_val = $( this ).val(); + quantityInput.val( qty_val ); + }); + } + + $( '.plus, .minus' ).unbind( 'click' ); + + $( '.plus, .minus' ).on( 'click', function() { + + // Quantity + var quantityBox; + + // If floating bar is enabled + if ( $( 'body' ).hasClass( 'single-product' ) && ! cart.hasClass( 'grouped_form' ) && ! cart.hasClass( 'cart_group' ) ) { + quantityBox = $( '.plus, .minus' ).closest( '.quantity' ).find( quantitySelector ); + } else { + quantityBox = $( this ).closest( '.quantity' ).find( quantitySelector ); + } + + // Get values + var currentQuantity = parseFloat( quantityBox.val() ), + maxQuantity = parseFloat( quantityBox.attr( 'max' ) ), + minQuantity = parseFloat( quantityBox.attr( 'min' ) ), + step = quantityBox.attr( 'step' ); + + // Fallback default values + if ( ! currentQuantity || '' === currentQuantity || 'NaN' === currentQuantity ) { + currentQuantity = 0; + } + + if ( '' === maxQuantity || 'NaN' === maxQuantity ) { + maxQuantity = ''; + } + + if ( '' === minQuantity || 'NaN' === minQuantity ) { + minQuantity = 0; + } + + if ( 'any' === step || '' === step || undefined === step || 'NaN' === parseFloat( step ) ) { + step = 1; + } + + // Change the value + if ( $( this ).is( '.plus' ) ) { + + if ( maxQuantity && ( maxQuantity == currentQuantity || currentQuantity > maxQuantity ) ) { + quantityBox.val( maxQuantity ); + } else { + quantityBox.val( currentQuantity + parseFloat( step ) ); + } + + } else { + + if ( minQuantity && ( minQuantity == currentQuantity || currentQuantity < minQuantity ) ) { + quantityBox.val( minQuantity ); + } else if ( currentQuantity > 0 ) { + quantityBox.val( currentQuantity - parseFloat( step ) ); + } + + } + + // Trigger change event + quantityBox.trigger( 'change' ); + + } ); + } + } +}); diff --git a/wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.min.js b/wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.min.js new file mode 100644 index 0000000..349992e --- /dev/null +++ b/wp-content/plugins/gp-premium/woocommerce/functions/js/woocommerce.min.js @@ -0,0 +1 @@ +jQuery(document).ready(function(l){var t=function(s,o,n){var r,i;return o||(o=250),function(){var t=n||this,a=+new Date,e=arguments;r&&a-'),t.after('+'),l("input"+n+":not(.product-quantity input"+n+")").each(function(){var t=parseFloat(l(this).attr("min"));t&&0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gp_elements + + + _generate_element_content + _generate_element_type + _generate_element_display_conditions + _generate_element_exclude_conditions + _generate_element_user_conditions + _generate_hook + _generate_hook_execute_shortcodes + _generate_hook_execute_php + _generate_hook_priority + _generate_hook_disable_site_header + _generate_hook_disable_site_footer + _generate_hero_custom_classes + _generate_hero_container + _generate_hero_inner_container + _generate_hero_horizontal_alignment + _generate_hero_padding_top + _generate_hero_padding_right + _generate_hero_padding_bottom + _generate_hero_padding_left + _generate_hero_padding_top_unit + _generate_hero_padding_right_unit + _generate_hero_padding_bottom_unit + _generate_hero_padding_left_unit + _generate_hero_padding_top_mobile + _generate_hero_padding_right_mobile + _generate_hero_padding_bottom_mobile + _generate_hero_padding_left_mobile + _generate_hero_padding_top_unit_mobile + _generate_hero_padding_right_unit_mobile + _generate_hero_padding_bottom_unit_mobile + _generate_hero_padding_left_unit_mobile + _generate_hero_background_image + _generate_hero_background_position + _generate_hero_background_parallax + _generate_hero_disable_featured_image + _generate_hero_background_overlay + _generate_hero_background_color + _generate_hero_text_color + _generate_hero_link_color + _generate_hero_background_link_color_hover + _generate_site_header_merge + _generate_site_header_height + _generate_site_header_height_mobile + _generate_site_header_background_color + _generate_site_header_title_color + _generate_site_header_tagline_color + _generate_site_logo + _generate_retina_logo + _generate_navigation_logo + _generate_mobile_logo + _generate_navigation_location + _generate_navigation_colors + _generate_navigation_background_color + _generate_navigation_text_color + _generate_navigation_background_color_hover + _generate_navigation_text_color_hover + _generate_navigation_background_color_current + _generate_navigation_text_color_current + _generate_sidebar_layout + _generate_footer_widgets + _generate_disable_site_header + _generate_disable_top_bar + _generate_disable_primary_navigation + _generate_disable_secondary_navigation + _generate_disable_featured_image + _generate_disable_content_title + _generate_disable_footer + _generate_content_area + _generate_content_width + + diff --git a/wp-content/plugins/index.php b/wp-content/plugins/index.php new file mode 100644 index 0000000..6220032 --- /dev/null +++ b/wp-content/plugins/index.php @@ -0,0 +1,2 @@ + + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/wp-content/plugins/menu-icons/assets/banner-1544x500.jpg b/wp-content/plugins/menu-icons/assets/banner-1544x500.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a10b5c2bcf652a61100fff1ec9f3ff8affaf5fb GIT binary patch literal 48202 zcmeFYcT|(X(=ZyOi!?!c69iOxOXx+qR0}l}A@mSJ=opHE(u?$76lv0=g$^Q+&=HUt zLhsT7N)d#MzxLhl-1mIvo_pTE?s+HA$+OSy?C#9$?9A4y>8m9Gle(X?0|20{{SZI~ z_+N0f1E5v&hCuxR1OTGzXdM9HYKic*lb4sftcZx4r?8D3+}2(g0*8tC*|>{{35$vV zE^RDoONZ>?OWdWKx8a1VPf zDPf=xL`+hg3nU{f1{9SMmlWg@7Zn4Eh=N4KB!oo8WJQ6p5;9!>0`BYDJnS4~pQ>s6 ztFG%W1@3<_?U1E>vvHy47&ewJSE3exBF|VwuhrNv#+~YYM z?)q;nFm!@@!9AVe?p&&>e_LHjSc>buiL;v>+}HEL--h}p-)i-=9(VGk08*h@<|TTj`;T=nwQ$Gl?^WtUv;8{B^srKe0{wt*JdkWAPL`!g8 z>J1`-o7dtYy_V6n=xA>c-X^*$_Jml)2Jw27JCW|$9g>9i;?<9y+R`6%dhn1gg?y+P zlVHFvlYLda2l1?xl)9P)-1yH32<4O|1Y!hKd=9h!2h2ma5i%Ky1BXLXA3XF zQDQNr#yo6*E}Bh1j^MpBu{~TeMd>j7^%Vfv8~mrP!&ypeXSKLRNYzb z*%ey4^nPlKT%`iKJui0RBf9pvNmrp#UqjU z9xPKqnUY4k2VK59EbNvnb>l5W-F3xZUrDG}e9mWBMt9np%gQ3Pp?AT3XcxlXn7FtQ zt#>;VoO~1jXUHAWPC0{dD$UM{R)?Q_?*BD6+aIz9n{IZr!qgeD8c@wx& zEFv&WlQ3A=ll~ZN-Lsk%9V{<(&dEBDA!sB8)=zy}GP%}pu9IVpHQwXrBwaO`Aq>@&3$Z#YFd z%G5f-%Dc)pyEJ7AN1$`)Z+q^r8_iF?5B|>R`CM(|W|yc_7I2y}{Uh4gzrsICNfhLC zcWtBu%EF?Jc>f{UNHpl<%HhoB>BO?)D9!^g)eh0@1ae8J?Lnb<}mNlpN+83YDH<16ruoGp%F4Y?Pc_Y{S5^ zBWx&VoamkYaGdkWHkmBVOF^Uep=;?o$0ibQ8{$lb4?KbMhYx1aY2>W!GR*bEWgJpO z-_GykZ&>`!LJNKvv9xM874rMJQ`_9^Nnkf6;^dnGfMjpTe0;U2{QlS_nI+Y#Y}u}N z267~wol9gl$Ahu77s|RNp|u~TFoZmAJ(l`z9NHGXCVeppl?bViGd2iKWU5@?F=yH^ z;7nf-48N@|`h1jJ3`PO2S7=9pKunJWp+pZIiMyLPaBF^s>uq;(+>S;nN zrCVCn(mMJG?)sd`nB|Mj;wFZjf&2Vu5}e-c7tlk_r=qRC??BNbP=DXV)QL0{YSKM2 zN6wmOWxBJGy~_q6T%a0Mqef-lQErMXbwsO%_p{+zP(!cIj4!Yn-}XgMFRD2s{GwZo z#^Q1rzgL1%J6CI`NL(#UeVYaA+b)8hPmW0v)(;U+RCv9Y+M0MQ@OWe*;Q3Ul;VPb4 zP`yZdH<~l47fe=Bm~aIk)Crw4wf^NxVB{2&HeYI6QOnGsU=!18FP=Wb$~Ng^D6UDf ziRI5|Y?Ug+Mjs_(pA@2e>RbYT(8HOm!EbH|H&HmRcti;2UDu)YrGvD%ihb^Dip5p$ zx;xLRmM*B}Z)pE8;D{T(g;~mwc$+qG+mW~|NS|Lz)oFuq?{1}>#d-*C_J+||ii2X+ zihQ%$W}f9>crtW2BGx+P&2@9oyd|?Os{K=vsL#o&mL=am3SKbx&QIY zkNaf*O`zy}$=z`UNVZq{h042JiWczySbP|sue2w+;2(Vj@JmSu<>_Nbj!-jwvD=aU z)rOKK&&co+9YOfg;g;fXhm8^gPE!T-JI2|h3Dxb(3$efB&!YL2_|Sd!@r-E*e+}nQ z5K!~cUD{e#{XaO?hI*^ef~Y;>B~<=(HPD*!m^3NV8%_oKEPth~GAzX#gZ&1DtgS~{w9x_8k!c=W>m3ZP*; z)-h>{;UH|-(to%;5CsxRa(2^vrzdQ6!BG)7GmnN=g(y@M+dgixXi1n4UYAOv``l9d zrFX}3pEI{5M8*-RJ8z15)w^EDP7w>;8-K1z8)Xuchll&QdAZn zyvO@ZZJGtmNtJx(Jzt^ywR1$vjF3lwLs}q|ApvwBa*6V%$v@5_e^T>JZ!e!?G(|T0`UTz?O zk?ZG%Sat^L6k92G$Y64Nv|1DSsk&ntkzk*9|uW5lq9IS{SW%gR#$VKtr4XCNH?c(Y;Jm~P05YEng{#Hws*cMlTE zn^=cdkBK~#O4Jrvsv-D%n|xNQLRPT#F1wP>Sv(E;w_{w~(OtOhj(SHzGAd^`%G5C; zfh)l6?u2kD3)F~@uK@b(hx6jk-?Pqly<0)PjK0ReJ$gY@rmw7m905zbjZV|Mjia6H zplnaMU_+~g3nhMgL|nh5aoGAi$iiICp!`o|EKiJ~|HVE>({eWF+cgQ8S4`a?*1`YT zfG@*<*M`DjFX)FFFPsDqUy7qGpXBA93X*GLwAOa&nUL ztruDcN{2mTj{GI^og$!O&e%f-sOXm^9~&KDE%4}gpF5wUZu8^e>%}7zAG1s5?bwN! zT>FYWFzf0tNj#)dD3fFM7m>^OtdyDGmp>G@#K2z%{Fr#6_`)<<)mbL%3<0DsD9qaf z%%_4Ql(mQ&q9;Bcb9R>&e>1isYhZG^0t~ykY`X}FadFHt;m&XS3v9H`_8+g!7xvj& zOwQUJG?+L5$;m>bLvwe-HAyb)*d-_IImot-?sFzDFWz z<4h51=G)-_{SV1nN7QCpbB~k^|2z`LYYB^$dwrxF#yVqvro>#cbCxVV(j91JCnVzD zXD0vZp-=VkKH@ik*PerL;w84farcDKzA)?&YiU)bt2LbMHt?w_He%jNmAt@t)~l4T z^y&1nV&!L(jTnn+l}!*~u5ZM0v<%@|!m3mS)Ps>IQU4WjE&9o3)00-;GE@_oLw}IC z$b@EEtO-F`|D8@&AY=nue>CwbGkj}8YgJ~Zg>UHH>ItJojlNFO=M^*QJxQh|7+LTipI#AdBhcRvoXY%e=GX+6}XE+~Jl{NDpAWeI4ACqvxlfmzi+ z*F%ckN{C%`W8HV7Dk2uz=WM|jO+Qbr0Ka0auK-inz_(By+bh6Z_lu7VlQV3*Dc#0; zw6mJLb^5M?>`a{vUl(4CK9uM}ORu%f`5vFPm{!_`ui0k2)0hHMpS*Zo5E%KS%%;=N z>fxy!zEOY`{Mi?{EMS^`oHRSeTKp{~p#{YGWe)W#jS1@vP7stKX(yW#)_n;YDhoh5 z7j2I|ju#mIET5KcKuT>NLxU(DfGO(S+v-fzdg1pDTLbu}BJ6~BD`a@`1^JFp8LAHW zM(~X|Vtu`FgniXDPX1DSfonQaEMQPD`EzcI&TH=W9v5yZAvDabe7^!={CN&Cy;<%M zHxHC0TQFQln~&D9V^rpmV+FKJ0m^F~9MWKk1l)SS{($=WKFdB1)za4XvLx=YI~h-jq4V4eQ4>?t;vQo1a3y`RI+f~e z7)gDzBv2gqO76a-iUo-M3x3)X{u%>bS@Fm5z&_Z4)`jM=;7Yo#Di2i&|2H+c zr|ee%&~+2NYxF`OVA||!0z8F^a-7}>n6EdKetafPcFdUvnn&(8yTTg5`!SZ1o*X}Y zo;Be5cBuR*&dfiL-{W+4%jO7Ne+lj_^QC0he@`lW6mn1=r@RI~Fa|Nk$>BVC%k_~t z^UL7U;}j@Q<79p8trwKnEx-b}5vpN9MHP^3R*Ih-v$LTO`*Wc2BkU%vMz6-w`=Ylb zg(o+c&g3HoRz*`yK>6VT-%+EAkHFv37``XW7`e!C0RT5%dEKO@91yk0%J85NWM7K` zUO0T+ra0S=S=NRJq>=(T?@2OHi=IZxzWym#5Tejptu7A_^C9Q)6AEx681mGAL*sSV zw$hkC93f9RzW=!qs>2%jkX@mz7117ELYz;d@Y+1uK{}0Lm66uc5y8+z{+>PxoX(Rn z1ei>5=S$hyOkuXf_?<5{qJqRHzTwgrylER^YD`oc21MLurE8tAR>}06DeQMh8kVN7 z0NqNAXQu7Q{xf*aA$H@8wc#wt9^{IvoE>Y;qCg3|l?-i>W)c7?gtpu{vt zTPcSr*&lkT(5xUP$LDb1*&h0-!lFY5jmdV8(fT4y0uw{0hoL#~OBPCZf;<`rc~dHu zO3%`-Tl`gSou@fj73@xVTuQqfr?V%*9}10gepeF+S zApNjmrlB+8cA>~u!^^mjeJab6<5t~lSbfs3t~|M{^2BeR%YD^bG(Nm;#H)RV{t-4D_ zggNOHMQt2wLUjEgcNwT7;~Hpdvdq>J8l3X;i=rszSHzkGtP^@?)xBZHd1;xzK6XSjT<7hW~HEL zfE0`V;j{bwsW|RKPA0FW`hSlh{hw0)M*{zEC7_}=|DEz54`7vHjz*x+@G)6soyvXg z=24>jSFb`0|Gjtc2q2~McLK;YRehu6Mq3H*-@SsrK*YtBO!U74t<_K3r?0PnAt3sH z7Eafg@1{KWx}}ZKgZvZe^V_ff2_X+(KfjrOou5XJMoRe;X&b?f_XI@wZ*GS?yheCT zHut)T(1T=^vX}Lp9`c=uZ#^MG8MpiQnKPt#r}vng_{Mu8BO*7Icn@-xd^$CNy5VC2 zUk`F(LZ1?T-)cZ}antpR6+liuf*9wej4QnVihV~#uB?!TVr%+!E0-G?-!;NNpJw_y zDhiogZy4r6$aj=UBJL6;0}N^OOL!VCHt*#}ozrMU{GI*YdqU)PpWjcJ2zgCWy>jW^ zHCKDeQ%yw15qu>)*US;Syn1bEs5)YM^Vw{Kq3?%e_DvS9{{-oe^D~i#53Ih^{`|oI z>qF(uzbpcph)kwKpgYPXd&)bTuR>_<)9B+Qm0c*f-q7qt5Pl$IkGPjl6>&%TH;v?; z@_03Xg)1tVaP&q|vWj`~&1710F1Js_h7Uu&oaD#$5*_D9y`eR{7M#0^lnPgVLv)K8 zZDW3g;lqg7S3V!gN$ZKEP1FFR^C8Z=Dw6Dlg!(^k-kdDq-%_EUtiO)fq<0~fiz1mn z3{h3yRW3k&Q_ZAyA^9dt&nfqdW1KU4U0x@~5!XTL$zXoY>$1g8FCp769nc|Nhbo6> zZWv}7r+{6T=){KBkoBn!xEEb%mvcQQmUlktN1!rW6U@^1qwt&uYeRx?4|!k4_@)Mo z!cJSlP(YBOz5WR~g_aHA-QF8yRR52vI5(;R$aI5`WsrbidPAOcaaw$MTGDEUm63P9 z3`9Zp3P6==9cs!vqcHz?B!F-2fW?1I>FG4{v|@v|mdgUem;kbCeID01cLmU%tr&$t zLEtVUrI(IhdoQj4WI>gfE`NAjeJGD~b4%R)8E=nCGOS>Q6Sd!q(f8=0oanbA^~HXk-DbH?oEvD3)Kpld7S9H!w-zXKLRNlsc> zH=awkZz1y6K`hCOc>*E}=e=`CdR_ z=Pa<<$NQO{2&+d7?3O28XRt_)eA2| z^2Q!$^I%!Qf(9=VJ~n-EnUK_T!omG!aA7;60Zu4qFMO2lkaUj#+l5UPbi0GN7n3MG znBJ7eNYK(4-j`D;I^~ooy4jiV<{e1FeL_;lC}-a>!1}}Qp@dJiX&yh=q%o4D zLYafN6sAfIB2;;EYCmT7o@IeO)Op@0>^kfYd#Y<>mKSr@Yf?}LVS-^TzK`{)(bAVy zWEI@?nTR(BdCyjxm;GIxVIfykcr>=9?d(0zAh}RfMJA>GE~TSGszT zzJ6J#sfCupw3STj$78a3(nEaw$8COVY+f5z0DpHWfB4tZkGiEf%F*oH9oR_gUpW<1$5J8HR*&#k4bunF=8> zr(Mdw$G4)@F_)4QyV0sk3{!k2QeWPkuF%30l8N?Tcm{sDkjsW&gf`%>01|0$g{yM8 zQ<~+gO%Iz*+6xY1f=Dn)7Hd2gN_@(g0oHpdCqz?P%dwRS-OmhJi(NAL>O2m8VTI|i zArLyc!$77glUv|SHl0fK&6@P2{Q;wEYaKGXljk8Bl9Fvo>WfSzX^A^AL`-aGV0N$C zP3%I~#HHc*QqJJ!o~7B%g4>< z=ac<|9XCBRK5eZ@PK>z~rRVWlJ{gc+LJe9`pwHw3`scci+f&z>E;d4!CS#-yCiKMD zuK<>z`a1RQ7|Vb^nd***n``z8M%Sx2)b~WK*Hj%E8^VssctZRO6X)G^IHs3lhq+$q zhw9G?FjxvRxc#c>5o5GQ+X_b%j!V$>JJX5}cyGfAYP%svQ_ShC@%@abubXgBd#@L1 zk}&7HU*EuFr}UfoA}g2|=7B!T4T7uJYLM~6VE^!?OwCf;qb2_f`%7!q$tqcXU3oTnc9yv?@F#Cx5OG##fO=$%$hi4}*} z8@SlYj3so%D!@OicrchDnLLcC#ldr+00U1>W})NyrAkgM^P>B|{A#eNz3ubQHvd#) zN@G%&tM%GNA4S@uL0j-Fc1Z7=q7 z-bq(@mV>PW3{^dxW(}(~P-|@~rny#j-vCq)IXvcb8pw6%aJFU8GxA0yJbi;^<8|3v zofZR^5u=}Fg|(3By}998L6nD@$I5wtW4Y(Wg3>SRqyuZcnuU}1R#M_5Z%z4ckQA6Q~V zY-)6I_7`=g&R0CJW@VQ|RUoA$oHe3aWO_!}k>BkEsv&v9BKW-yti0jGYDvz*cnG!K ze*R%V=!e&@LvO@REk~7&MEZc65yU19ZGTVH!eZ$|qh0zL+id+9dG_w8iQX*j_haG| zq4dQ?$jIEmdW{6w{@7YF1H)+CcQ{$!FwnV0Ewdc6a(Gy5$0BC<7`E1m<(us1XTUl) z_#TJD)x$C>*y~QN*K)FF+afYe;$^q409m1$LfZ|+r-F6qx+t4>mXFpo5f?If^wf!2 zV97z7C~@eoxjWIq>4@5sid43wxQhfvO+`AbD!e6a(SmN50sD3;-xc7yd=;V4;n15W zimVkiW7@#pE%WWqQtw}9N;k*t7`q<3jE1+abOZ)rQ`4giI3&>R^ij`p{7!+N=Rdhq zsirzG(x%5Do1%MaeIEC22$s5snN(NzJ%(2IXxG@X9{>4apLY*}N#xsF`|2!t$(&v| zADK%2$L8nc?2eg*BX^vN#I7B(AYGk)w6S_H)iT$@A%7hC7J28?*9+Rx;VRUkyBd*s zZ9F35=ram=#znUfxybIOw?nu*j*hd89aL7jCH=Ryir}w{GwEN~Go9AIBcEqE$TT4p zH&8fB@5ah|;h61YC8^q``I zJL|-2lzX=87IwO)F$>;2T_ZMhM4w~9|I2IKfO^72p}qFE-5EQbXN)jyWC4dB2A`=# z|LQEb$6LQ5-ZR|it#!C(G^e}IS!RINnw1IS+GtU`1f))ahpwGMM{JzA_#jiQ$N>2O zFE!{+aq?ZkBi+33*p}&{$O^XfeO8%H{4aFWSgZffaXq8Mr{(D*Pa5^DX@hfW`_Y2c zFYWBE?N9T<<9KnISq!Qzh2{9(jF_Z-cneH?xkab}ouy<1b<2~tq*ZidGyTj_?Cz!) z%pgFKL}#Uo8DKAeXFwDt{Y5xvroe{s{kI%yTfL-PK-`LBW4j9mv>spf z&%qwyD}axETknylE&Q|bH=H@Pf%m15y*-xCD@hW4vh%7ZKdH;Sqw8@gt$D-V30>3$ zg3i^YId=jo&;Pa#e{|riyKUL>)?Z^$qK~>VOXr8>ol)?40o+R{&kBd3q7p&V$I@?r?fL zl5f`KMcCubZ|c^(%HtIT0^X=00Z+8A!XB%H{&@WiZQ%US)XZ>j>de-KNwDY7DvHmm zOzi?On8TL!RgZ6vCKs$E4HbUz&zRq\N*uH+rRv-o=f-jl~MKj4Y`bQD?7uh)dUkyX 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
      • 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 B1^EB~ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/menu-icons/assets/banner-772x250.jpg b/wp-content/plugins/menu-icons/assets/banner-772x250.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a10b5c2bcf652a61100fff1ec9f3ff8affaf5fb GIT binary patch literal 48202 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\N*uH+rRv-o=f-jl~MKj4Y`bQD?7uh)dUkyX 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
      • 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 B1^EB~ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/menu-icons/assets/screenshot-1.png b/wp-content/plugins/menu-icons/assets/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..94c255d1570378dc59bc89a3fe32b335d9e6945a GIT binary patch literal 31926 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

        ;7+Zkv-Ltxpb}!m^F=Zh`jjme z93NPXw)q;UZWSy0zM2qM+OYiJ0|(`<(G?svdN2EZ<}miONexbq*^4uCEH@^9sIoa@kK%i~c*5JWSE}aK-eNzSc^WR4 z2m3^-m?+&7cOwjfk!$87#YZ3p28OVbaYt9z^H3C_&v;zHnwL5x4+&%R>7%>nT+n;kQWQjt z)<8<=z;)3_mB~b1-+kdJ&T&bVIod^kD-Z(iOWSCq@~mTo?g}~IyM~H6-yFK)z1d4I zch=mLs*QQLm!Nvi3U@Trhr3_@igSyrJO{rA;Ll$sj}?#r8k*uuZ(S8G{$FE6IZ`Sw zo%y*nl^lAh;SvjE;9OoBzToLlhK*8QC{RnrbDBa zn39_|fA4ZJ*=Y0g8o1O|=kQ98dgEb^=_98LL*s*lQ4wSDU-Lv<; z>I*N%eD;Vzmmzb#o_Ajj*JehnA?JaqWRZDmQZ>tGvza zGOyFE{xlKes)K%|-$UK|ji07J6sBFuli-9b66XHJTzWd1;Zrh2R6_*QW_A{DcNOO& z^$hpjff=p*5$QC5N^JU~f;zeE=e@k(-@#5P#Y0#8X`K^|T0_Rq2zYj)8!l7!Jw0gE zCH(ZUcVQag{EbUOMVcYTpMeKtgiAv-|Ie+uCuwLz1{77VvB-d!2r9tdn4Ry>10_pSbb+^Ly-0>i_n8@?N< zC(3LrFaMHf{PN|?Z1YcL+=c@1`0H3%*MnsFGp2-_EYZ=+?z&{sxDQu%oi)kVKO3Mj zYoujUrtHF-;L2WEZw~dU-786H5<=n=kJakF@Y8d_iVP8w8f{JvNhS&kiXu3ri|vNm zIbob+bWv{3L{hWJWbdXq&gpxT6Vo8ZApHYV!r^_p~a_$<9PBE3!`k+e*jy?VZ6q(Vg|wV}X1?WJs)n;5tUzq=ed%E7k4S?)Eoek`Sb>$LGU7 zRXl`bEp#^H{zkVXXft%FmO(N#Bjzexp0P0G!P?a6y4;5pDkJ#@UD3f}7l+YUZ!KYD zp((*ZgFm8S4s>?VzDf}MHYs$`n(cP0_`BggK5R6`L7|;Vz+{g#%}t%qSZ2m`%4_UR zU#9>LS5E6D3-iZcC(WLjEPPtH>9e>QZFWdg2jytj4;8ewP~o~Zi8JTm2|l+o`epm8 z$aQYaAnTUocDYu+2R5%N3*}??-b#ajvSsR7Ot)L-4B|)yt4*e$oQyg2lyR@YHd`{F zrm*xoh(k2dg)F_H#IJkn>xJyJo~ZufMOWL!vkMb0xdc19AZS?Fj_1ceb`KjZhzDfk zbXP;YBsWR`zxs5ww@WjO=xV+P=yLGO4-`|BWZ2a^lapHUZKGoXjVN8$)5u(>d1IRC z^Fq^VC%9oK2T@Z$)_Rpz74P00HF?R3?oLvwy@O!w67L@jQovFW-gEG2E6$Sa-V`Y% za2-N zU1C2kS371wM^f2;dr&ux+-~PC~^L{t2x$dnQ&M zvz}3#`>~LLxAuy7f^8rw( zvQ$k(AXm*N>rR3B#OzYyhl#Q7tOyg~tspKCCtex_UPNQk#6ZNTDZAu`A)g7h=&C8j-F$MWl@B&ku`sRbQzabU!gSjdGj0y3D1<({B;GJrxRE+OO6(HU1|}FK|RL^}A9*4qNgIOJZkMMKO@RgAE|um8#bM zYH)Z;*-|HQggIW2W=ut-$9#5QUXEjQJfYC|?TFWm17)k@VkSPWWOf*qzco4~V;t3- zx7-F0Xuhp?ckt!p?Lbx(OglC9ZkxCc^*Xo$gEyAbdldm_B42nw<V&+$zZ z)vMZtCj8VpGP3KFaV|7N0wAqo7w6sNyr$vgSb{uA5J#p=3xm1t?49?$)y+H_>0ToUHBLltm*`;q2OC_}aCw91jE%Y&Fai>G}B+?x|*D2{AS1}x+W3u6& z`=$)7)@G^|;iv=$JP-$)ia^z!>>eT~$qx`}OgnP{&BWYua5jRn))LXQC z`(56TZq8`N`C)rztfqO)Wan$P;ul6UHHjcSVSaxe&sBxg^#J1B{i5=}Zsk^^yY~W> zg|!m;O=bS8@cHm~9Y~SzZsU|XyEQEByh*K#L(9I+Z0WdRBGrhVq&cJ>GmJ`j__6c0*|+9b#5R|MBC;pO~Y( z_Ve_;J_Gry8f}k_LHtzd$rDIR<4974k@goB_*cpe(KMce-ZHhXBs_KccRN+`lTWKS z_#SGpk1?0%XV1#gWG{>Aj@}YV@Q_IPoA>SY406RpiAT4UEj6fH#oo6YwRI0>i7;8+ z6)&(`3BzYy7Y`ACw{BQOUtz`q9_RFljEqcZ#QQB);7@M3j}^9;#pxl8)Bha{FjcEs zS6M3tYpVlbO*8OunG3<;u<zpKJI>oAWc z>A3st`<2{#z)s7FkX-E3eVEHPo9VyO^t6zf`pvcs5wtkjZQZJY04m{zRpEoqBlSr@b|QvX&}m~gUZBu{dlq$5l)e4J`$P%7~Qv$rK8S2l^=X7X?PrDTDw{ay+@LnWH3q{+Gw zD^XC>buZBEe5b&ON$iY(V%*lt%WL0le^fn%|Kg|oX~lHypyl*fnORY(g*bTvcZ)2c@FBeJn>YfS#<6YpNyu{=V3ctXP)tXUI@r!z@rbO`jE&c z3P2cMK$pB)W#^so>vxS6Ifv3*HA}1(lf$_IH`lO;kLfR7lTZ~^(rV8O;tS^GT(Oh7 zLk=rR_UEr|I7nFxJVP`fsch2>59dpf9aC5e*g~);MLKJR58EZl%|kVtzXe-yhWz+} z-Q6|C0fEd82xE>JD3p7BuDt}UwAr$)bdZ0JZ7(>CYHad>uZf-1P1)Tkl5nP4q34*Z z<{B~Iat&qEyTMGu%$oa7&Us3bLrS793)l|+qaI-COnsWbG7`B4hKIHLvDy zuZOf|wNf8@!##8FWWq$%Tw=KXy>uV5mpxGhuL+C@ z5znsdyJcr;lH&ea#qrPf>lVK1v(w}4KMpf}TQMoEv3^=l`r?H-$^(Uu zkB=J(v7VkD3k%C}L*58W!pX7AVx!Y|9!0C}=%2beXN8s*vS^GvxMhEA>3i(76nk^T z+Z71nJZ}yW1RVIq+PYaGX9c>4UnTUnt^-4pLnUPtOg^ooKQP>u@=_{Qp|?-ZvG1m5 z>s9redyZ_}PwPZf74tLhMF&kzSq(1T()S1macA09DezjP>EW^B3V zHm)K(^Y2qU)3RWUyar#MX`XAla;kR}8Y=9*s3E9l`B>yXWG?PlD|2yeauCC@n0&6` zES0OLQkgH?F`tc7SVhcgS%l-{t`U9lFgF5F?dI68W=S4n+f&}qCaFD_!Wbx2%A9^{ zy=c|0o$55zuzGWrHGGq&kkeeES$8mQr~>xo_XO~w5%$=rg3oOD?1O_i3{{Ou_VF)7 z#j&@|5p{?&n@I$cFf^p$oZIDNb=%*1#-K4`$7MZAx?vAG06l5#6E( zp8o28P#bS}xIC0tlBIW(BjzDtvZ=eYVY`ZPzF!s*(KwqcLdXVXq!o#=~|k1~4;I?5RL^ z;6XdCv)=3v!rF%_zE>Z7os7U}a{ivzje(AJFzv-cNj)@VCUGI~Y3u7{o9-#%0rFPR z^=7HQzBkcGWi5-FT!>O}lY5=e#8Mz%!$#WWPjEep$cvLT*@iE}!IOJ+V?38$-lJ*Y zs4A1vu0oeLUHzIE_Vqj}pHYqo6)0PAB(%mKWW0Zz@2utGxQ_&MQec_YkKi?lQl)VU zKg|AFtNij-G#7_WXFUeC!ELR43ofY2(^xMtbTZC~L&H*tl-YEU(-#D=gg{r>dB8dl zyB}pIWI#p&8V!cWokhdSFSm3jhDgURlB}*+LoEGnoL7|mEd}s$#2X_-+ukx@ z&}1;AOY|1c)TdJ-y3ub_2_bhE&H$F|*H6dfC$(H0vZ5W~jyFfYwtai?S9h_)_5#F{*!ji5LP%vI@T_2vi^u{FBX{Mh*lOULC1nE6o4+31 zD0Ro?TA;c6Om9VFQX?nf`6haflAY!nrhKIE!}nK5Mvmqk^VE5(R)SNZpVTrK z>95VfeaFIvH=Fa0xYXg3bm@aGvp8$r1_{$NJ1dG$0LTzGdPtCQP37={BUlA-C!{-O zN0wP<@5Dm>1Yj0JYHx{_Ds_4K8o!#nwq8st-{cF6u1KS_$p=9I4L25Bw!+Wt!JQH< zZ4mGy(CD|OPh?T4_JDN{tmL6UQ*x0mDX2~>JW0KW?3Sa7z*4#nQI(_G(}%V@Y`I~c zUplzc)@LnVx#j6^GBGUYM$di*ZoU?@D9AMOi=ep_rvI%y_kP;@=;(|)tW}Szich#I z4d}u%`2}InzRaiJ7D%b86p+><9X!Rj%Jl+tOU&uCZ$-Ug#_egMArN2+c8~^d!^Z=g zZFmh?NxR^jC+9>JH-lch77s}BZ-Nsyb$s75L^L`Q@fTQy|B3Ytka0LoS+~kVcqgG8 z6$OQRG);S-_2cClh^zKC$Ba`H@(h0e*pNs8z+$M9ZHkzQoxgc{ z*(>`!r7`>MjaRI3vc*K`r63NxRLVT{1VV;(Hc8zsuCufJ{_E{?l*P#Lx(5FI@5o8B{b9@r1t z%zQ{Oo+^K0aRADbCuGfBS`;OR=z7o^@BkTUsMysqMklQs(UN^5`^rV1k(Lp9GJy4v z9NK8>hjvW(P;6 z>)`cWWr`E(Mw148)py~XTsAAym8a0AKw1GhCU(a8GUq^iVohh_dXYyaxUT3wNTjGYcR>tKm(O@%U z*D|dDd;2;xCzd#frMnF>I9 zc2`+HfBxLM-tGGP_pg41+Nbv$wNNc$U%01oxXR&*U+tmZ@ z<}&`&dh>f=_}pQF=6$lmm5A3Y9@YEXwi-a+?tdicL-=JjGv8?kgij zLzk8MrS8?@CG$q7g0I)cmWTcMw;+@dwU8Mb-=5$n4_d<5BW8;PrRiKp608Gw5*V&A z>D87Wlh&tK;6)wVz3)e;R_E}TzgVE;zHEbbLGL;1?OrZx-jQ&MWK_X!@HaiE#B$K^$V6;#Qcg;Ld$i)-stWrC{meEY<07A zOsZ_%K9%)_h1J3&yflk?ipG#OTwpXWSqM;bX=b{@Y>F_3L4)V<_609F*L<1N9Zr3e z=2a^xfnb~#r{m0Vu5?O!{pqpPjknk)GZ?=Afa_kOu$@qmVpjcurk^(mi^9{)wplas z5iy*!D&v8j>kcfr(gc@JYRRQ?u7U@j_r7lrAZ9BoORsO&SHXbDnaZgjIVFLni^GeW zcZBaE?Y<0jw}_WqyPu-iSl=%2%vs6H6WReM^iED*C#wz}Zf&Nz()}aAPt=>0vk1>O z{n_pWVMSI}+2k5uJ&$07i~3rdz>BFjrD-BBnuO*nC`%TmqHkjyE2=7;tXZ;?fCs`D z11uq(6CfE-uJJ}LGR(_Lw@_bea(s7fNyk~15%rwHoZBjGi29sXhZz>?YmtL7m00(W z&sRA2m0WM^EWuAgS&wU@Rtpn@YrKMV8U&xx=LO`aUT!j$XcD zTyne9?i7#J5CzeO#RS$(5~(f%Pn(gIVZ^Ar~s7g>amiYk;55%CTW56^Q7^X*%_;4a||<~q@}oe%$F ztj0n&p(2U})rNghJWF_;%puCOqWq7nLOE*kLlw?AB5Y-R{&@NwPJvVkB7eCVxw${= zBbkqHVq)Uo?hbo`1Tua1B6|YB`ScY<_6Z6sw7i@-R4n@bRurXe*~RqfcU@lOlWl7+ z{wL)Z-xqF1!w>T(cc#m9d%C)ePA!a{`n1i>&CSlv_V&I!{1=KtxhfI!2; z>MBVQWeI-u@+A}sEw8JKm&)1tr?9>^pJv$*1qBA$IXGYkf-Gybw6roaGm*%%xBo=u z4ov2Q8;^|yzr_#07$_n{_f7x&`ch0##{5s7uhd1JK67g^`b?hA$+FYjn8utZiw%0r z)gT48t&Lk?D{;J=JR>Y~4d+t-Br`2&MiZ&gK2ZMWhGpv4=usUIey~Q^j>cNw+&Dh2 z0AF>cNz;a)tVUQ`6Nf@{5@FFzx!&;Bl&oiR?GCHSxS5r`KVj(DLrhQF)}j@`qZXT~ zyaj~dJihX?#L>8G<3UWUIB9%iYE(y^kQ6vaw|XP2?`O^~7h^iTTeG@FWLvs_WO-18Be^xT6xv-H%5X;_Nja~J_qI)I8S^@!>&fc{K z(wx_9|4;4nUxRh|U9h ziQ-+Vp7QVTgr+9Ga2wpCz1oYBAQDO}_Pt;{ra!DGu(*0INSIDN;Ev4aO8C|M5ACKJ zuD@(<)`T9bjSjJerXna;;UYf{^WuuskIg zm!f^8-nt@MQ9A&Yumn#kmv?*Lt{)E#lgGMWx+{&SrL z^AqR3JMTXNSCnt#<+Lsj{VvnrUx*4cVW!XKh&^Ga{j5`8y_;ll`b1@+1PZ+p8@84M zWyiH73EIHV%vNjCO$LRyt#(X-H@1kgGzW-KPJReI#>DpA&GFQvHz!|1rB}vB?MqB=EoPc-03*T^V%JTMww`2e9;`8SE|$T&wq})G}MGp znP69~i4{lVS8a%Kh{#+;@zM~wQGbe!9lf<>+P`i0BR~I>gM)+5#{sC(h>(re{Dl-E z7V4DP&bbgUIU)pz>>YG>6G&ofR=sQ=XHR3;gg~ZCl^hnL{GDxjF80SD6ToP<`;BUP z5QslxKMGMJ+fZJJ1UE*5iBA&+R;4Art<1ul1D~zlJlGsO55c+e9KPe}3L1I8y>gmY z)EIgO$F@?eHAz1p$t*89y?r}#&1tnAkStRBbIoGzmzwZIveEsnHAc1hRKB6&S(B5& zL!S2E*&S=_DH288ha$*`^Vpvzhg+_eko0qu-e<*Bf1NWcBb)rvc5MXghZ-f}ebH3s z*7xzrf$DiW4A4lKBz7}fLOft&m6a0I$Pche9YQeI!Fe(kHvpI`QSN&ZK3Eh&z*V5? znOtc{uMVSKkn;zVC|=S~a34x`%MDB;SuEbZBx4G((Sc6mFhioUS0@D#bJoDdyM zkHj;jBf-FG^uy+Uh<*MTGQYpcRs!}ZP$)0ak_f1}Rc9n*_hoToXd;|J$@;kkL|3!P zeJ}g8r(ju6Qlwn_6O(^FmSX7;tKeea}gNkFbXR_ z6$@ims8TIyY5w2(Svq5vB>J@j)oG0^6L_wQa_r{&P=ER9CW;e3Cg(2? zsGcyqxZw6)8Qgi!wMaW{r4AFmiDfVR^qRchXi4>SNuXp`E22cjCc`@+0Bd@Nxy)6kO!rCzSxCbCma|-^C4Af zui_YVxlPQ&!A_&uD6ZL&Hht85bpn_n#(~^mVnTdbkVj-HbV5}GJ5Wi0?{Xar9(-9r zFAh|)ph;IKR7-37!F}!C;6HAQ3Gd8R<3$#rj{smZQ{ zHhtL={GJ|xB8!5eaUj4&uOfR1ce3wj9LTL@-1nDDo>-Jc3`t+WD}M@E3@s^XPA}mk zt(|_-#g@g05T}=}-OAvGob<+#+tJV;m!#6Z-UG+~O?E6)G9H=gQWZ5e+O1v@S}M@K zJ~+0z6{IMqu>GXipn@(AQQ#6E9|DLG0t6`+uY`_kRLnhw=MluwtO2f3f&yINxQE`2+{QO8RHR zE|0uMM_Gnp;o|y>J&psJ!SntUDY3S^{M{L8Ws14Da1%UP?&(;4ghU=;>#5_0{WW)?STn*k@VY?($+ z!JPb$h9>pGS?;g>&t#@Qk;fm-#U~$IDC@jyz4cVo5Z;T1_2m%pKKcuvz5TDx^<#mY zY3n!dIVpi`*y99L>GHTrf){gc_wZ#3Ht8Z7D~k)KI1eY<0*eAI+(pRkzHd7^zmJPV zy17ZMj?6cnXmq|I2I+v%GYQyrM^$)mTp6;`@#K3zARcW(1`~pg4DIcl%Hb^ip!aUc zmL12QA|KcBy8pT+DXJHHWqHxI>a}#9Nu(TTCk9eQ%_uQy+v0x7S!vzsA!iVJcYnc= zY{UQ72)`fzvf4_#8<<%3`=uPY#ma8ua(W(dPmZyZ(dH>ZOA<-4D-(yj`f|4s;X!L4 zXC>oI@yMS!zab=hUW7EvmW3VHz6xLGKXqFat7Ejug2E=;kGf%qhh*rO_k&fl5Q}@? zeo}C*@@ASD|VV%#K)s9 zM>I~BDk2e$9MZ;b)=SfRSyG{>Vxx}nyVFeR;|b8P;l$gy+~Ji;3sr_x%iD{i zJ{w$U0**_`FP1gxpp8fp3X85&!o%jwA>?ZQVWxp($-i)&wBj7 z2V`HYneUzS;QeiJzTru!*fa;1^7&o0)))&K&e*n42BFiD%MZ*UtY z*H4JI@*afDK%~5kcd}3t{cUiCRn#p&YpOa-t4$pW+=Kt>JYb+DIR4Pu*~B@D0!?ph9nO(jrv}ne_w#(^@nGf_&8}hk(};4}AqH z>nbVEy?jt)88|aAY~b$BcY|w}JapxL{=JhXU7sqAy%V8y;Dv~VG)rEbKx4T;cj4G4 zivrGy)L7Jxe++J~W3H%9n=HNRpA8Re{t2Wb5ed($cEa+wt`y>7IrkmTq0Qj|2q;w; z35h@FWx~!^IqndN-4y3!pf`j{FutPu>rI#8q$GHAik5Cc+ffIT#^-{RmLM&W!nGcQ zJR8|<4pjA^d{+=!p@Nb^Ky$8-RAAMAKPgon4nA`_vdJtOfMw6pfrr&H8~qgV>E z0S;-z8+4~B;P{QiR3cJ*djs_n)E|mY&|#>Fb2<3Fa{lrlsW1?x+51SCIv34K=}U^? zVSTU0n1QE(Rlz@*Zfz6wTn4(sl>65YoHS+AzKZuo&>vKOUfH4OK1S}qNUYHx!T{yt zJUBHi&kFbX^?U}^Mk$EmUDAjh=Z*^}ciK91%Rp;EyDL5b-H{O|sMvoNdZYbP$v#_= zLI_;xk%10Kl^U~Mh@Zx2ad*))RjSRcsmN-W7}e6~Y&GQzw3M*LXgoy=Zf%IQf%gl* zYGNM`m4_eRD!4t??!+T_d>rL$OVxp#_gqS9a#>f7jvd+oJ68W!b?+V3MA!BU$6JNlg4_`hrE2IPAkw=ffJl=Lp((xh z8cMJdx`6biR7nUCLx+HcDg>nW-b)BIlu*v#^Q`Bb_nfo7_5Sg#Z>?|sn3YUsCVS89 zef_TMca`l;Yx&8i@J9ifk=4h=Ofp!;!t|pC7}p=R-YUid<_ZpC=N$~b_~5q3yl6+a zVJYB2Dkpt+8_>vRqY4*97ixv$**PmvCC9hRSHE~K_t;h_r@hJ-ybvX!ZK==tui@}; z{R`7UpP8LA5Al9_ncJ4hEdD&cY?t`h|c zv^F<=f~tr&z~xy|jY3OHA18v}MVWmjueVc<3O*M1l)vejVMWs$iv&%5<_in|yx!`u zF0!byLy~G9_?LXSX$`@ZfB!L?hlxcOV`J17pJFR`u<)X#@U&hn;#b6Vq+7! z5&8DfixLiEM$E%#^esfu?Vw%tsH1^DY{%d87uitSeL9plb^gS?%?FD9|@psehbF+)>pXlQ%cdfQI2rjz=kb@)|!%Mf-s-C`&wpao}?!F0MFa&(o zbaG;UcstPlsp-{Uy~d_>R$Ar0E`OqB=@}!raY|kny%&)aJG*}hTklCwd&&7I^jTi= z?I)4Q+kffkU3mELTw=ivKSU`)Oq=auDd_TL-pe}qYRMB1pMJjc&l9d)A-~$L$SZf^ zEuZCaPIfU1;c%k0IIotIueFSzi{~wbk){D~xH%qPZr_~)m*1YN*xA`>ZGEDp)um$T z)RigQa_9WUdtQAM{cF%amo|`_dwa1lG1q8mD~Fw6}4qmr$q(WDak4cXt%k1I}-`Ed+u_VJ|>*N-O-H{@Cvrt(@Ct4cC(}D(qeM zme~S@Qm0(5qG7mweG0s=cD8j$$@Q?ree?JP0<9}5Y2UmM`UEufu*Y5uhDmw?3e^Jv z-`~>!wPn5?H)9IFalEwnlkW=sqn`g~e=%csp>r_{V~DdQuu5WRebp+iI*e~_(^V%b z%8jNXh_DKG=j{pTDne2L(48-Vjs!H>d=N)pU%0Bdncs|?HTHL%KTVM*jtvnnanybw zVB|=|BkVEm_}HTf6oe9>_L)NslYO<^0%F`7L#6o z){Tj+CO-y~N8ZIYJ@Kidg`Go)g{P=bt)GYS%|5rX@R?5s5~bI%#@VaF&-AzgzV~TI zO0wu*m1)XK@zI_+z~~l);1`3U@(QW-T&0}Xrt(TNYu#jKt;rZk>&_3&FBcIjqqC8C zNf%cWgoWMjqhl#xWLr$}pL_Nsc<S@wxn2G34p&12EsgRv`!Ku>NQ_mWnVL3+TSU(Ad)e?Wr<3 zsPMUOG5rL?zfgK>S(TdGEfytDe$9Wv4d#PQ7ePWg{rVil94s-GC6JLD!gbGjyxmIT zMg)_UkA15JuPDy#B|KuHK?d$X5rAO%@+!*dkTXERz`C+G8K?CTRkF=?WxMS1sUK4`=+{R=}y(Oo_snD5OqOjjh z*RNr-iTdCckiLH+3(yOxz?S>_;C@g0M9fe79msIao+tA19DKW$?Wg4>DbShw?VT8lnQorqkfnb{l}<_>@Mu9aP#cI@xAKA$kzR9E-*2-0n~QNSF>g<2VJ??5{A|O zZl@foy^;^vTOCA}(*=4kUw_cjwr%gbA~RW9+2=cs_p1UDF|TFF2lnk04pew6($JhP z?j4E1-Y4V_!!o8xAWjY>%#zotg&^dzjRiuwY#LL4y~g$e!D9VTO_{SbKeKLcPm^i9 z3ajkTnzEz5TA?e+-%HW|<*Z`IFYUEFmh>{2x~}JF*p^^Y7O-1On5M!gL%o}4&I_bs ziBDL1IG5a7s6nBpY1}}R`{HRG0~Z%plVkaP@I1p2O9BdBO7Rb`c82 z8$qzG^_+iNq?3PA5n^qfmz_PSxZiPM!|jML+r;(s!}F+61jqgR@elt2YxnYW$qh`` z#%`N*?gNteJs_f5qgBE;DdgxbH<#!a0}Gjc+U7&|u7N<1b3nUMsIxi~z)O28a)~$M zhZM;F8NJf9;dM|P=-cbYpMW|CKry}f!9fTBh0j_y{r&_YK>p}C|E>M^hE3bt-@nRD z%*#i%OKx00+rF+AB<7xB`IzM17M3yW%^PIvtJgfM{!%uAv{$Z(a$odcss3|!`lToD z(>rqu{cO)_ZiI&Q9Pbl?2V`FX8ThET!F7S_DFwTa+7r>gt6cUl+I+(U&+3(( z4JW@psgH%zI#pyO`!Acsouo!y?+h7q*^#?{|1J*j_me(53mc^cy_Cq^QRy9HXpgz4e)Qw;%uOY+Qe#tS)s562t2?gp)q({!&Q(THooCqdcbJ z7a;aG=xrmu;i>yckgvYpXbukB8dOGtf zZm*Qo)P~V9fY`M6w)h_c1!X3a?1G7N+B}s?`tZ}66SA|rAKa4MGd7-AD;VH@<<=dK zTJ@lOPyz1iTGI}@kJaHSs_ry6q|pqyBfWCk6so6FQ(~G)4wmVw|6;wiSZJaZfJGsZ zyk22sUD+sr)_OVlzAf{-nG)yb*g&dRvPDgtwXQz6sE3q0F^|Vp;+zK>#ls*wnz|I{ z-%%(2hhq;(GO%a*?Va$&jR0?A$TRr7cJPq$-g5mnR5)nvLo{RYwkwo3uSh(yc7PuW< zV8fF5`f>G&Kkb-EeDC2dnfdLVbBY16aQRxwsbJY}O zP|&(=g-A7gLGqp0{fS+iJyJNSI&C?I%N7{BioS4cm^i7l^^6%^#*{DM13=GiJKXx~ z<8zz|_zf59fhGx0=J=so-uEMdk$8roQSgh`o0ZHEG@D!fB*IAmGWM)AZ_d>U@ zD`m4N*;5er*32T-!i(eM=}=pCXNsvI;xJO02MR4!&eAMrjoD$oXFC&y=g%G~<)sL{ zN!2jEg4?sNguW>pxn5G`&3u1h_Ev9}xQgKZOla=bx-^{x*N2-@wp(Q$qzvN&<0uUe zJ=cvviA`D_qog=*mS0r1Rs)x&9AZ0)6ON6J@}>0;mT~&gf#qJ?MKAEx?b=D@MT3*; z-Ys<_b<6Oub5;dftJsMZnab3UM%WD1^0%qc)h>m`*yD7<`7xz4JclilSr&STgE0Kws2Oa(nhEMvyE2g^vf ztb6xd?>#H#Yc^&7;1~VuCKrQuZZ$+bQOLG-7g+c_HFH`w>kwV_8q7_4=ePE%?I<~( zB``|f{rhm?+fj^)Li~?}jInI`IObYO)YFlahv!-5Bg_UT@**dG;F|XQUyXYdpWZ*` z+TXTmWL<(Dva}6GNEvT0hMrr6a+)QYT}rY%5i(A%u`-vY$di1WWNdshN7a$??i2Q% zDQ%^cF1yLjI!Rgpi$HApsa?j7y9+|)NA>1k3g5(Qd(MouFI%^_KZ`gt~lc zQi8hi&*$iO6>wrLymJT?K=@c{6-$c^b*JGF6#n&}?`T+!E1E?gkJyaaW?IQ6lbiO( z;J2l4Z|5T0lqYjidB`S}7Q*AD>dJ4^xLERm-&34!)Os;y?YHOVNR#~mne5d)8tpa_ zf`^9nK;nZ$ni@1uOEVvPvfLO$U-E7F&-=cg3EN5)+#zgY?$?j34n=v$o~r+YNG{eG z7r_QOQrVG!$>45dQC#iVToYKKl)5@mof+W92BLosSS9rC#_Y#e9Y!UjXOi^?by>I& z8OS}X1<$vid^4?ST!T8U`n`JYA{j#zLUcSU(|!un+C<&aoe*`SQ|P3kKaj2b?jJSQ_fD#+Bp9PV6KYp{3j5N0C`~kp#Gu8z|iP1e_&!;>K+> zV0Aor>Af~ji`De|EPsEprc>9o{yH~4gKkmZu4vh`8ZYztJ|9=nX*fzyez^b%_n6dL zow++)DH=;SANnd9ec{2w1^>>k#~2kwni75UYrf_|ce*z}+8Mpx$|kVO+80?67G)B} zmPNDw!7SMtRn3|1wc%L=Gc?Na&Jy8B6sLto-BIwV0whN=U=UI27giWCKhT+=^&w3f z(Xrvf&`jf&F#Jkuw=#|GB80rhfdWYdGN@&6m$JYYe}q z`puh8WbRfO(%oHkZabUy)`~Z{T*b>B7GAZ$$TaRX$C3P4{)wVm+Hk!#XUCZ(zx5PD z;#Z%{7Ips|cSCo zTwI)TZuj$hW5fsqg{^FqsI9HNN7Qgsla@bt-R0=ZI#CrAYLII#zp?p-ee6WCTsG|H zH~ewO&h|EiIy)6~LIXr{zZWi5Nw(1RDKhWTLdW%035*U}2y8X>UIjeB7ePS8cPpb; zqJ;iy#vrNB*ygFZ75zLr?&W&^Jn`;E^0z^k_ifU*8;!+rK2KsSE&8Hh~h zZ3T>+mfKV8XAI-^<-Gv&bAXw#kKI2!bS#H~yY0oIsJ1?$P)Od0>#VGVx*z9L4bNuz z37t%)W?`?##Jiv@{4mjXfq|{B?yoZ*fL-~o7Gdv~b$k&&fU`6HeKt@)8{O}@@-8rt z++6op5r`KWHwBbWivn-BNl8n~%MFMAd?_cjeqd`p{UXH>#8&d;Sq}74^WXcDKq0|f zXP%9FfU)~*DbJKrU`t37S$@g}gh&Eb53m9Ij~m*>hIVy>$Ej34%wmqxGq`zQeJJPr zh@{UC^U2+QO4r+dmko7vo8oEpMsA44kCiv_l$qqw-1`P)O`UB06yUlaOqEQ#^YF8v z*fXH(`SslmQ)l41kYjVD!Cx_CI8Px`^hDDI{%cc}k-yV;%WHCEgq^3JoRGg>sTQ(q zXp*`2-ALsv4av_qRc{yF)ZTFNW%dv|$xLbSp`rtYs{Cc~=rX;Iu!Ms*CEZdFJ!{bf z-_14CmQUK_HSAMrJjGAzk7#7@Vby)^5+yd?KEM?@VBzc-lOxT^ftTjZ+~cbnMmSz$ z?M!0#tb`eB_4=-kx$>o;{Djlu{8L$8EeV?ppy2m)kpC0H;d-EOurlwH=#$dm!HW>f z>S_Y&GYvjE#2)z?lxi8^cZ)!|u0b|GaO(u8B$$Mi9xB-bl(hIpc@V(4t!F!t2x4 zcS;QiQe$gRAD3`&l56+;t$^ z;hTjRo8scyP@Mc|<=2}XG%#8g3T!#3WPj{U0GLjhX6?wbPT#Oty}v$N-0I#rkUyvW ze{X&UG^hf^`~NikbEn;J)1pxP5tg{&64PoOlpfy#!}@mJucQAuO@XlpbP3olqaPjK z{hl8E$d8A*WVGV$H`Nx-2X{W9_+Nt-7(i2su@`(-69aS=PaFspk%I|!kyQG{{YwN| zssUfWUsj19RvUuLH~J#wC-`jZ5O#||s&R83NK2kk^%-yH5WUh1miO!tIdj|e*#U1) zEzQsI{vG$Aw2AC8U`cojeNC|vcT9?sL2T_=AXv!L@9PFf6fA#4X&5^CEC(oZJY4MV zmG#=tmVzoP-~ao$`8m+KE~nJ)e7chmXAM<33>V@E07OoPy!)NTJUVdT$}k@XkMmIQ z+SYDf=>1Qm$H!FbAP|el*%|@rDcuzjmB^sI?%IS3Xhf@1e|zK;AYdrB2p?IXvA?jW z%V?Dm`N8qzmuzlerF-MsxpwAv*D~vgzlS*^1#y!d<-S3Z9zA0=b|swtH_*RJD6Qv+ zDA`|+A3c(bpv~BZL$S+hk#)!IUnk~)V*pS8J;6sVV{1tWAPqutZP}%Qo2Hge{RxGE z!BUWpmd3pA9Gr@iq;vPMppWlsll?k7j>%C-u|t3VXU!x^dA^hNQROF(t?^RV%4W2G z`Tg}|t#y{+qS{&b_JXde10XX{eHiu|Hx@p#RC_cEaM-fdrkEDl(hOE@uq&+hx~x02 zzE!4xzmZ0GKJq8#9@zwdA|fa9;kkKcP$%XyN7OaNl{)cz|5g$`LCtB$c4qCGegXc1mhvhJi7faWbHJ1IEb zObMEA;eYXSFGNDWCWsHRYS{y|p8Ii;Al9Id5`U7rXNudQZh=`uTL?h3y7qV53u4Vq zh=g}|N#S6`dJ2&worH?m4c~OC56pKayR_%lMmqR{1MFssug&A*OO$J>H^tlDwhz0Y zubHb==lzXdRg&z_I9qb~ptuCMh65TjKME;#VjYYql%;D&TLd+f z8T8JARboCj_lPq!$hvway-jl_9=%OB@Twf|XFnV-cqecoxsA&gSXeW|Irj_*3e$VM z=%LSPEZ%e8unyOk?X*dH)8{btY1XYAkZzENLN#)9Up5!F(Nvu*U!1E7H8~&y`|X16=WGJq%Isll%~|=7nYCVi#q>-SKNT#ee#y9}BQfa(wvX5#3Cubq zV@;w>4?Vxo%TM}|rt&O_{E(7|pZdSbM*{78z*$8M@6OgUqHKlJP4=Pp0?WUisEQbB zW!C#|br^$-NH50z$(A5v%yAs#3rs$7Hv$)6UH)kU&H2|zLpCLw%|G&)p>xD=;o#BT z+UUnHG0OBMM8ff}YPwGBU08SFE96Z%Q>D2C%}hz^>PTf0onFbYEIyle<}Spnr98El zNSUOREgPZ7isS>8@|LN`w{XJ&-g`fE`_Dh(PulQP2$=%vH(_7cHq$@)FC0=7K<)AR zug~Kyz>}XUy6k^y-=>js(GK(_O0(M(bysCtbq_7etL;}eWh)pL^e$%m?6+fvaurE? z{-J&|!{?KAj##*qvYB>QdCof}($)kylS+&|LTKZA=dj2r$=#`Aj|wXx&r9 z@8&&3Ls^f@T+_SCWV%EPY29yc{*H)>5@U*{`e}wR>z}NrCi({I>GeI{<-Qn-I89w% zT->8o5IuLqe5hh?qR(Xp)eMo?iO$Ry8%VdKWoL-XdGS~}0+27?6bpjiREU4xT+FRe zI86!cnaCU^vng2d8&uEM&Kh*OwrHQ>*GZ|$GXG2E)vMU|9I1? zwEDagAO1`4djGV#!ms1ENFX-<9#D}NaNp85%iZ%B8$-7lF2g5o&rO|>P3lK(Zb2ZJJ}(n z3v-J02OG`(;sZ^xtKvERirPZfsx2!DFdAwmP$=RZ;Ea2PeKO=E7^LyAiyU-2;3JUl z9c*G~BreK9D+OgY7x7&{UB*zz_6FazJq;%xdT+Sv^fz~LMU(y!-(SAcqP0`!IL&(= zv=Muze$!Vd6e`WlfaH7tCpJA&&uBC||CZ|y8P9V6m z13qf4ZlP^s%se;`V`REj45Bjm*mqWXb!|IfUY6@s;aevgJP|c>c7F9Sxc<*GfK*_s zub0tyuPOjR#h)}V$SNxO%HP+Z=;R)5X9+&Z|$`B{Su3+68=tExnmhB{@qY zAb0Q~gb`*7em)4wF&*dI)fa3C(Q)RAWXvAS*QCkyCH-O${E0SOHR%v}p4lR(Gg6jj z@trS_0ze(elnZoOp_U6GM;Q3#?0Hn>L*5tUyYsq5^T>K6C8moyvb6-;f~^MsMy$p99o4V*HjK^Zi;UHG*8qb8qFEW3ytedx3z4qZw~!R9PA}Br0=ct z)*SuH*m{tp_XQQSsvw`P|E18vqI%0H#FuBBsgi?ml9c?g)Fjzu7~YBQgW?j9ca6&6 z$~h#`>ye3@e9pOy4{L-F$APa^- z3F&XViH&|dGQl!Pra3N8zF`hbIh#z~>uyr~rYBy5I(!P)949h46$T1@^%Ah5zuSdR zq9halmRNx{!o3!AtdcHeD-cTtBmC(ZO1V!&PM>d8-HOKVz`(lE%1VZJ_jU6;VPgQX zh3<+hk79}@tmTPPNyD5b?1m=E`_M}8@||fP<|LT3*V-@Bvo3!O`Hj|6?8?k%R*1_U zSA8ml>9$Xcp@=laPw*Bm#GS;Zi^Zn})vtnAt34S0+F=q&`>DRt=H0}xT&79dGTDwV zVJc18h2uv@ZrpK&m8R`d@d$%eRb}=DMAY`HwqC-ck)K?GySmj%!Y>3I9>97aN>F{` zIHS4$9)Yn}*VA6n2y5kg4w$x_RqoS&of*PFTsdtJvn8$Rz0~YqQWq!jO~aM>l_z9| zA4~ELvJ?f97n<`RDE>Pp1=+|Zvj`AcwE$jvP;;nH&}>iUD$nYXmbU~Hm`k^oh;q*= zoQI2jG_w_g1sIB1DAiGjLK_9<25+(EH49nzvsAtWMl4Ox-6w_MxQ$~3zaxBJB$Cy~ z*_T+TJpNWO2Oo^uUlxOS9@u9jyV>|*q|9pr6Y1i%!!!fZ&{V6UY#K4u)*{vLNMxHd z?>PLfW?af+lRdb;ky(egv(q)ADE=JiE#$h~RXb78NxoX3RmZ0$R%`;mv7L{wHA@Q; z8D2^^&T$h^88F2`m9J1NJH#W$T^fwHLy=cmr0%W8j@SA%u&TwB(6_m9 zN_q1Z`7^MC9eP^>$I^6latn}+%0|E5NSxp@Pc0nT)P>9mEt`i^(|I%c1miQ4ZOtY! zeV7AxvNkTc+F%5QW~kRsz=q=-Q)|{%_D^=boY;Z!#(pVEIX8#*%+j_mhea=(Lntng zQ%1XP)Fy5|F|DK&V2W#vN}8WM2PgRHpXR+a$?g4hc+*8?uxs3|n5@l!Lpn#Q(v-ZY zAAbZm6!#yHsbGd=b6f=43WJ?>9=4#?-$9$Ph$Q&=!ef0Y_%3trK}HFX}${P_a&h1D)=k1EE5`5%zMV~-+CzOWJi}y`SNE=YfK^-TyBKy{ zrA1^L4T$$%p#T8=QGadxqw{a@zgKzLw^p8?pFj38t?7WtYp6AOZTP_A@<(?7@c|A< z^yby87u^*-z-QPC*!IB2TfAR;0kobVyG{>iac6-~V}N7nEc5mZC$Tw7k@o>ml{@l3 zTk`GS*Zk|s|L^zyHvxS9_$|^%{>9jq+62R)`kL+?+`Z|YnLE7_)fauUBv2E0;`)E^ zHX;Y^?=OZmCnGf4YaFEj|2F{Ka<~7my9^o%!H+mOu77?y;%BjrnRlr(!0pSE)`1D( z7@a*j*?1QPU(ta!9E>_~OJzG-M4bm>{(gp^0k&J9I&Asy#Xuu|1rv{M=!!t^+6JY` zSG_Za>h*t}9duKnVeMPYRIpOa^5P>1K^T*wSmmZSFybGoA5%J{>2vuV(nB(izkhic zd`Od7Nmh>;4`#Kyf&q{-r~AVdA&CZ)*3{RCAw4iyzdU$*v~z1V#1rB6B2n0v$&go>YZMd~OF6|XQm zC^+AII;XI;C@G;LBKhY3O|AcQB=f+i8O|pJ)bko}%mbd#+@aFpY7WFKN^-NI##mG`VKksDM=+QV^(z;FS zT@R1F^3mRSJ#bvWBsT5lY`Mpi(e&Ao`cDnyo*!ty=qS>qPe&T{miQ@>7IV1^(U6>L z=4}1MM9+$yeL)BE{NR`bZOCQ^^TP(xu$M~gpKe{bfys(nqEJ3oNWPQDyBse>N+bg6 z8^AE}PTk!!*)53w-dVz6x)bOIQ<@w4VXR~U9~E?{{o`E1{eeZ#Q%R=4TjflcB0#3K zC7;lP?M~w>`g9>VsO2jQYfgRJHi11^ZnOng*LoUzKZ{o}2sr6rjY&}#R4)}~M%906 z9?cfy3)faoXh=5DiSNYwbbKuhK6t7(`gA7sJ@ z3MP<44chES+V4d~PW}Us9@_)V8FgQMlTFg4OA`NurVEDr7jBAk8+xUv%BPmxdkmDY zF#hXfXe8i>u?~3(b@XSd%uxSwQ>#OEb11JyJl=8v-AE z>f7$d7m-%BhrTkQF(Ek3R{bIul^1FP+jx1YD)vVByT;czimt%T_neiIXD zC%eqNLkUxHm;Z06h4`kq6+sC6H4Zh>BUp-M_d49>svHa%I7%(aINCIgtPm7~B*!WR zQuH=^9iVet-BNy7Ph;jT41s0v^5kh@PJtmCZb*CBb}+=TPXy=-AU`gS%?FDt{GNg6 zl)X|JdznHb%lLNprp@msjaf$7z+u48GQ4E6W8mYnN?y&EO#*}QMIRy!uCE(a}|^^N-JsX#vK9dzU>`7otqUD6=O#7hnM5 zKp?vzz>sj1GY44eGobkY`<~v&q0|XTxCR2e&O$0fskx;$i)}Z8n$Llr+5Z7joEgQ| z;afV~(6IZaDe9emiagdxiKJpP>tn~=$*f%gGn zXfdbz`I_&s<{UYEH;l@%aGKE0HTh?DD>_|!A@^cUM7Ey9BRP4pd`_PKjGwHaiZ)+T zupLI`s>a;t(Q&Oi>F4j-V}!?^*sRf@kw&^!GKkV2F8e>ewK>^Ys9Wj$d6t*K{Y-&2 zhjN8XBjUG>N}sPiV=6V5f>8=DJ+9wG`kG&}G%5I+u)5n023>vhwsH4iXqADa6z z{jzW}NWcoC+y$lHvj_X(cJosYpy*%o&Skz!%4Ez6uY|wg;}}j-P|TLUw9kv$G5}Fk`xdi=tGwGz}U>XJcdFw zqaZJrD3I%e5X@V ziBK2=yTq4!)0aDFKo9P;;4VCP(G9FE=HZ(_uvj*Wk^yVSlhLS}c@f1HoqorFy96Ok z2xMId4hCazNGblv0b{*%ByU?7R3ATzn}70jiB!>7I$yIy^$Ss~@2*k3M z8h*qXcw%+ydyAI}BM-B+~m45E{7%@6AnmXcDpqr>#!kvkl`+YL5^jEH% zDC2nRY@5L8A;aV4q?8&(R_5{D1Ht*aUOKJn;3^)kZdUnQSF<3Va%M%o0t`1ZI$+T( zKz2ga3E7;R=e{@y^p*+m^S(tYyOqdut*u=l@uTcb`SnV4t@pyzdR!uqM#8MIYKIgP zd$CR%bf0hyq7jmArk{Y#SOFGNSZ$1|>-LGV=^9#{rKM=O@NLnKHvH_UxZ{L?NiJ{f zLY1JL3eyYW-ul|b%c#Dq?t=o$YLeLm0X?Zy%7OImP*4-gIyl5|JnXp)r zISTX4KCb6)vh}{Uztt9M$bGyd`GPR4vm3FrRfW1k2N%D3P0>CC@u}+#kYmXJzV#dL zkeMQCqax@VND6bbAda|k0k+d++5ZD^Ft5h{g*ZPr?g;v7w3FF^%4k^}*B(IsclZIo z1+cF+LQ^^jRZ!py06zesdj4nf`@j5`&X6e-kJgp(08B5yB=dhS#YYXA3YlrX1Dy3A zH}(IEpQph2c7KPez<_n6Ujw&A0uw8*+de2bm_g|UFNppo3}cYn4FnL!fgXf#yfnue z>L-2zTq6p@Kqr8vpL+ZS3Z+BDRLJzteC16-GMD)dHZPQKF1KpnLj=2E(7RLOqn};ISPp@bMXEomVb{qIZ OkgAd$bc+Q!fYp=amuN|(WAdP`ajEaPWgz-@Zpn`<-JQE4&Db=f|h>{~9TLj{T;wYo- zf`o+G^XLCbA~Pllq7d2jqr4>Y>I-tTx6hw?dw3xsy+!&6_@L&wc(~%B^=6Lv<%xqi ziQI7*6;+VFa>R=d)z|nw$Kh!`MT~UK#d9>8xZDj|Cb27)JqF|RB)L>fuT-9^c^l62 zxIAh}{!G^2zxTn(S~0pBIpi1I%H#}=lg(Gd0q&q6rbawWWZmy*W2i^`@F*x^nVub? zqM%sKRgmpJ`BN!I5ET{0#jZ8|;?FN6v1mE~-rp~zX+Wl+hdE)05#gr5-;yuHjMoYb zzkHAXc0|fH-x9#j!Tej59kMMTpJsx+|F5exRm_GbaEA|bZth>(X&Hz610{lgwF7Sd z-b&ofF*{y7*TPIMTu%ihX#bX~sZ>1sSN)$^k&1HlLgTmom04R>P%rcT12ublTVS-~ zzk_iLE>iw?vfoPm=R%Q@2mk5gS|<@e_V-(C>)X4TM2UcY=4RiohQdvW-Reah7|s9I zAaD;ejfz7I5v+UtCWj-4NR3#(cC`6yaC zclXlrZaL~u*y6%Q3;HX#$gn8n?(*Pz46IgWVQw_lq@B*Ta(}hAJF@H9aw(K-|2UR^ z^ZpSI|4J5UMNLqdzPw0!^cNHPMi93lA?+(Bh!~YDsz5dO?xmyZ4!PkNi4h9}*q;rW z{**gJHZJ~zWB;n7Kj0C*!I)M4D!I7CH|c7{uVO%<-SzB+4)UL+$yRE2EF53E4+-|v zjDB$tWwa<74u%U9fouiXR!_`qsD2D{tmgs^1dn}o*Sl}BYqLOEHU0;&mp$rUYQ|mf zz#Y&+45EWC=6@*S%j8D$VTxw4S7^%O;>U#uU|fhE@(cm>Yq@+CsvolX1^Bb0dhIQ( z<(cP8r-wa)hLvs2muO(73|??5#5*_m4?x+UaugE%EiZpW8Xa%8RMn>Q$n1cjOK+Mn z_apj*Mbms9?po*v*&p@sVS`;EIDzI(Oq|=xgD$+s%V?2NABR3TL8JQiGkKTb784>#D(!ivQp9 zS%k@F_5d{-wg*^PuQnX==6yVzFu}qN-_1EL$()poZ(XFG`=CE@w1IiB4cz8m7#p~F zw{_r2MPEme@-iOG{y^z`jN4u8yVG83e4@XkyVzk*x9V_KUxe$uqbeDpl!+O;1h z*FSqfnWKC|&&exk-T{hWzg3^^kZ!oUmp)#&C~n#%KRZzkVA1l^8`}|arx6sP6XO4H zJJ>(Pb(}?N0AJWX-{+-fP~AAz=l6Qtzs*6L8-cDc7+ST)R`^`aS@ovJscz)5QLOmS zJ>CLEJHEd&yZ_5Sl*j;Cs}(42=-o}2FiWW{e4#nnhBM@jDp%l+!_ni+ueE?@N72^m z6)sLr?;Swf>+p&fk6if{^v&P`KS)C_d!9W<(OmK_7k2NeOfGM8#VE32OjR3XHorcz zKDaoC=KVT+(jhs-qBQ2g+jTu=uG+d6jtux|0fn9aNR4L2;J`5yX$iQuZ}RhzPzHSz z5^We8$XW8Bh_#s+kc}g)ceo8u{PxpaDogj;w$GP-N_>Zje!>C1zkv!&)@k(<3MeUc z@e`q^efT&Y|IPd*iv*yiDL%_Vq;lIU-rNu0kE?HCmXDjq^LPlt2KY$f`HtGz+8SYAJvbP zI%_ir3BcXe7|+$1Flzd9>hZ^|Yj9@1I2BcQ((&WFjh?10z(o&xOvHd2md3H#iBNag zW9^lXhsk^FxVXUd#LT61Y-r_j>AIJcWu56>Tc5W$6^He9wPP>1QEF^hWye;VZ2l5C z)?=s3aquiS?fv&9({` zH)SVBNY;yOm~=JD-trPBWw>hoCJ4AVYiuSauG15;0FhQC7H*ScZp|&ocHrK2E25^N z3b*3T-2%|Wf*JRzL9wb~G7#^J10~JQiE%C}jw<4Nfs*!^yfKq zXdpvB&zWy^;~NzAsIw0r%RQ^zPYI4OcGsZ$`+HLXYme@xE|ngjDRPP|UMo*}tT_dP z73oi@9t?c)oO+)VnhvL|Rx_6cT%qr;?^&BSTAP|&DO~tHavQJUBJQ8Dur#mj+mT^S zf_j`M+pBmcFE1QD+>ZGzmlvr6o2e14KZ!cQ8iS`=+|PE$o9_=Dc$4`^lvaw&aw_9v zzpkY#c|c)UAOX)SZ&zQPRi$LbEQ;jl6IZI-0bP201nLiwvmV{f8fvO0F6~y2UYoB1 z>Zyhc`Z;K^_vUQ0r(bm;zCIpskMXvB6lTO`G>bjQNM7V(^e2~n{44vjXJ1N&7-=UN z5$X#+DFaa{=p6VJ>Nxz2uHrC+Sp?OwX)Kn3wCBZMR+FxSYzQv0n6r{c0 zz{$hBPx5E_EVI%&8l%wN4fj`gMzWpW69XBG#8`wr`o$%fg{}GspUj;bOU(Jn5rh%u zc0Hr;a^t^)bby4;i?=I{pT&Aa2tQ=JAl@ zD0cByZ~C{GY7wl4!HVR7sFn4yp)SKhznBXGZG z+C1%DC&L+q9b5Bb2sbuK%T^h&b+Vm-6xUMuxXK$whH0Q?kiz*pr0~5Z=@%#abt`eb znID$@ygvO3#|(>97I6c9}FOJOV|}vmvK zi}wxzJkDI4E>nYz@NB{v5)~E+8EZ|s*9^hF%52STOsp$Yo!6<@qRXtP(Q#DC=j?{JETkTvOHsGK*gG)&HjO?@Q$&TzsRm8!# zaq7sClZsAvq#ls0iYS=v!W)YI&E4;>hN~m{xquf(-}Nb=B+?eNJxZE)Ah!I267q0i{T-tQV4$iz}$&c{?#KNFY2q>5+K3Mckf>M?_RcmH-< ze$gUHh9*rjJUkqaQRZCFImC!YCGRd~wDpqWwCe`ctO?40L6P~mm4*yfmAB2L_rKHq zYNwjS1nOw&V8-^lpGY{kmiWPmcei~ha77I3&SmU-+Sl9L+jdJl`YP?03j}me4;?A! zCBeLvq%|eh5{SCBUy)wD4BPDzwMn)UCMJzH)~X!*U7W>EdSp2wiSZ!9#K6bb z`K@(t>Xr%(2uWIJCKrFvk;0jRKFJs)sWA`<-|pE2ww5BO^n*FPJsL3|{V9-YBT z1ND#-iI2|U3{4e&FtaDaWdaINM)b|fZO2FKNp*o%bAynXT`1U_rpCMwq zfbnUd*f7lPwq@H?dvJ>ZK*RB&=$~27kT2UZrj8i;Vk552A^P#4)XVP?PF<-^KT2@V zqwVE?)!WlX9Z*$7i;ZM0QBj&PD05LpjFQ?6N6}p=cb-(~5XksRRH0UI z9I13=ZE4NAeJq(D*;{bCqiA_j8-23z1*uy7V4Er=j8Lkocg6Ep1rivAjZFRpyDBG} zbU0lTaW1P31RAt0^KSQ5zf;k3q|ON9DoG@<3TD9SeZi(58-MpJg&5oSYjpu%Ihk~s z&nrVb;66(ofS%X42F;DT>Pb-+WOgjGpWIosw!irEoHvM2aQ6y(gegMoMNy7NSKN72 z3V66VNDuc#p0H}S{-s!Vf+|X6q_UzXy3dgqW~{ZT;w%kl>DH~DWSdb^Qrg?wo59pf zO@Ee`mn$)tYU5kn?7jk@llB*@l_awpt}}W40aEvyvjg_8?ruaQ!9LFFrlZ7Bh0SW2*0a8TgU~*P`C458$)aeFq z7$-;5$&*DwD(S!D7yODVkRlrvhAqqb4FJgC*gH#&tR`|6-Uw;G_aZ?fq*B=e=nL&+ zv8Xcf8!;clkB-p!%qA-&a-J(PqaD`;l!<(&BQk&HO$#mMzGwOr_}GP&3@e* z_dQxul z!`BWZRH(u}95ah{%k$MH{V|pn#f9Nv?By%cG30_}r86sNSjuZiNC?LJRsZf%eEE`H zSXj8d1w($w^G4c}7=hI6wB2{Emeh3c9?*(K#qzM)xlm;bZsG3i$d53VwE9tR_>KHi zF8j{~(g2lob8E97=5N7_-tMmEL{wBj%@yy&sdjn4kT4^FcUn%=_*7Ry*w0z{nX}{~ zJESi`j^uRH==&Kb++Z??Wvxp7H*pV^r#*%aBanG4?q^6!WL4rDR|f6+0_M*R`27x} z;3*h8_^;;jgBnv)=QU3tlmc>1}zgydG6Hx8lms{`vx{aZt zKmP>vM+;qiiJ+aYX-rp#Dv?hpwyxOI>$Tqcb36p+#&VauM9RMVDHx|r!VdPihrSP@ zqYAXVNU8REMhs^5g+X0OxrPRZzN_{*KwQc{qeOLzb(-xswym~KAS9ox*0Vg+Y^nKb z=-{_v1qa@Tvb93!ByF-I4%*M>#MWeBIJxuxW2Vr6LVj{&Z zw6c+l@SEhWYgE<G^>w$@stu}6m%-!8s$i73e-u`PYJuJ-LKv)JK z4l_?fIH8pW`P}+uIO#by+mt$YQx`7D$AiMsu8)#k;gdil{!_I|t7CF|e01icnFjc2 zyHBr5aeHL!6QAbsNu7&>IGLS{lvIfl=?flr!>g?&s&Ap8y1L0n zC1Ho(U=WsOdBD@S`Q?U>;I$2*Lkwr+8u4mLzkc%WJ~vC#6hWo#8dxZX1g|u|0t}pB zo<=FVu)*H3vd&+-aVhFB3b!iO--g`wIgo>Hm0^sK5nBa7M3kT*tP1RZVv%(-kE86K zd(8XT%H?wU1OLu*oof2Ch=>TwFzWNC7k||#F*B0OwTHX1Luhq-D37f>%nQC0nBaEZ z1M1+lb-y?J0PPIHNecU>!aPG(I`atpePf=6_AdSbTupUuu>El9AvZ=Qx)Zce-kA;< z4QDtSl-C&OGeo1J(4~?+!@`v%rkwsz9(eFq+sv-fo?l!P-uLfM!@vCOX0wgev*6Ql`pmD5y2uc;2UbZgp6l zd9RRU<7LlwdZqkf!Ac7}zO`XtfR{Y5!Vw&fpCg<~wu`R6+6J3rTgK68a`Ces-c79* zNz<3s&ncXnY!^HSntwC@YJ1uIQ(V@c6XZp2qP%+vkc=%P%BX70cM_J{+ls7w^UT1s zsEG|z%JP-i-!Q^k;Epni5@w!A24sF<{MY2Cfi})@zWuCBf_ZZdZ!cu)isX15qStZt z9-3RX?Q>IjsXGRQyyVPAsfSN#cgQ;YT&4sSgMNIHpe+!QdRk!Rk#5p&Um#fciWWn6 zZC&8+Bwqx`5iuLAJddm|egYCL?>-D%6TnT6h^3Q*e043Ed>uR;<-E1WQbgV55*GHJG*4YmC3oGwk8WA_&@-!<3F4rn%Ke$lehFEIO!n!00tgFgSKMAZ7<}d#(CGM# za@&`zbNRVRurNLa3dKjLla_NbZPz`KEUkkW%1dALkh9PELc2R#G-#zQo@Bdsy0CvJ zv=ySC6KwXpU!%{uprI1D>6aaK9KNFP=bnfQvu$fFfnBBYWHK3{dHEWHPPO9_OLG|B zE_E(#UP`3}1-wL97UKMf5+t2(J3pQoBYq=P zJl33gJ^JB@2JP)EkFdD`kwP7!guJ3#W?xM4MOu ztyKH2yP36uRN`7VRoiRkogNgV7I|L#`3b{xusHvx*&ZR7qRBZxyED>)$Xd=No=9IG zWN9J`s424y70q?Ps!wz0Is8yEIo7woqfFjT<3wKikSIh1^ZXVDf3Q6v{QBThq+vE1 zJF;;5Au>+)Dc(wJI1yEDbU+5*cur|nC^j~2?~2F#>(k*NN(vIRu-&BNTOw_{puUBZ zHt%kt$3(34c)mbQxqiE^>8aJ|*ee~6yLocTu~X{iQg`k8i*~#A+KUScs#68&ABc(2vGi29LK1-?1#s41Wu&$ZT!nnb{m^d-5L5ufoQFSxJLPZ}u`JE?h89+Z$~~5I{n7RZ%^&x!7hKwfYw!A4_jw_7 zCRY`&M=gUD5E2XVWVh@HS<6N|zbTpi`#bQ5q zqb-Jx?UZ3`Q*bxsZM;5H3;kJ60X=++xBKy82i^98y31@E*;L-(frIkq=0B|0Nx(zwD=UWw!y}bXIiny7y^CEM zNkp>KD(CKBE-s@L2?M`vsL>{85xc+By_r{*1&j*T%QQLfROH5`r*I=wm`-H!VU6o; z!xemPXKtJ2clTP~N)pXxISm#&C3}Wk){WI3I%z=;xU9@HRR5=elMhIsR%AJ{tu+oY z^1E0C&G@1<3ssK~{xcUX(YoKU40E989aMGUVrx2%lT30LIJw`t^7S(=u?t_Bf4NhA z90?GP4mT2QeB%(C*eDaQJ>P(VeO_O_yTjKTRK&MLR~{~NezUdf5Sos^n{&8a>=za} zRiSHy)|k1nH)9sSJIpcWP6^3L`R|;;VsBsnaUSgRxbJ=}BmFj#W#u5azD{jOOvu9` z;)D|y#J;I$ooH*2V!QSxi=@`a8ZNjxcQ%puRvzj6(2~$u@O*OxSd#+ zeqAfz#({_-0Q2j=EM#bSCT9bzxuyzX^?UMT2JO0_g)zg=)$#vq;BhK45Bm2(b_O(L zUK9V#1=wbOL~Tk-$=jY*%#w~3P2#fpZt_0sb@(U^I*gccgTMZ8#g%}}SyT=J50#>e z*?yV!*wWOjU9wI<&k$AwikDa)-o4cR5gQc@FtwW#dQWHV$8;T>nDQShX{+Lk%}3`% z9lXqh8o{^mVF^PQ`ik)e=A|>%GwnsL)$?_}wfb)}@kRbas^wF+l7`TgHqF|=ESTGx zRmjlLvgdwhg&}twKCguMR|%1;+N(@M$sj{fDDUXWQG9=ZX!?A6KxG>>+P6CreRK<; z=Os+d$FDmidh=Rkzu5}t`xYlX#?*j((q@yv*AMvf|HGUL45K`2cXpU4Wg!9!ENYdd z9_oM=*oyw=tdLR1$#7NT;5t$JkJo(v{+gGUcN&3HF*`hRa{GTS6sFbH)kLR%u4W{p zU1EC>)*mvU{p}?pD5zVkhJ)~zOiWElWd3nyASw_hQf4M=^012`E_N=NSbfm>yFbO* z&rySOQyP&FvgJ?r88UFk`3+;ePPD+2e*zg%_}>hL{}%k`J&q#j?#$GmM~)=>49x$f zRyeQ|s*zW~|y7@wgnN%v2l_kvm0u@CYVGFiYXsfi$6Um!OG9>1g0V(1zCbaR>XE>`)CgQXR zQvKh~ggEW6jIW5%`KSzSVWC64y+Wh=dKs7pcrB-44ZmaAg}=h{a8w)aj-OXE0 zGO@9wja%+@KjMjX95PnQ6W{uEd3VSam$YpNVPTS1EBaY}O7AFqm*@VRrpQZOL0l=O zr5^a!(5eDRCz=(W&D#uJ>o^Tb`qgn<5PS803Z4HoaLW5No%!Ge=jYqoq)I7 zkjP$hc+7n3*C865@aIpT{PArn_2yKJk9w^Vs9nblY{Nje6=?&)5UI#}uKyc|YKe7C zVb!|Oo)W%dr}j|_PhN{jkp;&!>$H;JDerS)LyosFqg`%&m;}B1S2TyFi4H1lQ#Uf% z7qz+V)8f5Yb+#6j25`XT;bXU-KjpbecMtS`4O1K1tX(J(#<&Oz^Mr0Dwx%EV3W1eU zQ`2Lv+ygqIiLlKqB=5=soXmrc3Zj_fz4 zD9wHOG~rbP{-S zOXU=v{HMhf{-G@aDo8K+~Gj0!zMcqV@`w7)w`4ZWp}UsI2n?rh*Wu$ zq22}@?Y=37K3C&BcU{xR<;2$JkMjwdiWe6o^*Gf4*T*0TxGSWT?!v}`&7T|>)(dsf zmikJ-ClfA{BlB=mb@o-cohL0aSo~@i8kyYGCoOtl_Ez!UZ6`RFL}ru&XY|0A_9jcP zgSo!zDppXt`YbaPRsgIK;ux38|CH%_IH)=G605W_`Fp~dj1>S7jQN}a1796UoqQkF ze)t^54e1oX^C<4@rD@@Ng7Uv>4`!Ojz}tnrZ;6i9{z_Kcp6)p4GON!*H*M7;{j#HR z1Gu*j(sP*zVrU8yk9hDk=k5 zZ+QX{uFx`TzPQG3%i}8N?=v4DO7bYyiDd^`itIMea+G>ph8`tNJ4DOOgi&lvZFwHs z?}DGJDd3$m+3&&M(a*WRkb7$YyUd(^#I&)e$CIUbiTjdIG~h-o{`m|bN{Qz4i_0<= zpV{O$!mqPUcPkN`@M`~z_N-Z2_uSxv@&m5b#2+c~kN%3B_PMQ`wyA$u^o=e$-hOCk z;iC8$BljHP`=)8 zVVh?+noRZyr%S>{XrV6`Qo8_l+z#|?^GyAChmA}JiHem{?Y}bb&uWzVb#s1HqmOC@@H6b#6~*sr2dqwsKrBTw zPr!be59G(R?sdmi4ha*!g7KTJFeNy6p*%&(xEd8kAh95uc=5`SIcp!WcMd^9I^=m--dpX6c0W8>ZKc)IK@DYDW zvzKKU-&k~VxO#`y#Vc1@2p+ho_=Tx;b4uDUqO`1SZP&)@wC@%4Gs-WkS*8JQZFr!E zvtgWm?HbdM2wxeoovG?qZU1oA*48adqBU!wEnj1kMqXZRqvwc?@I9H!yxP!PN{_SFl|*+Q4bj*$LR&f(^M}3z1CdlMhxIjS z-XDpDBK8oU!~leeA0Fmuf8BBI-|@&qrD|vW^Krs7>&3SC`t37KC_9?xDT{=il|4sZ z=`exar|_bbz19EIzz)xnp$%2Oa> z$^RPm=&bKytz(0#D7`4}EH#i4@_V>(+N}*s(HtyMIZSw0HoiDEF<2a~TB|WiqRn9$ zOvQAyU9I2mAf&F|>kpKT%gi8*&meR;?#nO8M3yIBF8-u=P@Xp|Uau#ahqwQkdD;~- z)7BXptYC9>6{bS1*?%Yp_ge%VIa^MZ_j?3=c{~y!i_78SFZ`-kw6_FfjEirG-c2)ZT$dRTB&4X`_?HL?vkZu`3_Lak%F|~7{aWgGN% zKD+LqNG@hsvJO@46%HW2e%Px=E4*MOX>d5+-(E9-Ao$3Ds^pofuBINQT@YCOYG3$FPSz{S_OUqgQIjr|o(~utqvM8snpL3qeq8%km>y;H(ttn8 zD4pX*8yKqIaqPED#7al`3mHEc8Y0BrpXlb@+8CxvAP^8R*4YPsO3}VB?_!8yvv14r zCZZ>=m3K@wmdW3@o~aeW7rV-HM`Z*A43%0eE9mo8XBGwn!|=Eo>dV+ahiNLdrnWd5 z`>@LiV>4TtLma_xBg>_`Bh%UbpKgsCzv=p_{y*4d;+Ss7J*io*0M4JEpRoqMPj$1# zl8WS{Q$!a99fKd)ZZ~>5Jcfw(&*EsM3)f~bDN=@-jYRY zZG&b>YvEVjNizQ)e)@&Ya!=@!)H(QoJI0P09CiFL2~XeQRv3}rjBE1GnK4Ck@80t4 zXXVse>hF#jB|WF2T;Kp912)Ad_0y>+$SoWHSq~weC^cBj23c3zoI!aww}2TZ6?nMu z&VD!*HcITbyC+lydeadrkbjW_J#t`Yv^{Pyl(>%#0JritG@2DzOHStFg8UoneVyNe zi+@4&{oNm1YNca8z*=?W4lZE+cvf(qhmF!DyUsVchHx3Bi`v;;BIN$4l=J#-vcNC5!^fKI6P<5M*4izfd?pxRH z1irQ4)P7qZ3qMj;7B-JLvSR@>F>8-}MMI9!3j0Js6M(#AD^;50T^YjKOB}6ryeED+Ul>^Q-pd*+F(raMi)RnSg9IP~^;{Hk) z!rf>$-P7zPsL3l$BB5q-D%#BwgFZiGpkKQ6v8?AQNw|tb0;l2&NkojZTlFLuMP z6HZ~QuI@`C`-f7V-j^BG7boe6oQoI9F(c9*_N!+dB*f{6m}tfY71f?(&yif=$YI9H zvVi-UrCAuYe6YIum*bFlaJeW@c=;#J96Hm&xg9f4=^|#9a1UO&3h`M+awKL4Kp08w zLj`p%ipdIZS=B;)twgxU!Q_l9$VWsprA z@|)rJaC6PP;?`%v{q^qL=7w~I(uC=ra?h9AMnd6u<6e48W81kF@7W7T<;&Q-BXaMS7+NprLNM z)CP|n4(-k^!EzhpWWhWx3sT#AlFY8xw3)>+r$Fy6`)T(!WjsJJz18DjBCoX6DO0FI z`BRagqi_U+_2|ozI?F;7H!w${E3ES+6`)mIUyHA-jAGCy4im|eb8c@>S06rqAK*`U zeC&-MpKtmt$h%Lfd#POnWvI}hG3(p)w!I(;qiQ-a5vIFamXfWN8Ci$)qrGTGhp5fL z!T?KRarH#d-bx$o=IW>qH_6R{Apy|5sB9#<5cBX(J${`n)g;Wfa#{C+Nv^Lph6mq< zu66xdnc!U%Fc9dD|Gb{#bb4$H+u%5w;y2r`7f>(LeqpW0{;nHYUuPXQNvTakW=+hr z(>RNb7B}a#jM9R}fen8Cq_E{r1n&Ld>&^U|!yg0~)!|c}Iqi#l3*lZ~BemHs(uzWI zs&A5MHwSsal>E!RrQ+rkF`dZ ztVb&glT|qf-%z@V(=~Q8MwWFoZ45Tyx=K<~Qs>*F!@`vMjX^9|SNoTbKTDcQ^rosO z{ig_AT{tQP%azi07&Q}XMEaX&SYuE@;xBwJ-|g2nTHZi;@K9~p@X`ItXC)74-4C=0o&@janhl6_!eOr zLxFI&g{*vZH^8QVmFp@3r)2}q7eBA^A3Sw7+eMRM?sRVp#ww1{Fx)O$=Abf*>3C{- zTAgsw0K+z4*lA>=EX6+J*3Vw>$ zJ8caxY=HSXu3GZyl}^NH4ns3mu7@L7J+fw2fR2dFMld(>k5YkYE64pZ6Oy@5^OBSM zP^M_Y5?yKDa^V{XbM2%^AO<=r=Cs3jDSAhMdSCA|8(y;Z{1O+V+ySLz-o^GPFXvsb zS;wQ-Zv!noN%Hed!qb!EBby}qc@jc$J+&fpzMl++78bl16~v(cV)0p*vn5?zy65KcyfBg>L<+GhEnC zw3la&G)+o(+Gv+oTt4_*4?JO5VG`SF^qZLpbB3QhbtjkgzHXCONc42H5WAHf4r^+0 zZZ#|yrHogly+Z~S!Ow50#zm{WGs-ZLxXH+2Puv8i+oRpN+^i87Jo3owwET3DeI6q& zG~vmHw}v9a5$FfJwo2fkUjs^pRQR>%l}ekN1Bmn`oPk*rUy5YnHss+!tVge;jnV_Z zD=+x3tFQVXAd`_(p;Hk}An0IBRG#^|KQXndG}(cS@2AHB9Y)X3Fh6|Pv1@?Vo_&aR zQC;EA+`UeKP@NrXg^PwIx8GV>IWteFW_GTtyy-5V&6+E-kjd*msW?pJ`%I#XR*pj> zDJS1ko)Ro-HSCFYG@?nUxnLF0FE8RH(9Jfq?~?&@a>AF zZqeN9`zePMDr>6Om6GMe?BF4T_fFgy>7rN6{ouW?EAe%jIoR$Fu`lKW6=+u>F7;Kd zzce1aTzi@QZflxK@5yOq?m~(*CNTd&IV5qFJF@d!!~gGSVKuq22fKl8W#i*E19j}8 zgfsJMW#t^|{Mhs+P9~qm@e~pp?j0SsJ`Lv{4LAo}okCit4mx3k!FN|1g)JJP{7#ty zglGjC#WI)Eex}5;r%J^C5VY^9<}bfHxxrh+#r*^m&ySmO{t|HpS1et^x&BRYQsfkqETSZ*Y z6tLTUf1O1?G^F#{eZ77I+=^AhTQ-a))9j)9B)h4dPVLF`Syt2d!&gROz}BJ@yQlc} zyK>-n?R0T6Y%}_d#Nv9d_OyJL{$@k}_hJ?~F=2de1%}P;mq-!Gt^on>vC?OSVxd>@ z45{MzDg(K|<<%Bnd6{NtFT{M_mVoo)i($=Doa>d+EzJe}#bd+S*s$m$WciHyBMX<% zi!=L)pE=FdAfZ6VYWS)YeDXs;~!C4cIpO~bxc1>Y$gE1pbiSPhLJ&qeyZ^Nz;% z*;YyIbJ*m*i+5^|l5LDJ|JK*u2c}r)1$~Nd^5wyoL;WKm5}0M{p_~D2vEL_j>dqM) z>Piz4TLIPdl-795am;UhRX7zgPo%b5{5&GcM+>3f7#K8_AAEdQ<~hHNVlHlH-{Szk zFKK8PXqGO{r&wsa{Jrp1Z@4MMd>I)`G`-k%K_P=85K8;v55E{9JGvXo%C5KMZPS~m zXb2IgUzc?5wNJF4nmov>#J_TPDca=UQ44pH#gs#~oJh=mqpz5I`vnW(=3Qjv+*+H_ zSs*Pb%RV`r6bXo62s(8j;uK}%H8&A8Zg~M{G~`)f z+PXp3fVqn+-KnD(v4mP7&cLVA^7)sNFX!)aps?Lw^UIzf=YX~*tJ zJtfCCvD@;bO7)2S<*2*!d|9-i^33g~(+qJLBOst8QAu+NdJ|gg)_hbZ?4#~UJ9=^W zjlT9TPo|}P?e(KZ9LD(~H*@f0fx>5=XnFyGMm?g|Hm#h&pI}jh8@fVZq)i8rO(tf8 zBQfcw=@~Cl+cG`3X2L%y@nhe4iQ9#{(vuP&DqsBuNh}eOvZb{1^W|gwsCr#MK_^No zorA)_NXb_OY$+W65(p-IaE#)GW_H=PfIbg?u#J~Jh`UkFXW zC4a`GS{uyAh%sS z7h{&ho3-Huw+DV8L#UrUsKd*l*+UWh4Su%;5(HCfB{Oz$|IGzZU)C>R?@4=Iw=D^T z8pat-d1c8T&rg0ZWO*ZtPO9Ucak|h}u!V{x?gZQ8^r^+uO-aD!`FCG z_Ik(YDMGA$iOH8<)@wHph`3S#bXi`nW;9MzKoNv&EV;GkzTqXZ{5VoWdte`|zO`Ve zK~;wG!A9l0%t((uy21B)t~Y{3TG85YmV+qdh~LErQIVx)A%exC&};?B26Aw2XR!{$g`D~I)w!?PtCL?-7YYZ!K2p zInx~(npCzzmPA$gt#~Wa-R--a#4}bdVz6+#)5Dx0@2&Jt^)Xu#E?ZsZ^gI`njeUNT zzL-p#>!8ncp6Nx;{%W+#4*xV-#zM*eFt~dDYs0_PB zzL7v9;Vgd3Ey9);g|*n=Oms7-b=>0nv!@e8KPFfWEMqE-OEBKtz6O@;H;@4==L~91>f0c zE|B~&)t-R?{2tpNvpHZcb23)+=sqj$V>QW3L}Uvo*g;brUg%ENq6Zu%p(#+vqmQvS zv-kuMD)jV)^{mD>s^=d-r@pla!2d6@-U2GBFYFoz6cIs6LRvt&Ly$&Vy1ToP7`hbc zZjc6t?uKCi3F+=3M!LJCzpMV<|M&gZd)H#kTC;|8?mhS1bDwAL{p{mv`?<-FN438P z*M3=1F$>4fsB0ob|5*&lm~!^C-@VL`k6lmwrA2Bv{C12V)RR(qp<7(w^iRG zcxo#pCX=Y%njtCXwf?ZGo~EeDx)4`1L1L#OA=FmSd_JEjah6VG<4NVPt%U}u47y>? z0C$eEw~F>VE-*Wg;)li1Ju({giC3 zJUSFOrkR2kXwZ<&fv(bdN$dH~@DFUZE}yYCy1Fxi^ocPL@Iy( zLbtZx*j=tZc$VRBlu6`@m&)-X$} zNui$TvyBwPzT@9X$ zp4rqB$*V41wP^u0-oeIII-hl7ch&qBW*6!Ao8`dcb&t2C_7VKz`f9*UVN6_$rRYRi zP~(HVv{qQ1T(V86J0axGYfS%+MCy*tNW?dXeW3o~IVk9%$?F|E?B+fA3;63+k#6fp zZNc5W$1?#=f9@hU)m1$oZR_fp{r+Mte&uLuZKbKN7uhmqD8p=hBAKaRb%uy?v%;jgru-+85VztFfC%QNx3kUK z^_cTAVdq#|FRmj5N2=Cp-g`w2dT=|^-LEFz&DOc8A1wEJ4l%bP78G8$GdHv8pR~c3 zz=7gvfah_dw4I-Wy(XCg!8+qM&2XAT`pUOdwKp3~W>{fF!9&TR)5@zjXMY+xDC{&hn~sET?;W{X)9!o=O>mb))p+EweMgN6K3X8 zmfl1$y_6`r%L6(a**Q54+g$*CV}~gZlEX;%>BN%(fo%{TP;44&hT7b&&yz;=J|^;VqNvBNtIR{HJ@dLif*JzQ&>N9aaFc5}WA#?$VF}Z%d@O+%uGXeW26s=P15x6-3MS@p#{& z9*wYABE^d)-+i8Q(+dd~It<%dr)_+2JO8N)%B7_~-Yw*berUM(-rCtnU$g(dBCBZT z5L2yGDZ~oJ{O%&y!*!d>fscmMLS2kp+nm`yWeGO#P1vV2*|>ZW>Z)3z8FlMC=)vA)2wLm- zxasbvSTWbeKU(ZSvUKyyLbWpbAe{%q#>tHn$3Z1XeQJFS)z!@Y+0P)9T{dPi5%BXl zNFDoN+cYD#Sa$cZ)*bF7zvxKPkqu!&Le<4>%z6Ih)m6!j3!?%_{h?rK0|Ol>0yd)~ zWox@sI%AKg+gJ}eDu4fpO;0XO+r3>F=`{r^qe#H$EvCVW^A!}b)qJs@%(3V=Bg4;6 ztdL*rS~g)WBJ8f~q%hOA{&H_5l4LS1)F7)}rC7TQofIutL~rGIMG#hVu$x8bXWEdp zEG+prk#)LCs@js9`LtL{A4MsVZmlwN=m1gvUg*^>pHZnMmfa#>^v?N1O8a4Y|M}E5 zS3zL<%hNA;6-HH^DqSt=kH+n&%gR~jmnSD;F)>@Ct{O+&b!zO)%tH-DV%D0UN^|?z z-xxi^eq5cHxoCf=?Q8eF3^CU#Ztz><-8hnZ%$zUFb?6oCc)sUKmU=o^X&vEyeAkbd z(j`2nVb|s}&7%-*`=FZaT*3ns>)`SEwp+CF7e;EmvphVxbtHT_z0c+|o+9`ay*S~^ z!tZDI9D1*+u7wvQKc`#H4vZ;yvL{PUfe?`QF2ZV?iK|S`K0x>QCOFQZ49bEy>@EU>n4;joE|=catQ%xKFTIwPSi zgIS5dHNK>|xcfAEz>?n$=EvthdGe&^^rvAID4W;4*Im})wT)Ch`lCgE&@$+i!cvU1 zimZ-5dqGmf;@h(hm;RJ1M>@Do&Lvz-wcxFrmfPa&*+}$wLdxzn=|h71>`ikv8aB9_y`ew3+7EhK)3ti&M5wX8XX6303&MZ{{0e3l#T;pAe?&Np5N#3Jm`yccM zgo#tig$+IB&L&#<4!5496pm!;!bJOuahBhPg)Q68u71cz8P0%E{h2J*iR9TXrH!PN zDm{j%#R5x}>8kr{`tXDIlQwRRt#YlBgu82NV%(oQJeZHv>EzNoG{Wj>FQQ}LwF9W&nL zF5osi$}4(j{JHmNC;b5oli1ex(|vZzG_qeMY1eaNck+3tlern9g#OCDxw(VsEzg6) zEiz|D!_WI(jRd^4E`*<81vC>Mg`k5x|W%2H_ z0bz35-r6_93y zg_ zsnLNBxjnSH7-m9+!&^knj;8H*CLBTo=abzi(*^@ZiI)T(W;0WqXb4N~!8)0+S!nCo z6;{6H=e#0D1naBWohj3j*T}Zauf9LasxRsTFH%yPe5JDV13gTo$-_~!)r)7rQiU~= z+0`ahq?8&~`M$dxU7>xh?G`nno)K+S?ejNi%9AJPZlaoVvZqy1ckNhbhf2K|Nc{*IU9)(yWy-7@mY_V$_ueVl+2V#7Ya(roT1w z^~@-7L7SR8^Sa06tJB3B_$jCH_0obLsbdpu=9`aZ;ZJ=u*biru{5M)i^L%8O+|R}= zw1Z~EyQ?NXX5|Haz^q&9%BHpWCe%MPqu`f5;v_DR(&T=EG5W#xyo^k{;fchHk=YM% z=h`n9XlJQv_vJN~OCJe*OJQNy?3@&_iMs;FgM3#bqyj#7>KPo_KPelE=avgCU05xj zl1PvS#MQdN@+$Jcms+9pN8_Jzq`ELGvklsv&JOQGu*c_pcWc1D^F&$oyHll_)7NX5 zA4LblyV{BBovvGkEDwP7ZFlv}=|#=5^X|%5jCY}`dULmqU=6CU&@GiL@wd%MjkJ<# zZ8E%v=a3lc_>N#@sSw7gjkldl3+&B+=Zkc{N^;4v$@OR(>`+j%!jH?;ps?Pln;qnv z%uJ>!*cD*ES?OJ4q%i9+_|)dqir;l(i^XeUw1!kfA0@V(!F|tgcZBswok&cuO4M^Q z8p_9g)P-2X z9q84AQcB7pN}^_SdFI0A^XJ{x@I?1S!a2$v`ac)gqLZx{ItO)8{)L#Fe_9WVv{Mca z4b{wCf;i}^)dU4ezj4_W+(pYvodQd}AzrM3!6an&GoiFmWtkHE1%h&oWqua})K3i6 z)9)vv(FG0p8n@Oy#}-XB1+_;GPUScVdo6sXYy~Gss~E215fX-d3a~~-LGkwXCf->Y z&zEv;&KM5~b$#6R8B$@L)~Cj<4p#^auL18uFk_rdbtrrcA$)#WjwYLA^>UGXgBRjivK z>VEebLGr&>vaz--D&nj&cwOzfqp~Jglwbf(ar0!_eZhq0)zjT=wryf*DJ2e+;VUR8 zyx;84@9UGcw6x3xVEVE&JA*$)l?vq=?SA*LaqOc|4nt<0y1&Iit3IT->dEGNzJyBG z1MOQ!!k&Z)u|uKXF~9>&YA%(kymN`lcAO> z(_+Go=uv5wrQzxNA82mUXh<@l3eLlLV+q#Zz{m*vF5>_2N=Ji)-S-8flZY}3 zLeU;Vj+tHj_Xc(7u6hq+xAGL?x~{cmheT$w$ZEjY6Opz~Z=l{SKnbA75P;XipBfkh z1R#d^d&Dv}wg0V#>(D!%_haEgz_#WhIxq=r`SYbn3=>=)#R%pcz4pHL+uP_hC9`kB z2ez1hJWKw1UImC=ZVnSaMLbpeMe*0e10kqyd>s2jfIz2<>c0+@{u#O;ApH9epvskaqYs9b@{q4Cbb58Qa8mWUvZPkqs&qD%X?boB+1G0s?dW;m#5cbr zVUnBnu(K-@r$j|ZcLjk!PEKijAV7r6lQ6FcsJIeEhN>%E1AipR9g%v+F7zk=mF1j3MPuewd%0z8K3D z)0$GAMO+V-0f$FKOdgnw9NDoK`VP@L#*ABW^&!;+Fug$oK8#A3wyBe3!laAUIM9J& zE+!@>85z52)N!IPOKVvGmp(mh_^up0ngLmZP;-WEPn8_8_ArJ?Ct=x6S`19NZE%Gj z>+dxRN6R!YY_R*7k)tRZIC{nN`Eu7g?rz!G-_Ww^e&m9oKS}cZ`EKCYF6+$87Hfzb6<}v^Je@BU6N_wy zs4apIeEj&TJw|K~Kuof-gYj-To#FfGDXV_VE(QK6o8WSB!nS*O%H*R|cd@Bo)}!jJ zg@U-Nc~@{^OV{SR^5fI}Z=hSTyIb{lE8X1!cdCaIO9D^8?myK}G_y1^Hn&vyF2^e* z_S$W^ha5MzqN`)ve6McPG-@F$Y;)a%45ELhlu_vDdjGq*EnEB%!}eS8$Zvy-T~Mek zGc2aafqvCfeJtYpC~*pHUd>D0Ucn}#&VD6Y!3T?(X+k)NW00H_eds+9Kb3M}_m^;4 zJk<~sAg#}S*H58UA&0T`&mtGyq$m2oC#3NtOsMv@aeB`lDL7^Fo|}GkKZ`(p>w-~M zyp=)chtpsR6AdM$0@Ek9X)Y@jQ43%8>XChB`^@i~TC;?yP8wEJCZRyJVP6e5jB_8I z>TMTo_J0qSh#$7}zV7uUU-kCW@!po`t@uYR_kycLZ6x~(%9>YbZ~bbKzS2M?wGwbR zTsnTsyqb-1+_B60!7i}YB;0`DA0YBPr|6gLgd)EMe{CNU4LWB8lTjyIE%l4SaP$a; zaX&wo$8d?_Z!PfPyL#^G{whB1Vnr15*G>TQy)-LYA1K+bo?1|JYhqGQPfUAPnb*Hn zAr^vhe{(U}79l`Ek!#rQN6P2gC$FD^$%*l2Z7h;`t~=iBvbBI(a*i2_nz)WfF&Irl zzSH&g-KwJ~y>f{6<=tIoxENiyn|@*RGUV{K*@fWgGnPefSuPVf)g{N-%$E@@t%7WS zj^jc>*07?JBIPgX-uO&9bw)qpsdy;Qgb*7E{O%Q-R>!VPeJ1X1_{P;-Xyc?!Oih8M zu%W z-S+W15qa&9Y^nNwY^QMLD2T(`{mAXC{RT<9?}#bYa)@>Rz6-1i=P+q_ZAn34CjlSt z1(waH$uk(!twiS}T;D%P5H?6})=Er-`?Odq-*Y3}PPe1rBKGV7Sx&ihZZ z;f%lx%_4txYMrkhkdu@Dy;57)bK>vwE4?0(-glP%z`BTtNq4TV&l-5$^yii_9GjF3JX zC0cGU5&a$hSyj|OQ^)@Y>#gvd;!;~p@v>iA>Um#f${tLNV3ly8L2N7XNG&K7m;Gvn z$o^I+qj=8H0(yzW~rU-3NmgTJ|1O>(z%z;dKSYG#QK>N1N*)ViAI}b zwT(U8Yy~}ye|JuJgy+A1#o4Ixl-vHVAr87V*EqL#|0zkVC}L*O6c+<)S~aue^q8TA zPfL5@WPU{*esrs7dJx}+%vr}^Zb_B=+VA1^h-VoiEHSBgrrxo6wUOnugL3`vh5H$h z)ICY;B^g^IQPf1+(8y`oQp4VXDoN4a$J=pc_ZGI8s z?k9gzT>FgEi<{Uv46zc=C@Uh6t$iyE2>!E}GDW!jcsTDG^jp)`;?bds3ZSA&kFq}M zGW~Y*D^G+(SRPJa(lgVR%%4Q?!dVW~<(-T!hRmXADM8N1=OD}*A70Cc*?RQL{O9_& zebztosC`Ra{2%$Gew>LfhSQ(1Kr7jNSFX@36zrB@U1QP_;Kc1U$HZ?9zDu0z_S1>Y zDftZYy1(x`ce-#!4(`0JJ;j)}qg*!CXrS=s>+bSo!x793-rUc+R8;-Um(D~k^_1tc zA>cbCf~ymw$Ax+;!#drLRcdJIcs0mH#Y1S1485DTt0f1Y_a%vXL@15#)mozq(N4eS z$ZFy-60Dh4>yH_a5$Np9O`liw~R zBQ^c`4?;pd9@ZxN9PzXa4!?X%&LEYN8S4M_cKVT~VOo>I+}2a$wf3p-lIr)$07Cbt z2o@SJdsrQ+1nDkcK1@a3aH-!O{aR^C25E@S^_NfqCJFIGlIC{VZy_Id?N~-xU$R~kUgGW~nFW&~ zy1|Vc%s3YNRn}Md> zT#lw64Yk^1gO^*sY}2r|``Y>FcGqs!e;h-1o8vSC;hT<)NWqc4P z%9;wd6kn$&@E7>b#x`O1tQWo3=&OiYaA+sqw;R4&G|+%5WeJ5Wv|naZBYbwzyL{^X zj_nVn49@R0CBv4Cg;0Zf>%F42+m^^I!2;F#*6wC$O9}$^N*X*IY{sfLc``Uanc)P! z(Lf0b)QP3iQGblOKe5sz8CgG!HSe{CjwI6<1emrGHbX)9;@?NA=2B`E7QXB#mPSa- z5VO~>B4ba>c)y1Xfz?iQ3D7I3I%~vnwi_ytY%?0&~jXTU+Fo&UY#b?|cuZ(B-AudKY2 zWaZVf*TL9{_=Q=JzAIUSx?x??Jr zO+$5W_8yf5SMzNi3Mzx6_AcFdG?zQSz$*r9U;CN%~3AOqoOP(SsO{j zl3u_7m7ZgOeL19H{)DF+u?dCq__?6ZTX+y2q1uW$!vT)q15*<9pT8 z3Be5{Nk=I($Ys>Q+un!P_?%T098)sk&?Gi=Yn;%&>c~J5Lid$VMGsDvh2#f_U-eNO ziTmS_Z7Y}jeI92v?jdA5mr~(>MTs3m>bXLHpuyytvJq-33z(!Eq+VF42QQEeIhk3x4^VLznNNXZr^Y7I~q?w zaj($xPMF-_mC{We;zz1|@jP{fB6eQXZHRDW_H(mcC&wdJ`bK4~_f>1vMQZW`qcBw+ zvC6pDV8N@pfY2hx=_(2M{@9#aCe|FQZ)_wf;g7lvL}9;nhvi5?Gh^M#>C|ZP2^C)< zM>o*pz%>C0gFm}{*7;%6Q2vO5@J_-zmu7g(AP;NWMZFGP>1}%&^gN1-fZs8}(ZD4o zh-sSex(jzO`|7^=p)x8Af9BFap5_*d)6YETSFd5pa9V}gdX~J`aK>HQvT;;5uPRXE z0stN!#J0w|4ST6zH_>3aUMCiA?LOHd7r)4irT4O=-k0YOTgL;}m;#dJY1G5OBb^j9 z%~`;K6t_51>~%1TFHf#C_|fK*=SbZ)&1;yktp1%1RR4Fsg}lE`ZT)8x@!Dkh`@>s# zwEKr@7ES2ml(i-jK7KpsN9=$Q;vkc|y`Zbf$;rWsm$vqrB?glX7?jDcxgiTtB=-HB zN6$|Si@J>6m4)$Fn<$U*y`$HvzNgXB+=EZ!;yl;|QnfyPs%mU(j3YZ-hU!ASc870% zx=-`M;%L8CZu8u9$1kDSYKKL-b3MxYxU~T_7!}&J78SkmirRg`$Qd$bho4GD`oDQP z0)oUhr4^+tkF4;{HTRs?M``B|Sm~alYR-O@!f*Lw$`-0ZM80V^cDwo`5*pcg#Q=Lp`#!m1KbqHtzum#MgO5GM);u2 z%S8R^-j%p0AcgyLgp&swYb7&NfJkNd|3iy!haY|Dk4bb zQ$q5SC|6BdWFCiQl+XXQtVCj!xWZ}SX9*LM*Uf!rHP^JaUfV+Ier{XIJnAtV!b*D= z`4;IPRK-TXzd0g6T0T~sZ*YB!Qt)ZM1$%Gfnh}O6kkaaRU`Ugeb&qCQ4gqf+*wBzj zxP_MO@(F6C#p0vL57d^IRKP|fJG`bxUsbJl^tLE4h+F@Km4b>vgAc=17k=qY z*wUBb8&pbx!n^zJ_F^ywBPnlz%QCHG+Nb;A?o(yt(S|C{8)!Y=fA+`7zkr&=Y32s#K4u8 z>?_p>YJA7VzS66pe#G8#-e&HO!#`bvv*QN_H2N`=D;wZ)h@u3zXmu6GBa0w(Lv}Of z=6{oh0*WBgLTB;?hmlUkb6qJ)zShnD?@`=coEL6ZyWO!~oG}#+{h#`8w_d)f;aI+3 z3;5rxq7Z%$rQU3h_3?LQgj%JY5KbD$vyItuY%K%?Hh;=NqL)k!nUNo@9UXHuzTTx9 z)fUwyhE~|k#j3c^wHDwRWa-yB_=ozpmxzCtX>ESgPa#AU3_`a~473~U$aO%po!I$Qu3KK&TMJwp75VgD#mzfJ6~t$9Ra@;XZs z87h5aVdqK7uuuhBoIn#-4-1|Bj((tHX!V;?K1-9-D|uVEhDc1jOx!y;9FJFxQB3@8 z>0+oV2^W{0=-f&-gP=K5u=`$8t4k@&GJYB0mHR#|SA5`=rL1wW%~K}%c>e|aqGSii zkY%E{`cdSu2qd}sb$@pq6va`Lmc;0bB&IsaBs$_E(b6jKma9`*gVvTn&myI#tlGA7 z%LRCgi%9TAf#tx+t>^U!fNzV8uPU{>?8k`_J(Nb!Qtd{Si~oOs*9<%3v4XaCT zQPaldlM<^x%%0DL;(1{0t%8B?t4br!cPBH!!BGES3UTz+DKJO7OL^q z76 zt@*Te#96P);Fb3RO%z>>isibBZ@DM*-8=p_o2=N+r8MRdJS#~+yg$1 zTndGxAvDJ12I|#pLq20Gq&$a%+6p*5lp`T&j|KgnQwRL`Ar2{SI8f_D$Iv|DWbZ7a zd7QtovDVHypL64QCi=yg?Q{u8il*!K{$%Os813|?^kf#5O_6s?7NcfFG_u<+tX_5N zP?-E>7mik)KjDYxf7ZJWlDXN_kBjv+5+Xt8EKyQXFBa~4znFgPW>+UdCk4v>1&ty_ zxSP!D>m!oq_`Ma0wE3al3FG;ljfZLeLdqg)-eW03N$X;|>bKS_NX2rS7ww2Moq}Gp zzs}*g*}fZPs!H1DMKsIq!fqZf1qBPmpV5}$;IrtN(VI!AEIi9>v)Zwl=yDz0O&I|z zSng#<*D36IoWKtV+wgQ+hOe)$&Jk&^7A?Nt7CzAc7&;6lkDe!D=K5hb?X9LZMI)2}it7JMk}-ARo-Hi>zckr6Hls2bfSQN@wWmGTU>mAeA`D&agcwz)uL=K)c+UEf{^W^$!_hMCTlQ9u zQTl4naDw4;OQjClx&S9;5?t}J<(NjoN|Q*tZ}v&CkD!O>AEE(Kn=PB^591XeaL`)) zI0LCXRGMCK*3v5zO=wv@{RR@W;V#?G8MpEXCapa=dZffbcJ?;QWsC3H6O8(gUQu$b zMfk(*$u&^XcDbu2)QeuDsCZ7aoMAB{}_;PSNxo+U6-ebz`!aqZ`HJ}7jz$XG7cik@_EtY zhVMpe_@9^ZSY2HN*)Qp8Iw=(c9GBJU%-RRV{HM++l6G->DI{;uv=0sIIVC5?Y%uQf(P5jDt;DBuQ5>xn96h*OA6dwNYf3WD+u50e zx&bY0wU)qI%p?jK)Uy2GOl67!ZC>Cj$2s%Ne`o58pJUYOdG_oB5N|4x*fgID@~rGw zwwy8I-aGND^*utW+|j@){b#M=#@!|-cTct+nyw^`4m!fYo~*mE$YN5`Eh*gKN3N_D z#s?R77!!i9^@$;9qL_)p~CgqDNz|~;conTZ{G_;yj1~@XZ(ni zXZkRY`=k!oxS9lMjgbHo;i3M=_TB!kQpx|t)td>(2!AvHgG=h0aC6S1R@rTXaAU2o z#6IJ-3r(ctw59y(0aHzXC@y6ceUHrdYo}}KnjFUakWWj7-JFkn4kd%x{}EF|v}g!_ z#4MKlM?<%#=w#tdiQ#l2$9qR4#dtsQsg-bdi*H6fS zd$Y=C*I++!MQh+IN{SXiY>+h#Q~^;&&e$Fg^l{a5#!H63I!>38MY%i6?QDg*&J8XihPK7=n@gOI7Tcn8<<^ zje(i_BK5RuunXd*kJf+k4Xohf!fmy6?LXqSyVPFnP5&p;OAYJm>$@XECTk7@#ARKw;q6bSdSOPoW~;}pxI4WPVnhN4Di*A% z`2cg<)@$XvI%3tJ6@O}ff0E@M@&hWAKqTm-DO&UE=*W-`?Ro+%JM5_+fMnt5I9gL? z-N*n7`usOz5`PUM75SX}>ZiAegywq9C(u^Gb1)z4WPygH9n2H()Xo2b8Jdfhak|q- z_NT+lz`6y0$7N6Mxwlf@qm`uhEBaG&s73M}gZ z0$pJ08Zf^5lYg=$v?y5Fz$~zr;}HNB(wo&(V(B=^GIS&|CyJP+ks&p%?XCp`EXak? zi!~SV#Xr5R_mY3Q(7fg?jaB5d%}U`+Dx%^wqgcAnF~nH%us^lHWB<`!4!ggYdf-3| zWHQnZ=#*z4tbxh0%SWue|4IN1NPm*X6gGCIHgBtu3`9magI-5j<)@IK^Y;2uq47sg z$Q*~Pjrs2yM~j{LuOFEPAv1OhP+4_ic6=SWpLs`Qi*ASNLhrIjJa4xS@a}@Sq%shP zzISk{tNv#GlR<{J#7O9WPI7Auo*joU&-h6{rfd87v_c>d2YD?v+WRTg7)|B{oMM)t z(#z@a?*y1Ej$WsBp>SLtLT)Q1fnrsIyM{fPwrI*tFLj3dfPc<`_aet$t2P5Svh8I5C-sj^FTG% zOql;lHhNkB32MrGap>E#wAAm%s(sIKWy7~!Lc~^G*mJZDns0N$&bE+!1UCk)IW2~> zdBLiayOJgRQGCv~hOAhh=q$JfKDDO_f2*n|G73}nHY8|?0F0Ado z*LnM!TXHGPfA%D>CS(Ag*F-Ph0$<-0#?>w$}nT_Ur~fI-ntKvJgf+# zXY+s{S(S;{jCWF?%bgjp3(sQ`%Cv{5Ojt-SI>KwlT_zIZ*<9TeO4aj3w`XMetE;Pd z?zn(rDAeUi6(#r7OLWjM`=H9pd+JG@-na>wZ3f zD|NXLLfh;bB5)ifiCvXL_=4*?`0N%A9B>J#F=lS9rhe##nGvn{md4^_>CEoO5`p!18?h+tK?XSMrpDX z8(ep{HGAC0=M~^Sn`O7thLe)QWt^N=)||nzbC>Fm{Se#x#ZhEg(T~ArAcUXcEu_6X z_Iz#m)%g;ej!rWy?gO*-f zB_h;`jti+YR5rOaf7 z_vx?Av+jo$?VRIb;>&yI{{CIYktKV*B6A-9LtcwAIO+NsdMm_}RmHG##fLPfh*M)~ zx;_bOddbzNx9ZYxeY=d*>?a%25sR2_x+bSvx3zwo*kc&W#+8GRvwmRX;ri$HcK^84 z5wL6urM9GAxD0SfWplq{8X{A3-v;)^?mn8}Es=tI{Pa6&G{u2w)X^c5DWM^6cE7_> zCU8eN?pVh!CLTElvE2)FXTiZ9E&XEf)|azE06WQkj?ZBSIj=;!OolSV#yk{It`a+i z2U_29j0Y5`0~(1q_r{r!WWyXcU*~ZT49(qBxB|1V(_yu*i=OIQPNX!>`*}1~O}D@5 z)u;HFz|%#y8;J`N7st^}bfZyf+%Ocdvuc;=L%Y9}!Dn9I|JrX$(1dq0Y8lA;*j)5Iw`bC#DPLq5q_5bhILRm(vvvxs zx1SZ(`zB<_aj2gdK51}VEYnI`=i0UU8IXZVWLD>4fHObN&7L2mL-Q0$?Yi39Vhs18 zAyV%}`oRjG$q+>0uO#8hka^UL?0Rp1>b~EwciO$)JPpWW8O&2?tm}fhHP4Sd zHw(O(8s1R?-D1R}Rz-b@m(BOdh9L5S&Tp1d&JB9YLYv!9wi(v~8L3pUeCRqsq*RA0 z$}RVBS^?~nUH)FhZC8TBHvAHO**rKyjZU0ee`}SAwJznuH8>{a{b{RBZ?mNUFjXo@ z1ojr|tR09(@jQFlYKi@QL>$tu_gcl=-415Tb!SJ9)L*xpx(INAzfWdWnr^r?gd*n@ z4eCt^qUp3o+>Gw-=IO##%JdcH)s7CB@Yh}GKF>9~gVLEXO`O?(wl3-iLmWEfj(waf zLZVt+tdLW<`Wln+dwS7amY*8VwXI1fJ7%r(0%3C9JF<5Sc4y>gBh<1z_y*Y*uWD~W z5Z3p};v}lzA7dXf2YhvUp=W1jlYYs3HzVoGMpmUZ!pwSalKNX8csg{NXfGIVSwOE? zd>hSTRKN`S(D~HIq+x}%W`RE%(w#-JB^J_@hk5n`PDX}z4lAr{v5sTqdrYJJVc_dAfnrws$V^+7F*BAAnmYV0AR}Rt`r zm)RHMJYVGp5Ynrb=+KCmC{d;yAOcf-7|JV>Wj)}|tsBg>q&3)Z=+LCi0fsK`k@lqypxdvu$znr|lryGC$ zS-t&PG_t$go4TDH>yWA^xGc-ASaN@t%Nk{v??K=MOZt0I=ZqkaGvCy(-~tX8NgfJy zh9nDPl~a-f2LgdH60Qkv?*=BW2lZDhihy{7DN?;D5R3*dWlcV-p^l30PX5ZK1)P~n zYZk3_JsR9!E@LN|ceKB>r!msl=E8j&)6`;lv}DE9uhc2X*9wF-X$Z~TTdv>Qz)$4lkpkj5v*Z37%3wW`of*OK5=-{mQ81#>UdUW z*ne@pxGXQ_VDvE<=Wx0DB>{_d_y1@C7Dff=tHwRANNr*gfWqVMKdRY3V{O+pt&Z`@gY~uQeS&{Ai>7E2%Ct#?wH^^6* zyaiv`2tbaeiG*_t6V0)_0fOtL=7bn3(=L8$!=I@rf2Hm5%gKv?O0iF%*7OBNwf%u*Z_2ynYSs23y>iUg!#4`^ODP&#I_8Bx{fHE959K`o9 z){;bENV9H1z(Ox<-TkzfZ}TCFnCD37#mfk3wVmeHbYm^skeUjIXsv|a?^Y94!uX)XCn1}cGxP@vhsxU1bleh|^|ALk+$r8qwR7Jk z`|EqK>cw>wn_fQNOx9O*FTOO$zd~q^rO5R?D6qHXv6pS-yOHlsFT#9b9nTq2 zB20&+(Zw}h_c@mR-~2|Rv@XGOmt;j4##4D4X^*To<;!$n;Yu|@4|s}D_s~t*59pBj zBpK1XGSzN)iSI{eBcZ>3IBn|yl^=``q4!XFKZy9#o|i`o|-{))~Ov zq|ProV;uTB7r66pTcJHwb+7sbX#53RbET+@o5n`&(0V3h$X+pcpX5BJ2v{vihjW7z!dqfvV@c|dR#)Q#Cq^o71>nC{ z3CzOurwznPE;}cl#op(!>`ZUs?PdEZZMGl><6RNWy^aIq^}tJ>10(Cjt(<=F1O_1@ z0!Xwk7%x4GcHKJg*OXNi1kVi)@Oyuh`#Bx-YguKw&D2~UGgBm==BWfin%)3=T;;S^ zBxudQ!3S{hYjNy*qk{oB74EJ;gX*+pRUp>YPXJL~Zi&X`gAHJzA+YH_JUn-)66kQ{vh^6><~ECJI&YSAs6yF7NBIH5Hk3|t})|g zF-H^Nxr zMXJk{S?&AMld#Ni~4WDPb9p}Bwe&79^KZ;V7f-4sI&8+G*X7A0Mn$B>n zsf`oXBs9x%6M2$nbfORSzbSMOf0unIBQ6J9>hZ)>>&i_C-{1rLI)w9`F6r7CBIJC! z%A1Y0TlPK-Yi>l1P3rUR)x7tUOoQe{hYmCz1>|AK5GjzlGk#hqp9kteYV*m6p+o@d*nN~M@-YstmziVxUwV5m)O>(B+sx+{xH%&p=zpW||Rg#V#{ zuT<9ytzzg=lk)U;QRovJ`n(vHn_*+Cv#LM>vYu`i`P-PI{bJ~+K!}^&RamLww2gf6 zu6*#NZEv^1Qr*g!EOo8Pj!6hC@c;1j7C>=yP22F|8VCs*+}+(JxVyW%OK<`qxLfc9 zcXti$?oO}`?hd=(Ciio{&-;J%*H=t2RkJf^&gmo5SNGL@hCD03H!DcoU~O!E*1pf;Jlw_ z6yMjByE{*j_3s5L0S`*nbF!msS!}<46_Pir7h3UY_viRBmCvSxlYw-a?{nrbyVG4K z#44cbp1!U)j1dB04^qRHErp56q4*+?8Js>g zAO6Ah0GrdD{K&w%yP?ipY!4s&%cGgyl?@|(80fZi7Uf!W;xRgRioEG0JC6`EYsniX z-Yh!4>m4h1!%SsUs3B;%@v=L728DV#QkzU>qbL>#@>Z%G{jw46d32I&k$KpOp|X67>%H%|dgmRB zqr37hVUu=>#TZSOU4Yf+PZ-NmF5;mubxlQKcsRx44yu_qCV`$~iN8+*RrQgXeMYrJ z%Gu?}Gkc@K&0xG86&t2DkO`@q5xtDtzRpp_iUxzVId{yU9U{I}%AV4XrQYf)7YAR*^uSEOU}sy){nE#!)+`7(nJ;L^7ek&v}#UIkUtl6Of>nRc$trM0h zKN3cEoUDz8sHFJdn*4c8IFoo02VUwTXh8ZI9&$IH7u9vL6)wv&WVGRSlB@RTsOrw& zHM~0{M42j|94h_FuWQ{d-1<&ub!ldq<4=W;N7BgdL=JF2pxQTxd2GwOBlG{Bvr5H1 z626gCKirI^LQVFRu~zSq#lTM{<@s79dY+i%eK}^p|0noFJL1jey>2PjpE-;8cpm2w zxN+d7Js)AwsK={K;-d_m9i@8H^tz{mV>@u|JlR&1Lc>Zo+S_C%^3&?jXdp2Bt#o-I zHp`_~tYjgodlLm&Ir3({<@}3RpV#r-d=@Vx$}idFr~3zsWt7GN+_iapo$9aD8s}yo z#gCHFp?}!4cikdd*?7CAb7kgzUUHO*3dKJ&MSL~l8bdLWFe*hx}J zg2T!3;daWt4(7?W6uwO@XTW%u!1uVab)JNfn(!g_AcIe1ddN@WIO@md&!R8l&YDTx z84o+n5^K!e_*)e>LyI@JO5(u0l(6QQYJ=JGTPmZZ#zOY3?f|e+n-@R2TaQb;O zh&2NoSe$66M)@^AB-)B*D9#Z4BeHc-zBg-73q8ZBxtlWH@%6KHa#v4@4g^Yl!4Tt8E>$+e2ZP|R3nNQ zwCSqNSW|97%Qmm>rPFZ)LADST`4ov-CdxgC`J=yC~2 zFooel%uSAT<}_~3H;VsA$I8zTwb4wM2f~jFJ@JXolWssV9*$ZgZN-hm8unS}k^71q z12J`WHO2YfMN0>GiJEWFd>r~+{;SDwB0`$MNuc92%3%vWQJbd8^Gw($yz?V4m8l$i z(m=nh!wv|gaONa$9)6ay+(o|=67;KLv<00=RR$bnL(P&`6}r+=EVN>T;blm2-2}<@ zK#{mWxN*30XA#8GPRqO8! zLl3drm3Bc0Ax~1~8|I(dwfIw+cLv@?C=49FM>vcv%+)*QQ>5?GyNwDN zuPRmA7}JYjUH?~fGDeUVVQ>*aTBKX%;2$*?C=iZ!lHT@aeofkMk1|3b3Khh*f8 zT2I*LMw%&&{YiN>N_N&rD-lGRsjsi^Iv)t3bLuqag4Vhr9EGj%o!#AyjScpGu4nSm zB?j}MEFJcGu=s;L5pR0gM3yD#k|@m$!#DQpDY2{ex$89Isl(qV0`O0T8+M-=_O{yM zw{G=B7d_xoL$l5{va+(A$6<=VBlb(PFrFbrP0V4+xJzXk^r;q*NZP7Ch~+ZUWI!TM zf#$A2(P7o^=^^aIda?3@7y{rs&J-nKH~w0U3hfuNX9!vqA$3#qwNzI`>fcAMQvi_b z`ppPPy+-ZdX0H7*fb0_KBfhcT_G#wcJ|tlEd7mT`5(pzwmSw1gRHVA4d3B}Wm}5X& zTdoxk(J4tiZ0Cw@TIZaS>Q(~xt12-#0Dw+{BQ&&)1e;~6F%`YzW$ZTDpy|i{@=W0syFPj3-(<8)_m`ndGXDW|ZJy`XP}6cgEnQWDbcF<(L8uq7Do?GeMS za8WJMsFF6(%FopjU>y3@vXFN#E^ z)$cleZJnkEj0;tDCfk9-XC4iN8WHz*X9AZb>4BY3&%O#_=vDr{Gfrro#{#@Q$KHok zyJ6ld`ut7L{R_pmjYaCWR3D!k>y7awZe}F9c~KpRJTH3lzkRB*0bgbdp0ddgE?4F1 zi+nSg_tBfa^9JtakmC@$LPxb3gssb2`gx2pN}QB>mkTkZ&n1PQIT&0$yDbg4J-?et z65Jws`=ID}Yra|5LV5i}E0pzq6kk@GikIp()^*KvqwFWpGpH2UDGIOZ# z7JT*6lU;mntqn!rcu&Y(mZ2`)Z;|tQQl6j^a0WFGTxc4;O49udfJiRivlOx{cZut}-pim9w=w z_nHIk{8!54Px^*Nza+2qZW>Me#&Ziiy$WgO_iY+w!E0lS({(}-#{^9|wO5Z&E9CA| z{E7u%2$I_s=%uhi)9-9T(%oKOP2I;-v=oa&lv+>=5w~+d;j*2SITqhLm6Hu%9i4%P zaDlI{%@wmu$e8|bLIOCF6Uhd(`uXRg-m0NtdT=!a4txyOr*cLLh9>C;vD_hx9CAqfvd$Ujxj%-I=1s@!R%T|zG z8E&Ed2R9^WZP`87ddd*O+3@^G@jn=mF7|>C*T%7pW~lNAvb_7W0IRaQQZful{TNSM-N^9XDv1=woswr#580Nz7*TZp z!CRM9WIRpPd}w;F()3OIzQ{_r_5ApIaf({TAvSm`u-S6;(6GVkt(|U6cttsn9VW)$ zM+a+Y_uX6&uN!|BpXX~tJjl#9tq~I=pSQbt(tehn=;c45ni7wSbn+y^cVVxGzQmRe3b_CfCqFf_uU)#5{(b=hoIkcsZ+F_!>22 zdDkM3A z-f62FOIklBY;_v;_n`2r+kq!$EkZJOqhO`Dk6LvxxP^Rh*TxzfS5kjM?1Dna05o%_ z6-yYF_K4dzZbaFQK1x8Dqm><}_QtE>LD&~axHNwYx&%^jBT;<*(g}x=un&thpnJdR zYv<6|s2RBWq@mYd-lVan+gQbSw23dZp(`q`jw#U;Y~PE9B;)8B7zoSy1pw6>uo-xP z?3LwvcHMfPbKMGDcbi8s`zXQn-d*1~W@8Bh7DYs2!I6d(R`l(kV+KL?j!wd2HDL-G zP!I=?-q--jdsl#CTc)+h_{iPfm)pMuuoyzM=>R}h$Vl|(TBAmpc+sD8DTzFbRRWS1SfNSCdm8s2A75P}j0 z3y}Q~$ScS9aS3j5*kqam?x*q2i2`CU3FMI8$WNwX(cwC3vvN^HtXQmI(pT<9=A7_gm65fN*r7ccT~S zCv@@qu(b-1Y++&FVdPhISEdVIe$dN)-qWEiWL3qgq>&YBy#Ja=`}-&39G3)(H*61I zpq5Z&6dV9inru&8JkDlA&ed@>iQ>Dqd#>4spFv*2vZUUNvNjFk*`O+Zy4mrtF}e)~ zK304HVz5Q88MMK#!?YsJtoQxK^*IGtP$HvA*EsC*MF`94M7G&@)6v}r=U0c$UpDJ{ zx0fDW0r5a9>w%7!JB`8mJV+`TJFNh}{$J2>w1f%`g5Um#EU%OySltW2)Y5SdJ-~52 z>+zY>Rr-4=bm(Z7(-$SYe@0kAmC5z%dZ_4DmEkU@iHV4PFpaGTkbAre54 z!;Y}m&tsVGDk!cIuEtEZz^2EwmDYm1x3SxT9t!;Y3_9Dtj564ww!A^p4_UY~AZX6X1_wxcsc3kWK0Cb2MD%_Hs{ zHFDA|cbANy{k=Bgv)iVy#_(V%DCHSYL+oy7977O1v5A-WFCPIY#pIC5Fsni6izsu%irhHDL{W~cTXGs(8$WT!*UM_DyrPs}l}dFgJRxpYTaT?%0~03&&N(mz zq$)I+kB^TTa)`k{Yt)ex<}$!^DYE|v4-Rr-Nk)!|4F2}~$h48QEDu0@wQ@WA*&0Il ziBpNx;Amm6fa!{s8THlDVS36gjV(MQ*VtQZj&ifg$AZUx_g)Deyd|K-4)|^}P}{gw z{*@v7z;0!pIS60WM31Nt6DkD$>h%oD$cq~;h<&KKxchz+nqM&{NidW0d~OucpD-9V zvB_cWNGG7VACI;@=dACm<3fYTDwm($&#AWf+6ttfx_E)FwW>3{GIADVM?bggH5d!9J z6bz2WwyVW{O;eMvN2f>bZ? z#Mp6KbvSuFo_V#BO;tNDoyn91e#Rn?Kz~{eDyhNjMthT#mP+g#d`oGspISQ$TJw-<{oTF^D60vKGxEiiQjsn9 z6g-e8vhFA89|;TGwCc2605m%3w;tUubc6btt|PxJs+&Ca{@@!3?g-R6Z}>Jx|7h>5 z?)ak&n5-1$ooRDWoCk9ltt4TU_8@HzB-*wdhXtf!RFgw=tbK`_HFEC@@B6%taMG{` zJN_uHP^*IB6?~zyG^}@bN(D6a-)hb8f+A8+Ab0$blIMEZcSMv^Ol1+yUJd*zhyb7n zt+nr>kAng@lhd5U)o_%G9nN%(8HMQmsQ&n$iRC}i(hPJ)1lC&^t+*!RaNA2$v^(SW zXCAM`31Km5xAo?XC1MTp7M;ul+~4=3>)fjF1BMa#`n*1feXydlxI7X^-kB0m_t2hG z{O0p~4%x6Tt>R%;JiX;Alkj2@*Ll3%rYJrDm@G>gM>520AjEe*aJL1C{5*OT0wiw< zo?ArgGx%Bvokn53C%>=YtvOw)>a=1s;yt~6ybY@^y8E_L^umM|BIE^7rgd$~>FmCE zUa0)Upks(U_S-?w#<*NYA zV;Ov(-2B6ekg+0CF4-iRm;z*D!G4d+>p1)Y!q4vCyoe{<-HD{F{OEYwHM=yOCPNL5 z9yVE|&f24>nKss|I-kNC!hOhYgfDHD_@!Xd&bv8Ag}2AWz{Oh3f!@?kJD-lDmv2l* zGNZnnU&3V@3APKqnx8}u2m#`WQY_BqF#vhzTaUD(H^aRc*s>~1w_e{Pp7{v4;r>}c zONFgd+?BS+5>TjC@seOecK7>PTpX(Nt~?FozFm!c@?}B+@D$ktqyw_d2#qT@>2FP9 zJ(TE+T8zw*YH{_F|!NRu5unx86m%b~2TEbk5ylC{02E;sYd19o^n#)aPfe`69(z+9akL-x71Se7 z1i^)qIfBZ=rf*RdfjOypVLE`fSlPho3H?rg!+!er+{_c0qvhY#DiYteroz5Yrc1P{ zO2NxUpd-ook-0zz_1^S$DOTuFB~?h+x%DZ zQd*PavcF=1vdw`wux$1O1Gc>qgI!bBLRjdVId4HVBMujPZ=N&#>-J#(De#aHvZ%jGDJg**93?27o zM&H&WA>~IBb#Kp&SH5hppLBV{Zyn&=f?TW>{nu5ud0{HF1~ul6L{fade$m(GNxRZ8 zbaX(h1$_~^hdMK+6%NY^_R*HqHD-RriUb@pn?}D9KeG})<~vcItZ%y;^XCjFVG$(K zb04!hTxMU&yR!whbbY*!q{6%igv}>p zp?e$f2$LcsdUx=~qCrHP?P9PGGh#^m$K*!J)!tI_%n&phU|K!k6NaCaBP@V}5uG-k zxrQTemR^7iaFOK)WONGjx^L@NY5==t*in{q)Fb?V@JE_umtdSmvcbx)(e=YiQ?>g9 z0V*hfx(ig2y;|GRWzxywoIU1_Gv48LFDax-gGQ5ylQo=7?^z?7kogAakP;+W))X+U z&oo9pH-wOsKAmV2%)!Bo4;hX_*W_dJ{=)R7PAm9xwhN<00zg6oA~CB_q#_jxR?hKZ>20G>lp$PCSRg z(p6|7kN0kkNncJRRtC5$SviJ|WFbc8y@tvBvUgxf8AOv>C<4=IU^M`s;^AI%jk4<20vfW1dN!1sT^SWa|Z7DV+Jh}8Hp zYM}lDy{1$8qJ5>f&ynbem$l;R9DGt6y7AH<>5$L66O;jOiTx-bIS*DeMAUR(OV9ju zoxQiZ{`R?KNUUDocYsG`6ys!|;`dJ9Wg=a5Ns~=NM3l%M!2h&=MK2 zll7@eMvn@hv`s=A>C2=69n?U=oNjxiu(NC!#^FX^(#brXVNtNyE$v^nJwD8npu@3{ zfdb&20khcKlQJqOFCgj3(4xt zR{NsAuzbpTGsZGuHv!VI!WBm105Is@OW}+8`JbO>Y6WZn`*SH2bF>g}^-zyb+YXD* z7gu?j@VF|6q68&i0c#CI>z`%90*n;uc?m?z!TwxH6ZdX7@c!*SF-u=Up03{rx69lQ1H1eB<;NugcZCKk9u?Xq zN?HsVk}>j=XWeFt;~W=Cm(El|Ht`8UB}&JiP99xEOn{)?k$Vm9cU^MD!7zu2Vgo(V zJ_JHQZKe=~S&sU4udvS72`G|%ovN73%mZ}5aQJA0vod-r(n`cgQK|zJ$)iqHCfK*M z`3w~U3qM`ADtD`!GwO$--OF2c{K`0=Ey!uK-SC{M#kM6rHfAjw=k^a z;U*EWv3Iw(3;H`RYn8KG5k@yL;o;UxRoRQM;vRg&2|O0Ndyh+tMEvDvci%x? zeGzUs`l_k-rpM=jVFH1LBnoTyA1)t@lVB-G6<2utRpujI9GY@buwlB_hL!x0!GeDD z9p7kwb6>AbNj5+MY;Q00PHxi3w{gpP}O-a}3y1J65{p&xag}QO468jfiyVrf-FDKv?!2 zj_1q{Z%CEvTX7nY!-ETqikKeGtJQ$|(bCydsai|-4m>wbs+ymV9AHxk`8KqMOM&lx z#HyEIBOxI{Xm8rUQo$*-s!kIj|3ell)KJmo=EwPCTJr9CQ|@Q>)45{wkRD^UbjS=Q zu~pAZ^}7$psW~ZDYE9e|Jm&USIjOPpW`<-Wc53RrF{-sZtq$R1wo&a6_^p5Bz&>Kr>2a~y{MG9$E! z@ZVTkYJm$DLsz9X&?hbV2$HF03{k}b*!1hyahT~! zHKv6r)(Kvne$u>fTEtkxRQB4_3!l-qyY}V+gABEy8=ciSjFx zxWq1Bm&9J-o`xxtIv8WJg>D2c4g(_wWPMTdgd9INJbIcmdv}9f-3AjJ3(<33MVY=A zxALR|g0kK0tc2uNxkb9pbG2zDHj%lGFI0wbOor43>hY*GzRXbI8@ik=Kt?-<0{VlE zgprgGARJ;16j!uL}lL| zw??RkdotS-HboKXR&5p$q>kea+IXXPHfvvADks!mKA_B0u6s3#^UmBg+ z3BD2&7o){!_00AOt<4h`5n zjZwzdc!ez+F;O8s(MFGPqytwFYmDL(*jUCr*i(b+lHIGx)7Vf?Rj-y9nJlm8i{Akq zKWMgh)P~sX=6G5L>WVeXGwfxvMQ}cp__3Y_0WmJ}*gbozwdt~e68ClO#JLXu%c|GP zOqqy%XBN{%y+F9))(o1`d#58mdcTBiW^?I(vfB zP0)45eF{!>x68*Q)UJIZEmM}#rE%ZHgnbW)RHp;P7g#QJm)fz>y&d-!mhY}LUP_hf zN`cc6WQ+Gf4`yFUCH_Qy`9r#`sIhb(H|}JC6l2_e?K4P2sJ($r@S&Vgk~-B%_cCp( zirIEcuC;X&#dESUo5M0>`q7>=X3YU)dDW4dD!kmw;dPott4ZO6q=^S;sJ@Q;};AVC~D z&63C{S2MC}9uKu^>-fC3DsfugrdV!$&7Ln#1Hz>}f;e7>NbS;kyn&o;t7e~ixT z2A#FlCrVMvIs(A9q;!9j)d*nPCHmvwsTp!WP$sL*4u?#R*RG|Z%M{3S!Qa#4wl?Ex zjxK4v-3WAzc@F1ay1kO<^O(AZFt+&mbe$$AWDWK-{^~=IG2KgwnAf+|=(M#tHddZO zi*NRsg9}Hin-cr-FxPI=O?u!j&r$pIqvc^>VEw;7GSi{#PaaGFV}6@$$An~ za5z{D(jbXhL&L0NY*#4ZD}X&Ne0&F=t``Wp*!UWF zQXFW6Ltez8g;iD=I>}8QyeTK;uE2i}T(a|OAJ^NQ&&BfaPZk=}{Kl%00=u&8dZKNV z)((00xyKn$b0VaiO6<64!vkR9RqXUmq!@LNPEmQ2V?eRwb~+p2QryjdUj~3QyX5zZ z=|Z{M_}M}fHsh21uU>R31^v1+`_2@^7&;-uU=AWgNM7;VFI*835x8jmHNSbML`NF6 z59KC&p6l{1*EX)~-mpzUl^MT<*uXLWnsGDYk?VrDY3CNv^c(lh0&%ElcAWw{KlRlU z7EkfJew+9hYWw+`fJD0Q$}tCqC=+uG6O{@jB$&gV@yC@D^#!5%{*RAXe^5Teo__SE zkU>Uqj&}sfxkEDK#9f|{W>-^?D{zbHM@L- zpq*yBoQVI&ivQ>3C77lc>sTScCK9ap58qYI3D=*z#6FLf^__&~;~#!|=2dD2d32w1 z=YHY>ed792!S$`W?=8t2Ly{Ec%37wvz!8V|cZB~I25Cud%eRNq``sMim<`qh*0?X=~WF)w#KY?22*U` z6|JJg{*|e29kPd^SGTX%2>VXhOeYu5C4hvnzDBo5v5*1uvNtzj)KJIP91%)(No;BHb&nOFcgPd6eIZN3dw{lNM=St~kwGHWZU0%}Q5Xctt(#z%pvvcP{R9*QP9EDK020T| z>_A*b^|s%2YuSYZKgNK!#J!UKU&iP^W>d|oC;!`O;aW~d*nh0&2RE`p_yj3>B}csb zb0(XXM;aL1itw9psbl+SU1q``He`T_R!d6y9bnY~jw1onJ2zU^o-c(7uD>@ofbaMF z2aOhW-Lq~-5W}uk<~Wvg?KINEmd=`tI?J36dFcir=|dDtQV={qLtc@c??9uL{l#-9 z#MZCRuSGAp-MRWQnq#@imM`5#>uo1GJdN={z!P5q>EZMb7I1aizIsiQd_>67`3=4~ z+GjrBQy_3Mu&~s9)a~TO@hsi-?IUPSVP>E_w?N&pL5uIy+p;fi^gouqBQ*|jp?c!K;FO&w5aE0%P~0y~WO`ljqOhiu-8=>zm#J z}w z+82wu(vQUVG!Hi*CqR9*&^?!5$B@Mj1%Uj9+LETey!mmMlhNi|Wc1tiJ9a1lC8gmF zN#M{Gh>HSB1nruW_nj)DAneR9iN&g}sLpXfkWA^PBEnR!1^^&Mec*lKllkBub8X(m zIXZ04#TCfmOB!!diM0uBDY{z)f*zE}*_;-YgJepn8-6=G<}(FdhMaOSngBt~Hok5` zC$M||QJ4|44i}I$Dad%fF&Qk>q%z};<~A-DEeo*|Hz(-g$@zaXJK}TA3WP8q3nTZ^ zVE_tPXI<}vPutNyU3E}_*sZmgmfdQg(qu?EZ+di zkn4&!<$=1EQ;W$bkf<(&>`m~+>!Z=fR)Lah=9>(bjwH3iL+e*N!R4~NirKbz48-8s zdTSMyi;;i4r@{014YCOp%HD3Haj_o>8PyfJm=Eplw`EK+nfw68EWA=ccVD0Dg9mb@ zO=U_!#kf5>NnU5bcN*cu9lqxd2Z#4jn1e+W0D>t^c>?QV!%vhSx!l7;p6;`kRMCkI zQ_@xDHmc_yr@|U!qjEfiIVRkj2U8zv$KNJMcC?hLh8{eakGMyduBLK2j=rd?1lqLcTth0J3**6gxMNCZLh7bP?s$po!60!1?AX7$x?zStVv&g*BGf z+ca1}sJtwjgY5g(2eEbUh9K3wFKQKp5Yd$+&(f>5Fp)q76{S!kr?ijjXjm3uVh_3Z z0Iq9s>H#NoMkUGA-9;_L*UJEBW+|chMQwUoVj+4Ny2o?*lVz+qs31Bf6-<~CmNBX4dl5RDtDU>rM`^6OvQ^Z=N9i>!vJ|M&j`;)6dLA*4x1+oBT zl~DP_a!=Dtr7vUY>zjiR*R>)B3_z5HvGq$^qoPXIfN6S}U9G?mITscE0(B$+dY{*}6S+fE< zU6o`%+w(V+YSTaLcVum#lPvNb+vg#xA0xf)v2A}ensD-lZACY)lvR~Euc*DK67~-l zK3#Ce9R*SeP5J(N2I9bp`r#HY_v@VR*sgjezJ#jP6ah0hAwhpAK#WF+5|(Yepo!CY#x&<>Uk_iGUJ$g$`R%OZGUZ~qw4GL@%>e&LIEW&x}~^?zvQrL*~5LzTX!Au`aMO_Q@ieGzWGCd zPQcrw^D(n`fS+8Kx%}I=pN*CPndX_R3hBaY9WU>qes$`CALr2R9J1G?6fb?d)JADC z`7+OeOsG$uw;!sJP>MhO9yX-qV@C(vK~LVIR9pJri^>G=Unv(P1Xj+?ME`Js(^+uI zaLO!|yLjZ6nSect|tHHA}%*@Pmb#>t){9$j{R8de+XzS^j z5pa0>pQN!{vZtZBPV0hBwpZ~F=F-sI2H%px7eI29p~8oZn49_%{iv1NdR@q`Rtg@|3T*P z2&Hz;0`mWF@(HAE5Dv$mm;X8b7ggndUskQ|iv3(~{qJ4D95zN)&%q=ZVu@FV+dRJH5zIG`Nn?>xgWfZZ5ONTtP&GxqYJ#LtyINgre zV*k9dN8y^lXu-Cc*D>~#%#Q!N zj6b{})oRbGQ6_H2dPHW%vIXG=&;ly?f2)Km3kNGYy+j&rVozk8mRZ)7T++^6_kX{q z)FjVn0YM1U3fd=oPjFalD1euCvs&sNDb;`&dTdO>i8dON%K@G1x zS{OY?eN97MT|+~IhqJAP-6V-JTnCPFsAVB!G(jj;{l*enav*WT`kzc-LbyMSB7Hd7 zjMp6-aeI9~zusd3T8$n}I$8-CN(n$~`XMbV^AQN2O3PRP{juxD_ z9YcYqd+4>5{Eul&27JD)@$jS6n<$@{AwaqMpBfe%3}{dq*g1n%u24JzX#R+2!P#9_ zrvJ6w3)G&gOTw+4LHBq(T(gv5@)bx{Ru8OFHRu!~J-RStrD&mJ`_WSRT#k^Yg}b#MFCn-8L|5wU1p zA8vNA23VTBT+WZS7QRX?N{G-M>8eRJrWX~72^yqMsD=g?TqIFX4VcT)Ghju3VRF!I zZ*V+4F?O=Bpxko+*nBC3G6>jm`up186@y}8TwKW>t*`v3bLg@aKPv^En=MvDwBg{|wv@$`T z)^>x()fQ-_nY~{isxI<(AkT-b*p+-xUtZ}}{7O*{mI?RA^E)2&H9J7Pb*pHunFrIr zN!P1<)|C0kMA-fovvM{i5Z>l!|9Gvov)Kw?>hyq9*BkUO_kma|1JBKUjrkW8IrW=s zZp*iym~k&6k}n<(Lgkug`!$-|eNext!Kj7Ng(nf&gP%L3e^i*`V^N~D2MF-p-3EJ` zjmt=02au5>21Ce&8KMhi(WUf^ljk{4^h$S!^MGP(RrO|?`lT%Oc;EoxhCdCPoD@5u z-u804Qtp{Sr#xLrVq_At_|c46eO+dlW@m?&qk;TMGD)w!fsF#k%Z*!z`Ns^rR^M0RKA_*bZK|KX1zf}83GL0qitmm++!i+H8>hp% zWIg?kT?7@fKgj4VH|VM!5-FynGq zekQr{Fyrz7h>TEFlM|n8)X+-GbDHta5+PJ=xv7lJW5D)Ru5C|s>#_}R)w`+{tC}0i zFte#!s;fJ0=iGjdo4epDWgW;XhD3LXt7$En!=L*azWy+k_%-BID97T17!3K6#t+&a zopqN&n3(?D3RV5arQQwTmT+6P8D%>0A#?%TDqV`OtaU%Ka5{cgLK|~-*R#5~!COu% zEdyB0t~PnRhGU${ykJFpp<5C>NOp{l=y-~gWk0b3Bl33{ZMyn}5@FR;i}qV!Gz2pM zgo_IK>MP7bvXv{$Ra^W%mTgH`?KjktQ+4E!BV{AXUh_FiSfru#16Ji$>d)6#w&p}o zY_N1d<=bd1uT%nwt#&3<73xWaJ3Rt3Q1y*t?oydkx%k2(St0B9JmidA#RcE{cBHreY2 z4M(661usLao!30!h$T<}1D&Lr7J9#tzd@8;W*3%T5Ucpx0!W&^o_=i-XBkk&a7eg4LNrOq=92|eb*2G1DrLA-pD$6O=<0wPf6qU|z_0yPr zA4oX+fo7obz9CM^z3S}Y_^S7UZ=x)6RPbRb!W0W_!;n*@cyjm#5i^4?WL=cD@!3$9 zDsqU03~^SuE0%Q67^0wcaC!invrA%2@lUP7R6c%4fI?h+2vbMBST z@a2)0c@l36Kqe48g2@wvJo_#lDCPJHv>dMtX|MX7WtASF56Kwe|6-N@dcs=PXtkIO z(xf7YjnDwo)_?fOr_d@Uo4w&7;Z}i}=)i5Y`Ial+vI(t(OrldgUqj0?JHLkAa-e@x zy3#ds{i0l{-d1S%4W$AI7?+)v*pKS~-&fKk!*WRp2kEN)W04fGtqJBA?NOT&r$sQ*F0@8Qx%>B{J* zqdev*bm156FZW^+llN66wtYnf;zQt*)#BvrtZHr@fdb*IbhV4d%nS-^hTOP66{_>E zB`O6o-~UtBS4TzlMQwv9C{ju{NHqIAPhQbP>godOOpAUSk53^_={ zJL>OU>wEwBHg~OAi@EonGxwak&vSM>yFhTrp-oi14H2gyynUzo0_%JJq&qlK61^kh z^rKq7S!S67OkN3*vsxtmsryBU!(iDoDQ06gabF~rZ0NP%cb7t&LV@$M_1Mf8^IR4- zx@}q_4D3X6MXq*VfLJ#5<|4w02~L%DNBS`^qOxf{9eij;A}R({5b5ly(ve(B2~ zX(FXl5WT}$;oNt%o6x!E)6$%rw*j>7Q-Fvk`;#>@m%_xLP11A`x&6y~sIvNr)Ga3pOQf2mtZCzVi6OLKr zKiujbpiL*>&s~@(4!WrKv{mP81Oh8LX->C>cQ;3#Xgn=_`Qxhm^dF11kfZd0!2} z7#R|3=gDp1HHa1n^?!#d0<=u6bdaid=S#OQnCUM?kV*fyL!5JKGOwdRCHVbIqRj`c z7BiJvz*sF2{<;7N(rW(LNly%y1VO!3k$nUi+XQ|5-?{}KJl6a$% zG0_#;YHPbK($X-lQuWR57L(WJ@HaS_V#}^AX9E#3TCDJxVrit1a#?G|b^3;*XkeqQ zjB)%_DX3>XJi9!mL2)V25Qv3DL?(mLe8Wz%&$M_^Pj6P=ig7-0^=DN^Xv>MLydPt| z=ob}3gG=Lcwu8I8mD@n}O><)P;s~H-+>@roeJu6z{M@{9RYBf3#Lz^hVKb#9Q)$tRJT?X5?bw)H+zcR5NU zw4=lNnaJ&&GpH?1sT)tE?LE!E_1P9DplZGkXs0VQJhP4Z2Z!kk6z5kP=F`KyR;TS{ zD*HZL5@7*a6AZUWnYDry#|#%5xhl*N!J_A@H`f(G<+s}hRhP@*(%CjzEUCiH;wVpgBk|HHTQ>9>Zuyjhi-Wv`K{4|FvOp%+N6f57D=wnWAj9l|w z7Y5a#dCbHsBfBK|nRj!ZB1*F)^pa$Hj4~EHHI%ajsZ1p$he->b{Ter4nZPcG2&+N8 z!dkjlCi%yhIMR**e-pV+4e0+`x5krFLARYBuOXOGzF6Hfwt{ma(4MP{b0ol-rlG`A zNM6l}yUQAnPR4eDGi7}=A!g9At9;^H!a!wi^szFI$AUvNReGhgraKMXlf~@rjrz9} zK`5;VZ*ir?6C_ZMnKPLT+hRn(qEgp#I?xdXc&+>C$A9=&2B4YA+XT=RYA9702h|R9 z9*JT29ZrP}-l|w?uhf7T$G_e~oH6d(iv@kpC+hdXDFI!umm}r2WD3Kh1%$EKCQt{D z94&EtiphMCMGC{TL|$oi_maNKa>0T3fF~+AcM6KNVR$4CA->;}aR340V(p+?lLGhE z(&2wqZ7J>JtYF5joE{Jk8{cEKTPB~Wiv*~g)u`6JD&iJPqL zqsWM8Q{%h;<8jII zevK4mt5|h8I+V8%z4>b%ktI*0vEYclsJe7$I{+X=3M5mcZ zOz6#c1jsP+3VN*U%r3ub&AEG8S7E%;*m+$1LliUMigDc{l;D5kd3;mZ zYoeJiUqODqI+e&%~PegPYz>XHhQLOZf6Dq@(@G+T*7H`}hSTCT5Thr(J;}m-UjFa^snF)%T*tUFD+QB9T}<}cP6D^!awri+EwcX zX8HL>^pT)R?Q^NsnfFO!GVZ@b2-@@e$D}IrT{-USHjE5JVxGynk`F-czemw@6|Fp* z1FPf+``)~vrxW?&E40h#v*wxm78lLkv(nKvnHDzmmFChYbx(Gr!TE4~VY&)bRq;Zr z^`GX5L1D8SY#^^TksNL8W=O#nSLWnLu|m-PvHw7NgZc$R#aLv@n(%Ggi354^3MBPJVlUXxR(x9NR+W)FeQTh-{#DXZ5`DC_#n1#- zPvIamE~h0${RkIH&hxAT1Qv&KT*Jxu-9KWxk$K^X$G4t&Jhia^kByA<>rh4J%p5tT zi#l2RU367Ep%0LlT;Pb%)~KQ*%0jM7gZ}}wrMM&M7+)ulP_mpIgvRtamt)mq(gL1N z&Q^qW>7zZa?Y-rD=RPxXiXl6U#I`gNH4?U4M6OynmDd*jRApr6gA$VTQxeM287;4BQW zi&5o=1m87lBmIIC@-A;0uTv?#3ru_Nq(#d6xzVD{FEM^zAtW| zAv%1hONBdGMTmdce{RQ1BW1K8$!{qdC7NliHTk0Xs`046s_izyc*SkqGKD@#i^-8} z)|xxWha=5P1c}L~)eDK?bW>nyYa))K?Wr)>Sj;J36+v@}CQ<~?% z3QK z0o9rnBj>&p=sIdIEE&rG#e7|4mKx!XnvX35NVJCGJbg<Vz@zOgo4DD1UqWvQofL3A(G=kaD^;B9KfwZyOY?p$Li73srRp?tm`geV>e@H&*7qusy6k7~cQreG z<<2HENrRRRP}GZoCz>Zf*bW^tiHA7Ok8XsHjR)wowON!K9vG?bVB0;;OtFcp7fYpO zB(dsF2X1rfq$XK<4(w`%Rhw0aE}3)ssG|vza*B-xSn2OV;S9q;o#+0^H(qMijmRox zr!-?ROLeAZ&IW-FuT5*qtpa(a-hUFPBus`+$HI1gXjF(wr)>SmUc5f2oNVHtymK2) z0KM_4SpFK7bnGNR7B+xLSVp)KCKxN0{3f@tj~9amUc*eOaXvrrIOwhmVs!6nJ{=ne z@wR0)65B!EnTx-Vr!NqJdst-Tq4l|1yjSO|D+CO8*e*SvO9#ijoWELFZf@7RV5cWK z%%dFh+SvF$b0e;v)=2p?p47yg1fbO)Zq#xv457Ln@}clv4J6qQ{k!gpHB2k!cCqPoch>^GgDV+P=9)m4f7wBbz zrMW<@*cPon3+h)9DHhAX#zwW0C9zu0fASd1)azvWpW2<6rxt8U(9@_Rrz_>-^u-s) zF&BGTKyobfE7k6VwdUD0QJ-O!|Mgio13)2~?IuZ*i%c;Dh~Hz?_!#hjECp@c$u=7! z#=W;cS%>1{r!+lE*l$2`)Li`^1CsyQyF+Fw!6)92;KO}B^^!mMFYc{x%IY$-(^BZ& zT%#~>O#vAdszPq?`Fec`0cw4Awa2xn;0*%A(9*i!aCgz4R zL*%mF?5WMq$Q^ED$SKfx9y0a%Zj(eD!vSV;({2iTi`UB1+~QJv*`Lkc_R(#$HHAg{ zQ*znMBp849(ACNaz+W`k{c@Gy^!wb#4S;BrrDQjsh4B{RHrwVb=T%HL4R_gXS(k5YP$b*Kf*S}+y68INgTroRy~bXYV1Gg zJ>$KyIj9Z2Z{=Z}Fd^qlu7#5v9|+7;3GBW0I-YX!V<-86FysoDFEj9`nR&bt@t&tW zlLKvPFGs3!{6lyJb)G^TB7OW+7ZGv?{LLYw{N(u%exlrw?Jcs%3-tcS2@6ceq?A66|&bf8jk-4epTjwVS`{1jtF zzD@V47hc!}4IlO~Lrmf*r^-^lMy^XdE?55^3F5GuYfUC$E}M(3K#eowNlW1T5PMI2 z#R>jcI_Hu5uAzF*S}C=B|J(HfJvscWrA{X97HTmKlT1OCEA#96oKWF5LsITN-m_eZ(wOYNpDR^cuI&-lv`AtJ*mjrR0Nj9WG_ z)Y-tOqGR~)#|I)+#;O3d7LKaJ=JjTi5`7OZ41rfhp?x(yoFo|Qe*4-k^qZq#XY2qL1!5wjv$Dl+oA0BO zHWtO25MAarUQNo~k56ev1q?by{&<(6N)^l<)Oqk|$v zsuWsfrQz55EW`xk#@W8kCh=QGLU}{jW-HsxI*Ku$--Q7B;o?AGbGflyQdzGAR{Cve zF%v1}D}<*yQuL1v#6U4y&ENAj7n@{s>hw@}P#LgkW)-cck+w+4$JgFG=RILF;q2fG z*`;U{qg_I}#8Wby4=7#ucIr#Qu16=(vEzt|WxgR+kfwCr;zF@y)0F0`oLRE8EggSv z8QXO+DcZVDPjdV!7w*Q>v%|bBQ;39w`zR+Vu7QH^tLHP!mVM?^ChonmVABdfHQ8?d9pTvp3mU0Lo^P z|BMJ}M)f-DEp-Z9%5{pQHqCw7Ng)gc4M8S)l_>&0!lWfonX-P*nX?yU#G$K=|0Ku9 z96Jay&`rZIVg7_{Ak_*5CykWLX!;==2&XXo=TKyMLz7IL*Z z_K9DoSp(kE5n~GZn0T1RL#q3yrz%!@Pkl0#Mas8Wu;p`JvlK1Hu&}Zw_KiA;d33d+ zCQ?N@ZipQ~fyC0w(2-qDy$lAmk*^!X#)0Mq;|Gbrt;Yv9WoQv&daZRM&r7icgyZp# z!=CMRM4*xt#)SWRzErlu2}^TpQLf0PePZ(qi*&n{DqVEb9X`ikgBDothMr#A$&(gG zV;OZ*!pq!tLiMGmFG5bpulIDs7A%Q>^M>m6bpCv|taGzpbrFP3EK>4eLCXO6?p*0` zY1oP~?Uo{)D*b+&75-`+Dg9qCM`6*YnYkxMo8L?AXs<>|f-cig1e6NFu?VA2`m}wQ zh3&N4x&(pW?Oy!6`_B;{8f4PS83~^U5EmMjNa=%#)Kl@_L|rDyxgXqOTB?`4{X7-R z+7&4keAW)m(Y$i1+-2hOD6yUU;ye((tayNy4I&Q0twh!*niu3g#Lw+<@gnN@I>>kg zw!LRR;yC3LE8AF8XVuhVe3vUzcl$#Dcd)Xc>&nF1VOt{^NSJn=3(R@+a$LIUvNPEy zDm1xTA3<}rfa&C}mkoRSewWRnFXgv7d? zDMOdJcbRO~A{NW`911iTuO@o4e`k%QtzZiic#BDELPRr|<)6JT?iX!!feoA&0u&h~ za4;@&Xy~zz#}A9S8T*~?B^ zlhf1F;oC~CuCBhGd1bMKYBOQtuH}aa>QRJ{WoKm_vMQ;1{0k<*Iuydz-CJhjre$S+ zYiOY8qJ*G*^t-Ff zoNfpSz0}ib1|Jn{&&?SNdF&}iNP2YCb-R=g$#5i?2n=Yq3(!-VzEdFG=n6^@aS4&3*s$ zaIKG!!gVa*spSY0;OUSA|J!F^}Qv?WSf56dwJx~omfb# zSoab3v1G3(-}=MDCm$cdVxj^r+n+2n-JG}+-3N^FUa4YBWA0O0ug>=h`U=x{-8@0s zMNpZ>9&yutI7SZj!zL0gtv{Linq-_Mbh*{?QtHwtDq(q(l!%OsY>`3O^>Z#-AEHnM z+ym*e7BPnK9V%7~IX}0SwPv_Bhe7LarL~KYklv79(v=i_Rsx0aqWpaM-Dv6l62@=& zH=bt)htQU~F5@&u5fsXkjbSQ8K??*6Y%_-34pii4l^;$DqP#@RE+c|=7Ew?F`uF2c z?+}7$5Fzgo#L5Wya}h%R&l&agWo67tlO-qth`KUJNKNK-bG5a#LqkJlWo0F(|NeQY zuBw`lo!#NSH<6$JMo;MGFWc$SVBoXu91%aQ3O!8&14TRNCwTIoTYN?#7j(BqFbmKp zG11WU4G$|6ZBHi~FdTKDVvP=~jg8GhqXQ|AZE`+i zz30CnHPE;K3+kqN2rhL8qm1Q>IX$Y|*z6t7)p^0@@$vCBm(GF_^BOT4b~U-BZJx0C z1R5DjL_2mf&&pA?CnY-MoWgVB@365GAO_BtTRV5aAWN2*EoZ! z^8C+i5difdelt5%q|x)AG;s*dwPGNUU8kCgkFTk@nO{WYzHUtP7Cx!M!pvL}$K^~; zua^O|iFstEy&WH-_xDf(Z)KI%iQ!1>#sDjk?~6ykL`#EhHk3NB-(y$JDcNhC;1U_q06XP<5b?3P8o`TgP89x)Z0irc#5+P&pi_*lKRSY9|6b- zAq8rYadA~VJNK6>UfD|SezHBH(&cj(%7t?u@5cz2efdT{tT?J80X`%a&d$zmZf+u@ zpfY}YO-$TkF`POwG9n&|N-pB-zWXb$tW1sWM({fmO)5P%wd8zjOphA4Gp)`oSC=5E z2`s8US%2#g>F}p%3L-Re;Bhnn}P|gD!hzz;#1;O;Q^X z22XLRPZX?U8h57R=8+SRpEZ1O(STZV?;<-&n1UcxKRK7v8d&Tw0h*@ z`}Klh0?-QVnoipl2zhY6$aIncVE*32^f?am+3lLY9E!*eYSH;<;NfRIHrpa}b4v)r z#$vy5aGlTSPYP}7@Ph+4NiVO?iUVi#t!LVm#$XS-$x_GDmpxa;9D!38UR&AOAw`?V zT1upuM7aB)NYT7dr!kIOXibA%V{Y?_L-FdDZPBz>mhJ8Kqg*L~M)P^vV?-3Qj@Mjq zN9)+*l3OuJSqqK_J^lfW5XZ|Vg**Y%Iqh#LRp!Tf?d5{We2s(C@|=q@E|-ms4QkKP z(O*j>Ga5-m9tC%V3d1Fy4|^3inIH3e?t|nzysl1MUgiMy3(`o^gKlw!0&u64XTnkU zeJ&G?UFoa_+7dOp?8!<9Pi<2=wt}t(a!APRruqUF$IpI(rzW2NATN z@mQyJ?H8DZ$Mb{z0b#k26-mt}2QA5K@N|X~cz~Tt?M)bt%>i$vu3)~eFYJsO6WZQc z__Np4bWY~whcwDCSM3muvAnWCuH%*sz9;XrDvht*ujC{U2kGuVH!jkIKW5lv*0YA5D!*Is&m8!_;xt&?)G zVw|>MUX(^FXB_z8F&Mv_%YdrxMjck}J~mfPC3!jKF*XwD|FGX>%z-PB9Mp8|onWyT zvbUD^Dz50uQu~!<%{KAuq{8!Yw(njhRh83|$Rh0|l|BJ-3E>63wMphrx?-tcZa8& zJ~AAdv#rb>;W%*>fu<)g1q92kYZ2|yq26?sWA!#B?N&7FqDVM>n8yyIY|KZv2i@#9 zB|}n$p6?OQPapO&@l`DgaPl|pgK7QTxrSPOw-@xxai=2G<6}g^ajX<7P#~xX^#_I0 z$*oLNtr)6|2{sve&BXDhJVB&0b~A;x;(Fx?(}W``-(C&|V&5JuyEghhOp65FkK+<| zMZ?qF1+ksX%#4Q4U|*alwfjQb2aDyb}*B2uk zE)Vo24#g(>c$8b`^9vx)r^OE=8i5zni(KSrg;)DUZ3m^EC1&6%`_kag1XxG`#tPa%(L-x!XzcimfVYspq?a1H;N0zEf>^+bWw552FPt0>f9Yl+_ng|woMWju zaPU0pENuVQL~&mwob#HFUYh*w99TZqr)H$*XXQJ&=+`c_Bqt#FvPn75$8>4=vV!R7L9Q61x?CZ->ZrAK!DYWp(Sss(dHPH=O31X=OF%twPyg59GpM%4&abJhzLvYmBM^$?fKPjY{KS z!a|CgbN|0H-pinMPoLa+IQJvVO>(1_NzeSC4uA7Zjq2}#v^s;RuaZWTu`i6{clmQF zFc!+|s^Pg`CG{V8mGDzWMobuIO2pG!*m=J6q(JCDP#gdEt=W6?<_+T$rq6h?$Ouav zaXuA>{vVKK|_;5bgZ=>i?eMFdc-%M%m@bniV4X=UX``WywkjlaT)b DKhEx# literal 0 HcmV?d00001 diff --git a/wp-content/plugins/menu-icons/assets/screenshot-3.png b/wp-content/plugins/menu-icons/assets/screenshot-3.png new file mode 100644 index 0000000000000000000000000000000000000000..0adbd96c6188d177dd2266c7c7ac0d84be2dea89 GIT binary patch literal 27261 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�#OIU&6r?7doE;UI=x#$ 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/menu-icons/assets/screenshot-4.png b/wp-content/plugins/menu-icons/assets/screenshot-4.png new file mode 100644 index 0000000000000000000000000000000000000000..e3baa44f26a2ddf6c9672918dd2f4b300ab9c621 GIT binary patch literal 24161 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

        YPI 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
      • +

        {{ data.pro_text }}

        +
      • + .select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/wp-content/themes/generatepress/inc/customizer/controls/css/slider-customizer.css b/wp-content/themes/generatepress/inc/customizer/controls/css/slider-customizer.css new file mode 100644 index 0000000..427d320 --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/css/slider-customizer.css @@ -0,0 +1,142 @@ +.customize-control-generatepress-range-slider .generatepress-slider { + position: relative; + width: calc(100% - 60px); + height: 6px; + background-color: rgba(0,0,0,.10); + cursor: pointer; + -webkit-transition: background .5s; + -moz-transition: background .5s; + transition: background .5s; +} + +.customize-control-generatepress-range-slider .has-unit .generatepress-slider { + width: calc(100% - 90px); +} + +.customize-control-generatepress-range-slider .gp_range_value.hide-value { + display: none; +} + +.customize-control-generatepress-range-slider .gp_range_value.hide-value + .generatepress-slider { + width: 100%; +} + +.customize-control-generatepress-range-slider .generatepress-slider .ui-slider-handle { + height: 16px; + width: 16px; + background-color: #3498D9; + display: inline-block; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%) translateX(-4px); + transform: translateY(-50%) translateX(-4px); + border-radius: 50%; + cursor: pointer; +} + +.gp-range-title-area { + display: flex; +} + +.gp-range-slider-controls { + margin-left: auto; +} + +.customize-control-generatepress-range-slider .wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.customize-control-generatepress-range-slider .gp_range_value { + font-size: 14px; + padding: 0; + font-weight: 400; + width: 50px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.customize-control-generatepress-range-slider .has-unit .gp_range_value { + width: 80px; +} + +.customize-control-generatepress-range-slider .gp_range_value span.value { + font-size: 12px; + width: calc(100% - 2px); + text-align: center; + min-height: 30px; + background: #FFF; + line-height: 30px; + border: 1px solid #DDD; +} + +.customize-control-generatepress-range-slider .has-unit .gp_range_value span.value { + width: calc(100% - 32px); + display: block; +} + +.customize-control-generatepress-range-slider .gp_range_value .unit { + width: 29px; + text-align: center; + font-size: 12px; + line-height: 30px; + background: #fff; + border: 1px solid #ddd; + margin-left: 1px; +} + +.customize-control-generatepress-range-slider .generatepress-range-slider-reset span { + font-size: 16px; + line-height: 22px; +} + +.customize-control-generatepress-range-slider .gp_range_value input { + font-size: 12px; + padding: 0px; + text-align: center; + min-height: 30px; + height: auto; + border-radius: 0; + border-color: #ddd; +} + +.customize-control-generatepress-range-slider .has-unit .gp_range_value input { + width: calc(100% - 30px); +} + +.customize-control-generatepress-range-slider .gp-range-title-area .dashicons { + cursor: pointer; + font-size: 11px; + width: 20px; + height: 20px; + line-height: 20px; + color: #222; + text-align: center; + position: relative; + top: 2px; +} + +.customize-control-generatepress-range-slider .gp-range-title-area .dashicons:hover { + background: #fafafa; +} + +.customize-control-generatepress-range-slider .gp-range-title-area .dashicons.selected { + background: #fff; + color: #222; +} + +.customize-control-generatepress-range-slider .gp-device-controls > span:first-child:last-child { + display: none; +} + +.customize-control-generatepress-range-slider .sub-description { + margin-top: 10px; +} diff --git a/wp-content/themes/generatepress/inc/customizer/controls/css/typography-customizer.css b/wp-content/themes/generatepress/inc/customizer/controls/css/typography-customizer.css new file mode 100644 index 0000000..c6ed651 --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/css/typography-customizer.css @@ -0,0 +1,47 @@ +.generatepress-font-family { + margin-bottom: 12px; +} + +.generatepress-weight-transform-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.generatepress-font-weight, +.generatepress-font-transform { + width: calc(50% - 5px); +} + +span.select2-container.select2-container--default.select2-container--open li.select2-results__option { + margin:0; +} + +span.select2-container.select2-container--default.select2-container--open{ + z-index:999999; +} + +.select2-selection__rendered li { + margin-bottom: 0; +} + +.select2-container--default .select2-selection--single, +.select2-container--default.select2-container .select2-selection--multiple, +.select2-dropdown, +.select2-container--default .select2-selection--multiple .select2-selection__choice { + border-color: #ddd; + border-radius: 0; +} + +.select2-container--default .select2-results__option[aria-selected=true] { + color: rgba(0,0,0,0.4); +} + +#customize-control-font_heading_1_control, +#customize-control-font_heading_2_control, +#customize-control-font_heading_3_control { + margin-top: 20px; +} diff --git a/wp-content/themes/generatepress/inc/customizer/controls/css/upsell-customizer.css b/wp-content/themes/generatepress/inc/customizer/controls/css/upsell-customizer.css new file mode 100644 index 0000000..b5707d7 --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/css/upsell-customizer.css @@ -0,0 +1,54 @@ +.customize-control-addon:before { + content: ""; + height: 1px; + width: 50px; + background: rgba(0,0,0,.10); + display: block; + margin-bottom: 10px; +} + +.customize-control-addon { + margin-top: 10px; +} + +li#accordion-section-generatepress_upsell_section { + border-top: 1px solid #D54E21; + border-bottom: 1px solid #D54E21; +} +.generate-upsell-accordion-section a { + background: #FFF; + display: block; + padding: 10px 10px 11px 14px; + line-height: 21px; + color: #D54E21; + text-decoration: none; +} + +.generate-upsell-accordion-section a:hover { + background:#FAFAFA; +} + +.generate-upsell-accordion-section h3 { + margin: 0; + position: relative; +} + +.generate-upsell-accordion-section h3 a:after { + content: "\f345"; + color: #D54E21; + position: absolute; + top: 11px; + right: 10px; + z-index: 1; + float: right; + border: none; + background: none; + font: normal 20px/1 dashicons; + speak: none; + display: block; + padding: 0; + text-indent: 0; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} \ No newline at end of file diff --git a/wp-content/themes/generatepress/inc/customizer/controls/js/customizer-controls.js b/wp-content/themes/generatepress/inc/customizer/controls/js/customizer-controls.js new file mode 100644 index 0000000..b4551c7 --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/js/customizer-controls.js @@ -0,0 +1,338 @@ +( function( api ) { + 'use strict'; + + // Add callback for when the header_textcolor setting exists. + api( 'generate_settings[nav_position_setting]', function( setting ) { + var isNavFloated, linkSettingValueToControlActiveState; + + /** + * Determine whether the navigation is floating. + * + * @returns {boolean} Is floating? + */ + isNavFloated = function() { + if ( 'nav-float-right' === setting.get() || 'nav-float-left' === setting.get() ) { + return true; + } + + return false; + }; + + /** + * Update a control's active state according to the navigation location setting's value. + * + * @param {wp.customize.Control} control + */ + linkSettingValueToControlActiveState = function( control ) { + var setActiveState = function() { + control.active.set( isNavFloated() ); + }; + + // FYI: With the following we can eliminate all of our PHP active_callback code. + control.active.validate = isNavFloated; + + // Set initial active state. + setActiveState(); + + /* + * Update activate state whenever the setting is changed. + * Even when the setting does have a refresh transport where the + * server-side active callback will manage the active state upon + * refresh, having this JS management of the active state will + * ensure that controls will have their visibility toggled + * immediately instead of waiting for the preview to load. + * This is especially important if the setting has a postMessage + * transport where changing the setting wouldn't normally cause + * the preview to refresh and thus the server-side active_callbacks + * would not get invoked. + */ + setting.bind( setActiveState ); + }; + + // Call linkSettingValueToControlActiveState on the navigation dropdown point. + api.control( 'generate_settings[nav_drop_point]', linkSettingValueToControlActiveState ); + } ); + + var setOption = function( headerAlignment, navLocation, navAlignment ) { + if ( headerAlignment ) { + api.control( 'generate_settings[header_alignment_setting]' ).setting.set( headerAlignment ); + } + + if ( navLocation ) { + api.control( 'generate_settings[nav_position_setting]' ).setting.set( navLocation ); + } + + if ( navAlignment ) { + api.control( 'generate_settings[nav_alignment_setting]' ).setting.set( navAlignment ); + } + }; + + api( 'generate_header_helper', function( value ) { + var headerAlignment = false, + navLocation = false, + navAlignment = false; + + value.bind( function( newval ) { + var headerAlignmentSetting = api.control( 'generate_settings[header_alignment_setting]' ).setting; + var navLocationSetting = api.control( 'generate_settings[nav_position_setting]' ).setting; + var navAlignmentSetting = api.control( 'generate_settings[nav_alignment_setting]' ).setting; + + if ( ! headerAlignmentSetting._dirty ) { + headerAlignment = headerAlignmentSetting.get(); + } + + if ( ! navLocationSetting._dirty ) { + navLocation = navLocationSetting.get(); + } + + if ( ! navAlignmentSetting._dirty ) { + navAlignment = navAlignmentSetting.get(); + } + + if ( 'current' === newval ) { + setOption( headerAlignment, navLocation, navAlignment ); + } + + if ( 'default' === newval ) { + setOption( generatepress_defaults.header_alignment_setting, generatepress_defaults.nav_position_setting, generatepress_defaults.nav_alignment_setting ); + } + + if ( 'nav-before-centered' === newval ) { + setOption( 'center', 'nav-above-header', 'center' ); + } + + if ( 'nav-after-centered' === newval ) { + setOption( 'center', 'nav-below-header', 'center' ); + } + + if ( 'nav-right' === newval ) { + setOption( 'left', 'nav-float-right', 'left' ); + } + + if ( 'nav-left' === newval ) { + setOption( 'right', 'nav-float-left', 'right' ); + } + } ); + } ); + + api( 'nav_color_presets', function( value ) { + var backgroundColor = false, + textColor = false, + backgroundColorHover = false, + textColorHover = false, + currentBackgroundColor = false, + currentTextColor = false, + subMenuBackgroundColor = false, + subMenuTextColor = false, + subMenuBackgroundColorHover = false, + subMenuTextColorHover = false, + subMenuCurrentBackgroundColor = false, + subMenuCurrentTextColor = false; + + value.bind( function( newval ) { + var backgroundColorSetting = api.instance( 'generate_settings[navigation_background_color]' ), + textColorSetting = api.instance( 'generate_settings[navigation_text_color]' ), + backgroundColorHoverSetting = api.instance( 'generate_settings[navigation_background_hover_color]' ), + textColorHoverSetting = api.instance( 'generate_settings[navigation_text_hover_color]' ), + currentBackgroundColorSetting = api.instance( 'generate_settings[navigation_background_current_color]' ), + currentTextColorSetting = api.instance( 'generate_settings[navigation_text_current_color]' ), + subMenuBackgroundColorSetting = api.instance( 'generate_settings[subnavigation_background_color]' ), + subMenuTextColorSetting = api.instance( 'generate_settings[subnavigation_text_color]' ), + subMenuBackgroundColorHoverSetting = api.instance( 'generate_settings[subnavigation_background_hover_color]' ), + subMenuTextColorHoverSetting = api.instance( 'generate_settings[subnavigation_text_hover_color]' ), + subMenuCurrentBackgroundColorSetting = api.instance( 'generate_settings[subnavigation_background_current_color]' ), + subMenuCurrentTextColorSetting = api.instance( 'generate_settings[subnavigation_text_current_color]' ); + + if ( ! backgroundColorSetting._dirty ) { + backgroundColor = backgroundColorSetting.get(); + } + + if ( ! textColorSetting._dirty ) { + textColor = textColorSetting.get(); + } + + if ( ! backgroundColorHoverSetting._dirty ) { + backgroundColorHover = backgroundColorHoverSetting.get(); + } + + if ( ! textColorHoverSetting._dirty ) { + textColorHover = textColorHoverSetting.get(); + } + + if ( ! currentBackgroundColorSetting._dirty ) { + currentBackgroundColor = currentBackgroundColorSetting.get(); + } + + if ( ! currentTextColorSetting._dirty ) { + currentTextColor = currentTextColorSetting.get(); + } + + if ( ! subMenuBackgroundColorSetting._dirty ) { + subMenuBackgroundColor = subMenuBackgroundColorSetting.get(); + } + + if ( ! subMenuTextColorSetting._dirty ) { + subMenuTextColor = subMenuTextColorSetting.get(); + } + + if ( ! subMenuBackgroundColorHoverSetting._dirty ) { + subMenuBackgroundColorHover = subMenuBackgroundColorHoverSetting.get(); + } + + if ( ! subMenuTextColorHoverSetting._dirty ) { + subMenuTextColorHover = subMenuTextColorHoverSetting.get(); + } + + if ( ! subMenuCurrentBackgroundColorSetting._dirty ) { + subMenuCurrentBackgroundColor = subMenuCurrentBackgroundColorSetting.get(); + } + + if ( ! subMenuCurrentTextColorSetting._dirty ) { + subMenuCurrentTextColor = subMenuCurrentTextColorSetting.get(); + } + + if ( 'current' === newval ) { + backgroundColorSetting.set( backgroundColor ); + textColorSetting.set( textColor ); + + backgroundColorHoverSetting.set( backgroundColorHover ); + textColorHoverSetting.set( textColorHover ); + + currentBackgroundColorSetting.set( currentBackgroundColor ); + currentTextColorSetting.set( currentTextColorSetting ); + + subMenuBackgroundColorSetting.set( subMenuBackgroundColor ); + subMenuTextColorSetting.set( subMenuTextColor ); + + subMenuBackgroundColorHoverSetting.set( subMenuBackgroundColorHover ); + subMenuTextColorHoverSetting.set( subMenuTextColorHover ); + + subMenuCurrentBackgroundColorSetting.set( subMenuCurrentBackgroundColor ); + subMenuCurrentTextColorSetting.set( subMenuCurrentTextColorSetting ); + } + + if ( 'default' === newval ) { + backgroundColorSetting.set( generatepress_color_defaults.navigation_background_color ); + textColorSetting.set( generatepress_color_defaults.navigation_text_color ); + + backgroundColorHoverSetting.set( generatepress_color_defaults.navigation_background_hover_color ); + textColorHoverSetting.set( generatepress_color_defaults.navigation_text_hover_color ); + + currentBackgroundColorSetting.set( generatepress_color_defaults.navigation_background_current_color ); + currentTextColorSetting.set( generatepress_color_defaults.navigation_text_current_color ); + + subMenuBackgroundColorSetting.set( generatepress_color_defaults.subnavigation_background_color ); + subMenuTextColorSetting.set( generatepress_color_defaults.subnavigation_text_color ); + + subMenuBackgroundColorHoverSetting.set( generatepress_color_defaults.subnavigation_background_hover_color ); + subMenuTextColorHoverSetting.set( generatepress_color_defaults.subnavigation_text_hover_color ); + + subMenuCurrentBackgroundColorSetting.set( generatepress_color_defaults.subnavigation_background_current_color ); + subMenuCurrentTextColorSetting.set( generatepress_color_defaults.subnavigation_text_current_color ); + } + + if ( 'white' === newval ) { + backgroundColorSetting.set( '#ffffff' ); + textColorSetting.set( '#000000' ); + + backgroundColorHoverSetting.set( '#ffffff' ); + textColorHoverSetting.set( '#8f919e' ); + + currentBackgroundColorSetting.set( '#ffffff' ); + currentTextColorSetting.set( '#8f919e' ); + + subMenuBackgroundColorSetting.set( '#f6f9fc' ); + subMenuTextColorSetting.set( '#000000' ); + + subMenuBackgroundColorHoverSetting.set( '#f6f9fc' ); + subMenuTextColorHoverSetting.set( '#8f919e' ); + + subMenuCurrentBackgroundColorSetting.set( '#f6f9fc' ); + subMenuCurrentTextColorSetting.set( '#8f919e' ); + } + + if ( 'grey' === newval ) { + backgroundColorSetting.set( '#595959' ); + textColorSetting.set( '#ffffff' ); + + backgroundColorHoverSetting.set( '#424242' ); + textColorHoverSetting.set( '#ffffff' ); + + currentBackgroundColorSetting.set( '#424242' ); + currentTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorSetting.set( '#424242' ); + subMenuTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorHoverSetting.set( '#424242' ); + subMenuTextColorHoverSetting.set( '#dbdbdb' ); + + subMenuCurrentBackgroundColorSetting.set( '#424242' ); + subMenuCurrentTextColorSetting.set( '#dbdbdb' ); + } + + if ( 'blue' === newval ) { + backgroundColorSetting.set( '#1e73be' ); + textColorSetting.set( '#ffffff' ); + + backgroundColorHoverSetting.set( '#035a9e' ); + textColorHoverSetting.set( '#ffffff' ); + + currentBackgroundColorSetting.set( '#035a9e' ); + currentTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorSetting.set( '#035a9e' ); + subMenuTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorHoverSetting.set( '#035a9e' ); + subMenuTextColorHoverSetting.set( '#bbd2e8' ); + + subMenuCurrentBackgroundColorSetting.set( '#035a9e' ); + subMenuCurrentTextColorSetting.set( '#bbd2e8' ); + } + + if ( 'red' === newval ) { + backgroundColorSetting.set( '#ed4250' ); + textColorSetting.set( '#ffffff' ); + + backgroundColorHoverSetting.set( '#c42f2f' ); + textColorHoverSetting.set( '#ffffff' ); + + currentBackgroundColorSetting.set( '#c42f2f' ); + currentTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorSetting.set( '#c42f2f' ); + subMenuTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorHoverSetting.set( '#c42f2f' ); + subMenuTextColorHoverSetting.set( '#fcd9d6' ); + + subMenuCurrentBackgroundColorSetting.set( '#c42f2f' ); + subMenuCurrentTextColorSetting.set( '#fcd9d6' ); + } + + if ( 'green' === newval ) { + backgroundColorSetting.set( '#16aa74' ); + textColorSetting.set( '#ffffff' ); + + backgroundColorHoverSetting.set( '#119b6d' ); + textColorHoverSetting.set( '#ffffff' ); + + currentBackgroundColorSetting.set( '#119b6d' ); + currentTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorSetting.set( '#119b6d' ); + subMenuTextColorSetting.set( '#ffffff' ); + + subMenuBackgroundColorHoverSetting.set( '#119b6d' ); + subMenuTextColorHoverSetting.set( '#c2e8de' ); + + subMenuCurrentBackgroundColorSetting.set( '#119b6d' ); + subMenuCurrentTextColorSetting.set( '#c2e8de' ); + } + + jQuery('.wp-color-picker').wpColorPicker().change(); + } ); + } ); + +}( wp.customize ) ); diff --git a/wp-content/themes/generatepress/inc/customizer/controls/js/customizer-live-preview.js b/wp-content/themes/generatepress/inc/customizer/controls/js/customizer-live-preview.js new file mode 100644 index 0000000..0ab0783 --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/js/customizer-live-preview.js @@ -0,0 +1,609 @@ +/** + * Theme Customizer enhancements for a better user experience. + * + * Contains handlers to make Theme Customizer preview reload changes asynchronously. + */ +function generatepress_colors_live_update( id, selector, property, default_value, get_value ) { + default_value = typeof default_value !== 'undefined' ? default_value : 'initial'; + get_value = typeof get_value !== 'undefined' ? get_value : ''; + + wp.customize( 'generate_settings[' + id + ']', function( value ) { + value.bind( function( newval ) { + default_value = ( '' !== get_value ) ? wp.customize.value('generate_settings[' + get_value + ']')() : default_value; + newval = ( '' !== newval ) ? newval : default_value; + + if ( jQuery( 'style#' + id ).length ) { + jQuery( 'style#' + id ).html( selector + '{' + property + ':' + newval + ';}' ); + } else { + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#' + id ).not( ':last' ).remove(); + }, 1000); + } + } ); + } ); +} + +function generatepress_classes_live_update( id, classes, selector, prefix ) { + classes = typeof classes !== 'undefined' ? classes : ''; + prefix = typeof prefix !== 'undefined' ? prefix : ''; + wp.customize( 'generate_settings[' + id + ']', function( value ) { + value.bind( function( newval ) { + jQuery.each( classes, function( i, v ) { + jQuery( selector ).removeClass( prefix + v ); + }); + jQuery( selector ).addClass( prefix + newval ); + } ); + } ); +} + +function generatepress_typography_live_update( id, selector, property, unit, media, settings ) { + settings = typeof settings !== 'undefined' ? settings : 'generate_settings'; + wp.customize( settings + '[' + id + ']', function( value ) { + value.bind( function( newval ) { + // Get our unit if applicable + unit = typeof unit !== 'undefined' ? unit : ''; + + var isTablet = ( 'tablet' == id.substring( 0, 6 ) ) ? true : false, + isMobile = ( 'mobile' == id.substring( 0, 6 ) ) ? true : false; + + if ( isTablet ) { + if ( '' == wp.customize(settings + '[' + id + ']').get() ) { + var desktopID = id.replace( 'tablet_', '' ); + newval = wp.customize(settings + '[' + desktopID + ']').get(); + } + } + + if ( isMobile ) { + if ( '' == wp.customize(settings + '[' + id + ']').get() ) { + var desktopID = id.replace( 'mobile_', '' ); + newval = wp.customize(settings + '[' + desktopID + ']').get(); + } + } + + if ( 'buttons_font_size' == id && '' == wp.customize('generate_settings[buttons_font_size]').get() ) { + newval = wp.customize('generate_settings[body_font_size]').get(); + } + + // We're using a desktop value + if ( ! isTablet && ! isMobile ) { + + var tabletValue = ( typeof wp.customize(settings + '[tablet_' + id + ']') !== 'undefined' ) ? wp.customize(settings + '[tablet_' + id + ']').get() : '', + mobileValue = ( typeof wp.customize(settings + '[mobile_' + id + ']') !== 'undefined' ) ? wp.customize(settings + '[mobile_' + id + ']').get() : ''; + + // The tablet setting exists, mobile doesn't + if ( '' !== tabletValue && '' == mobileValue ) { + media = generatepress_live_preview.desktop + ', ' + generatepress_live_preview.mobile; + } + + // The tablet setting doesn't exist, mobile does + if ( '' == tabletValue && '' !== mobileValue ) { + media = generatepress_live_preview.desktop + ', ' + generatepress_live_preview.tablet; + } + + // The tablet setting doesn't exist, neither does mobile + if ( '' == tabletValue && '' == mobileValue ) { + media = generatepress_live_preview.desktop + ', ' + generatepress_live_preview.tablet + ', ' + generatepress_live_preview.mobile; + } + + } + + // Check if media query + media_query = typeof media !== 'undefined' ? 'media="' + media + '"' : ''; + + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#' + id ).not( ':last' ).remove(); + }, 1000); + + setTimeout("jQuery('body').trigger('generate_spacing_updated');", 1000); + } ); + } ); +} + +( function( $ ) { + + // Update the site title in real time... + wp.customize( 'blogname', function( value ) { + value.bind( function( newval ) { + $( '.main-title a' ).html( newval ); + } ); + } ); + + //Update the site description in real time... + wp.customize( 'blogdescription', function( value ) { + value.bind( function( newval ) { + $( '.site-description' ).html( newval ); + } ); + } ); + + wp.customize( 'generate_settings[logo_width]', function( value ) { + value.bind( function( newval ) { + $( '.site-header .header-image' ).css( 'width', newval + 'px' ); + + if ( '' == newval ) { + $( '.site-header .header-image' ).css( 'width', '' ); + } + } ); + } ); + + /** + * Body background color + * Empty: white + */ + generatepress_colors_live_update( 'background_color', 'body', 'background-color', '#FFFFFF' ); + + /** + * Text color + * Empty: black + */ + generatepress_colors_live_update( 'text_color', 'body', 'color', '#000000' ); + + /** + * Link color + * Empty: initial + */ + generatepress_colors_live_update( 'link_color', 'a, a:visited', 'color', 'initial' ); + + /** + * Link color hover + * Empty: initial + */ + generatepress_colors_live_update( 'link_color_hover', 'a:hover', 'color', 'initial' ); + + /** + * Live update for content & navigation colors thanks to our preset option. + * We only want to run this if GP Premium isn't already doing it. + */ + if ( 'undefined' == typeof generate_colors_live_update ) { + /** + * Blog post title color + * Empty: Body link color + */ + generatepress_colors_live_update( 'blog_post_title_color', '.entry-title a, .entry-title a:visited', 'color', '', 'link_color' ); + + /** + * Blog post title color on hover + * Empty: Body link color on hover + */ + generatepress_colors_live_update( 'blog_post_title_hover_color', '.entry-title a:hover', 'color', '', 'link_color_hover' ); + + /** + * Navigation background color + * Empty: Transparent + */ + generatepress_colors_live_update( 'navigation_background_color', '.main-navigation', 'background-color', 'transparent' ); + + /** + * Primary navigation text color + * Empty: link_color + */ + generatepress_colors_live_update( 'navigation_text_color', + '.main-navigation .main-nav ul li a,\ + .menu-toggle,button.menu-toggle:hover,\ + button.menu-toggle:focus,\ + .main-navigation .mobile-bar-items a,\ + .main-navigation .mobile-bar-items a:hover,\ + .main-navigation .mobile-bar-items a:focus', + 'color', + '', + 'link_color' + ); + + /** + * Primary navigation text color hover + * Empty: link_color_hover + */ + generatepress_colors_live_update( 'navigation_text_hover_color', + '.navigation-search input[type="search"],\ + .navigation-search input[type="search"]:active,\ + .navigation-search input[type="search"]:focus,\ + .main-navigation .main-nav ul li:hover > a,\ + .main-navigation .main-nav ul li:focus > a,\ + .main-navigation .main-nav ul li.sfHover > a', + 'color', + '', + 'link_color_hover' + ); + + /** + * Primary navigation menu item hover + * Empty: transparent + */ + generatepress_colors_live_update( 'navigation_background_hover_color', + '.navigation-search input[type="search"],\ + .navigation-search input[type="search"]:focus,\ + .main-navigation .main-nav ul li:hover > a,\ + .main-navigation .main-nav ul li:focus > a,\ + .main-navigation .main-nav ul li.sfHover > a', + 'background-color', + 'transparent' + ); + + /** + * Primary sub-navigation color + * Empty: transparent + */ + generatepress_colors_live_update( 'subnavigation_background_color', '.main-navigation ul ul', 'background-color', 'transparent' ); + + /** + * Primary sub-navigation text color + * Empty: link_color + */ + generatepress_colors_live_update( 'subnavigation_text_color', '.main-navigation .main-nav ul ul li a', 'color', 'link_color' ); + + /** + * Primary sub-navigation hover + */ + var subnavigation_hover = '.main-navigation .main-nav ul ul li:hover > a, \ + .main-navigation .main-nav ul ul li:focus > a, \ + .main-navigation .main-nav ul ul li.sfHover > a'; + + /** + * Primary sub-navigation text hover + * Empty: link_color_hover + */ + generatepress_colors_live_update( 'subnavigation_text_hover_color', subnavigation_hover, 'color', '', 'link_color_hover' ); + + /** + * Primary sub-navigation background hover + * Empty: transparent + */ + generatepress_colors_live_update( 'subnavigation_background_hover_color', subnavigation_hover, 'background-color', 'transparent' ); + + /** + * Navigation current selectors + */ + var navigation_current = '.main-navigation .main-nav ul li[class*="current-menu-"] > a, \ + .main-navigation .main-nav ul li[class*="current-menu-"]:hover > a, \ + .main-navigation .main-nav ul li[class*="current-menu-"].sfHover > a'; + + /** + * Primary navigation current text + * Empty: link_color + */ + generatepress_colors_live_update( 'navigation_text_current_color', navigation_current, 'color', '', 'link_color' ); + + /** + * Primary navigation current background + * Empty: transparent + */ + generatepress_colors_live_update( 'navigation_background_current_color', navigation_current, 'background-color', 'transparent' ); + + /** + * Primary sub-navigation current selectors + */ + var subnavigation_current = '.main-navigation .main-nav ul ul li[class*="current-menu-"] > a,\ + .main-navigation .main-nav ul ul li[class*="current-menu-"]:hover > a, \ + .main-navigation .main-nav ul ul li[class*="current-menu-"].sfHover > a'; + + /** + * Primary sub-navigation current text + * Empty: link_color + */ + generatepress_colors_live_update( 'subnavigation_text_current_color', subnavigation_current, 'color', '', 'link_color' ); + + /** + * Primary navigation current item background + * Empty: transparent + */ + generatepress_colors_live_update( 'subnavigation_background_current_color', subnavigation_current, 'background-color', 'transparent' ); + } + + /** + * Container width + */ + wp.customize( 'generate_settings[container_width]', function( value ) { + value.bind( function( newval ) { + if ( jQuery( 'style#container_width' ).length ) { + jQuery( 'style#container_width' ).html( 'body .grid-container, .wp-block-group__inner-container{max-width:' + newval + 'px;}' ); + } else { + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#container_width' ).not( ':last' ).remove(); + }, 100); + } + jQuery('body').trigger('generate_spacing_updated'); + } ); + } ); + + /** + * Live update for typography options. + * We only want to run this if GP Premium isn't already doing it. + */ + if ( 'undefined' == typeof gp_premium_typography_live_update ) { + /** + * Body font size, weight and transform + */ + generatepress_typography_live_update( 'body_font_size', 'body, button, input, select, textarea', 'font-size', 'px' ); + generatepress_typography_live_update( 'body_line_height', 'body', 'line-height', '' ); + generatepress_typography_live_update( 'paragraph_margin', 'p, .entry-content > [class*="wp-block-"]:not(:last-child)', 'margin-bottom', 'em' ); + generatepress_typography_live_update( 'body_font_weight', 'body, button, input, select, textarea', 'font-weight' ); + generatepress_typography_live_update( 'body_font_transform', 'body, button, input, select, textarea', 'text-transform' ); + + /** + * H1 font size, weight and transform + */ + generatepress_typography_live_update( 'heading_1_font_size', 'h1', 'font-size', 'px', generatepress_live_preview.desktop ); + generatepress_typography_live_update( 'mobile_heading_1_font_size', 'h1', 'font-size', 'px', generatepress_live_preview.mobile ); + generatepress_typography_live_update( 'heading_1_weight', 'h1', 'font-weight' ); + generatepress_typography_live_update( 'heading_1_transform', 'h1', 'text-transform' ); + generatepress_typography_live_update( 'heading_1_line_height', 'h1', 'line-height', 'em' ); + + /** + * H2 font size, weight and transform + */ + generatepress_typography_live_update( 'heading_2_font_size', 'h2', 'font-size', 'px', generatepress_live_preview.desktop ); + generatepress_typography_live_update( 'mobile_heading_2_font_size', 'h2', 'font-size', 'px', generatepress_live_preview.mobile ); + generatepress_typography_live_update( 'heading_2_weight', 'h2', 'font-weight' ); + generatepress_typography_live_update( 'heading_2_transform', 'h2', 'text-transform' ); + generatepress_typography_live_update( 'heading_2_line_height', 'h2', 'line-height', 'em' ); + + /** + * H3 font size, weight and transform + */ + generatepress_typography_live_update( 'heading_3_font_size', 'h3', 'font-size', 'px' ); + generatepress_typography_live_update( 'heading_3_weight', 'h3', 'font-weight' ); + generatepress_typography_live_update( 'heading_3_transform', 'h3', 'text-transform' ); + generatepress_typography_live_update( 'heading_3_line_height', 'h3', 'line-height', 'em' ); + } + + /** + * Content layout + */ + generatepress_classes_live_update( 'content_layout_setting', [ 'one-container', 'separate-containers' ], 'body' ); + + /** + * Top bar width + */ + wp.customize( 'generate_settings[top_bar_width]', function( value ) { + value.bind( function( newval ) { + if ( 'full' == newval ) { + $( '.top-bar' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + if ( 'contained' == wp.customize.value('generate_settings[top_bar_inner_width]')() ) { + $( '.inside-top-bar' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } + if ( 'contained' == newval ) { + $( '.top-bar' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + $( '.inside-top-bar' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + } ); + } ); + + /** + * Inner top bar width + */ + wp.customize( 'generate_settings[top_bar_inner_width]', function( value ) { + value.bind( function( newval ) { + if ( 'full' == newval ) { + $( '.inside-top-bar' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + if ( 'contained' == newval ) { + $( '.inside-top-bar' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } ); + } ); + + /** + * Top bar alignment + */ + generatepress_classes_live_update( 'top_bar_alignment', [ 'left', 'center', 'right' ], '.top-bar', 'top-bar-align-' ); + + /** + * Header layout + */ + wp.customize( 'generate_settings[header_layout_setting]', function( value ) { + value.bind( function( newval ) { + if ( 'fluid-header' == newval ) { + $( '.site-header' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + if ( 'contained' == wp.customize.value('generate_settings[header_inner_width]')() ) { + $( '.inside-header' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } + if ( 'contained-header' == newval ) { + $( '.site-header' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + $( '.inside-header' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + } ); + } ); + + /** + * Inner Header layout + */ + wp.customize( 'generate_settings[header_inner_width]', function( value ) { + value.bind( function( newval ) { + if ( 'full-width' == newval ) { + $( '.inside-header' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + if ( 'contained' == newval ) { + $( '.inside-header' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } ); + } ); + + /** + * Header alignment + */ + generatepress_classes_live_update( 'header_alignment_setting', [ 'left', 'center', 'right' ], 'body', 'header-aligned-' ); + + /** + * Navigation width + */ + wp.customize( 'generate_settings[nav_layout_setting]', function( value ) { + value.bind( function( newval ) { + if ( $( 'body' ).hasClass( 'sticky-enabled' ) ) { + wp.customize.preview.send( 'refresh' ); + } else { + if ( 'fluid-nav' == newval ) { + $( '.main-navigation' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + if ( 'full-width' !== wp.customize.value('generate_settings[nav_inner_width]')() ) { + $( '.main-navigation .inside-navigation' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } + if ( 'contained-nav' == newval ) { + $( '.main-navigation' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + $( '.main-navigation .inside-navigation' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + } + } ); + } ); + + /** + * Inner navigation width + */ + wp.customize( 'generate_settings[nav_inner_width]', function( value ) { + value.bind( function( newval ) { + if ( 'full-width' == newval ) { + $( '.main-navigation .inside-navigation' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + if ( 'contained' == newval ) { + $( '.main-navigation .inside-navigation' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } ); + } ); + + /** + * Navigation position + */ + wp.customize( 'generate_settings[nav_position_setting]', function( value ) { + value.bind( function( newval ) { + $( 'body' ).trigger( 'generate_navigation_location_updated' ); + + // Update navigation alignment settings. + $( 'body' ).removeClass( 'nav-aligned-center' ); + $( 'body' ).removeClass( 'nav-aligned-left' ); + $( 'body' ).removeClass( 'nav-aligned-right' ); + $( 'body' ).addClass( 'nav-aligned-' + wp.customize.value('generate_settings[nav_alignment_setting]')() ); + + if ( $( '.gen-sidebar-nav' ).length ) { + wp.customize.preview.send( 'refresh' ); + return false; + } + if ( 'nav-left-sidebar' == newval ) { + wp.customize.preview.send( 'refresh' ); + return false; + } + if ( 'nav-right-sidebar' == newval ) { + wp.customize.preview.send( 'refresh' ); + return false; + } + + if ( '' !== wp.customize.value('generate_settings[nav_drop_point]')() ) { + wp.customize.preview.send( 'refresh' ); + return false; + } + + var classes = [ 'nav-below-header', 'nav-above-header', 'nav-float-right', 'nav-float-left', 'nav-left-sidebar', 'nav-right-sidebar' ]; + if ( 'nav-left-sidebar' !== newval && 'nav-right-sidebar' !== newval ) { + $.each( classes, function( i, v ) { + $( 'body' ).removeClass( v ); + }); + } + $( 'body' ).addClass( newval ); + if ( 'nav-below-header' == newval ) { + $( '#site-navigation:first' ).insertAfter( '.site-header' ).show(); + } + if ( 'nav-above-header' == newval ) { + if ( $( '.top-bar:not(.secondary-navigation .top-bar)' ).length ) { + $( '#site-navigation:first' ).insertAfter( '.top-bar' ).show(); + } else { + $( '#site-navigation:first' ).prependTo( 'body' ).show(); + } + } + if ( 'nav-float-right' == newval ) { + if ( ! $( 'body' ).hasClass( 'using-floats' ) && $( '.header-widget' ).length ) { + $( '#site-navigation:first' ).insertBefore( '.header-widget' ).show(); + } else { + $( '#site-navigation:first' ).appendTo( '.inside-header' ).show(); + } + } + if ( 'nav-float-left' == newval ) { + $( '#site-navigation:first' ).appendTo( '.inside-header' ).show(); + } + if ( '' == newval ) { + if ( $( '.gen-sidebar-nav' ).length ) { + wp.customize.preview.send( 'refresh' ); + } else { + $( '#site-navigation:first' ).hide(); + } + } + } ); + } ); + + /** + * Navigation alignment + */ + generatepress_classes_live_update( 'nav_alignment_setting', [ 'left', 'center', 'right' ], 'body', 'nav-aligned-' ); + + /** + * Footer width + */ + wp.customize( 'generate_settings[footer_layout_setting]', function( value ) { + value.bind( function( newval ) { + if ( 'fluid-footer' == newval ) { + $( '.site-footer' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + if ( 'contained-footer' == newval ) { + $( '.site-footer' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } ); + } ); + + /** + * Inner footer width + */ + wp.customize( 'generate_settings[footer_inner_width]', function( value ) { + value.bind( function( newval ) { + if ( 'full-width' == newval ) { + if ( $( '.footer-widgets-container' ).length ) { + $( '.footer-widgets-container' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } else { + $( '.inside-footer-widgets' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + $( '.inside-site-info' ).removeClass( 'grid-container' ).removeClass( 'grid-parent' ); + } + if ( 'contained' == newval ) { + if ( $( '.footer-widgets-container' ).length ) { + $( '.footer-widgets-container' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } else { + $( '.inside-footer-widgets' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + $( '.inside-site-info' ).addClass( 'grid-container' ).addClass( 'grid-parent' ); + } + } ); + } ); + + /** + * Footer bar alignment + */ + generatepress_classes_live_update( 'footer_bar_alignment', [ 'left', 'center', 'right' ], '.site-footer', 'footer-bar-align-' ); + + jQuery( 'body' ).on( 'generate_spacing_updated', function() { + var containerAlignment = wp.customize( 'generate_settings[container_alignment]' ).get(), + containerWidth = wp.customize( 'generate_settings[container_width]' ).get(), + contentLeft = generatepress_live_preview.contentLeft, + contentRight = generatepress_live_preview.contentRight; + + if ( 'text' === containerAlignment ) { + if ( typeof wp.customize( 'generate_spacing_settings[content_left]' ) !== 'undefined' ) { + contentLeft = wp.customize( 'generate_spacing_settings[content_left]' ).get(); + } + + if ( typeof wp.customize( 'generate_spacing_settings[content_right]' ) !== 'undefined' ) { + contentRight = wp.customize( 'generate_spacing_settings[content_right]' ).get(); + } + + var newContainerWidth = Number( containerWidth ) + Number( contentLeft ) + Number( contentRight ); + + if ( jQuery( 'style#wide_container_width' ).length ) { + jQuery( 'style#wide_container_width' ).html( '#page{max-width:' + newContainerWidth + 'px;}' ); + } else { + jQuery( 'head' ).append( '' ); + setTimeout(function() { + jQuery( 'style#wide_container_width' ).not( ':last' ).remove(); + }, 100); + } + } + } ); +} )( jQuery ); diff --git a/wp-content/themes/generatepress/inc/customizer/controls/js/selectWoo.min.js b/wp-content/themes/generatepress/inc/customizer/controls/js/selectWoo.min.js new file mode 100644 index 0000000..bf9600c --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/js/selectWoo.min.js @@ -0,0 +1 @@ +/*! Select2 1.0.1 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return v.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=b&&b.split("/"),p=t.map,q=p&&p["*"]||{};if(a){for(a=a.split("/"),g=a.length-1,t.nodeIdCompat&&x.test(a[g])&&(a[g]=a[g].replace(x,"")),"."===a[0].charAt(0)&&o&&(n=o.slice(0,o.length-1),a=n.concat(a)),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}if((o||q)&&p){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),o)for(l=o.length;l>0;l-=1)if((e=p[o.slice(0,l).join("/")])&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=w.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),o.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){r[a]=b}}function j(a){if(e(s,a)){var c=s[a];delete s[a],u[a]=!0,n.apply(b,c)}if(!e(r,a)&&!e(u,a))throw new Error("No "+a);return r[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return a?k(a):[]}function m(a){return function(){return t&&t.config&&t.config[a]||{}}}var n,o,p,q,r={},s={},t={},u={},v=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;p=function(a,b){var c,d=k(a),e=d[0],g=b[1];return a=d[1],e&&(e=f(e,g),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(g)):f(a,g):(a=f(a,g),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},q={require:function(a){return g(a)},exports:function(a){var b=r[a];return void 0!==b?b:r[a]={}},module:function(a){return{id:a,uri:"",exports:r[a],config:m(a)}}},n=function(a,c,d,f){var h,k,m,n,o,t,v,w=[],x=typeof d;if(f=f||a,t=l(f),"undefined"===x||"function"===x){for(c=!c.length&&d.length?["require","exports","module"]:c,o=0;o0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c.isTouchscreen=function(){return void 0===c._isTouchscreenCache&&(c._isTouchscreenCache="ontouchstart"in document.documentElement),c._isTouchscreenCache},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('
          ');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a(''),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()});b.$results.find(".select2-results__option[data-selected]").each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("data-selected","true"):b.attr("data-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"option","data-selected":"false",tabindex:-1};b.disabled&&(delete d["data-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["data-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d["aria-label"]=b.text,delete d["data-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";var i=a(h);this.template(b,h),i.attr("role","presentation");for(var j=[],k=0;k",{class:"select2-results__options select2-results__options--nested",role:"listbox"});n.append(j),g.attr("role","list"),g.append(h),g.append(n)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("data-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[data-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):h-g<0&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[data-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted").attr("aria-selected","true"),d.$results.attr("aria-activedescendant",a.element.attr("id"))}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[data-selected]",function(b){var c=a(this),e=c.data("data");if("true"===c.attr("data-selected"))return void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{}));d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[data-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted").attr("aria-selected","false"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[data-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.options.get("minimumResultsForSearch");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),window.setTimeout(function(){d.$selection.focus()},1),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2");a(".select2.select2-container--open").each(function(){var b=a(this);this!=d[0]&&b.data("element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",d),this.$selection.attr("role","combobox"),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("keydown",function(b){!a.isOpen()&&b.which>=48&&b.which<=90&&a.open()}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
            '),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('
          • ')},d.prototype.update=function(a){var b=this;if(this.clear(),0!==a.length){for(var d=[],e=0;e1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this,f=b.id+"-results";a.call(this,b,d),b.on("open",function(){e.$search.attr("aria-owns",f),e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.removeAttr("aria-owns"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.data._resultId)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===e.$search.val()){var b=e.$searchContainer.prev(".select2-selection__choice");if(b.length>0){var d=b.data("data");e.searchRemoveChoice(d),a.preventDefault()}}});var g=document.documentMode,h=g&&g<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(h)return void e.$selection.off("input.search input.searchcheck");e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(h&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d="";return d+=null!=b?b.id:a.generateChars(4),d+="-result-",d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f),e.container.focusOnActiveElement()},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this,f=c.id+"-results";b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.attr("aria-owns",f),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.removeAttr("aria-activedescendant"),e.$search.removeAttr("aria-owns"),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}}),c.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.data._resultId)})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
          • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var b=this;this.on("open",function(){b.$container.addClass("select2-container--open")}),this.on("close",function(){b.$container.removeClass("select2-container--open")}),this.on("enable",function(){b.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){b.$container.addClass("select2-container--disabled")}),this.on("blur",function(){b.$container.removeClass("select2-container--focus")}),this.on("query",function(a){b.isOpen()||b.trigger("open",{}),this.dataAdapter.query(a,function(c){b.trigger("results:all",{data:c,query:a})})}),this.on("query:append",function(a){this.dataAdapter.query(a,function(c){b.trigger("results:append",{data:c,query:a})})}),this.on("open",function(){setTimeout(function(){b.focusOnActiveElement()},1)}),a(document).on("keydown",function(a){var c=a.which;if(b.isOpen())if(c===d.ESC||c===d.TAB||c===d.UP&&a.altKey?(b.close(),a.preventDefault()):c===d.ENTER?(b.trigger("results:select",{}),a.preventDefault()):c===d.SPACE&&a.ctrlKey?(b.trigger("results:toggle",{}),a.preventDefault()):c===d.UP?(b.trigger("results:previous",{}),a.preventDefault()):c===d.DOWN&&(b.trigger("results:next",{}),a.preventDefault()),c===d.DOWN||c===d.UP)b.focusOnActiveElement();else{var e=b.$dropdown.find(".select2-search__field");e.length||(e=b.$container.find(".select2-search__field")),e.focus(),setTimeout(function(){b.focusOnActiveElement()},1e3)}else b.hasFocus()&&(c===d.ENTER||c===d.SPACE||c===d.DOWN&&a.altKey)&&(b.open(),a.preventDefault())})},e.prototype.focusOnActiveElement=function(){c.isTouchscreen()||this.$results.find("li.select2-results__option--highlighted").focus()},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.selectWoo){var e=["open","close","destroy"];a.fn.selectWoo=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null!=a.fn.select2&&null!=a.fn.select2.defaults&&(a.fn.selectWoo.defaults=a.fn.select2.defaults),null==a.fn.selectWoo.defaults&&(a.fn.selectWoo.defaults=d),a.fn.select2=a.fn.select2||a.fn.selectWoo,c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,a.fn.selectWoo.amd=b,c}); \ No newline at end of file diff --git a/wp-content/themes/generatepress/inc/customizer/controls/js/slider-control.js b/wp-content/themes/generatepress/inc/customizer/controls/js/slider-control.js new file mode 100644 index 0000000..afb97ca --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/js/slider-control.js @@ -0,0 +1,134 @@ +wp.customize.controlConstructor['generatepress-range-slider'] = wp.customize.Control.extend({ + + ready: function() { + + 'use strict'; + + var control = this, + value, + thisInput, + inputDefault, + changeAction, + controlClass = '.customize-control-generatepress-range-slider', + footerActions = jQuery( '#customize-footer-actions' ); + + // Set up the sliders + jQuery( '.generatepress-slider' ).each( function() { + var _this = jQuery( this ); + var _input = _this.closest( 'label' ).find( 'input[type="number"]' ); + var _text = _input.next( '.value' ); + _this.slider({ + value: _input.val(), + min: _this.data( 'min' ), + max: _this.data( 'max' ), + step: _this.data( 'step' ), + slide: function( event, ui ) { + _input.val( ui.value ).change(); + _text.text( ui.value ); + } + }); + }); + + // Update the range value based on the input value + jQuery( controlClass + ' .gp_range_value input[type=number]' ).on( 'input', function() { + value = jQuery( this ).attr( 'value' ); + if ( '' == value ) { + value = -1; + } + jQuery( this ).closest( 'label' ).find( '.generatepress-slider' ).slider( 'value', parseFloat(value)).change(); + }); + + // Handle the reset button + jQuery( controlClass + ' .generatepress-reset' ).on( 'click', function() { + var icon = jQuery( this ), + visible_area = icon.closest( '.gp-range-title-area' ).next( '.gp-range-slider-areas' ).children( 'label:visible' ), + input = visible_area.find( 'input[type=number]' ), + slider_value = visible_area.find( '.generatepress-slider' ), + visual_value = visible_area.find( '.gp_range_value' ), + reset_value = input.attr( 'data-reset_value' ); + + input.val( reset_value ).change(); + visual_value.find( 'input' ).val( reset_value ); + visual_value.find( '.value' ).text( reset_value ); + + if ( '' == reset_value ) { + reset_value = -1; + } + + slider_value.slider( 'value', parseFloat( reset_value ) ); + }); + + // Figure out which device icon to make active on load + jQuery( controlClass + ' .generatepress-range-slider-control' ).each( function() { + var _this = jQuery( this ); + _this.find( '.gp-device-controls' ).children( 'span:first-child' ).addClass( 'selected' ); + _this.find( '.range-option-area:first-child' ).show(); + }); + + // Do stuff when device icons are clicked + jQuery( controlClass + ' .gp-device-controls > span' ).on( 'click', function( event ) { + var device = jQuery( this ).data( 'option' ); + + jQuery( controlClass + ' .gp-device-controls span' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.addClass( 'selected' ); + _this.siblings().removeClass( 'selected' ); + } + }); + + jQuery( controlClass + ' .gp-range-slider-areas label' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.show(); + _this.siblings().hide(); + } + }); + + // Set the device we're currently viewing + wp.customize.previewedDevice.set( jQuery( event.currentTarget ).data( 'option' ) ); + } ); + + // Set the selected devices in our control when the Customizer devices are clicked + footerActions.find( '.devices button' ).on( 'click', function() { + var device = jQuery( this ).data( 'device' ); + jQuery( controlClass + ' .gp-device-controls span' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.addClass( 'selected' ); + _this.siblings().removeClass( 'selected' ); + } + }); + + jQuery( controlClass + ' .gp-range-slider-areas label' ).each( function() { + var _this = jQuery( this ); + if ( device == _this.attr( 'data-option' ) ) { + _this.show(); + _this.siblings().hide(); + } + }); + }); + + // Apply changes when desktop slider is changed + control.container.on( 'input change', '.desktop-range', + function() { + control.settings['desktop'].set( jQuery( this ).val() ); + } + ); + + // Apply changes when tablet slider is changed + control.container.on( 'input change', '.tablet-range', + function() { + control.settings['tablet'].set( jQuery( this ).val() ); + } + ); + + // Apply changes when mobile slider is changed + control.container.on( 'input change', '.mobile-range', + function() { + control.settings['mobile'].set( jQuery( this ).val() ); + } + ); + } + +}); \ No newline at end of file diff --git a/wp-content/themes/generatepress/inc/customizer/controls/js/typography-customizer.js b/wp-content/themes/generatepress/inc/customizer/controls/js/typography-customizer.js new file mode 100644 index 0000000..bd67534 --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/js/typography-customizer.js @@ -0,0 +1,154 @@ +( function( api ) { + + api.controlConstructor['gp-customizer-typography'] = api.Control.extend( { + ready: function() { + var control = this; + + control.container.on( 'change', '.generatepress-font-family select', + function() { + var _this = jQuery( this ), + _value = _this.val(), + _categoryID = _this.attr( 'data-category' ), + _variantsID = _this.attr( 'data-variants' ); + + // Set our font family + control.settings['family'].set( _this.val() ); + + // Bail if our controls don't exist + if ( 'undefined' == typeof control.settings['category'] || 'undefined' == typeof control.settings['variant'] ) { + return; + } + + setTimeout( function() { + // Send our request to the generate_get_all_google_fonts_ajax function + var response = jQuery.getJSON({ + type: 'POST', + url: ajaxurl, + data: { + action: 'generate_get_all_google_fonts_ajax', + gp_customize_nonce: gp_customize.nonce + }, + async: false, + dataType: 'json', + }); + + // Get our response + var fonts = response.responseJSON; + + // Create an ID from our selected font + var id = _value.split(' ').join('_').toLowerCase(); + + // Set our values if we have them + if ( id in fonts ) { + + // Get existing variants if this font is already selected + var got_variants = false; + jQuery( '.generatepress-font-family select' ).not( _this ).each( function( key, select ) { + var parent = jQuery( this ).closest( '.generatepress-font-family' ); + + if ( _value == jQuery( select ).val() && _this.data( 'category' ) !== jQuery( select ).data( 'category' ) ) { + if ( ! got_variants ) { + updated_variants = jQuery( parent.next( '.generatepress-font-variant' ).find( 'select' ) ).val(); + got_variants = true; + } + } + } ); + + // We're using a Google font, so show the variants field + _this.closest( '.generatepress-font-family' ).next( 'div' ).show(); + + // Remove existing variants + jQuery( 'select[name="' + _variantsID + '"]' ).find( 'option' ).remove(); + + // Populate our select input with available variants + jQuery.each( fonts[ id ].variants, function( key, value ) { + jQuery( 'select[name="' + _variantsID + '"]' ).append( jQuery( '' ).attr( 'value', value ).text( value ) ); + } ); + + // Set our variants + if ( ! got_variants ) { + control.settings[ 'variant' ].set( fonts[ id ].variants ); + } else { + control.settings[ 'variant' ].set( updated_variants ); + } + + // Set our font category + control.settings[ 'category' ].set( fonts[ id ].category ); + jQuery( 'input[name="' + _categoryID + '"' ).val( fonts[ id ].category ); + } else { + _this.closest( '.generatepress-font-family' ).next( 'div' ).hide(); + control.settings[ 'category' ].set( '' ) + control.settings[ 'variant' ].set( '' ) + jQuery( 'input[name="' + _categoryID + '"' ).val( '' ); + jQuery( 'select[name="' + _variantsID + '"]' ).find( 'option' ).remove(); + } + }, 25 ); + } + ); + + control.container.on( 'change', '.generatepress-font-variant select', + function() { + var _this = jQuery( this ); + var variants = _this.val(); + + control.settings['variant'].set( variants ); + + jQuery( '.generatepress-font-variant select' ).each( function( key, value ) { + var this_control = jQuery( this ).closest( 'li' ).attr( 'id' ).replace( 'customize-control-', '' ); + var parent = jQuery( this ).closest( '.generatepress-font-variant' ); + var font_val = api.control( this_control ).settings['family'].get(); + + if ( font_val == control.settings['family'].get() && _this.attr( 'name' ) !== jQuery( value ).attr( 'name' ) ) { + jQuery( parent.find( 'select' ) ).not( _this ).val( variants ).triggerHandler( 'change' ); + api.control( this_control ).settings['variant'].set( variants ); + } + } ); + } + ); + + control.container.on( 'change', '.generatepress-font-category input', + function() { + control.settings['category'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change', '.generatepress-font-weight select', + function() { + control.settings['weight'].set( jQuery( this ).val() ); + } + ); + + control.container.on( 'change', '.generatepress-font-transform select', + function() { + control.settings['transform'].set( jQuery( this ).val() ); + } + ); + + } + } ); + +} )( wp.customize ); + +jQuery( document ).ready( function( $ ) { + + $( '.generatepress-font-family select' ).select2(); + + $( '.generatepress-font-variant' ).each( function( key, value ) { + var _this = $( this ); + var value = _this.data( 'saved-value' ); + + if ( value ) { + value = value.toString().split( ',' ); + } + + _this.find( 'select' ).select2().val( value ).trigger( 'change.select2' ); + } ); + + $( ".generatepress-font-family" ).each( function( key, value ) { + var _this = $( this ); + if ( $.inArray( _this.find( 'select' ).val(), typography_defaults ) !== -1 ) { + _this.next( '.generatepress-font-variant' ).hide(); + } + } ); + +} ); diff --git a/wp-content/themes/generatepress/inc/customizer/controls/js/upsell-control.js b/wp-content/themes/generatepress/inc/customizer/controls/js/upsell-control.js new file mode 100644 index 0000000..164312d --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/js/upsell-control.js @@ -0,0 +1,12 @@ +( function( $, api ) { + api.sectionConstructor['gp-upsell-section'] = api.Section.extend( { + + // No events for this type of section. + attachEvents: function () {}, + + // Always make the section active. + isContextuallyActive: function () { + return true; + } + } ); +} )( jQuery, wp.customize ); \ No newline at end of file diff --git a/wp-content/themes/generatepress/inc/customizer/customizer-helpers.php b/wp-content/themes/generatepress/inc/customizer/customizer-helpers.php new file mode 100644 index 0000000..c0292ca --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/customizer-helpers.php @@ -0,0 +1,23 @@ + $fam ) { + $font_names[] = $fam['name']; + } + + // Get all non-Google font names + $not_google = generate_typography_default_fonts(); + + // Merge them both into one array + $valid = array_merge( $font_names, $not_google ); + + // Sanitize + if ( in_array( $input, $valid ) ) { + return $input; + } else { + return 'Open Sans'; + } + } +} + +if ( ! function_exists( 'generate_sanitize_font_weight' ) ) { + /** + * Sanitize font weight. + * + * @since 1.1.10 + * @deprecated 1.3.40 + */ + function generate_sanitize_font_weight( $input ) { + + $valid = array( + 'normal', + 'bold', + '100', + '200', + '300', + '400', + '500', + '600', + '700', + '800', + '900', + ); + + if ( in_array( $input, $valid ) ) { + return $input; + } else { + return 'normal'; + } + } +} + +if ( ! function_exists( 'generate_sanitize_text_transform' ) ) { + /** + * Sanitize text transform. + * + * @since 1.1.10 + * @deprecated 1.3.40 + */ + function generate_sanitize_text_transform( $input ) { + + $valid = array( + 'none', + 'capitalize', + 'uppercase', + 'lowercase', + ); + + if ( in_array( $input, $valid ) ) { + return $input; + } else { + return 'none'; + } + } +} + +if ( ! function_exists( 'generate_typography_customize_preview_css' ) ) { + /** + * Hide the hidden input control + * @since 1.3.40 + */ + function generate_typography_customize_preview_css() { + ?> + + +
            + +
            + manager->get_control( $setting->id )->choices; + + // If the input is a valid key, return it; + // otherwise, return the default + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); + } +} + +/** + * Sanitize our Google Font variants + * + * @since 2.0 + */ +function generate_sanitize_variants( $input ) { + if ( is_array( $input ) ) { + $input = implode( ',', $input ); + } + return sanitize_text_field( $input ); +} + +add_action( 'customize_controls_enqueue_scripts', 'generate_do_control_inline_scripts', 100 ); +/** + * Add misc inline scripts to our controls. + * + * We don't want to add these to the controls themselves, as they will be repeated + * each time the control is initialized. + * + * @since 2.0 + */ +function generate_do_control_inline_scripts() { + wp_localize_script( 'generatepress-typography-customizer', 'gp_customize', + array( + 'nonce' => wp_create_nonce( 'gp_customize_nonce' ) + ) + ); + + $number_of_fonts = apply_filters( 'generate_number_of_fonts', 200 ); + + wp_localize_script( + 'generatepress-typography-customizer', + 'generatePressTypography', + array( + 'googleFonts' => apply_filters( 'generate_typography_customize_list', generate_get_all_google_fonts( $number_of_fonts ) ) + ) + ); + + wp_localize_script( 'generatepress-typography-customizer', 'typography_defaults', generate_typography_default_fonts() ); + + wp_enqueue_script( 'generatepress-customizer-controls', trailingslashit( get_template_directory_uri() ) . 'inc/customizer/controls/js/customizer-controls.js', array( 'customize-controls', 'jquery' ), GENERATE_VERSION, true ); + wp_localize_script( 'generatepress-customizer-controls', 'generatepress_defaults', generate_get_defaults() ); + wp_localize_script( 'generatepress-customizer-controls', 'generatepress_color_defaults', generate_get_color_defaults() ); +} + +if ( ! function_exists( 'generate_customizer_live_preview' ) ) { + add_action( 'customize_preview_init', 'generate_customizer_live_preview', 100 ); + /** + * Add our live preview scripts + * + * @since 0.1 + */ + function generate_customizer_live_preview() { + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + wp_enqueue_script( 'generate-themecustomizer', trailingslashit( get_template_directory_uri() ) . 'inc/customizer/controls/js/customizer-live-preview.js', array( 'customize-preview' ), GENERATE_VERSION, true ); + + wp_localize_script( 'generate-themecustomizer', 'generatepress_live_preview', array( + 'mobile' => generate_get_media_query( 'mobile' ), + 'tablet' => generate_get_media_query( 'tablet' ), + 'desktop' => generate_get_media_query( 'desktop' ), + 'contentLeft' => absint( $spacing_settings['content_left'] ), + 'contentRight' => absint( $spacing_settings['content_right'] ), + ) ); + } +} + +/** + * Check to see if we have a logo or not. + * + * Used as an active callback. Calling has_custom_logo creates a PHP notice for + * multisite users. + * + * @since 2.0.1 + */ +function generate_has_custom_logo_callback() { + if ( get_theme_mod( 'custom_logo' ) ) { + return true; + } + + return false; +} + +/** + * Save our preset layout controls. These should always save to be "current". + * + * @since 2.2 + */ +function generate_sanitize_preset_layout( $input ) { + return 'current'; +} diff --git a/wp-content/themes/generatepress/inc/dashboard.php b/wp-content/themes/generatepress/inc/dashboard.php new file mode 100644 index 0000000..3c57a61 --- /dev/null +++ b/wp-content/themes/generatepress/inc/dashboard.php @@ -0,0 +1,367 @@ + +
            +
            +
            +
            + + +
            +
            + + + +
            +
            +
            + + + +
            +

            +
            + + +
            + %2$s', + esc_url( admin_url( 'customize.php' ) ), + esc_html__( 'Customize', 'generatepress' ) + ); + ?> +
            + + +
            + + array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#backgrounds', false ), + ), + 'Blog' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#blog', false ), + ), + 'Colors' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#colors', false ), + ), + 'Copyright' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#copyright', false ), + ), + 'Disable Elements' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#disable-elements', false ), + ), + 'Elements' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#elements', false ), + ), + 'Import / Export' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#import-export', false ), + ), + 'Menu Plus' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#menu-plus', false ), + ), + 'Secondary Nav' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#secondary-nav', false ), + ), + 'Sections' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#sections', false ), + ), + 'Site Library' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/site-library', false ), + ), + 'Spacing' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#spacing', false ), + ), + 'Typography' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#typography', false ), + ), + 'WooCommerce' => array( + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#woocommerce', false ), + ), + ); + + if ( ! defined( 'GP_PREMIUM_VERSION' ) ) : ?> +
            +

            +
            +
            + $info ) { ?> +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + array( + 'title' => __( 'Upload Logo', 'generatepress' ), + 'icon' => 'dashicons-format-image', + 'url' => admin_url( 'customize.php?autofocus[control]=custom_logo' ), + ), + 'typography' => array( + 'title' => __( 'Customize Fonts', 'generatepress' ), + 'icon' => 'dashicons-editor-textcolor', + 'url' => admin_url( $typography_section ), + ), + 'colors' => array( + 'title' => __( 'Customize Colors', 'generatepress' ), + 'icon' => 'dashicons-admin-customizer', + 'url' => admin_url( $colors_section ), + ), + 'layout' => array( + 'title' => __( 'Layout Options', 'generatepress' ), + 'icon' => 'dashicons-layout', + 'url' => admin_url( 'customize.php?autofocus[panel]=generate_layout_panel' ), + ), + 'all' => array( + 'title' => __( 'All Options', 'generatepress' ), + 'icon' => 'dashicons-admin-generic', + 'url' => admin_url( 'customize.php' ), + ), + ); + ?> +
            + +
            +
            +

            +
            +
              + $data ) { + printf( + '
            • %3$s
            • ', + esc_attr( $data['icon'] ), + esc_url( $data['url'] ), + esc_html( $data['title'] ) + ); + } + ?> +
            + +

            + +
            +
            + + + +
            +

            +
            +

            +
            +

            +

            + esc_js( $warning ) + ) + ); + ?> +

            + +
            + +
            +
            +
            +
            +
            + +
            +
            +
            + base ) { + return; + } + + if ( isset( $_GET['settings-updated'] ) && 'true' == $_GET['settings-updated'] ) { + add_settings_error( 'generate-notices', 'true', esc_html__( 'Settings saved.', 'generatepress' ), 'updated' ); + } + + if ( isset( $_GET['status'] ) && 'imported' == $_GET['status'] ) { + add_settings_error( 'generate-notices', 'imported', esc_html__( 'Import successful.', 'generatepress' ), 'updated' ); + } + + if ( isset( $_GET['status'] ) && 'reset' == $_GET['status'] ) { + add_settings_error( 'generate-notices', 'reset', esc_html__( 'Settings removed.', 'generatepress' ), 'updated' ); + } + + settings_errors( 'generate-notices' ); + } +} diff --git a/wp-content/themes/generatepress/inc/defaults.php b/wp-content/themes/generatepress/inc/defaults.php new file mode 100644 index 0000000..3b4b102 --- /dev/null +++ b/wp-content/themes/generatepress/inc/defaults.php @@ -0,0 +1,354 @@ + '', + 'hide_tagline' => '', + 'logo' => '', + 'inline_logo_site_branding' => false, + 'retina_logo' => '', + 'logo_width' => '', + 'top_bar_width' => 'full', + 'top_bar_inner_width' => 'contained', + 'top_bar_alignment' => 'right', + 'container_width' => '1100', + 'container_alignment' => 'boxes', + 'header_layout_setting' => 'fluid-header', + 'header_inner_width' => 'contained', + 'nav_alignment_setting' => ( is_rtl() ) ? 'right' : 'left', + 'header_alignment_setting' => ( is_rtl() ) ? 'right' : 'left', + 'nav_layout_setting' => 'fluid-nav', + 'nav_inner_width' => 'contained', + 'nav_position_setting' => 'nav-below-header', + 'nav_drop_point' => '', + 'nav_dropdown_type' => 'hover', + 'nav_dropdown_direction' => 'right', + 'nav_search' => 'disable', + 'content_layout_setting' => 'separate-containers', + 'layout_setting' => 'right-sidebar', + 'blog_layout_setting' => 'right-sidebar', + 'single_layout_setting' => 'right-sidebar', + 'post_content' => 'excerpt', + 'footer_layout_setting' => 'fluid-footer', + 'footer_inner_width' => 'contained', + 'footer_widget_setting' => '3', + 'footer_bar_alignment' => 'right', + 'back_to_top' => '', + 'background_color' => '#efefef', + 'text_color' => '#3a3a3a', + 'link_color' => '#1e73be', + 'link_color_hover' => '#000000', + 'link_color_visited' => '', + 'font_awesome_essentials' => true, + 'icons' => 'font', + 'combine_css' => true, + 'dynamic_css_cache' => true, + ) + ); + } +} + +if ( ! function_exists( 'generate_get_color_defaults' ) ) { + /** + * Set default options + */ + function generate_get_color_defaults() { + return apply_filters( 'generate_color_option_defaults', + array( + 'top_bar_background_color' => '#636363', + 'top_bar_text_color' => '#ffffff', + 'top_bar_link_color' => '#ffffff', + 'top_bar_link_color_hover' => '#303030', + 'header_background_color' => '#ffffff', + 'header_text_color' => '#3a3a3a', + 'header_link_color' => '#3a3a3a', + 'header_link_hover_color' => '', + 'site_title_color' => '#222222', + 'site_tagline_color' => '#757575', + 'navigation_background_color' => '#222222', + 'navigation_text_color' => '#ffffff', + 'navigation_background_hover_color' => '#3f3f3f', + 'navigation_text_hover_color' => '#ffffff', + 'navigation_background_current_color' => '#3f3f3f', + 'navigation_text_current_color' => '#ffffff', + 'subnavigation_background_color' => '#3f3f3f', + 'subnavigation_text_color' => '#ffffff', + 'subnavigation_background_hover_color' => '#4f4f4f', + 'subnavigation_text_hover_color' => '#ffffff', + 'subnavigation_background_current_color' => '#4f4f4f', + 'subnavigation_text_current_color' => '#ffffff', + 'navigation_search_background_color' => '', + 'navigation_search_text_color' => '', + 'content_background_color' => '#ffffff', + 'content_text_color' => '', + 'content_link_color' => '', + 'content_link_hover_color' => '', + 'content_title_color' => '', + 'blog_post_title_color' => '', + 'blog_post_title_hover_color' => '', + 'entry_meta_text_color' => '#595959', + 'entry_meta_link_color' => '#595959', + 'entry_meta_link_color_hover' => '#1e73be', + 'h1_color' => '', + 'h2_color' => '', + 'h3_color' => '', + 'h4_color' => '', + 'h5_color' => '', + 'h6_color' => '', + 'sidebar_widget_background_color' => '#ffffff', + 'sidebar_widget_text_color' => '', + 'sidebar_widget_link_color' => '', + 'sidebar_widget_link_hover_color' => '', + 'sidebar_widget_title_color' => '#000000', + 'footer_widget_background_color' => '#ffffff', + 'footer_widget_text_color' => '', + 'footer_widget_link_color' => '', + 'footer_widget_link_hover_color' => '', + 'footer_widget_title_color' => '#000000', + 'footer_background_color' => '#222222', + 'footer_text_color' => '#ffffff', + 'footer_link_color' => '#ffffff', + 'footer_link_hover_color' => '#606060', + 'form_background_color' => '#fafafa', + 'form_text_color' => '#666666', + 'form_background_color_focus' => '#ffffff', + 'form_text_color_focus' => '#666666', + 'form_border_color' => '#cccccc', + 'form_border_color_focus' => '#bfbfbf', + 'form_button_background_color' => '#666666', + 'form_button_background_color_hover' => '#3f3f3f', + 'form_button_text_color' => '#ffffff', + 'form_button_text_color_hover' => '#ffffff', + 'back_to_top_background_color' => 'rgba( 0,0,0,0.4 )', + 'back_to_top_background_color_hover' => 'rgba( 0,0,0,0.6 )', + 'back_to_top_text_color' => '#ffffff', + 'back_to_top_text_color_hover' => '#ffffff', + ) + ); + } +} + +if ( ! function_exists( 'generate_get_default_fonts' ) ) { + /** + * Set default options. + * + * @since 0.1 + * + * @param bool $filter Whether to return the filtered values or original values. + * @return array Option defaults. + */ + function generate_get_default_fonts( $filter = true ) { + $defaults = array( + 'font_body' => 'System Stack', + 'font_body_category' => '', + 'font_body_variants' => '', + 'body_font_weight' => 'normal', + 'body_font_transform' => 'none', + 'body_font_size' => '17', + 'body_line_height' => '1.5', // no unit + 'paragraph_margin' => '1.5', // em + 'font_top_bar' => 'inherit', + 'font_top_bar_category' => '', + 'font_top_bar_variants' => '', + 'top_bar_font_weight' => 'normal', + 'top_bar_font_transform' => 'none', + 'top_bar_font_size' => '13', + 'font_site_title' => 'inherit', + 'font_site_title_category' => '', + 'font_site_title_variants' => '', + 'site_title_font_weight' => 'bold', + 'site_title_font_transform' => 'none', + 'site_title_font_size' => '45', + 'mobile_site_title_font_size' => '30', + 'font_site_tagline' => 'inherit', + 'font_site_tagline_category' => '', + 'font_site_tagline_variants' => '', + 'site_tagline_font_weight' => 'normal', + 'site_tagline_font_transform' => 'none', + 'site_tagline_font_size' => '15', + 'font_navigation' => 'inherit', + 'font_navigation_category' => '', + 'font_navigation_variants' => '', + 'navigation_font_weight' => 'normal', + 'navigation_font_transform' => 'none', + 'navigation_font_size' => '15', + 'font_widget_title' => 'inherit', + 'font_widget_title_category' => '', + 'font_widget_title_variants' => '', + 'widget_title_font_weight' => 'normal', + 'widget_title_font_transform' => 'none', + 'widget_title_font_size' => '20', + 'widget_title_separator' => '30', + 'widget_content_font_size' => '17', + 'font_buttons' => 'inherit', + 'font_buttons_category' => '', + 'font_buttons_variants' => '', + 'buttons_font_weight' => 'normal', + 'buttons_font_transform' => 'none', + 'buttons_font_size' => '', + 'font_heading_1' => 'inherit', + 'font_heading_1_category' => '', + 'font_heading_1_variants' => '', + 'heading_1_weight' => '300', + 'heading_1_transform' => 'none', + 'heading_1_font_size' => '40', + 'heading_1_line_height' => '1.2', // em + 'heading_1_margin_bottom' => '20', + 'mobile_heading_1_font_size' => '30', + 'font_heading_2' => 'inherit', + 'font_heading_2_category' => '', + 'font_heading_2_variants' => '', + 'heading_2_weight' => '300', + 'heading_2_transform' => 'none', + 'heading_2_font_size' => '30', + 'heading_2_line_height' => '1.2', // em + 'heading_2_margin_bottom' => '20', + 'mobile_heading_2_font_size' => '25', + 'font_heading_3' => 'inherit', + 'font_heading_3_category' => '', + 'font_heading_3_variants' => '', + 'heading_3_weight' => 'normal', + 'heading_3_transform' => 'none', + 'heading_3_font_size' => '20', + 'heading_3_line_height' => '1.2', // em + 'heading_3_margin_bottom' => '20', + 'font_heading_4' => 'inherit', + 'font_heading_4_category' => '', + 'font_heading_4_variants' => '', + 'heading_4_weight' => 'normal', + 'heading_4_transform' => 'none', + 'heading_4_font_size' => '', + 'heading_4_line_height' => '', // em + 'font_heading_5' => 'inherit', + 'font_heading_5_category' => '', + 'font_heading_5_variants' => '', + 'heading_5_weight' => 'normal', + 'heading_5_transform' => 'none', + 'heading_5_font_size' => '', + 'heading_5_line_height' => '', // em + 'font_heading_6' => 'inherit', + 'font_heading_6_category' => '', + 'font_heading_6_variants' => '', + 'heading_6_weight' => 'normal', + 'heading_6_transform' => 'none', + 'heading_6_font_size' => '', + 'heading_6_line_height' => '', // em + 'font_footer' => 'inherit', + 'font_footer_category' => '', + 'font_footer_variants' => '', + 'footer_weight' => 'normal', + 'footer_transform' => 'none', + 'footer_font_size' => '15', + ); + + if ( $filter ) { + return apply_filters( 'generate_font_option_defaults', $defaults ); + } + + return $defaults; + } +} + +if ( ! function_exists( 'generate_spacing_get_defaults' ) ) { + /** + * Set the default options. + * + * @since 0.1 + * + * @param bool $filter Whether to return the filtered values or original values. + * @return array Option defaults. + */ + function generate_spacing_get_defaults( $filter = true ) { + $defaults = array( + 'top_bar_top' => '10', + 'top_bar_right' => '10', + 'top_bar_bottom' => '10', + 'top_bar_left' => '10', + 'header_top' => '40', + 'header_right' => '40', + 'header_bottom' => '40', + 'header_left' => '40', + 'menu_item' => '20', + 'menu_item_height' => '60', + 'sub_menu_item_height' => '10', + 'sub_menu_width' => '200', + 'content_top' => '40', + 'content_right' => '40', + 'content_bottom' => '40', + 'content_left' => '40', + 'mobile_content_top' => '30', + 'mobile_content_right' => '30', + 'mobile_content_bottom' => '30', + 'mobile_content_left' => '30', + 'separator' => '20', + 'mobile_separator' => '', + 'left_sidebar_width' => '25', + 'right_sidebar_width' => '25', + 'widget_top' => '40', + 'widget_right' => '40', + 'widget_bottom' => '40', + 'widget_left' => '40', + 'footer_widget_container_top' => '40', + 'footer_widget_container_right' => '40', + 'footer_widget_container_bottom' => '40', + 'footer_widget_container_left' => '40', + 'footer_widget_separator' => '40', + 'footer_top' => '20', + 'footer_right' => '20', + 'footer_bottom' => '20', + 'footer_left' => '20', + ); + + if ( $filter ) { + return apply_filters( 'generate_spacing_option_defaults', $defaults ); + } + + return $defaults; + } +} + +if ( ! function_exists( 'generate_typography_default_fonts' ) ) { + /** + * Set the default system fonts. + * + * @since 1.3.40 + */ + function generate_typography_default_fonts() { + $fonts = array( + 'inherit', + 'System Stack', + 'Arial, Helvetica, sans-serif', + 'Century Gothic', + 'Comic Sans MS', + 'Courier New', + 'Georgia, Times New Roman, Times, serif', + 'Helvetica', + 'Impact', + 'Lucida Console', + 'Lucida Sans Unicode', + 'Palatino Linotype', + 'Segoe UI, Helvetica Neue, Helvetica, sans-serif', + 'Tahoma, Geneva, sans-serif', + 'Trebuchet MS, Helvetica, sans-serif', + 'Verdana, Geneva, sans-serif', + ); + + return apply_filters( 'generate_typography_default_fonts', $fonts ); + } +} diff --git a/wp-content/themes/generatepress/inc/deprecated.php b/wp-content/themes/generatepress/inc/deprecated.php new file mode 100644 index 0000000..450d59b --- /dev/null +++ b/wp-content/themes/generatepress/inc/deprecated.php @@ -0,0 +1,712 @@ + apply_filters( 'generate_pagination_mid_size', 1 ), + 'prev_text' => __( '← Previous', 'generatepress' ), + 'next_text' => __( 'Next →', 'generatepress' ) + ) ); + } + } +} + +if ( ! function_exists( 'generate_additional_spacing' ) ) { + /** + * Add fallback CSS for our mobile search icon color + * @deprecated 1.3.47 + */ + function generate_additional_spacing() { + // No longer needed + } +} + +if ( ! function_exists( 'generate_mobile_search_spacing_fallback_css' ) ) { + /** + * Enqueue our mobile search icon color fallback CSS + * @deprecated 1.3.47 + */ + function generate_mobile_search_spacing_fallback_css() { + // No longer needed + } +} + +if ( ! function_exists( 'generate_addons_available' ) ) { + /** + * Check to see if there's any addons not already activated + * @since 1.0.9 + * @deprecated 1.3.47 + */ + function generate_addons_available() { + if ( defined( 'GP_PREMIUM_VERSION' ) ) { + return false; + } + } +} + +if ( ! function_exists( 'generate_no_addons' ) ) { + /** + * Check to see if no addons are activated + * @since 1.0.9 + * @deprecated 1.3.47 + */ + function generate_no_addons() { + if ( defined( 'GP_PREMIUM_VERSION' ) ) { + return false; + } + } +} + +if ( ! function_exists( 'generate_get_min_suffix' ) ) { + /** + * Figure out if we should use minified scripts or not + * @since 1.3.29 + * @deprecated 2.0 + */ + function generate_get_min_suffix() { + return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + } +} + +if ( ! function_exists( 'generate_add_layout_meta_box' ) ) { + function generate_add_layout_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_register_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_show_layout_meta_box' ) ) { + function generate_show_layout_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_do_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_save_layout_meta' ) ) { + function generate_save_layout_meta() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_save_layout_meta_data()' ); + } +} + +if ( ! function_exists( 'generate_add_footer_widget_meta_box' ) ) { + function generate_add_footer_widget_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_register_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_show_footer_widget_meta_box' ) ) { + function generate_show_footer_widget_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_do_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_save_footer_widget_meta' ) ) { + function generate_save_footer_widget_meta() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_save_layout_meta_data()' ); + } +} + +if ( ! function_exists( 'generate_add_page_builder_meta_box' ) ) { + function generate_add_page_builder_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_register_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_show_page_builder_meta_box' ) ) { + function generate_show_page_builder_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_do_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_save_page_builder_meta' ) ) { + function generate_save_page_builder_meta() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_save_layout_meta_data()' ); + } +} + +if ( ! function_exists( 'generate_add_de_meta_box' ) ) { + function generate_add_de_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_register_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_show_de_meta_box' ) ) { + function generate_show_de_meta_box() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_do_layout_meta_box()' ); + } +} + +if ( ! function_exists( 'generate_save_de_meta' ) ) { + function generate_save_de_meta() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_save_layout_meta_data()' ); + } +} + +if ( ! function_exists( 'generate_add_base_inline_css' ) ) { + function generate_add_base_inline_css() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_enqueue_dynamic_css()' ); + } +} + +if ( ! function_exists( 'generate_color_scripts' ) ) { + function generate_color_scripts() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_enqueue_dynamic_css()' ); + } +} + +if ( ! function_exists( 'generate_typography_scripts' ) ) { + function generate_typography_scripts() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_enqueue_dynamic_css()' ); + } +} + +if ( ! function_exists( 'generate_spacing_scripts' ) ) { + function generate_spacing_scripts() { + _deprecated_function( __FUNCTION__, '2.0', 'generate_enqueue_dynamic_css()' ); + } +} + +if ( ! function_exists( 'generate_get_setting' ) ) { + /** + * A wrapper function to get our settings. + * + * @since 1.3.40 + * + * @param string $option The option name to look up. + * @return string The option value. + * @todo Ability to specify different option name and defaults. + */ + function generate_get_setting( $setting ) { + return generate_get_option( $setting ); + } +} +if ( ! function_exists( 'generate_right_sidebar_class' ) ) { + /** + * Display the classes for the sidebar. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_right_sidebar_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_right_sidebar_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_right_sidebar_class' ) ) { + /** + * Retrieve the classes for the sidebar. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_right_sidebar_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_right_sidebar_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_left_sidebar_class' ) ) { + /** + * Display the classes for the sidebar. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_left_sidebar_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_left_sidebar_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_left_sidebar_class' ) ) { + /** + * Retrieve the classes for the sidebar. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_left_sidebar_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_left_sidebar_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_content_class' ) ) { + /** + * Display the classes for the content. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_content_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_content_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_content_class' ) ) { + /** + * Retrieve the classes for the content. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_content_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_content_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_header_class' ) ) { + /** + * Display the classes for the header. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_header_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_header_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_header_class' ) ) { + /** + * Retrieve the classes for the content. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_header_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_header_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_inside_header_class' ) ) { + /** + * Display the classes for inside the header. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_inside_header_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_inside_header_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_inside_header_class' ) ) { + /** + * Retrieve the classes for inside the header. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_inside_header_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_inside_header_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_container_class' ) ) { + /** + * Display the classes for the container. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_container_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_container_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_container_class' ) ) { + /** + * Retrieve the classes for the content. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_container_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_container_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_navigation_class' ) ) { + /** + * Display the classes for the navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_navigation_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_navigation_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_navigation_class' ) ) { + /** + * Retrieve the classes for the navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_navigation_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_navigation_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_inside_navigation_class' ) ) { + /** + * Display the classes for the inner navigation. + * + * @since 1.3.41 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_inside_navigation_class( $class = '' ) { + $classes = array(); + + 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( 'generate_inside_navigation_class', $classes, $class ); + + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', $return ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_menu_class' ) ) { + /** + * Display the classes for the navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_menu_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_menu_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_menu_class' ) ) { + /** + * Retrieve the classes for the navigation. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_menu_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_menu_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_main_class' ) ) { + /** + * Display the classes for the
            container. + * + * @since 1.1.0 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_main_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_main_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_main_class' ) ) { + /** + * Retrieve the classes for the footer. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_main_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_main_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_footer_class' ) ) { + /** + * Display the classes for the footer. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_footer_class( $class = '' ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', generate_get_footer_class( $class ) ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_get_footer_class' ) ) { + /** + * Retrieve the classes for the footer. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ + function generate_get_footer_class( $class = '' ) { + + $classes = array(); + + 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( 'generate_footer_class', $classes, $class ); + } +} + +if ( ! function_exists( 'generate_inside_footer_class' ) ) { + /** + * Display the classes for the footer. + * + * @since 0.1 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_inside_footer_class( $class = '' ) { + $classes = array(); + + 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( 'generate_inside_footer_class', $classes, $class ); + + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', $return ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_top_bar_class' ) ) { + /** + * Display the classes for the top bar. + * + * @since 1.3.45 + * @param string|array $class One or more classes to add to the class list. + */ + function generate_top_bar_class( $class = '' ) { + $classes = array(); + + 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( 'generate_top_bar_class', $classes, $class ); + + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', $return ) . '"'; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_body_schema' ) ) { + /** + * Figure out which schema tags to apply to the element. + * + * @since 1.3.15 + */ + function generate_body_schema() { + // Set up blog variable + $blog = ( is_home() || is_archive() || is_attachment() || is_tax() || is_single() ) ? true : false; + + // Set up default itemtype + $itemtype = 'WebPage'; + + // Get itemtype for the blog + $itemtype = ( $blog ) ? 'Blog' : $itemtype; + + // Get itemtype for search results + $itemtype = ( is_search() ) ? 'SearchResultsPage' : $itemtype; + + // Get the result + $result = esc_html( apply_filters( 'generate_body_itemtype', $itemtype ) ); + + // Return our HTML + echo "itemtype='https://schema.org/$result' itemscope='itemscope'"; // WPCS: XSS ok, sanitization ok. + } +} + +if ( ! function_exists( 'generate_article_schema' ) ) { + /** + * Figure out which schema tags to apply to the
            element + * The function determines the itemtype: generate_article_schema( 'BlogPosting' ) + * @since 1.3.15 + */ + function generate_article_schema( $type = 'CreativeWork' ) { + // Get the itemtype + $itemtype = esc_html( apply_filters( 'generate_article_itemtype', $type ) ); + + // Print the results + echo "itemtype='https://schema.org/$itemtype' itemscope='itemscope'"; // WPCS: XSS ok, sanitization ok. + } +} diff --git a/wp-content/themes/generatepress/inc/general.php b/wp-content/themes/generatepress/inc/general.php new file mode 100644 index 0000000..624ac3b --- /dev/null +++ b/wp-content/themes/generatepress/inc/general.php @@ -0,0 +1,350 @@ + esc_attr__( 'Open Search Bar', 'generatepress' ), + 'close' => esc_attr__( 'Close Search Bar', 'generatepress' ), + ) + ); + } + + if ( 'enable' === generate_get_option( 'back_to_top' ) ) { + wp_enqueue_script( 'generate-back-to-top', $dir_uri . "/js/back-to-top{$suffix}.js", array(), GENERATE_VERSION, true ); + } + + if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { + wp_enqueue_script( 'comment-reply' ); + } + } +} + +if ( ! function_exists( 'generate_widgets_init' ) ) { + add_action( 'widgets_init', 'generate_widgets_init' ); + /** + * Register widgetized area and update sidebar with default widgets + */ + function generate_widgets_init() { + $widgets = array( + 'sidebar-1' => __( 'Right Sidebar', 'generatepress' ), + 'sidebar-2' => __( 'Left Sidebar', 'generatepress' ), + 'header' => __( 'Header', 'generatepress' ), + 'footer-1' => __( 'Footer Widget 1', 'generatepress' ), + 'footer-2' => __( 'Footer Widget 2', 'generatepress' ), + 'footer-3' => __( 'Footer Widget 3', 'generatepress' ), + 'footer-4' => __( 'Footer Widget 4', 'generatepress' ), + 'footer-5' => __( 'Footer Widget 5', 'generatepress' ), + 'footer-bar' => __( 'Footer Bar','generatepress' ), + 'top-bar' => __( 'Top Bar','generatepress' ), + ); + + foreach ( $widgets as $id => $name ) { + register_sidebar( array( + 'name' => $name, + 'id' => $id, + 'before_widget' => '', + 'before_title' => apply_filters( 'generate_start_widget_title', '

            ' ), + 'after_title' => apply_filters( 'generate_end_widget_title', '

            ' ), + ) ); + } + } +} + +if ( ! function_exists( 'generate_smart_content_width' ) ) { + add_action( 'wp', 'generate_smart_content_width' ); + /** + * Set the $content_width depending on layout of current page + * Hook into "wp" so we have the correct layout setting from generate_get_layout() + * Hooking into "after_setup_theme" doesn't get the correct layout setting + */ + function generate_smart_content_width() { + global $content_width; + + $container_width = generate_get_option( 'container_width' ); + $right_sidebar_width = apply_filters( 'generate_right_sidebar_width', '25' ); + $left_sidebar_width = apply_filters( 'generate_left_sidebar_width', '25' ); + $layout = generate_get_layout(); + + if ( 'left-sidebar' == $layout ) { + $content_width = $container_width * ( ( 100 - $left_sidebar_width ) / 100 ); + } elseif ( 'right-sidebar' == $layout ) { + $content_width = $container_width * ( ( 100 - $right_sidebar_width ) / 100 ); + } elseif ( 'no-sidebar' == $layout ) { + $content_width = $container_width; + } else { + $content_width = $container_width * ( ( 100 - ( $left_sidebar_width + $right_sidebar_width ) ) / 100 ); + } + } +} + +if ( ! function_exists( 'generate_page_menu_args' ) ) { + add_filter( 'wp_page_menu_args', 'generate_page_menu_args' ); + /** + * Get our wp_nav_menu() fallback, wp_page_menu(), to show a home link. + * + * @since 0.1 + * + * @param array $args The existing menu args. + * @return array Menu args. + */ + function generate_page_menu_args( $args ) { + $args['show_home'] = true; + + return $args; + } +} + +if ( ! function_exists( 'generate_disable_title' ) ) { + add_filter( 'generate_show_title', 'generate_disable_title' ); + /** + * Remove our title if set. + * + * @since 1.3.18 + * + * @param bool $title Whether the title is displayed or not. + * @return bool Whether to display the content title. + */ + function generate_disable_title( $title ) { + if ( is_singular() ) { + $disable_title = get_post_meta( get_the_ID(), '_generate-disable-headline', true ); + + if ( $disable_title ) { + $title = false; + } + } + + return $title; + } +} + +if ( ! function_exists( 'generate_resource_hints' ) ) { + add_filter( 'wp_resource_hints', 'generate_resource_hints', 10, 2 ); + /** + * Add resource hints to our Google fonts call. + * + * @since 1.3.42 + * + * @param array $urls URLs to print for resource hints. + * @param string $relation_type The relation type the URLs are printed. + * @return array $urls URLs to print for resource hints. + */ + function generate_resource_hints( $urls, $relation_type ) { + if ( wp_style_is( 'generate-fonts', 'queue' ) && 'preconnect' === $relation_type ) { + if ( version_compare( $GLOBALS['wp_version'], '4.7-alpha', '>=' ) ) { + $urls[] = array( + 'href' => 'https://fonts.gstatic.com', + 'crossorigin', + ); + } else { + $urls[] = 'https://fonts.gstatic.com'; + } + } + + return $urls; + } +} + +if ( ! function_exists( 'generate_remove_caption_padding' ) ) { + add_filter( 'img_caption_shortcode_width', 'generate_remove_caption_padding' ); + /** + * Remove WordPress's default padding on images with captions + * + * @param int $width Default WP .wp-caption width (image width + 10px) + * @return int Updated width to remove 10px padding + */ + function generate_remove_caption_padding( $width ) { + return $width - 10; + } +} + +if ( ! function_exists( 'generate_enhanced_image_navigation' ) ) { + add_filter( 'attachment_link', 'generate_enhanced_image_navigation', 10, 2 ); + /** + * Filter in a link to a content ID attribute for the next/previous image links on image attachment pages + */ + function generate_enhanced_image_navigation( $url, $id ) { + if ( ! is_attachment() && ! wp_attachment_is_image( $id ) ) { + return $url; + } + + $image = get_post( $id ); + if ( ! empty( $image->post_parent ) && $image->post_parent != $id ) { + $url .= '#main'; + } + + return $url; + } +} + +if ( ! function_exists( 'generate_categorized_blog' ) ) { + /** + * Determine whether blog/site has more than one category. + * + * @since 1.2.5 + * + * @return bool True of there is more than one category, false otherwise. + */ + function generate_categorized_blog() { + if ( false === ( $all_the_cool_cats = get_transient( 'generate_categories' ) ) ) { + // Create an array of all the categories that are attached to posts. + $all_the_cool_cats = get_categories( array( + 'fields' => 'ids', + 'hide_empty' => 1, + + // We only need to know if there is more than one category. + 'number' => 2, + ) ); + + // Count the number of categories that are attached to the posts. + $all_the_cool_cats = count( $all_the_cool_cats ); + + set_transient( 'generate_categories', $all_the_cool_cats ); + } + + if ( $all_the_cool_cats > 1 ) { + // This blog has more than 1 category so twentyfifteen_categorized_blog should return true. + return true; + } else { + // This blog has only 1 category so twentyfifteen_categorized_blog should return false. + return false; + } + } +} + +if ( ! function_exists( 'generate_category_transient_flusher' ) ) { + add_action( 'edit_category', 'generate_category_transient_flusher' ); + add_action( 'save_post', 'generate_category_transient_flusher' ); + /** + * Flush out the transients used in {@see generate_categorized_blog()}. + * + * @since 1.2.5 + */ + function generate_category_transient_flusher() { + // Like, beat it. Dig? + delete_transient( 'generate_categories' ); + } +} + +if ( ! function_exists( 'generate_get_default_color_palettes' ) ) { + /** + * Set up our colors for the color picker palettes and filter them so you can change them. + * + * @since 1.3.42 + */ + function generate_get_default_color_palettes() { + $palettes = array( + '#000000', + '#FFFFFF', + '#F1C40F', + '#E74C3C', + '#1ABC9C', + '#1e72bd', + '#8E44AD', + '#00CC77', + ); + + return apply_filters( 'generate_default_color_palettes', $palettes ); + } +} + +add_filter( 'generate_fontawesome_essentials', 'generate_set_font_awesome_essentials' ); +/** + * Check to see if we should include the full Font Awesome library or not. + * + * @since 2.0 + * + * @param bool $essentials + * @return bool + */ +function generate_set_font_awesome_essentials( $essentials ) { + if ( generate_get_option( 'font_awesome_essentials' ) ) { + return true; + } + + return $essentials; +} + +add_filter( 'generate_dynamic_css_skip_cache', 'generate_skip_dynamic_css_cache' ); +/** + * Skips caching of the dynamic CSS if set to false. + * + * @since 2.0 + * + * @param bool $cache + * @return bool + */ +function generate_skip_dynamic_css_cache( $cache ) { + if ( ! generate_get_option( 'dynamic_css_cache' ) ) { + return true; + } + + return $cache; +} + +add_filter( 'wp_headers', 'generate_set_wp_headers' ); +/** + * Set any necessary headers. + * + * @since 2.3 + */ +function generate_set_wp_headers( $headers ) { + $headers['X-UA-Compatible'] = 'IE=edge'; + + return $headers; +} diff --git a/wp-content/themes/generatepress/inc/markup.php b/wp-content/themes/generatepress/inc/markup.php new file mode 100644 index 0000000..fc48d70 --- /dev/null +++ b/wp-content/themes/generatepress/inc/markup.php @@ -0,0 +1,565 @@ + element + * @since 1.1.0 + */ + function generate_main_classes( $classes ) { + $classes[] = 'site-main'; + + return $classes; + } +} + +if ( ! function_exists( 'generate_post_classes' ) ) { + add_filter( 'post_class', 'generate_post_classes' ); + /** + * Adds custom classes to the
            element. + * Remove .hentry class from pages to comply with structural data guidelines. + * + * @since 1.3.39 + */ + function generate_post_classes( $classes ) { + if ( 'page' == get_post_type() ) { + $classes = array_diff( $classes, array( 'hentry' ) ); + } + + return $classes; + } +} diff --git a/wp-content/themes/generatepress/inc/meta-box.php b/wp-content/themes/generatepress/inc/meta-box.php new file mode 100644 index 0000000..23fdccd --- /dev/null +++ b/wp-content/themes/generatepress/inc/meta-box.php @@ -0,0 +1,315 @@ + true ) ); + $screen = get_current_screen(); + $post_type = $screen->id; + + if ( in_array( $post_type, ( array ) $post_types ) ) { + wp_enqueue_style( 'generate-layout-metabox', get_template_directory_uri() . '/css/admin/meta-box.css', array(), GENERATE_VERSION ); + } + } +} + +add_action( 'add_meta_boxes', 'generate_register_layout_meta_box' ); +/** + * Generate the layout metabox + * + * @since 2.0 + */ +function generate_register_layout_meta_box() { + if ( ! current_user_can( apply_filters( 'generate_metabox_capability', 'edit_theme_options' ) ) ) { + return; + } + + if ( ! defined( 'GENERATE_LAYOUT_META_BOX' ) ) { + define( 'GENERATE_LAYOUT_META_BOX', true ); + } + + $post_types = get_post_types( array( 'public' => true ) ); + + foreach ( $post_types as $type ) { + if ( 'attachment' !== $type ) { + add_meta_box( + 'generate_layout_options_meta_box', + esc_html__( 'Layout', 'generatepress' ), + 'generate_do_layout_meta_box', + $type, + 'side' + ); + } + } +} + +/** + * Build our meta box. + * + * @since 2.0 + * + * @param object $post All post information. + */ +function generate_do_layout_meta_box( $post ) { + wp_nonce_field( basename( __FILE__ ), 'generate_layout_nonce' ); + $stored_meta = (array) get_post_meta( $post->ID ); + $stored_meta['_generate-sidebar-layout-meta'][0] = ( isset( $stored_meta['_generate-sidebar-layout-meta'][0] ) ) ? $stored_meta['_generate-sidebar-layout-meta'][0] : ''; + $stored_meta['_generate-footer-widget-meta'][0] = ( isset( $stored_meta['_generate-footer-widget-meta'][0] ) ) ? $stored_meta['_generate-footer-widget-meta'][0] : ''; + $stored_meta['_generate-full-width-content'][0] = ( isset( $stored_meta['_generate-full-width-content'][0] ) ) ? $stored_meta['_generate-full-width-content'][0] : ''; + $stored_meta['_generate-disable-headline'][0] = ( isset( $stored_meta['_generate-disable-headline'][0] ) ) ? $stored_meta['_generate-disable-headline'][0] : ''; + + $tabs = apply_filters( 'generate_metabox_tabs', + array( + 'sidebars' => array( + 'title' => esc_html__( 'Sidebars', 'generatepress' ), + 'target' => '#generate-layout-sidebars', + 'class' => 'current', + ), + 'footer_widgets' => array( + 'title' => esc_html__( 'Footer Widgets', 'generatepress' ), + 'target' => '#generate-layout-footer-widgets', + 'class' => '', + ), + 'disable_elements' => array( + 'title' => esc_html__( 'Disable Elements', 'generatepress' ), + 'target' => '#generate-layout-disable-elements', + 'class' => '', + ), + 'container' => array( + 'title' => esc_html__( 'Page Builder Container', 'generatepress' ), + 'target' => '#generate-layout-page-builder-container', + 'class' => '', + ), + ) + ); + ?> + +
            + +
            +
            +
            + + + + + + + + + + + + + +
            +
            + + + + +
            +
            + 'Open Sans', + ) + ); + + $category = get_theme_mod( 'font_body_category', 'sans-serif' ); + $variants = get_theme_mod( 'font_body_variants', '300,300italic,regular,italic,600,600italic,700,700italic,800,800italic' ); + + if ( 'Open Sans' == $generate_settings['font_body'] ) { + $new_settings['font_body'] = 'Open Sans'; + set_theme_mod( 'font_body_category', $category ); + set_theme_mod( 'font_body_variants', $variants ); + } + } + + // Set blog post content to full content if it hasn't been set otherwise. + if ( ! isset( $migration_settings['blog_post_content_preview'] ) || 'true' !== $migration_settings['blog_post_content_preview'] ) { + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + array( + 'post_content' => 'full', + ) + ); + + if ( 'full' === $generate_settings['post_content'] ) { + $new_settings['post_content'] = 'full'; + } + } + + } + + // Set our flags. + if ( ! isset( $migration_settings['font_awesome_essentials_updated'] ) || 'true' !== $migration_settings['font_awesome_essentials_updated'] ) { + $migrated_flags['font_awesome_essentials_updated'] = 'true'; + } + + if ( ! isset( $migration_settings['skip_dynamic_css_cache'] ) || 'true' !== $migration_settings['skip_dynamic_css_cache'] ) { + $migrated_flags['skip_dynamic_css_cache'] = 'true'; + } + + if ( ! isset( $migration_settings['default_font_updated'] ) || 'true' !== $migration_settings['default_font_updated'] ) { + $migrated_flags['default_font_updated'] = 'true'; + } + + if ( ! isset( $migration_settings['blog_post_content_preview'] ) || 'true' !== $migration_settings['blog_post_content_preview'] ) { + $migrated_flags['blog_post_content_preview'] = 'true'; + } + + // Merge our new settings with our existing settings. + if ( ! empty( $new_settings ) ) { + $update_settings = wp_parse_args( $new_settings, $settings ); + update_option( 'generate_settings', $update_settings ); + } + + // Set our migrated setting flags. + if ( ! empty( $migrated_flags ) ) { + $update_migration_flags = wp_parse_args( $migrated_flags, $migration_settings ); + update_option( 'generate_migration_settings', $update_migration_flags ); + } +} diff --git a/wp-content/themes/generatepress/inc/plugin-compat.php b/wp-content/themes/generatepress/inc/plugin-compat.php new file mode 100644 index 0000000..c315e7a --- /dev/null +++ b/wp-content/themes/generatepress/inc/plugin-compat.php @@ -0,0 +1,268 @@ + +
            > +
            > + +
            > +
            + +
            + +
            + +
            +
            + +
            +
            + post_date ); + if ( $post_date < $compare_date ) { + $css = '.fl-builder.no-sidebar .container.grid-container { + max-width: 100%; + } + + .fl-builder.one-container.no-sidebar .site-content { + padding:0; + }'; + $css = str_replace( array( "\r", "\n", "\t" ), '', $css ); + wp_add_inline_style( 'generate-style', $css ); + } + } + } +} diff --git a/wp-content/themes/generatepress/inc/structure/archives.php b/wp-content/themes/generatepress/inc/structure/archives.php new file mode 100644 index 0000000..209cb9f --- /dev/null +++ b/wp-content/themes/generatepress/inc/structure/archives.php @@ -0,0 +1,116 @@ + +
            + + +

            + +

            + + +
            + %2$s', + get_avatar( get_the_author_meta( 'ID' ), 75 ), + get_the_author() + ); + /* + * Since we called the_post() above, we need to + * rewind the loop back to the beginning that way + * we can run the loop properly, in full. + */ + rewind_posts(); + } + + return $title; + + } +} + +add_action( 'generate_after_archive_title', 'generate_do_archive_description' ); +/** + * Output the archive description. + * + * @since 2.3 + */ +function generate_do_archive_description() { + $term_description = term_description(); + + if ( ! empty( $term_description ) ) { + printf( '
            %s
            ', $term_description ); // WPCS: XSS ok, sanitization ok. + } + + if ( get_the_author_meta( 'description' ) && is_author() ) { + echo '
            ' . get_the_author_meta( 'description' ) . '
            '; // WPCS: XSS ok, sanitization ok. + } + + /** + * generate_after_archive_description hook. + * + * @since 0.1 + */ + do_action( 'generate_after_archive_description' ); +} diff --git a/wp-content/themes/generatepress/inc/structure/comments.php b/wp-content/themes/generatepress/inc/structure/comments.php new file mode 100644 index 0000000..84df2d2 --- /dev/null +++ b/wp-content/themes/generatepress/inc/structure/comments.php @@ -0,0 +1,161 @@ +comment_type || 'trackback' == $comment->comment_type ) : ?> + +
          • > +
            + ', '' ); ?> +
            + + + +
          • > +
            > +
            + +
            +
            > + %s', get_comment_author_link() ); ?> +
            + + +
            + + comment_approved ) : ?> +

            + +
            + +
            + +
            +
            + 'div-comment', + 'depth' => $depth, + 'max_depth' => $args['max_depth'], + 'before' => '', + 'after' => '', + ) ) ); +} + +add_filter( 'comment_form_defaults', 'generate_set_comment_form_defaults' ); +/** + * Set the default settings for our comments. + * + * @since 2.3 + * + * @param array $defaults + * @return array + */ +function generate_set_comment_form_defaults( $defaults ) { + $defaults['comment_field'] = sprintf( + '

            ', + esc_html__( 'Comment', 'generatepress' ) + ); + + $defaults['comment_notes_before'] = null; + $defaults['comment_notes_after'] = null; + $defaults['id_form'] = 'commentform'; + $defaults['id_submit'] = 'submit'; + $defaults['title_reply'] = apply_filters( 'generate_leave_comment', __( 'Leave a Comment', 'generatepress' ) ); + $defaults['label_submit'] = apply_filters( 'generate_post_comment', __( 'Post Comment', 'generatepress' ) ); + + return $defaults; +} + +add_filter( 'comment_form_default_fields', 'generate_filter_comment_fields' ); +/** + * Customizes the existing comment fields. + * + * @since 2.1.2 + * @param array $fields + * @return array + */ +function generate_filter_comment_fields( $fields ) { + $commenter = wp_get_current_commenter(); + + $fields['author'] = sprintf( + '', + esc_html__( 'Name', 'generatepress' ), + esc_attr( $commenter['comment_author'] ) + ); + + $fields['email'] = sprintf( + '', + esc_html__( 'Email', 'generatepress' ), + esc_attr( $commenter['comment_author_email'] ) + ); + + $fields['url'] = sprintf( + '', + esc_html__( 'Website', 'generatepress' ), + esc_attr( $commenter['comment_author_url'] ) + ); + + return $fields; +} diff --git a/wp-content/themes/generatepress/inc/structure/featured-images.php b/wp-content/themes/generatepress/inc/structure/featured-images.php new file mode 100644 index 0000000..c807c1f --- /dev/null +++ b/wp-content/themes/generatepress/inc/structure/featured-images.php @@ -0,0 +1,112 @@ + + %3$s + + %2$s + + ', + esc_url( get_permalink() ), + get_the_post_thumbnail( + get_the_ID(), + apply_filters( 'generate_page_header_default_size', 'full' ), + array( + 'itemprop' => 'image', + ) + ), + apply_filters( 'generate_inside_featured_image_output', '' ) + ) ); + } + } +} + +if ( ! function_exists( 'generate_featured_page_header_area' ) ) { + /** + * Build the page header. + * + * @since 1.0.7 + * + * @param string The featured image container class + */ + function generate_featured_page_header_area( $class ) { + // Don't run the function unless we're on a page it applies to. + if ( ! is_singular() ) { + return; + } + + // Don't run the function unless we have a post thumbnail. + if ( ! has_post_thumbnail() ) { + return; + } + ?> +
            + 'image', + ) + ); ?> +
            + +
            > +
            + + +
            +
            + + + © %1$s %2$s • %4$s ', + date( 'Y' ), + get_bloginfo( 'name' ), + esc_url( 'https://generatepress.com' ), + _x( 'Powered by', 'GeneratePress', 'generatepress' ), + __( 'GeneratePress', 'generatepress' ) + ); + + echo apply_filters( 'generate_copyright', $copyright ); // WPCS: XSS ok. + } +} + +/** + * Build our individual footer widgets. + * Displays a sample widget if no widget is found in the area. + * + * @since 2.0 + * + * @param int $widget_width The width class of our widget. + * @param int $widget The ID of our widget. + */ +function generate_do_footer_widget( $widget_width, $widget ) { + $widget_width = apply_filters( "generate_footer_widget_{$widget}_width", $widget_width ); + $tablet_widget_width = apply_filters( "generate_footer_widget_{$widget}_tablet_width", '50' ); + ?> + + + + + %5$s + %6$s + ', + esc_attr__( 'Scroll back to top', 'generatepress' ), + absint( apply_filters( 'generate_back_to_top_scroll_speed', 400 ) ), + absint( apply_filters( 'generate_back_to_top_start_scroll', 300 ) ), + esc_attr( apply_filters( 'generate_back_to_top_icon', 'fa-angle-up' ) ), + esc_html__( 'Scroll back to top', 'generatepress' ), + generate_get_svg_icon( 'arrow' ) + ) ); + } +} diff --git a/wp-content/themes/generatepress/inc/structure/header.php b/wp-content/themes/generatepress/inc/structure/header.php new file mode 100644 index 0000000..1396a50 --- /dev/null +++ b/wp-content/themes/generatepress/inc/structure/header.php @@ -0,0 +1,310 @@ + +
            > +
            > + +
            +
            + 'header-image', + 'alt' => esc_attr( apply_filters( 'generate_logo_title', get_bloginfo( 'name', 'display' ) ) ), + 'src' => $logo_url, + 'title' => esc_attr( apply_filters( 'generate_logo_title', get_bloginfo( 'name', 'display' ) ) ), + ) ); + + if ( '' !== $retina_logo_url ) { + $attr['srcset'] = $logo_url . ' 1x, ' . $retina_logo_url . ' 2x'; + + // Add dimensions to image if retina is set. This fixes a container width bug in Firefox. + if ( function_exists( 'the_custom_logo' ) && get_theme_mod( 'custom_logo' ) ) { + $data = wp_get_attachment_metadata( get_theme_mod( 'custom_logo' ) ); + + if ( ! empty( $data ) ) { + $attr['width'] = $data['width']; + $attr['height'] = $data['height']; + } + } + } + + $attr = array_map( 'esc_attr', $attr ); + + $html_attr = ''; + foreach ( $attr as $name => $value ) { + $html_attr .= " $name=" . '"' . $value . '"'; + } + + // Print our HTML. + echo apply_filters( 'generate_logo_output', sprintf( // WPCS: XSS ok, sanitization ok. + '', + esc_url( apply_filters( 'generate_logo_href' , home_url( '/' ) ) ), + esc_attr( apply_filters( 'generate_logo_title', get_bloginfo( 'name', 'display' ) ) ), + $html_attr + ), $logo_url, $html_attr ); + + /** + * generate_after_logo hook. + * + * @since 0.1 + */ + do_action( 'generate_after_logo' ); + } +} + +if ( ! function_exists( 'generate_construct_site_title' ) ) { + /** + * Build the site title and tagline. + * + * @since 1.3.28 + */ + function generate_construct_site_title() { + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_defaults() + ); + + // Get the title and tagline. + $title = get_bloginfo( 'title' ); + $tagline = get_bloginfo( 'description' ); + + // If the disable title checkbox is checked, or the title field is empty, return true. + $disable_title = ( '1' == $generate_settings['hide_title'] || '' == $title ) ? true : false; + + // If the disable tagline checkbox is checked, or the tagline field is empty, return true. + $disable_tagline = ( '1' == $generate_settings['hide_tagline'] || '' == $tagline ) ? true : false; + + // Build our site title. + $site_title = apply_filters( 'generate_site_title_output', sprintf( + '<%1$s class="main-title" itemprop="headline"> + + %3$s + + ', + ( is_front_page() && is_home() ) ? 'h1' : 'p', + esc_url( apply_filters( 'generate_site_title_href', home_url( '/' ) ) ), + get_bloginfo( 'name' ) + ) ); + + // Build our tagline. + $site_tagline = apply_filters( 'generate_site_description_output', sprintf( + '

            + %1$s +

            ', + html_entity_decode( get_bloginfo( 'description', 'display' ) ) + ) ); + + // Site title and tagline. + if ( false == $disable_title || false == $disable_tagline ) { + if ( generate_get_option( 'inline_logo_site_branding' ) && generate_has_logo_site_branding() ) { + echo '
            '; + generate_construct_logo(); + } + + echo apply_filters( 'generate_site_branding_output', sprintf( // WPCS: XSS ok, sanitization ok. + '
            + %1$s + %2$s +
            ', + ( ! $disable_title ) ? $site_title : '', + ( ! $disable_tagline ) ? $site_tagline : '' + ) ); + + if ( generate_get_option( 'inline_logo_site_branding' ) && generate_has_logo_site_branding() ) { + echo '
            '; + } + } + } +} + +add_filter( 'generate_header_items_order', 'generate_reorder_inline_site_branding' ); +/** + * Remove the logo from it's usual position. + * + * @since 2.3 + */ +function generate_reorder_inline_site_branding( $order ) { + if ( ! generate_get_option( 'inline_logo_site_branding' ) || ! generate_has_logo_site_branding() ) { + return $order; + } + + return array( + 'header-widget', + 'site-branding', + ); +} + +if ( ! function_exists( 'generate_construct_header_widget' ) ) { + /** + * Build the header widget. + * + * @since 1.3.28 + */ + function generate_construct_header_widget() { + if ( is_active_sidebar( 'header' ) ) : ?> +
            + +
            + +
            > +
            + +
            +
            + ' . "\n", esc_url( get_bloginfo( 'pingback_url' ) ) ); + } + } +} + +if ( ! function_exists( 'generate_add_viewport' ) ) { + add_action( 'wp_head', 'generate_add_viewport' ); + /** + * Add viewport to wp_head. + * + * @since 1.1.0 + */ + function generate_add_viewport() { + echo apply_filters( 'generate_meta_viewport', '' ); // WPCS: XSS ok. + } +} + +add_action( 'generate_before_header', 'generate_do_skip_to_content_link', 2 ); +/** + * Add skip to content link before the header. + * + * @since 2.0 + */ +function generate_do_skip_to_content_link() { + printf( '', + esc_attr__( 'Skip to content', 'generatepress' ), + esc_html__( 'Skip to content', 'generatepress' ) + ); +} diff --git a/wp-content/themes/generatepress/inc/structure/navigation.php b/wp-content/themes/generatepress/inc/structure/navigation.php new file mode 100644 index 0000000..7a8e9be --- /dev/null +++ b/wp-content/themes/generatepress/inc/structure/navigation.php @@ -0,0 +1,397 @@ + + + + + '; + generate_navigation_position(); + echo ''; + } + } +} + +if ( ! function_exists( 'generate_add_navigation_before_left_sidebar' ) ) { + add_action( 'generate_before_left_sidebar_content', 'generate_add_navigation_before_left_sidebar', 5 ); + function generate_add_navigation_before_left_sidebar() { + if ( 'nav-left-sidebar' == generate_get_navigation_location() ) { + echo '
            '; + generate_navigation_position(); + echo '
            '; + } + } +} + +if ( ! class_exists( 'Generate_Page_Walker' ) && class_exists( 'Walker_Page' ) ) { + /** + * Add current-menu-item to the current item if no theme location is set + * This means we don't have to duplicate CSS properties for current_page_item and current-menu-item + * + * @since 1.3.21 + */ + class Generate_Page_Walker extends Walker_Page { + function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) { + $css_class = array( 'page_item', 'page-item-' . $page->ID ); + $button = ''; + + if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { + $css_class[] = 'menu-item-has-children'; + $icon = generate_get_svg_icon( 'arrow' ); + $button = '' . $icon . ''; + } + + if ( ! empty( $current_page ) ) { + $_current_page = get_post( $current_page ); + if ( $_current_page && in_array( $page->ID, $_current_page->ancestors ) ) { + $css_class[] = 'current-menu-ancestor'; + } + if ( $page->ID == $current_page ) { + $css_class[] = 'current-menu-item'; + } elseif ( $_current_page && $page->ID == $_current_page->post_parent ) { + $css_class[] = 'current-menu-parent'; + } + } elseif ( $page->ID == get_option( 'page_for_posts' ) ) { + $css_class[] = 'current-menu-parent'; + } + + $css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) ); + + $args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before']; + $args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after']; + + $output .= sprintf( + '
          • %s%s%s%s', + $css_classes, + get_permalink( $page->ID ), + $args['link_before'], + apply_filters( 'the_title', $page->post_title, $page->ID ), + $args['link_after'], + $button + ); + } + } +} + +if ( ! function_exists( 'generate_dropdown_icon_to_menu_link' ) ) { + add_filter( 'nav_menu_item_title', 'generate_dropdown_icon_to_menu_link', 10, 4 ); + /** + * Add dropdown icon if menu item has children. + * + * @since 1.3.42 + * + * @param string $title The menu item title. + * @param WP_Post $item All of our menu item data. + * @param stdClass $args All of our menu item args. + * @param int $dept Depth of menu item. + * @return string The menu item. + */ + function generate_dropdown_icon_to_menu_link( $title, $item, $args, $depth ) { + $role = 'presentation'; + $tabindex = ''; + + if ( 'click-arrow' === generate_get_option( 'nav_dropdown_type' ) ) { + $role = 'button'; + $tabindex = ' tabindex="0"'; + } + + if ( isset( $args->container_class ) && 'main-nav' === $args->container_class ) { + foreach ( $item->classes as $value ) { + if ( 'menu-item-has-children' === $value ) { + $icon = generate_get_svg_icon( 'arrow' ); + $title = $title . '' . $icon . ''; + } + } + } + + return $title; + } +} + +if ( ! function_exists( 'generate_navigation_search' ) ) { + add_action( 'generate_inside_navigation', 'generate_navigation_search' ); + /** + * Add the search bar to the navigation. + * + * @since 1.1.4 + */ + function generate_navigation_search() { + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_defaults() + ); + + if ( 'enable' !== $generate_settings['nav_search'] ) { + return; + } + + echo apply_filters( 'generate_navigation_search_output', sprintf( // WPCS: XSS ok, sanitization ok. + '', + esc_url( home_url( '/' ) ), + esc_attr( get_search_query() ), + esc_attr_x( 'Search', 'label', 'generatepress' ) + )); + } +} + +if ( ! function_exists( 'generate_menu_search_icon' ) ) { + add_filter( 'wp_nav_menu_items', 'generate_menu_search_icon', 10, 2 ); + /** + * Add search icon to primary menu if set + * + * @since 1.2.9.7 + * + * @param string $nav The HTML list content for the menu items. + * @param stdClass $args An object containing wp_nav_menu() arguments. + * @return string The search icon menu item. + */ + function generate_menu_search_icon( $nav, $args ) { + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_defaults() + ); + + // If the search icon isn't enabled, return the regular nav. + if ( 'enable' !== $generate_settings['nav_search'] ) { + return $nav; + } + + // If our primary menu is set, add the search icon. + if ( isset( $args->theme_location ) && 'primary' === $args->theme_location ) { + return sprintf( + '%1$s
          • %3$s
          • ', + $nav, + esc_attr__( 'Open Search Bar', 'generatepress' ), + generate_get_svg_icon( 'search', true ) + ); + } + + // Our primary menu isn't set, return the regular nav. + // In this case, the search icon is added to the generate_menu_fallback() function in navigation.php. + return $nav; + } +} + +if ( ! function_exists( 'generate_mobile_menu_search_icon' ) ) { + add_action( 'generate_inside_navigation', 'generate_mobile_menu_search_icon' ); + /** + * Add search icon to mobile menu bar + * + * @since 1.3.12 + */ + function generate_mobile_menu_search_icon() { + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_defaults() + ); + + // If the search icon isn't enabled, return the regular nav. + if ( 'enable' !== $generate_settings['nav_search'] ) { + return; + } + + ?> +
            + + + + + + +
            + + + post_parent ) : get_adjacent_post( false, '', true ); + $next = get_adjacent_post( false, '', false ); + + if ( ! $next && ! $previous ) { + return; + } + } + + // Don't print empty markup in archives if there's only one page. + if ( $wp_query->max_num_pages < 2 && ( is_home() || is_archive() || is_search() ) ) { + return; + } + + $nav_class = ( is_single() ) ? 'post-navigation' : 'paging-navigation'; + ?> + + %3$s'; + } + + return $template; + } +} + +/** + * Output requested post meta. + * + * @since 2.3 + * + * @param string $item The post meta item we're requesting + * @return The requested HTML. + */ +function generate_do_post_meta_item( $item ) { + if ( 'date' === $item ) { + $date = apply_filters( 'generate_post_date', true ); + + $time_string = ''; + + if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { + $time_string = '' . $time_string; + } + + $time_string = sprintf( $time_string, + esc_attr( get_the_date( 'c' ) ), + esc_html( get_the_date() ), + esc_attr( get_the_modified_date( 'c' ) ), + esc_html( get_the_modified_date() ) + ); + + // If our date is enabled, show it. + if ( $date ) { + echo apply_filters( 'generate_post_date_output', + sprintf( // WPCS: XSS ok, sanitization ok. + '%1$s%4$s ', + apply_filters( 'generate_inside_post_meta_item_output', '', 'date' ), + esc_url( get_permalink() ), + esc_attr( get_the_time() ), + $time_string + ), + $time_string ); + } + } + + if ( 'author' === $item ) { + $author = apply_filters( 'generate_post_author', true ); + + if ( $author ) { + echo apply_filters( 'generate_post_author_output', + sprintf( ' ', + apply_filters( 'generate_inside_post_meta_item_output', '', 'author' ), + esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), + /* translators: 1: Author name */ + esc_attr( sprintf( __( 'View all posts by %s', 'generatepress' ), get_the_author() ) ), + esc_html( get_the_author() ), + generate_get_microdata( 'post-author' ) + ) + ); + } + } + + if ( 'categories' === $item ) { + $categories = apply_filters( 'generate_show_categories', true ); + + $term_separator = apply_filters( 'generate_term_separator', _x( ', ', 'Used between list items, there is a space after the comma.', 'generatepress' ), 'categories' ); + $categories_list = get_the_category_list( $term_separator ); + + if ( $categories_list && $categories ) { + echo apply_filters( 'generate_category_list_output', + sprintf( '%3$s%1$s %2$s ', // WPCS: XSS ok, sanitization ok. + esc_html_x( 'Categories', 'Used before category names.', 'generatepress' ), + $categories_list, + apply_filters( 'generate_inside_post_meta_item_output', '', 'categories' ) + ) + ); + } + } + + if ( 'tags' === $item ) { + $tags = apply_filters( 'generate_show_tags', true ); + + $term_separator = apply_filters( 'generate_term_separator', _x( ', ', 'Used between list items, there is a space after the comma.', 'generatepress' ), 'tags' ); + $tags_list = get_the_tag_list( '', $term_separator ); + + if ( $tags_list && $tags ) { + echo apply_filters( 'generate_tag_list_output', + sprintf( '%3$s%1$s %2$s ', // WPCS: XSS ok, sanitization ok. + esc_html_x( 'Tags', 'Used before tag names.', 'generatepress' ), + $tags_list, + apply_filters( 'generate_inside_post_meta_item_output', '', 'tags' ) + ) + ); + } + } + + if ( 'comments-link' === $item ) { + $comments = apply_filters( 'generate_show_comments', true ); + + if ( $comments && ! post_password_required() && ( comments_open() || get_comments_number() ) ) { + echo ''; + echo apply_filters( 'generate_inside_post_meta_item_output', '', 'comments-link' ); + comments_popup_link( __( 'Leave a comment', 'generatepress' ), __( '1 Comment', 'generatepress' ), __( '% Comments', 'generatepress' ) ); + echo ' '; + } + } + + /** + * generate_post_meta_items hook. + * + * @since 2.4 + */ + do_action( 'generate_post_meta_items', $item ); +} + +add_filter( 'generate_inside_post_meta_item_output', 'generate_do_post_meta_prefix', 10, 2 ); +/** + * Add svg icons or text to our post meta output. + * + * @since 2.4 + */ +function generate_do_post_meta_prefix( $output, $item ) { + if ( 'author' === $item ) { + $output = __( 'by', 'generatepress' ) . ' '; + } + + if ( 'categories' === $item ) { + $output = generate_get_svg_icon( 'categories' ); + } + + if ( 'tags' === $item ) { + $output = generate_get_svg_icon( 'tags' ); + } + + if ( 'comments-link' === $item ) { + $output = generate_get_svg_icon( 'comments' ); + } + + return $output; +} + +if ( ! function_exists( 'generate_posted_on' ) ) { + /** + * Prints HTML with meta information for the current post-date/time and author. + * + * @since 0.1 + */ + function generate_posted_on() { + $items = apply_filters( 'generate_header_entry_meta_items', array( + 'date', + 'author', + ) ); + + foreach ( $items as $item ) { + generate_do_post_meta_item( $item ); + } + } +} + +if ( ! function_exists( 'generate_entry_meta' ) ) { + /** + * Prints HTML with meta information for the categories, tags. + * + * @since 1.2.5 + */ + function generate_entry_meta() { + $items = apply_filters( 'generate_footer_entry_meta_items', array( + 'categories', + 'tags', + 'comments-link', + ) ); + + foreach ( $items as $item ) { + generate_do_post_meta_item( $item ); + } + } +} + +if ( ! function_exists( 'generate_excerpt_more' ) ) { + add_filter( 'excerpt_more', 'generate_excerpt_more' ); + /** + * Prints the read more HTML to post excerpts. + * + * @since 0.1 + * + * @param string $more The string shown within the more link. + * @return string The HTML for the more link. + */ + function generate_excerpt_more( $more ) { + return apply_filters( 'generate_excerpt_more_output', sprintf( ' ... %3$s %4$s', + the_title_attribute( 'echo=0' ), + esc_url( get_permalink( get_the_ID() ) ), + __( 'Read more', 'generatepress' ), + '' . get_the_title() . '' + ) ); + } +} + +if ( ! function_exists( 'generate_content_more' ) ) { + add_filter( 'the_content_more_link', 'generate_content_more' ); + /** + * Prints the read more HTML to post content using the more tag. + * + * @since 0.1 + * + * @param string $more The string shown within the more link. + * @return string The HTML for the more link + */ + function generate_content_more( $more ) { + return apply_filters( 'generate_content_more_link_output', sprintf( '

            %3$s%4$s

            ', + the_title_attribute( 'echo=0' ), + esc_url( get_permalink( get_the_ID() ) . apply_filters( 'generate_more_jump','#more-' . get_the_ID() ) ), + __( 'Read more', 'generatepress' ), + '' . get_the_title() . '' + ) ); + } +} + +if ( ! function_exists( 'generate_post_meta' ) ) { + add_action( 'generate_after_entry_title', 'generate_post_meta' ); + /** + * Build the post meta. + * + * @since 1.3.29 + */ + function generate_post_meta() { + $post_types = apply_filters( 'generate_entry_meta_post_types', array( + 'post', + ) ); + + if ( in_array( get_post_type(), $post_types ) ) : ?> + + +
            + +
            + + + + + post_content, '' ) ); + + $format = ( false !== get_post_format() ) ? get_post_format() : 'standard'; + + $show_excerpt = ( 'excerpt' === generate_get_option( 'post_content' ) ) ? true : false; + + $show_excerpt = ( 'standard' !== $format ) ? false : $show_excerpt; + + $show_excerpt = ( $more_tag ) ? false : $show_excerpt; + + $show_excerpt = ( is_search() ) ? true : $show_excerpt; + + return apply_filters( 'generate_show_excerpt', $show_excerpt ); + } +} + +if ( ! function_exists( 'generate_show_title' ) ) { + /** + * Check to see if we should show our page/post title or not. + * + * @since 1.3.18 + * + * @return bool Whether to show the content title. + */ + function generate_show_title() { + return apply_filters( 'generate_show_title', true ); + } +} + +if ( ! function_exists( 'generate_get_premium_url' ) ) { + /** + * Generate a URL to our premium add-ons. + * Allows the use of a referral ID and campaign. + * + * @since 1.3.42 + * + * @param string $url URL to premium page. + * @param bool $trailing_slash Whether we want to include a trailing slash. + * @return string The URL to generatepress.com. + */ + function generate_get_premium_url( $url = 'https://generatepress.com/premium', $trailing_slash = true ) { + if ( $trailing_slash ) { + $url = trailingslashit( $url ); + } + + $args = apply_filters( 'generate_premium_url_args', array( + 'ref' => null, + 'campaign' => null, + ) ); + + if ( isset( $args['ref'] ) ) { + $url = add_query_arg( 'ref', absint( $args['ref'] ), $url ); + } + + if ( isset( $args['campaign'] ) ) { + $url = add_query_arg( 'campaign', sanitize_text_field( $args['campaign'] ), $url ); + } + + return esc_url( $url ); + } +} + +if ( ! function_exists( 'generate_padding_css' ) ) { + /** + * Shorten our padding/margin values into shorthand form. + * + * @since 0.1 + * + * @param int $top Top spacing. + * @param int $right Right spacing. + * @param int $bottom Bottom spacing. + * @param int $left Left spacing. + * @return string Element spacing values. + */ + function generate_padding_css( $top, $right, $bottom, $left ) { + $padding_top = ( isset( $top ) && '' !== $top ) ? absint( $top ) . 'px ' : '0px '; + $padding_right = ( isset( $right ) && '' !== $right ) ? absint( $right ) . 'px ' : '0px '; + $padding_bottom = ( isset( $bottom ) && '' !== $bottom ) ? absint( $bottom ) . 'px ' : '0px '; + $padding_left = ( isset( $left ) && '' !== $left ) ? absint( $left ) . 'px' : '0px'; + + if ( ( absint( $padding_top ) === absint( $padding_right ) ) && ( absint( $padding_right ) === absint( $padding_bottom ) ) && ( absint( $padding_bottom ) === absint( $padding_left ) ) ) { + return $padding_left; + } + + return $padding_top . $padding_right . $padding_bottom . $padding_left; + } +} + +if ( ! function_exists( 'generate_get_link_url' ) ) { + /** + * Return the post URL. + * + * Falls back to the post permalink if no URL is found in the post. + * + * @since 1.2.5 + * + * @see get_url_in_content() + * @return string The Link format URL. + */ + function generate_get_link_url() { + $has_url = get_url_in_content( get_the_content() ); + + return $has_url ? $has_url : apply_filters( 'the_permalink', get_permalink() ); + } +} + +if ( ! function_exists( 'generate_get_navigation_location' ) ) { + /** + * Get the location of the navigation and filter it. + * + * @since 1.3.41 + * + * @return string The primary menu location. + */ + function generate_get_navigation_location() { + return apply_filters( 'generate_navigation_location', generate_get_option( 'nav_position_setting' ) ); + } +} + +/** + * Check if the logo and site branding are active. + * + * @since 2.3 + */ +function generate_has_logo_site_branding() { + if ( get_theme_mod( 'custom_logo' ) && ( ! generate_get_option( 'hide_title' ) || ! generate_get_option( 'hide_tagline' ) ) ) { + return true; + } + + return false; +} + +/** + * Create SVG icons. + * + * @since 2.3 + */ +function generate_get_svg_icon( $icon, $replace = false ) { + if ( 'svg' !== generate_get_option( 'icons' ) ) { + return; + } + + $output = ''; + + if ( 'menu-bars' === $icon ) { + $output = ''; + } + + if ( 'close' === $icon ) { + $output = ''; + } + + if ( 'search' === $icon ) { + $output = ''; + } + + if ( 'categories' === $icon ) { + $output = ''; + } + + if ( 'tags' === $icon ) { + $output = ''; + } + + if ( 'comments' === $icon ) { + $output = ''; + } + + if ( 'arrow' === $icon ) { + $output = ''; + } + + if ( $replace ) { + $output .= ''; + } + + $output = apply_filters( 'generate_svg_icon_element', $output, $icon ); + + $classes = array( + 'gp-icon', + 'icon-' . $icon, + ); + + $output = sprintf( + '%2$s', + implode( ' ', $classes ), + $output + ); + + return apply_filters( 'generate_svg_icon', $output, $icon ); +} + +/** + * Out our icon HTML. + * + * @since 2.3 + * + * @param string $icon + * @param bool $replace Whether to include the close icon to be shown using JS. + * @return string + */ +function generate_do_svg_icon( $icon, $replace = false ) { + echo generate_get_svg_icon( $icon, $replace ); +} + +/** + * Get our media queries. + * + * @since 2.4 + * + * @param string $name + * @return string The full media query. + */ +function generate_get_media_query( $name ) { + $desktop = apply_filters( 'generate_desktop_media_query', '(min-width:1025px)' ); + $tablet = apply_filters( 'generate_tablet_media_query', '(min-width: 769px) and (max-width: 1024px)' ); + $mobile = apply_filters( 'generate_mobile_media_query', '(max-width:768px)' ); + $mobile_menu = apply_filters( 'generate_mobile_menu_media_query', $mobile ); + + $queries = apply_filters( 'generate_media_queries', array( + 'desktop' => $desktop, + 'tablet' => $tablet, + 'mobile' => $mobile, + 'mobile-menu' => $mobile_menu, + ) ); + + return $queries[ $name ]; +} diff --git a/wp-content/themes/generatepress/inc/typography.php b/wp-content/themes/generatepress/inc/typography.php new file mode 100644 index 0000000..1cc5527 --- /dev/null +++ b/wp-content/themes/generatepress/inc/typography.php @@ -0,0 +1,1076 @@ +register_control_type( 'Generate_Typography_Customize_Control' ); + $wp_customize->register_control_type( 'Generate_Range_Slider_Control' ); + } + + $wp_customize->add_section( + 'font_section', + array( + 'title' => __( 'Typography', 'generatepress' ), + 'capability' => 'edit_theme_options', + 'priority' => 30, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[font_body]', + array( + 'default' => $defaults['font_body'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + $wp_customize->add_setting( + 'font_body_category', + array( + 'default' => $defaults['font_body_category'], + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + $wp_customize->add_setting( + 'font_body_variants', + array( + 'default' => $defaults['font_body_variants'], + 'sanitize_callback' => 'generate_sanitize_variants', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[body_font_weight]', + array( + 'default' => $defaults['body_font_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[body_font_transform]', + array( + 'default' => $defaults['body_font_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage', + + ) + ); + + $wp_customize->add_control( + new Generate_Typography_Customize_Control( + $wp_customize, + 'body_typography', + array( + 'label' => __( 'Body', 'generatepress' ), + 'section' => 'font_section', + 'priority' => 1, + 'settings' => array( + 'family' => 'generate_settings[font_body]', + 'variant' => 'font_body_variants', + 'category' => 'font_body_category', + 'weight' => 'generate_settings[body_font_weight]', + 'transform' => 'generate_settings[body_font_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[body_font_size]', + array( + 'default' => $defaults['body_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_integer', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[body_font_size]', + array( + 'type' => 'generatepress-range-slider', + 'description' => __( 'Font size', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[body_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 6, + 'max' => 25, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[body_line_height]', + array( + 'default' => $defaults['body_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_decimal_integer', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[body_line_height]', + array( + 'type' => 'generatepress-range-slider', + 'description' => __( 'Line height', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[body_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 1, + 'max' => 3, + 'step' => .1, + 'edit' => true, + 'unit' => '', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[paragraph_margin]', + array( + 'default' => $defaults['paragraph_margin'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_decimal_integer', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[paragraph_margin]', + array( + 'type' => 'generatepress-range-slider', + 'description' => __( 'Paragraph margin', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[paragraph_margin]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[font_heading_1]', + array( + 'default' => $defaults['font_heading_1'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_1_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_1_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_1_weight]', + array( + 'default' => $defaults['heading_1_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_1_transform]', + array( + 'default' => $defaults['heading_1_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Typography_Customize_Control( + $wp_customize, + 'font_heading_1_control', + array( + 'label' => __( 'Heading 1 (H1)', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_1]', + 'variant' => 'font_heading_1_variants', + 'category' => 'font_heading_1_category', + 'weight' => 'generate_settings[heading_1_weight]', + 'transform' => 'generate_settings[heading_1_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_1_font_size]', + array( + 'default' => $defaults['heading_1_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[mobile_heading_1_font_size]', + array( + 'default' => $defaults['mobile_heading_1_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'h1_font_sizes', + array( + 'description' => __( 'Font size', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_1_font_size]', + 'mobile' => 'generate_settings[mobile_heading_1_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 15, + 'max' => 100, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_1_line_height]', + array( + 'default' => $defaults['heading_1_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_1_line_height]', + array( + 'description' => __( 'Line height', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_1_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[font_heading_2]', + array( + 'default' => $defaults['font_heading_2'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_2_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_2_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_2_weight]', + array( + 'default' => $defaults['heading_2_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_2_transform]', + array( + 'default' => $defaults['heading_2_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Typography_Customize_Control( + $wp_customize, + 'font_heading_2_control', + array( + 'label' => __( 'Heading 2 (H2)', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_2]', + 'variant' => 'font_heading_2_variants', + 'category' => 'font_heading_2_category', + 'weight' => 'generate_settings[heading_2_weight]', + 'transform' => 'generate_settings[heading_2_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_2_font_size]', + array( + 'default' => $defaults['heading_2_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[mobile_heading_2_font_size]', + array( + 'default' => $defaults['mobile_heading_2_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_empty_absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'h2_font_sizes', + array( + 'description' => __( 'Font size', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_2_font_size]', + 'mobile' => 'generate_settings[mobile_heading_2_font_size]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + 'mobile' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_2_line_height]', + array( + 'default' => $defaults['heading_2_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_2_line_height]', + array( + 'description' => __( 'Line height', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_2_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[font_heading_3]', + array( + 'default' => $defaults['font_heading_3'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_3_category', + array( + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field' + ) + ); + + $wp_customize->add_setting( + 'font_heading_3_variants', + array( + 'default' => '', + 'sanitize_callback' => 'generate_sanitize_variants' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_3_weight]', + array( + 'default' => $defaults['heading_3_weight'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_3_transform]', + array( + 'default' => $defaults['heading_3_transform'], + 'type' => 'option', + 'sanitize_callback' => 'sanitize_key', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Typography_Customize_Control( + $wp_customize, + 'font_heading_3_control', + array( + 'label' => __( 'Heading 3 (H3)', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'family' => 'generate_settings[font_heading_3]', + 'variant' => 'font_heading_3_variants', + 'category' => 'font_heading_3_category', + 'weight' => 'generate_settings[heading_3_weight]', + 'transform' => 'generate_settings[heading_3_transform]', + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_3_font_size]', + array( + 'default' => $defaults['heading_3_font_size'], + 'type' => 'option', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'h3_font_sizes', + array( + 'description' => __( 'Font size', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_3_font_size]' + ), + 'choices' => array( + 'desktop' => array( + 'min' => 10, + 'max' => 80, + 'step' => 1, + 'edit' => true, + 'unit' => 'px', + ), + ), + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[heading_3_line_height]', + array( + 'default' => $defaults['heading_3_line_height'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_decimal_integer', + 'transport' => 'postMessage' + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[heading_3_line_height]', + array( + 'description' => __( 'Line height', 'generatepress' ), + 'section' => 'font_section', + 'settings' => array( + 'desktop' => 'generate_settings[heading_3_line_height]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 0, + 'max' => 5, + 'step' => .1, + 'edit' => true, + 'unit' => 'em', + ), + ), + ) + ) + ); + + if ( ! function_exists( 'generate_fonts_customize_register' ) && ! defined( 'GP_PREMIUM_VERSION' ) ) { + $wp_customize->add_control( + new Generate_Customize_Misc_Control( + $wp_customize, + 'typography_get_addon_desc', + array( + 'section' => 'font_section', + 'type' => 'addon', + 'label' => __( 'Learn more','generatepress' ), + 'description' => __( 'More options are available for this section in our premium version.', 'generatepress' ), + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#typography', false ), + 'priority' => 50, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + } + } +} + +if ( ! function_exists( 'generate_get_all_google_fonts' ) ) { + /** + * Return an array of all of our Google Fonts. + * + * @since 1.3.0 + * @param string $amount How many fonts to return. + * @return array The list of Google Fonts. + */ + function generate_get_all_google_fonts( $amount = 'all' ) { + // Our big list Google Fonts + // We use json_decode to reduce PHP memory usage + // Adding them as a PHP array seems to use quite a bit more memory + $content = json_decode( '[{"family":"Roboto","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic","900","900italic"]},{"family":"Open Sans","category":"sans-serif","variants":["300","300italic","regular","italic","600","600italic","700","700italic","800","800italic"]},{"family":"Lato","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","700","700italic","900","900italic"]},{"family":"Slabo 27px","category":"serif","variants":["regular"]},{"family":"Oswald","category":"sans-serif","variants":["200","300","regular","500","600","700"]},{"family":"Roboto Condensed","category":"sans-serif","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Source Sans Pro","category":"sans-serif","variants":["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","900","900italic"]},{"family":"Montserrat","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Raleway","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"PT Sans","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Roboto Slab","category":"serif","variants":["100","300","regular","700"]},{"family":"Merriweather","category":"serif","variants":["300","300italic","regular","italic","700","700italic","900","900italic"]},{"family":"Open Sans Condensed","category":"sans-serif","variants":["300","300italic","700"]},{"family":"Droid Sans","category":"sans-serif","variants":["regular","700"]},{"family":"Lora","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Ubuntu","category":"sans-serif","variants":["300","300italic","regular","italic","500","500italic","700","700italic"]},{"family":"Droid Serif","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Playfair Display","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Arimo","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Noto Sans","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"PT Serif","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Titillium Web","category":"sans-serif","variants":["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","900"]},{"family":"PT Sans Narrow","category":"sans-serif","variants":["regular","700"]},{"family":"Muli","category":"sans-serif","variants":["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Indie Flower","category":"handwriting","variants":["regular"]},{"family":"Bitter","category":"serif","variants":["regular","italic","700"]},{"family":"Poppins","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Inconsolata","category":"monospace","variants":["regular","700"]},{"family":"Dosis","category":"sans-serif","variants":["200","300","regular","500","600","700","800"]},{"family":"Fjalla One","category":"sans-serif","variants":["regular"]},{"family":"Oxygen","category":"sans-serif","variants":["300","regular","700"]},{"family":"Hind","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Cabin","category":"sans-serif","variants":["regular","italic","500","500italic","600","600italic","700","700italic"]},{"family":"Anton","category":"sans-serif","variants":["regular"]},{"family":"Arvo","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Noto Serif","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Crimson Text","category":"serif","variants":["regular","italic","600","600italic","700","700italic"]},{"family":"Lobster","category":"display","variants":["regular"]},{"family":"Yanone Kaffeesatz","category":"sans-serif","variants":["200","300","regular","700"]},{"family":"Nunito","category":"sans-serif","variants":["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Bree Serif","category":"serif","variants":["regular"]},{"family":"Catamaran","category":"sans-serif","variants":["100","200","300","regular","500","600","700","800","900"]},{"family":"Libre Baskerville","category":"serif","variants":["regular","italic","700"]},{"family":"Abel","category":"sans-serif","variants":["regular"]},{"family":"Josefin Sans","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","600","600italic","700","700italic"]},{"family":"Fira Sans","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Gloria Hallelujah","category":"handwriting","variants":["regular"]},{"family":"Abril Fatface","category":"display","variants":["regular"]},{"family":"Exo 2","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Merriweather Sans","category":"sans-serif","variants":["300","300italic","regular","italic","700","700italic","800","800italic"]},{"family":"Pacifico","category":"handwriting","variants":["regular"]},{"family":"Roboto Mono","category":"monospace","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic"]},{"family":"Varela Round","category":"sans-serif","variants":["regular"]},{"family":"Asap","category":"sans-serif","variants":["regular","italic","500","500italic","700","700italic"]},{"family":"Amatic SC","category":"handwriting","variants":["regular","700"]},{"family":"Quicksand","category":"sans-serif","variants":["300","regular","500","700"]},{"family":"Karla","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Ubuntu Condensed","category":"sans-serif","variants":["regular"]},{"family":"Signika","category":"sans-serif","variants":["300","regular","600","700"]},{"family":"Alegreya","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Questrial","category":"sans-serif","variants":["regular"]},{"family":"Rubik","category":"sans-serif","variants":["300","300italic","regular","italic","500","500italic","700","700italic","900","900italic"]},{"family":"Shadows Into Light","category":"handwriting","variants":["regular"]},{"family":"PT Sans Caption","category":"sans-serif","variants":["regular","700"]},{"family":"Archivo Narrow","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Play","category":"sans-serif","variants":["regular","700"]},{"family":"Cuprum","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Dancing Script","category":"handwriting","variants":["regular","700"]},{"family":"Rokkitt","category":"serif","variants":["100","200","300","regular","500","600","700","800","900"]},{"family":"Work Sans","category":"sans-serif","variants":["100","200","300","regular","500","600","700","800","900"]},{"family":"Francois One","category":"sans-serif","variants":["regular"]},{"family":"Vollkorn","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Source Code Pro","category":"monospace","variants":["200","300","regular","500","600","700","900"]},{"family":"Exo","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Maven Pro","category":"sans-serif","variants":["regular","500","700","900"]},{"family":"Architects Daughter","category":"handwriting","variants":["regular"]},{"family":"Orbitron","category":"sans-serif","variants":["regular","500","700","900"]},{"family":"Pathway Gothic One","category":"sans-serif","variants":["regular"]},{"family":"Acme","category":"sans-serif","variants":["regular"]},{"family":"Ropa Sans","category":"sans-serif","variants":["regular","italic"]},{"family":"Patua One","category":"display","variants":["regular"]},{"family":"EB Garamond","category":"serif","variants":["regular"]},{"family":"Lobster Two","category":"display","variants":["regular","italic","700","700italic"]},{"family":"Crete Round","category":"serif","variants":["regular","italic"]},{"family":"Cinzel","category":"serif","variants":["regular","700","900"]},{"family":"Josefin Slab","category":"serif","variants":["100","100italic","300","300italic","regular","italic","600","600italic","700","700italic"]},{"family":"Source Serif Pro","category":"serif","variants":["regular","600","700"]},{"family":"Alegreya Sans","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic","800","800italic","900","900italic"]},{"family":"Comfortaa","category":"display","variants":["300","regular","700"]},{"family":"Russo One","category":"sans-serif","variants":["regular"]},{"family":"News Cycle","category":"sans-serif","variants":["regular","700"]},{"family":"ABeeZee","category":"sans-serif","variants":["regular","italic"]},{"family":"Yellowtail","category":"handwriting","variants":["regular"]},{"family":"Noticia Text","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Monda","category":"sans-serif","variants":["regular","700"]},{"family":"Quattrocento Sans","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Hammersmith One","category":"sans-serif","variants":["regular"]},{"family":"Libre Franklin","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Satisfy","category":"handwriting","variants":["regular"]},{"family":"Pontano Sans","category":"sans-serif","variants":["regular"]},{"family":"Righteous","category":"display","variants":["regular"]},{"family":"Poiret One","category":"display","variants":["regular"]},{"family":"BenchNine","category":"sans-serif","variants":["300","regular","700"]},{"family":"Arapey","category":"serif","variants":["regular","italic"]},{"family":"Kaushan Script","category":"handwriting","variants":["regular"]},{"family":"Economica","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Kanit","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Old Standard TT","category":"serif","variants":["regular","italic","700"]},{"family":"Sanchez","category":"serif","variants":["regular","italic"]},{"family":"Courgette","category":"handwriting","variants":["regular"]},{"family":"Quattrocento","category":"serif","variants":["regular","700"]},{"family":"Domine","category":"serif","variants":["regular","700"]},{"family":"Gudea","category":"sans-serif","variants":["regular","italic","700"]},{"family":"Permanent Marker","category":"handwriting","variants":["regular"]},{"family":"Armata","category":"sans-serif","variants":["regular"]},{"family":"Cantarell","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Archivo Black","category":"sans-serif","variants":["regular"]},{"family":"Istok Web","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Cardo","category":"serif","variants":["regular","italic","700"]},{"family":"Playfair Display SC","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Passion One","category":"display","variants":["regular","700","900"]},{"family":"Tinos","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Cookie","category":"handwriting","variants":["regular"]},{"family":"Cormorant Garamond","category":"serif","variants":["300","300italic","regular","italic","500","500italic","600","600italic","700","700italic"]},{"family":"Philosopher","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Yantramanav","category":"sans-serif","variants":["100","300","regular","500","700","900"]},{"family":"Chewy","category":"display","variants":["regular"]},{"family":"Antic Slab","category":"serif","variants":["regular"]},{"family":"Handlee","category":"handwriting","variants":["regular"]},{"family":"Teko","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Boogaloo","category":"display","variants":["regular"]},{"family":"Vidaloka","category":"serif","variants":["regular"]},{"family":"Audiowide","category":"display","variants":["regular"]},{"family":"Coming Soon","category":"handwriting","variants":["regular"]},{"family":"Alfa Slab One","category":"display","variants":["regular"]},{"family":"Cabin Condensed","category":"sans-serif","variants":["regular","500","600","700"]},{"family":"Ruda","category":"sans-serif","variants":["regular","700","900"]},{"family":"Ek Mukta","category":"sans-serif","variants":["200","300","regular","500","600","700","800"]},{"family":"Changa One","category":"display","variants":["regular","italic"]},{"family":"Tangerine","category":"handwriting","variants":["regular","700"]},{"family":"Great Vibes","category":"handwriting","variants":["regular"]},{"family":"Sintony","category":"sans-serif","variants":["regular","700"]},{"family":"Khand","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Bevan","category":"display","variants":["regular"]},{"family":"Kalam","category":"handwriting","variants":["300","regular","700"]},{"family":"Days One","category":"sans-serif","variants":["regular"]},{"family":"Bangers","category":"display","variants":["regular"]},{"family":"Rajdhani","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Droid Sans Mono","category":"monospace","variants":["regular"]},{"family":"Kreon","category":"serif","variants":["300","regular","700"]},{"family":"Rambla","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Shrikhand","category":"display","variants":["regular"]},{"family":"Fredoka One","category":"display","variants":["regular"]},{"family":"Shadows Into Light Two","category":"handwriting","variants":["regular"]},{"family":"Playball","category":"display","variants":["regular"]},{"family":"Neuton","category":"serif","variants":["200","300","regular","italic","700","800"]},{"family":"Copse","category":"serif","variants":["regular"]},{"family":"Didact Gothic","category":"sans-serif","variants":["regular"]},{"family":"Signika Negative","category":"sans-serif","variants":["300","regular","600","700"]},{"family":"Amiri","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Gentium Book Basic","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Glegoo","category":"serif","variants":["regular","700"]},{"family":"Oleo Script","category":"display","variants":["regular","700"]},{"family":"Voltaire","category":"sans-serif","variants":["regular"]},{"family":"Actor","category":"sans-serif","variants":["regular"]},{"family":"Amaranth","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Paytone One","category":"sans-serif","variants":["regular"]},{"family":"Volkhov","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Sorts Mill Goudy","category":"serif","variants":["regular","italic"]},{"family":"Bad Script","category":"handwriting","variants":["regular"]},{"family":"Coda","category":"display","variants":["regular","800"]},{"family":"Damion","category":"handwriting","variants":["regular"]},{"family":"Sacramento","category":"handwriting","variants":["regular"]},{"family":"Squada One","category":"display","variants":["regular"]},{"family":"Rock Salt","category":"handwriting","variants":["regular"]},{"family":"Adamina","category":"serif","variants":["regular"]},{"family":"Alice","category":"serif","variants":["regular"]},{"family":"Cantata One","category":"serif","variants":["regular"]},{"family":"Luckiest Guy","category":"display","variants":["regular"]},{"family":"Rochester","category":"handwriting","variants":["regular"]},{"family":"Covered By Your Grace","category":"handwriting","variants":["regular"]},{"family":"Heebo","category":"sans-serif","variants":["100","300","regular","500","700","800","900"]},{"family":"VT323","category":"monospace","variants":["regular"]},{"family":"Nothing You Could Do","category":"handwriting","variants":["regular"]},{"family":"Patrick Hand","category":"handwriting","variants":["regular"]},{"family":"Gentium Basic","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Nobile","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Rancho","category":"handwriting","variants":["regular"]},{"family":"Marck Script","category":"handwriting","variants":["regular"]},{"family":"Special Elite","category":"display","variants":["regular"]},{"family":"Julius Sans One","category":"sans-serif","variants":["regular"]},{"family":"Varela","category":"sans-serif","variants":["regular"]},{"family":"PT Mono","category":"monospace","variants":["regular"]},{"family":"Alex Brush","category":"handwriting","variants":["regular"]},{"family":"Homemade Apple","category":"handwriting","variants":["regular"]},{"family":"Scada","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Jura","category":"sans-serif","variants":["300","regular","500","600"]},{"family":"Antic","category":"sans-serif","variants":["regular"]},{"family":"Gochi Hand","category":"handwriting","variants":["regular"]},{"family":"Sarala","category":"sans-serif","variants":["regular","700"]},{"family":"Electrolize","category":"sans-serif","variants":["regular"]},{"family":"Sigmar One","category":"display","variants":["regular"]},{"family":"Candal","category":"sans-serif","variants":["regular"]},{"family":"Prata","category":"serif","variants":["regular"]},{"family":"Homenaje","category":"sans-serif","variants":["regular"]},{"family":"Pinyon Script","category":"handwriting","variants":["regular"]},{"family":"Unica One","category":"display","variants":["regular"]},{"family":"Basic","category":"sans-serif","variants":["regular"]},{"family":"Neucha","category":"handwriting","variants":["regular"]},{"family":"Convergence","category":"sans-serif","variants":["regular"]},{"family":"Molengo","category":"sans-serif","variants":["regular"]},{"family":"Caveat Brush","category":"handwriting","variants":["regular"]},{"family":"Monoton","category":"display","variants":["regular"]},{"family":"Calligraffitti","category":"handwriting","variants":["regular"]},{"family":"Kameron","category":"serif","variants":["regular","700"]},{"family":"Share","category":"display","variants":["regular","italic","700","700italic"]},{"family":"Alegreya Sans SC","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic","800","800italic","900","900italic"]},{"family":"Enriqueta","category":"serif","variants":["regular","700"]},{"family":"Martel","category":"serif","variants":["200","300","regular","600","700","800","900"]},{"family":"Black Ops One","category":"display","variants":["regular"]},{"family":"Just Another Hand","category":"handwriting","variants":["regular"]},{"family":"Caveat","category":"handwriting","variants":["regular","700"]},{"family":"PT Serif Caption","category":"serif","variants":["regular","italic"]},{"family":"Ultra","category":"serif","variants":["regular"]},{"family":"Ubuntu Mono","category":"monospace","variants":["regular","italic","700","700italic"]},{"family":"Carme","category":"sans-serif","variants":["regular"]},{"family":"Cousine","category":"monospace","variants":["regular","italic","700","700italic"]},{"family":"Cherry Cream Soda","category":"display","variants":["regular"]},{"family":"Reenie Beanie","category":"handwriting","variants":["regular"]},{"family":"Hind Siliguri","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Bubblegum Sans","category":"display","variants":["regular"]},{"family":"Aldrich","category":"sans-serif","variants":["regular"]},{"family":"Lustria","category":"serif","variants":["regular"]},{"family":"Alef","category":"sans-serif","variants":["regular","700"]},{"family":"Freckle Face","category":"display","variants":["regular"]},{"family":"Fanwood Text","category":"serif","variants":["regular","italic"]},{"family":"Advent Pro","category":"sans-serif","variants":["100","200","300","regular","500","600","700"]},{"family":"Allura","category":"handwriting","variants":["regular"]},{"family":"Ceviche One","category":"display","variants":["regular"]},{"family":"Press Start 2P","category":"display","variants":["regular"]},{"family":"Overlock","category":"display","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Niconne","category":"handwriting","variants":["regular"]},{"family":"Limelight","category":"display","variants":["regular"]},{"family":"Frank Ruhl Libre","category":"sans-serif","variants":["300","regular","500","700","900"]},{"family":"Allerta Stencil","category":"sans-serif","variants":["regular"]},{"family":"Marcellus","category":"serif","variants":["regular"]},{"family":"Pragati Narrow","category":"sans-serif","variants":["regular","700"]},{"family":"Michroma","category":"sans-serif","variants":["regular"]},{"family":"Fauna One","category":"serif","variants":["regular"]},{"family":"Syncopate","category":"sans-serif","variants":["regular","700"]},{"family":"Telex","category":"sans-serif","variants":["regular"]},{"family":"Marvel","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Cabin Sketch","category":"display","variants":["regular","700"]},{"family":"Hanuman","category":"serif","variants":["regular","700"]},{"family":"Cairo","category":"sans-serif","variants":["200","300","regular","600","700","900"]},{"family":"Chivo","category":"sans-serif","variants":["300","300italic","regular","italic","700","700italic","900","900italic"]},{"family":"Allerta","category":"sans-serif","variants":["regular"]},{"family":"Fugaz One","category":"display","variants":["regular"]},{"family":"Viga","category":"sans-serif","variants":["regular"]},{"family":"Ruslan Display","category":"display","variants":["regular"]},{"family":"Nixie One","category":"display","variants":["regular"]},{"family":"Marmelad","category":"sans-serif","variants":["regular"]},{"family":"Average","category":"serif","variants":["regular"]},{"family":"Spinnaker","category":"sans-serif","variants":["regular"]},{"family":"Leckerli One","category":"handwriting","variants":["regular"]},{"family":"Judson","category":"serif","variants":["regular","italic","700"]},{"family":"Lusitana","category":"serif","variants":["regular","700"]},{"family":"Montserrat Alternates","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Contrail One","category":"display","variants":["regular"]},{"family":"Oranienbaum","category":"serif","variants":["regular"]},{"family":"Hind Vadodara","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Rufina","category":"serif","variants":["regular","700"]},{"family":"Quantico","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Concert One","category":"display","variants":["regular"]},{"family":"Marcellus SC","category":"serif","variants":["regular"]},{"family":"Jockey One","category":"sans-serif","variants":["regular"]},{"family":"Parisienne","category":"handwriting","variants":["regular"]},{"family":"Carter One","category":"display","variants":["regular"]},{"family":"Arbutus Slab","category":"serif","variants":["regular"]},{"family":"Slabo 13px","category":"serif","variants":["regular"]},{"family":"Tauri","category":"sans-serif","variants":["regular"]},{"family":"Goudy Bookletter 1911","category":"serif","variants":["regular"]},{"family":"Carrois Gothic","category":"sans-serif","variants":["regular"]},{"family":"Sue Ellen Francisco","category":"handwriting","variants":["regular"]},{"family":"Walter Turncoat","category":"handwriting","variants":["regular"]},{"family":"Annie Use Your Telescope","category":"handwriting","variants":["regular"]},{"family":"Puritan","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Grand Hotel","category":"handwriting","variants":["regular"]},{"family":"Yesteryear","category":"handwriting","variants":["regular"]},{"family":"Jaldi","category":"sans-serif","variants":["regular","700"]},{"family":"Khula","category":"sans-serif","variants":["300","regular","600","700","800"]},{"family":"Cinzel Decorative","category":"display","variants":["regular","700","900"]},{"family":"Crafty Girls","category":"handwriting","variants":["regular"]},{"family":"Merienda","category":"handwriting","variants":["regular","700"]},{"family":"Hind Guntur","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Cutive","category":"serif","variants":["regular"]},{"family":"Prompt","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Coustard","category":"serif","variants":["regular","900"]},{"family":"Arima Madurai","category":"display","variants":["100","200","300","regular","500","700","800","900"]},{"family":"Doppio One","category":"sans-serif","variants":["regular"]},{"family":"Radley","category":"serif","variants":["regular","italic"]},{"family":"Fontdiner Swanky","category":"display","variants":["regular"]},{"family":"Iceland","category":"display","variants":["regular"]},{"family":"Alegreya SC","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Halant","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Schoolbell","category":"handwriting","variants":["regular"]},{"family":"Waiting for the Sunrise","category":"handwriting","variants":["regular"]},{"family":"Italianno","category":"handwriting","variants":["regular"]},{"family":"Fredericka the Great","category":"display","variants":["regular"]},{"family":"Average Sans","category":"sans-serif","variants":["regular"]},{"family":"Rosario","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Mr Dafoe","category":"handwriting","variants":["regular"]},{"family":"Port Lligat Slab","category":"serif","variants":["regular"]},{"family":"Aclonica","category":"sans-serif","variants":["regular"]},{"family":"Graduate","category":"display","variants":["regular"]},{"family":"Racing Sans One","category":"display","variants":["regular"]},{"family":"Berkshire Swash","category":"handwriting","variants":["regular"]},{"family":"Forum","category":"display","variants":["regular"]},{"family":"Anonymous Pro","category":"monospace","variants":["regular","italic","700","700italic"]},{"family":"Love Ya Like A Sister","category":"display","variants":["regular"]},{"family":"Nunito Sans","category":"sans-serif","variants":["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Magra","category":"sans-serif","variants":["regular","700"]},{"family":"Lateef","category":"handwriting","variants":["regular"]},{"family":"Assistant","category":"sans-serif","variants":["200","300","regular","600","700","800"]},{"family":"Six Caps","category":"sans-serif","variants":["regular"]},{"family":"Gilda Display","category":"serif","variants":["regular"]},{"family":"Oregano","category":"display","variants":["regular","italic"]},{"family":"Metrophobic","category":"sans-serif","variants":["regular"]},{"family":"Lalezar","category":"display","variants":["regular"]},{"family":"Caudex","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Kelly Slab","category":"display","variants":["regular"]},{"family":"Reem Kufi","category":"sans-serif","variants":["regular"]},{"family":"Cambay","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Gruppo","category":"display","variants":["regular"]},{"family":"Give You Glory","category":"handwriting","variants":["regular"]},{"family":"GFS Didot","category":"serif","variants":["regular"]},{"family":"Duru Sans","category":"sans-serif","variants":["regular"]},{"family":"Andika","category":"sans-serif","variants":["regular"]},{"family":"Tenor Sans","category":"sans-serif","variants":["regular"]},{"family":"Knewave","category":"display","variants":["regular"]},{"family":"Averia Serif Libre","category":"display","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Eczar","category":"serif","variants":["regular","500","600","700","800"]},{"family":"Inder","category":"sans-serif","variants":["regular"]},{"family":"Martel Sans","category":"sans-serif","variants":["200","300","regular","600","700","800","900"]},{"family":"Trocchi","category":"serif","variants":["regular"]},{"family":"Wire One","category":"sans-serif","variants":["regular"]},{"family":"Petit Formal Script","category":"handwriting","variants":["regular"]},{"family":"Mako","category":"sans-serif","variants":["regular"]},{"family":"Frijole","category":"display","variants":["regular"]},{"family":"Zeyada","category":"handwriting","variants":["regular"]},{"family":"Slackey","category":"display","variants":["regular"]},{"family":"Karma","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Mate","category":"serif","variants":["regular","italic"]},{"family":"Belleza","category":"sans-serif","variants":["regular"]},{"family":"Montez","category":"handwriting","variants":["regular"]},{"family":"Quando","category":"serif","variants":["regular"]},{"family":"Capriola","category":"sans-serif","variants":["regular"]},{"family":"Lilita One","category":"display","variants":["regular"]},{"family":"Trirong","category":"serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Lekton","category":"sans-serif","variants":["regular","italic","700"]},{"family":"Just Me Again Down Here","category":"handwriting","variants":["regular"]},{"family":"Bowlby One SC","category":"display","variants":["regular"]},{"family":"The Girl Next Door","category":"handwriting","variants":["regular"]},{"family":"Happy Monkey","category":"display","variants":["regular"]},{"family":"Merienda One","category":"handwriting","variants":["regular"]},{"family":"Alike","category":"serif","variants":["regular"]},{"family":"Chelsea Market","category":"display","variants":["regular"]},{"family":"Unkempt","category":"display","variants":["regular","700"]},{"family":"Anaheim","category":"sans-serif","variants":["regular"]},{"family":"Strait","category":"sans-serif","variants":["regular"]},{"family":"Brawler","category":"serif","variants":["regular"]},{"family":"Clicker Script","category":"handwriting","variants":["regular"]},{"family":"Delius","category":"handwriting","variants":["regular"]},{"family":"Mouse Memoirs","category":"sans-serif","variants":["regular"]},{"family":"IM Fell Double Pica","category":"serif","variants":["regular","italic"]},{"family":"Crushed","category":"display","variants":["regular"]},{"family":"Rammetto One","category":"display","variants":["regular"]},{"family":"Prosto One","category":"display","variants":["regular"]},{"family":"Kranky","category":"display","variants":["regular"]},{"family":"IM Fell English","category":"serif","variants":["regular","italic"]},{"family":"Aladin","category":"handwriting","variants":["regular"]},{"family":"Mr De Haviland","category":"handwriting","variants":["regular"]},{"family":"NTR","category":"sans-serif","variants":["regular"]},{"family":"Londrina Solid","category":"display","variants":["regular"]},{"family":"Skranji","category":"display","variants":["regular","700"]},{"family":"Allan","category":"display","variants":["regular","700"]},{"family":"Baumans","category":"display","variants":["regular"]},{"family":"Ovo","category":"serif","variants":["regular"]},{"family":"Changa","category":"sans-serif","variants":["200","300","regular","500","600","700","800"]},{"family":"Lemon","category":"display","variants":["regular"]},{"family":"Federo","category":"sans-serif","variants":["regular"]},{"family":"Herr Von Muellerhoff","category":"handwriting","variants":["regular"]},{"family":"Arizonia","category":"handwriting","variants":["regular"]},{"family":"Bowlby One","category":"display","variants":["regular"]},{"family":"Orienta","category":"sans-serif","variants":["regular"]},{"family":"Short Stack","category":"handwriting","variants":["regular"]},{"family":"Bungee Inline","category":"display","variants":["regular"]},{"family":"Andada","category":"serif","variants":["regular"]},{"family":"Baloo Paaji","category":"display","variants":["regular"]},{"family":"Oxygen Mono","category":"monospace","variants":["regular"]},{"family":"Yeseva One","category":"display","variants":["regular"]},{"family":"UnifrakturMaguntia","category":"display","variants":["regular"]},{"family":"Bentham","category":"serif","variants":["regular"]},{"family":"Londrina Outline","category":"display","variants":["regular"]},{"family":"Pompiere","category":"display","variants":["regular"]},{"family":"Gabriela","category":"serif","variants":["regular"]},{"family":"Qwigley","category":"handwriting","variants":["regular"]},{"family":"Nova Square","category":"display","variants":["regular"]},{"family":"Poly","category":"serif","variants":["regular","italic"]},{"family":"Sniglet","category":"display","variants":["regular","800"]},{"family":"Patrick Hand SC","category":"handwriting","variants":["regular"]},{"family":"Gravitas One","category":"display","variants":["regular"]},{"family":"Khmer","category":"display","variants":["regular"]},{"family":"Shojumaru","category":"display","variants":["regular"]},{"family":"Kurale","category":"serif","variants":["regular"]},{"family":"Gafata","category":"sans-serif","variants":["regular"]},{"family":"Biryani","category":"sans-serif","variants":["200","300","regular","600","700","800","900"]},{"family":"Cambo","category":"serif","variants":["regular"]},{"family":"Titan One","category":"display","variants":["regular"]},{"family":"Carrois Gothic SC","category":"sans-serif","variants":["regular"]},{"family":"La Belle Aurore","category":"handwriting","variants":["regular"]},{"family":"Holtwood One SC","category":"serif","variants":["regular"]},{"family":"Oleo Script Swash Caps","category":"display","variants":["regular","700"]},{"family":"Headland One","category":"serif","variants":["regular"]},{"family":"Cherry Swash","category":"display","variants":["regular","700"]},{"family":"Belgrano","category":"serif","variants":["regular"]},{"family":"Norican","category":"handwriting","variants":["regular"]},{"family":"Mountains of Christmas","category":"display","variants":["regular","700"]},{"family":"Julee","category":"handwriting","variants":["regular"]},{"family":"Ramabhadra","category":"sans-serif","variants":["regular"]},{"family":"Mallanna","category":"sans-serif","variants":["regular"]},{"family":"Kristi","category":"handwriting","variants":["regular"]},{"family":"Imprima","category":"sans-serif","variants":["regular"]},{"family":"Lily Script One","category":"display","variants":["regular"]},{"family":"Chau Philomene One","category":"sans-serif","variants":["regular","italic"]},{"family":"Bilbo Swash Caps","category":"handwriting","variants":["regular"]},{"family":"Finger Paint","category":"display","variants":["regular"]},{"family":"Voces","category":"display","variants":["regular"]},{"family":"Itim","category":"handwriting","variants":["regular"]},{"family":"Megrim","category":"display","variants":["regular"]},{"family":"Simonetta","category":"display","variants":["regular","italic","900","900italic"]},{"family":"Cutive Mono","category":"monospace","variants":["regular"]},{"family":"Stardos Stencil","category":"display","variants":["regular","700"]},{"family":"IM Fell DW Pica","category":"serif","variants":["regular","italic"]},{"family":"Unna","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Loved by the King","category":"handwriting","variants":["regular"]},{"family":"Prociono","category":"serif","variants":["regular"]},{"family":"Corben","category":"display","variants":["regular","700"]},{"family":"Amiko","category":"sans-serif","variants":["regular","600","700"]},{"family":"Denk One","category":"sans-serif","variants":["regular"]},{"family":"Palanquin","category":"sans-serif","variants":["100","200","300","regular","500","600","700"]},{"family":"Baloo","category":"display","variants":["regular"]},{"family":"Fondamento","category":"handwriting","variants":["regular","italic"]},{"family":"Seaweed Script","category":"display","variants":["regular"]},{"family":"Shanti","category":"sans-serif","variants":["regular"]},{"family":"Wendy One","category":"sans-serif","variants":["regular"]},{"family":"Raleway Dots","category":"display","variants":["regular"]},{"family":"Amethysta","category":"serif","variants":["regular"]},{"family":"Vast Shadow","category":"display","variants":["regular"]},{"family":"Stalemate","category":"handwriting","variants":["regular"]},{"family":"Fira Mono","category":"monospace","variants":["regular","500","700"]},{"family":"Expletus Sans","category":"display","variants":["regular","italic","500","500italic","600","600italic","700","700italic"]},{"family":"Scheherazade","category":"serif","variants":["regular","700"]},{"family":"Fenix","category":"serif","variants":["regular"]},{"family":"Delius Swash Caps","category":"handwriting","variants":["regular"]},{"family":"Rouge Script","category":"handwriting","variants":["regular"]},{"family":"Life Savers","category":"display","variants":["regular","700"]},{"family":"IM Fell English SC","category":"serif","variants":["regular"]},{"family":"Meddon","category":"handwriting","variants":["regular"]},{"family":"Tienne","category":"serif","variants":["regular","700","900"]},{"family":"Over the Rainbow","category":"handwriting","variants":["regular"]},{"family":"Share Tech Mono","category":"monospace","variants":["regular"]},{"family":"Abhaya Libre","category":"serif","variants":["regular","500","600","700","800"]},{"family":"Kotta One","category":"serif","variants":["regular"]},{"family":"Pridi","category":"serif","variants":["200","300","regular","500","600","700"]},{"family":"Euphoria Script","category":"handwriting","variants":["regular"]},{"family":"Engagement","category":"handwriting","variants":["regular"]},{"family":"Podkova","category":"serif","variants":["regular","500","600","700","800"]},{"family":"Salsa","category":"display","variants":["regular"]},{"family":"Sofia","category":"handwriting","variants":["regular"]},{"family":"Suranna","category":"serif","variants":["regular"]},{"family":"Mada","category":"sans-serif","variants":["300","regular","500","900"]},{"family":"Chonburi","category":"display","variants":["regular"]},{"family":"Ledger","category":"serif","variants":["regular"]},{"family":"Italiana","category":"serif","variants":["regular"]},{"family":"Dawning of a New Day","category":"handwriting","variants":["regular"]},{"family":"Nokora","category":"serif","variants":["regular","700"]},{"family":"Angkor","category":"display","variants":["regular"]},{"family":"Medula One","category":"display","variants":["regular"]},{"family":"Taviraj","category":"serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Vampiro One","category":"display","variants":["regular"]},{"family":"Englebert","category":"sans-serif","variants":["regular"]},{"family":"Nova Mono","category":"monospace","variants":["regular"]},{"family":"Dorsa","category":"sans-serif","variants":["regular"]},{"family":"Averia Sans Libre","category":"display","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Cedarville Cursive","category":"handwriting","variants":["regular"]},{"family":"Geo","category":"sans-serif","variants":["regular","italic"]},{"family":"Rationale","category":"sans-serif","variants":["regular"]},{"family":"Balthazar","category":"serif","variants":["regular"]},{"family":"Sunshiney","category":"handwriting","variants":["regular"]},{"family":"Aguafina Script","category":"handwriting","variants":["regular"]},{"family":"Mystery Quest","category":"display","variants":["regular"]},{"family":"Fjord One","category":"serif","variants":["regular"]},{"family":"Fira Sans Extra Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Kadwa","category":"serif","variants":["regular","700"]},{"family":"McLaren","category":"display","variants":["regular"]},{"family":"Rye","category":"display","variants":["regular"]},{"family":"Sail","category":"display","variants":["regular"]},{"family":"Athiti","category":"sans-serif","variants":["200","300","regular","500","600","700"]},{"family":"Rosarivo","category":"serif","variants":["regular","italic"]},{"family":"Kite One","category":"sans-serif","variants":["regular"]},{"family":"Odor Mean Chey","category":"display","variants":["regular"]},{"family":"Numans","category":"sans-serif","variants":["regular"]},{"family":"Artifika","category":"serif","variants":["regular"]},{"family":"Poller One","category":"display","variants":["regular"]},{"family":"Gurajada","category":"serif","variants":["regular"]},{"family":"Inika","category":"serif","variants":["regular","700"]},{"family":"Mandali","category":"sans-serif","variants":["regular"]},{"family":"Bungee Shade","category":"display","variants":["regular"]},{"family":"Suwannaphum","category":"display","variants":["regular"]},{"family":"Mate SC","category":"serif","variants":["regular"]},{"family":"Creepster","category":"display","variants":["regular"]},{"family":"Arsenal","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Montserrat Subrayada","category":"sans-serif","variants":["regular","700"]},{"family":"Metamorphous","category":"display","variants":["regular"]},{"family":"Palanquin Dark","category":"sans-serif","variants":["regular","500","600","700"]},{"family":"Coda Caption","category":"sans-serif","variants":["800"]},{"family":"Dynalight","category":"display","variants":["regular"]},{"family":"Maitree","category":"serif","variants":["200","300","regular","500","600","700"]},{"family":"IM Fell French Canon","category":"serif","variants":["regular","italic"]},{"family":"Amarante","category":"display","variants":["regular"]},{"family":"Quintessential","category":"handwriting","variants":["regular"]},{"family":"Codystar","category":"display","variants":["300","regular"]},{"family":"Cantora One","category":"sans-serif","variants":["regular"]},{"family":"Aref Ruqaa","category":"serif","variants":["regular","700"]},{"family":"Griffy","category":"display","variants":["regular"]},{"family":"Revalia","category":"display","variants":["regular"]},{"family":"Buenard","category":"serif","variants":["regular","700"]},{"family":"Donegal One","category":"serif","variants":["regular"]},{"family":"IM Fell DW Pica SC","category":"serif","variants":["regular"]},{"family":"Habibi","category":"serif","variants":["regular"]},{"family":"Share Tech","category":"sans-serif","variants":["regular"]},{"family":"Flamenco","category":"display","variants":["300","regular"]},{"family":"Mitr","category":"sans-serif","variants":["200","300","regular","500","600","700"]},{"family":"Maiden Orange","category":"display","variants":["regular"]},{"family":"Diplomata SC","category":"display","variants":["regular"]},{"family":"Cormorant","category":"serif","variants":["300","300italic","regular","italic","500","500italic","600","600italic","700","700italic"]},{"family":"Delius Unicase","category":"handwriting","variants":["regular","700"]},{"family":"Stoke","category":"serif","variants":["300","regular"]},{"family":"Vibur","category":"handwriting","variants":["regular"]},{"family":"Sarpanch","category":"sans-serif","variants":["regular","500","600","700","800","900"]},{"family":"Baloo Bhaina","category":"display","variants":["regular"]},{"family":"Baloo Tamma","category":"display","variants":["regular"]},{"family":"Averia Libre","category":"display","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Esteban","category":"serif","variants":["regular"]},{"family":"Battambang","category":"display","variants":["regular","700"]},{"family":"Bokor","category":"display","variants":["regular"]},{"family":"Wallpoet","category":"display","variants":["regular"]},{"family":"IM Fell Great Primer","category":"serif","variants":["regular","italic"]},{"family":"Tulpen One","category":"display","variants":["regular"]},{"family":"Proza Libre","category":"sans-serif","variants":["regular","italic","500","500italic","600","600italic","700","700italic","800","800italic"]},{"family":"IM Fell French Canon SC","category":"serif","variants":["regular"]},{"family":"Vesper Libre","category":"serif","variants":["regular","500","700","900"]},{"family":"Rozha One","category":"serif","variants":["regular"]},{"family":"Sansita","category":"sans-serif","variants":["regular","italic","700","700italic","800","800italic","900","900italic"]},{"family":"Kavoon","category":"display","variants":["regular"]},{"family":"Della Respira","category":"serif","variants":["regular"]},{"family":"Milonga","category":"display","variants":["regular"]},{"family":"Condiment","category":"handwriting","variants":["regular"]},{"family":"Junge","category":"serif","variants":["regular"]},{"family":"New Rocker","category":"display","variants":["regular"]},{"family":"Chicle","category":"display","variants":["regular"]},{"family":"Mrs Saint Delafield","category":"handwriting","variants":["regular"]},{"family":"League Script","category":"handwriting","variants":["regular"]},{"family":"Miniver","category":"display","variants":["regular"]},{"family":"Galindo","category":"display","variants":["regular"]},{"family":"Moul","category":"display","variants":["regular"]},{"family":"Amatica SC","category":"display","variants":["regular","700"]},{"family":"Stint Ultra Expanded","category":"display","variants":["regular"]},{"family":"Yrsa","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Stint Ultra Condensed","category":"display","variants":["regular"]},{"family":"Suez One","category":"serif","variants":["regular"]},{"family":"Text Me One","category":"sans-serif","variants":["regular"]},{"family":"Buda","category":"display","variants":["300"]},{"family":"Ruluko","category":"sans-serif","variants":["regular"]},{"family":"Sonsie One","category":"display","variants":["regular"]},{"family":"Krona One","category":"sans-serif","variants":["regular"]},{"family":"Elsie","category":"display","variants":["regular","900"]},{"family":"Pangolin","category":"handwriting","variants":["regular"]},{"family":"Linden Hill","category":"serif","variants":["regular","italic"]},{"family":"Secular One","category":"sans-serif","variants":["regular"]},{"family":"IM Fell Double Pica SC","category":"serif","variants":["regular"]},{"family":"Alike Angular","category":"serif","variants":["regular"]},{"family":"Sancreek","category":"display","variants":["regular"]},{"family":"Bilbo","category":"handwriting","variants":["regular"]},{"family":"Antic Didone","category":"serif","variants":["regular"]},{"family":"Paprika","category":"display","variants":["regular"]},{"family":"Asul","category":"sans-serif","variants":["regular","700"]},{"family":"David Libre","category":"serif","variants":["regular","500","700"]},{"family":"Almendra","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Sriracha","category":"handwriting","variants":["regular"]},{"family":"Miriam Libre","category":"sans-serif","variants":["regular","700"]},{"family":"Ribeye","category":"display","variants":["regular"]},{"family":"Swanky and Moo Moo","category":"handwriting","variants":["regular"]},{"family":"Trade Winds","category":"display","variants":["regular"]},{"family":"Overlock SC","category":"display","variants":["regular"]},{"family":"Nova Round","category":"display","variants":["regular"]},{"family":"Cagliostro","category":"sans-serif","variants":["regular"]},{"family":"Glass Antiqua","category":"display","variants":["regular"]},{"family":"Offside","category":"display","variants":["regular"]},{"family":"El Messiri","category":"sans-serif","variants":["regular","500","600","700"]},{"family":"Bigshot One","category":"display","variants":["regular"]},{"family":"IM Fell Great Primer SC","category":"serif","variants":["regular"]},{"family":"Akronim","category":"display","variants":["regular"]},{"family":"Fira Sans Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Nosifer","category":"display","variants":["regular"]},{"family":"Autour One","category":"display","variants":["regular"]},{"family":"Pirata One","category":"display","variants":["regular"]},{"family":"Port Lligat Sans","category":"sans-serif","variants":["regular"]},{"family":"Scope One","category":"serif","variants":["regular"]},{"family":"Sumana","category":"serif","variants":["regular","700"]},{"family":"Lemonada","category":"display","variants":["300","regular","600","700"]},{"family":"Montaga","category":"serif","variants":["regular"]},{"family":"Iceberg","category":"display","variants":["regular"]},{"family":"Ruthie","category":"handwriting","variants":["regular"]},{"family":"Content","category":"display","variants":["regular","700"]},{"family":"Henny Penny","category":"display","variants":["regular"]},{"family":"Nova Slim","category":"display","variants":["regular"]},{"family":"Hind Madurai","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Harmattan","category":"sans-serif","variants":["regular"]},{"family":"UnifrakturCook","category":"display","variants":["700"]},{"family":"Sarina","category":"display","variants":["regular"]},{"family":"Bubbler One","category":"sans-serif","variants":["regular"]},{"family":"Dekko","category":"handwriting","variants":["regular"]},{"family":"Redressed","category":"handwriting","variants":["regular"]},{"family":"Laila","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Faster One","category":"display","variants":["regular"]},{"family":"Arya","category":"sans-serif","variants":["regular","700"]},{"family":"Peralta","category":"display","variants":["regular"]},{"family":"Meie Script","category":"handwriting","variants":["regular"]},{"family":"Overpass","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Monsieur La Doulaise","category":"handwriting","variants":["regular"]},{"family":"Bungee","category":"display","variants":["regular"]},{"family":"Snippet","category":"sans-serif","variants":["regular"]},{"family":"Emilys Candy","category":"display","variants":["regular"]},{"family":"Trykker","category":"serif","variants":["regular"]},{"family":"MedievalSharp","category":"display","variants":["regular"]},{"family":"Space Mono","category":"monospace","variants":["regular","italic","700","700italic"]},{"family":"Croissant One","category":"display","variants":["regular"]},{"family":"Monofett","category":"display","variants":["regular"]},{"family":"Lovers Quarrel","category":"handwriting","variants":["regular"]},{"family":"Oldenburg","category":"display","variants":["regular"]},{"family":"Galdeano","category":"sans-serif","variants":["regular"]},{"family":"Spicy Rice","category":"display","variants":["regular"]},{"family":"Wellfleet","category":"display","variants":["regular"]},{"family":"Germania One","category":"display","variants":["regular"]},{"family":"GFS Neohellenic","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Baloo Thambi","category":"display","variants":["regular"]},{"family":"Jolly Lodger","category":"display","variants":["regular"]},{"family":"Rubik Mono One","category":"sans-serif","variants":["regular"]},{"family":"Pattaya","category":"sans-serif","variants":["regular"]},{"family":"Joti One","category":"display","variants":["regular"]},{"family":"Siemreap","category":"display","variants":["regular"]},{"family":"Ranga","category":"display","variants":["regular","700"]},{"family":"Chango","category":"display","variants":["regular"]},{"family":"Miltonian Tattoo","category":"display","variants":["regular"]},{"family":"Koulen","category":"display","variants":["regular"]},{"family":"Eagle Lake","category":"handwriting","variants":["regular"]},{"family":"Nova Flat","category":"display","variants":["regular"]},{"family":"Petrona","category":"serif","variants":["regular"]},{"family":"Jacques Francois","category":"serif","variants":["regular"]},{"family":"Amita","category":"handwriting","variants":["regular","700"]},{"family":"Plaster","category":"display","variants":["regular"]},{"family":"Ramaraja","category":"serif","variants":["regular"]},{"family":"Sura","category":"serif","variants":["regular","700"]},{"family":"Kenia","category":"display","variants":["regular"]},{"family":"Fresca","category":"sans-serif","variants":["regular"]},{"family":"Jomhuria","category":"display","variants":["regular"]},{"family":"Lancelot","category":"display","variants":["regular"]},{"family":"Pavanam","category":"sans-serif","variants":["regular"]},{"family":"Rum Raisin","category":"sans-serif","variants":["regular"]},{"family":"Almendra SC","category":"serif","variants":["regular"]},{"family":"Purple Purse","category":"display","variants":["regular"]},{"family":"Kumar One","category":"display","variants":["regular"]},{"family":"Modern Antiqua","category":"display","variants":["regular"]},{"family":"Piedra","category":"display","variants":["regular"]},{"family":"Irish Grover","category":"display","variants":["regular"]},{"family":"Molle","category":"handwriting","variants":["italic"]},{"family":"Cormorant Infant","category":"serif","variants":["300","300italic","regular","italic","500","500italic","600","600italic","700","700italic"]},{"family":"Margarine","category":"display","variants":["regular"]},{"family":"Sahitya","category":"serif","variants":["regular","700"]},{"family":"Mukta Vaani","category":"sans-serif","variants":["200","300","regular","500","600","700","800"]},{"family":"Astloch","category":"display","variants":["regular","700"]},{"family":"Snowburst One","category":"display","variants":["regular"]},{"family":"Rhodium Libre","category":"serif","variants":["regular"]},{"family":"Smythe","category":"display","variants":["regular"]},{"family":"Asset","category":"display","variants":["regular"]},{"family":"Ewert","category":"display","variants":["regular"]},{"family":"Keania One","category":"display","variants":["regular"]},{"family":"Ranchers","category":"display","variants":["regular"]},{"family":"Gorditas","category":"display","variants":["regular","700"]},{"family":"Sirin Stencil","category":"display","variants":["regular"]},{"family":"Averia Gruesa Libre","category":"display","variants":["regular"]},{"family":"Trochut","category":"display","variants":["regular","italic","700"]},{"family":"Baloo Chettan","category":"display","variants":["regular"]},{"family":"Kdam Thmor","category":"display","variants":["regular"]},{"family":"Timmana","category":"sans-serif","variants":["regular"]},{"family":"Original Surfer","category":"display","variants":["regular"]},{"family":"Supermercado One","category":"display","variants":["regular"]},{"family":"Mirza","category":"display","variants":["regular","500","600","700"]},{"family":"Passero One","category":"display","variants":["regular"]},{"family":"Nova Oval","category":"display","variants":["regular"]},{"family":"Caesar Dressing","category":"display","variants":["regular"]},{"family":"Taprom","category":"display","variants":["regular"]},{"family":"Fascinate","category":"display","variants":["regular"]},{"family":"Seymour One","category":"sans-serif","variants":["regular"]},{"family":"Freehand","category":"display","variants":["regular"]},{"family":"Ravi Prakash","category":"display","variants":["regular"]},{"family":"Coiny","category":"display","variants":["regular"]},{"family":"Atomic Age","category":"display","variants":["regular"]},{"family":"Jacques Francois Shadow","category":"display","variants":["regular"]},{"family":"Diplomata","category":"display","variants":["regular"]},{"family":"Dr Sugiyama","category":"handwriting","variants":["regular"]},{"family":"Miltonian","category":"display","variants":["regular"]},{"family":"Ribeye Marrow","category":"display","variants":["regular"]},{"family":"Elsie Swash Caps","category":"display","variants":["regular","900"]},{"family":"Felipa","category":"handwriting","variants":["regular"]},{"family":"Galada","category":"display","variants":["regular"]},{"family":"Nova Script","category":"display","variants":["regular"]},{"family":"Bayon","category":"display","variants":["regular"]},{"family":"Underdog","category":"display","variants":["regular"]},{"family":"Devonshire","category":"handwriting","variants":["regular"]},{"family":"Atma","category":"display","variants":["300","regular","500","600","700"]},{"family":"Londrina Shadow","category":"display","variants":["regular"]},{"family":"Sofadi One","category":"display","variants":["regular"]},{"family":"Tillana","category":"handwriting","variants":["regular","500","600","700","800"]},{"family":"Inknut Antiqua","category":"serif","variants":["300","regular","500","600","700","800","900"]},{"family":"Goblin One","category":"display","variants":["regular"]},{"family":"Rakkas","category":"display","variants":["regular"]},{"family":"Metal","category":"display","variants":["regular"]},{"family":"Farsan","category":"display","variants":["regular"]},{"family":"Londrina Sketch","category":"display","variants":["regular"]},{"family":"Nova Cut","category":"display","variants":["regular"]},{"family":"BioRhyme","category":"serif","variants":["200","300","regular","700","800"]},{"family":"Warnes","category":"display","variants":["regular"]},{"family":"Romanesco","category":"handwriting","variants":["regular"]},{"family":"Fascinate Inline","category":"display","variants":["regular"]},{"family":"Mrs Sheppards","category":"handwriting","variants":["regular"]},{"family":"Princess Sofia","category":"handwriting","variants":["regular"]},{"family":"Modak","category":"display","variants":["regular"]},{"family":"Spirax","category":"display","variants":["regular"]},{"family":"Cormorant Upright","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Geostar Fill","category":"display","variants":["regular"]},{"family":"Cormorant SC","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Baloo Bhai","category":"display","variants":["regular"]},{"family":"Sree Krushnadevaraya","category":"serif","variants":["regular"]},{"family":"Smokum","category":"display","variants":["regular"]},{"family":"Arbutus","category":"display","variants":["regular"]},{"family":"Fruktur","category":"display","variants":["regular"]},{"family":"Geostar","category":"display","variants":["regular"]},{"family":"Marko One","category":"serif","variants":["regular"]},{"family":"Erica One","category":"display","variants":["regular"]},{"family":"Yatra One","category":"display","variants":["regular"]},{"family":"Uncial Antiqua","category":"display","variants":["regular"]},{"family":"Combo","category":"display","variants":["regular"]},{"family":"Gidugu","category":"sans-serif","variants":["regular"]},{"family":"Aubrey","category":"display","variants":["regular"]},{"family":"Jim Nightshade","category":"handwriting","variants":["regular"]},{"family":"Butterfly Kids","category":"handwriting","variants":["regular"]},{"family":"Metal Mania","category":"display","variants":["regular"]},{"family":"Macondo","category":"display","variants":["regular"]},{"family":"Chenla","category":"display","variants":["regular"]},{"family":"Miss Fajardose","category":"handwriting","variants":["regular"]},{"family":"Macondo Swash Caps","category":"display","variants":["regular"]},{"family":"Barrio","category":"display","variants":["regular"]},{"family":"Sevillana","category":"display","variants":["regular"]},{"family":"Bigelow Rules","category":"display","variants":["regular"]},{"family":"Rasa","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Risque","category":"display","variants":["regular"]},{"family":"Federant","category":"display","variants":["regular"]},{"family":"Dangrek","category":"display","variants":["regular"]},{"family":"Chathura","category":"sans-serif","variants":["100","300","regular","700","800"]},{"family":"Almendra Display","category":"display","variants":["regular"]},{"family":"Chela One","category":"display","variants":["regular"]},{"family":"Bonbon","category":"handwriting","variants":["regular"]},{"family":"Stalinist One","category":"display","variants":["regular"]},{"family":"Mr Bedfort","category":"handwriting","variants":["regular"]},{"family":"Eater","category":"display","variants":["regular"]},{"family":"Fasthand","category":"serif","variants":["regular"]},{"family":"Mogra","category":"display","variants":["regular"]},{"family":"Padauk","category":"sans-serif","variants":["regular","700"]},{"family":"Preahvihear","category":"display","variants":["regular"]},{"family":"Flavors","category":"display","variants":["regular"]},{"family":"Ruge Boogie","category":"handwriting","variants":["regular"]},{"family":"Tenali Ramakrishna","category":"sans-serif","variants":["regular"]},{"family":"Unlock","category":"display","variants":["regular"]},{"family":"Butcherman","category":"display","variants":["regular"]},{"family":"Baloo Da","category":"display","variants":["regular"]},{"family":"Lakki Reddy","category":"handwriting","variants":["regular"]},{"family":"Cormorant Unicase","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Katibeh","category":"display","variants":["regular"]},{"family":"Asar","category":"serif","variants":["regular"]},{"family":"Emblema One","category":"display","variants":["regular"]},{"family":"Moulpali","category":"display","variants":["regular"]},{"family":"Meera Inimai","category":"sans-serif","variants":["regular"]},{"family":"Kantumruy","category":"sans-serif","variants":["300","regular","700"]},{"family":"Suravaram","category":"serif","variants":["regular"]},{"family":"Bungee Hairline","category":"display","variants":["regular"]},{"family":"Overpass Mono","category":"monospace","variants":["300","regular","600","700"]},{"family":"Peddana","category":"serif","variants":["regular"]},{"family":"Bahiana","category":"display","variants":["regular"]},{"family":"Kumar One Outline","category":"display","variants":["regular"]},{"family":"Hanalei Fill","category":"display","variants":["regular"]},{"family":"Dhurjati","category":"sans-serif","variants":["regular"]},{"family":"Hanalei","category":"display","variants":["regular"]},{"family":"Kavivanar","category":"handwriting","variants":["regular"]},{"family":"Bungee Outline","category":"display","variants":["regular"]},{"family":"BioRhyme Expanded","category":"serif","variants":["200","300","regular","700","800"]}]' ); + + // Loop through them and put what we need into our fonts array + $fonts = array(); + foreach ( $content as $item ) { + + // Grab what we need from our big list + $atts = array( + 'name' => $item->family, + 'category' => $item->category, + 'variants' => $item->variants, + ); + + // Create an ID using our font family name + $id = strtolower( str_replace( ' ', '_', $item->family ) ); + + // Add our attributes to our new array + $fonts[ $id ] = $atts; + } + + if ( 'all' !== $amount ) { + $fonts = array_slice( $fonts, 0, $amount ); + } + + // Alphabetize our fonts + if ( apply_filters( 'generate_alphabetize_google_fonts', true ) ) { + asort( $fonts ); + } + + // Filter to allow us to modify the fonts array + return apply_filters( 'generate_google_fonts_array', $fonts ); + } +} + +if ( ! function_exists( 'generate_get_all_google_fonts_ajax' ) ) { + add_action( 'wp_ajax_generate_get_all_google_fonts_ajax', 'generate_get_all_google_fonts_ajax' ); + /** + * Return an array of all of our Google Fonts. + * + * @since 1.3.0 + */ + function generate_get_all_google_fonts_ajax() { + // Bail if the nonce doesn't check out + if ( ! isset( $_POST['gp_customize_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['gp_customize_nonce'] ), 'gp_customize_nonce' ) ) { + wp_die(); + } + + // Do another nonce check + check_ajax_referer( 'gp_customize_nonce', 'gp_customize_nonce' ); + + // Bail if user can't edit theme options + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die(); + } + + // Get all of our fonts + $fonts = generate_get_all_google_fonts(); + + // Send all of our fonts in JSON format + echo wp_json_encode( $fonts ); + + // Exit + die(); + } +} + +if ( ! function_exists( 'generate_get_google_font_variants' ) ) { + /** + * Wrapper function to find variants for chosen Google Fonts + * Example: generate_get_google_font_variation( 'Open Sans' ) + * @since 1.3.0 + */ + function generate_get_google_font_variants( $font, $key = '' ) { + // Don't need variants if we're using a system font + if ( in_array( $font, generate_typography_default_fonts() ) ) { + return; + } + + // Return if we have our variants saved + if ( '' !== $key && get_theme_mod( $key . '_variants' ) ) { + return get_theme_mod( $key . '_variants' ); + } + + // Get our defaults + $defaults = generate_get_default_fonts(); + + // If our default font is selected and the category isn't saved, we already know the category + if ( $defaults[ $key ] == $font ) { + return $defaults[ $key . '_variants' ]; + } + + // Grab all of our fonts + // It's a big list, so hopefully we're not even still reading + $fonts = generate_get_all_google_fonts(); + + // Get the ID from our font + $id = strtolower( str_replace( ' ', '_', $font ) ); + + // If the ID doesn't exist within our fonts, we can bail + if ( ! array_key_exists( $id, $fonts ) ) { + return; + } + + // Grab all of the variants associated with our font + $variants = $fonts[ $id ]['variants']; + + // Loop through them and put them into an array, then turn them into a comma separated list + $output = array(); + if ( $variants ) { + foreach ( $variants as $variant ) { + $output[] = $variant; + } + return implode( ',', apply_filters( 'generate_typography_variants', $output ) ); + } + } +} + +if ( ! function_exists( 'generate_get_google_font_category' ) ) { + /** + * Wrapper function to find the category for chosen Google Font + * Example: generate_get_google_font_category( 'Open Sans' ) + * + * @since 1.3.0 + * + * @param string $font The name of our font. + * @param string $key The ID of the font setting. + * @return string The category of our font. + */ + function generate_get_google_font_category( $font, $key = '' ) { + // Don't need a category if we're using a system font + if ( in_array( $font, generate_typography_default_fonts() ) ) { + return; + } + + // Return if we have our variants saved + if ( '' !== $key && get_theme_mod( $key . '_category' ) ) { + return ', ' . get_theme_mod( $key . '_category' ); + } + + // Get our defaults + $defaults = generate_get_default_fonts(); + + // If our default font is selected and the category isn't saved, we already know the category + if ( $defaults[ $key ] == $font ) { + return ', ' . $defaults[ $key . '_category' ]; + } + + // Grab all of our fonts + // It's a big list, so hopefully we're not even still reading + $fonts = generate_get_all_google_fonts(); + + // Get the ID from our font + $id = strtolower( str_replace( ' ', '_', $font ) ); + + // If the ID doesn't exist within our fonts, we can bail + if ( ! array_key_exists( $id, $fonts ) ) { + return; + } + + // Let's grab our category to go with our font + $category = ! empty( $fonts[ $id ]['category'] ) ? ', ' . $fonts[ $id ]['category'] : ''; + + // Return it to be used by our function + return $category; + + } +} + + + +if ( ! function_exists( 'generate_get_font_family_css' ) ) { + /** + * Wrapper function to create font-family value for CSS. + * + * @since 1.3.0 + * + * @param string $font The name of our font. + * @param string $settings The ID of the settings we're looking up. + * @param array $default The defaults for our $settings. + * @return string The CSS value for our font family. + */ + function generate_get_font_family_css( $font, $settings, $default ) { + $generate_settings = wp_parse_args( + get_option( $settings, array() ), + $default + ); + + // We don't want to wrap quotes around these values + $no_quotes = array( + 'inherit', + 'Arial, Helvetica, sans-serif', + 'Georgia, Times New Roman, Times, serif', + 'Helvetica', + 'Impact', + 'Segoe UI, Helvetica Neue, Helvetica, sans-serif', + 'Tahoma, Geneva, sans-serif', + 'Trebuchet MS, Helvetica, sans-serif', + 'Verdana, Geneva, sans-serif', + apply_filters( 'generate_typography_system_stack', '-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"' ), + ); + + // Get our font + $font_family = $generate_settings[ $font ]; + + if ( 'System Stack' == $font_family ) { + $font_family = apply_filters( 'generate_typography_system_stack', '-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"' ); + } + + // If our value is still using the old format, fix it + if ( strpos( $font_family, ':' ) !== false ) { + $font_family = current( explode( ':', $font_family ) ); + } + + // Set up our wrapper + if ( in_array( $font_family, $no_quotes ) ) { + $wrapper_start = null; + $wrapper_end = null; + } else { + $wrapper_start = '"'; + $wrapper_end = '"' . generate_get_google_font_category( $font_family, $font ); + } + + // Output the CSS + $output = ( 'inherit' == $font_family ) ? '' : $wrapper_start . $font_family . $wrapper_end; + return $output; + } +} + +if ( ! function_exists( 'generate_add_to_font_customizer_list' ) ) { + add_filter( 'generate_typography_customize_list', 'generate_add_to_font_customizer_list' ); + /** + * This function makes sure your selected typography option exists in the Customizer list + * Why wouldn't it? Originally, all 800+ fonts were in each list. This has been reduced to 200. + * This functions makes sure that if you were using a font that is now not included in the 200, you won't lose it. + * + * @since 1.3.40 + */ + function generate_add_to_font_customizer_list( $fonts ) { + // Bail if we don't have our defaults + if ( ! function_exists( 'generate_get_default_fonts' ) ) { + return; + } + + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_default_fonts() + ); + + $font_settings = array( + 'font_body', + 'font_top_bar', + 'font_site_title', + 'font_site_tagline', + 'font_navigation', + 'font_widget_title', + 'font_heading_1', + 'font_heading_2', + 'font_heading_3', + ); + + $all_fonts = generate_get_all_google_fonts(); + $select_fonts = generate_get_all_google_fonts( apply_filters( 'generate_number_of_fonts', 200 ) ); + + foreach ( $font_settings as $setting ) { + // If we don't have a setting, keep going + if ( ! isset( $generate_settings[ $setting ] ) ) { + continue; + } + + $id = strtolower( str_replace( ' ', '_', $generate_settings[ $setting ] ) ); + + if ( array_key_exists( $id, $select_fonts ) || in_array( $generate_settings[ $setting ], generate_typography_default_fonts() ) ) { + continue; + } + + $fonts[ strtolower( str_replace( ' ', '_', $generate_settings[ $setting ] ) ) ] = array( + 'name' => $generate_settings[ $setting ], + 'variants' => array_key_exists( $id, $all_fonts ) ? $all_fonts[ $id ]['variants'] : array(), + 'category' => array_key_exists( $id, $all_fonts ) ? $all_fonts[ $id ]['category'] : 'sans-serif', + ); + } + + if ( function_exists( 'generate_secondary_nav_get_defaults' ) ) { + $secondary_nav_settings = wp_parse_args( + get_option( 'generate_secondary_nav_settings', array() ), + generate_secondary_nav_get_defaults() + ); + + $secondary_nav_id = strtolower( str_replace( ' ', '_', $secondary_nav_settings['font_secondary_navigation'] ) ); + + if ( ! array_key_exists( $secondary_nav_id, $select_fonts ) && ! in_array( $secondary_nav_settings['font_secondary_navigation'], generate_typography_default_fonts() ) ) { + $fonts[ strtolower( str_replace( ' ', '_', $secondary_nav_settings['font_secondary_navigation'] ) ) ] = array( + 'name' => $secondary_nav_settings['font_secondary_navigation'], + 'variants' => array_key_exists( $secondary_nav_id, $all_fonts ) ? $all_fonts[ $secondary_nav_id ]['variants'] : array(), + 'category' => array_key_exists( $secondary_nav_id, $all_fonts ) ? $all_fonts[ $secondary_nav_id ]['category'] : 'sans-serif', + ); + } + } + + return $fonts; + } +} diff --git a/wp-content/themes/generatepress/index.php b/wp-content/themes/generatepress/index.php new file mode 100644 index 0000000..a4698c8 --- /dev/null +++ b/wp-content/themes/generatepress/index.php @@ -0,0 +1,77 @@ + + +
            > +
            > + +
            +
            + + ' + container_width_elements + '{max-width: 100%;}' ); + } else { + $( 'style#container_width' ).remove(); + } + } ); + + $( 'input[name="_generate-sidebar-layout-meta"]' ).on( 'change', function() { + if ( 'true' !== $( 'input[name="_generate-full-width-content"]:checked' ).val() ) { + var this_value = this.value, + content_width = '', + calc = '', + container_width = generate_block_editor.container_width, + right_sidebar_width = generate_block_editor.right_sidebar_width, + left_sidebar_width = generate_block_editor.left_sidebar_width, + right_content_padding = generate_block_editor.content_padding_right, + left_content_padding = generate_block_editor.content_padding_left; + + if ( '' === this_value ) { + this_value = generate_block_editor.global_sidebar_layout; + } + + if ( 'left-sidebar' == this_value ) { + content_width = container_width * ( ( 100 - left_sidebar_width ) / 100 ); + } else if ( 'right-sidebar' == this_value ) { + content_width = container_width * ( ( 100 - right_sidebar_width ) / 100 ); + } else if ( 'no-sidebar' == this_value ) { + content_width = container_width; + } else { + content_width = container_width * ( ( 100 - ( Number( left_sidebar_width ) + Number( right_sidebar_width ) ) ) / 100 ); + } + + calc = 'max-width: calc(' + content_width + 'px - ' + right_content_padding + ' - ' + left_content_padding + ')'; + + $( 'style#content-width' ).remove(); + $( 'head' ).append( '' ); + + $( 'style#wide-width' ).remove(); + $( 'head' ).append( ' + section and everything up until
            + * + * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials + * + * @package WordPress + * @subpackage Twenty_Nineteen + * @since Twenty Nineteen 1.0 + */ +?> +> + + + + + + + +> + +
            + + +
            + +
            + +
            + + + + +
            + +
            diff --git a/wp-content/themes/twentynineteen/image.php b/wp-content/themes/twentynineteen/image.php new file mode 100644 index 0000000..414d850 --- /dev/null +++ b/wp-content/themes/twentynineteen/image.php @@ -0,0 +1,104 @@ + + +
            +
            + + + +
            > + +
            + ', '' ); ?> +
            + +
            + +
            + + +
            + +
            + + '', + 'link_before' => '', + 'link_after' => '', + 'pagelink' => '' . __( 'Page', 'twentynineteen' ) . ' %', + 'separator' => ', ', + ) + ); + ?> +
            + +
            + %1$s%3$s × %4$s', + _x( 'Full size', 'Used before full size attachment link.', 'twentynineteen' ), + esc_url( wp_get_attachment_url() ), + absint( $metadata['width'] ), + absint( $metadata['height'] ) + ); + } + ?> + + + +
            +
            + + _x( 'Published in
            %title', 'Parent post link', 'twentynineteen' ), + ) + ); + + // If comments are open or we have at least one comment, load up the comment template. + if ( comments_open() || get_comments_number() ) { + comments_template(); + } + + // End the loop. + endwhile; + ?> + +
            +
            + +

            %s

            ', $message ); +} + +/** + * Prevents the Customizer from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Nineteen 1.0.0 + * + * @global string $wp_version WordPress version. + */ +function twentynineteen_customize() { + wp_die( + sprintf( + /* translators: %s: WordPress version. */ + __( 'Twenty Nineteen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentynineteen' ), + $GLOBALS['wp_version'] + ), + '', + array( + 'back_link' => true, + ) + ); +} +add_action( 'load-customize.php', 'twentynineteen_customize' ); + +/** + * Prevents the Theme Preview from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Nineteen 1.0.0 + * + * @global string $wp_version WordPress version. + */ +function twentynineteen_preview() { + if ( isset( $_GET['preview'] ) ) { + /* translators: %s: WordPress version. */ + wp_die( sprintf( __( 'Twenty Nineteen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentynineteen' ), $GLOBALS['wp_version'] ) ); + } +} +add_action( 'template_redirect', 'twentynineteen_preview' ); diff --git a/wp-content/themes/twentynineteen/inc/color-patterns.php b/wp-content/themes/twentynineteen/inc/color-patterns.php new file mode 100644 index 0000000..b990fff --- /dev/null +++ b/wp-content/themes/twentynineteen/inc/color-patterns.php @@ -0,0 +1,271 @@ + .has-primary-background-color, + .entry .entry-content > *[class^="wp-block-"].has-primary-background-color, + .entry .entry-content > *[class^="wp-block-"] .has-primary-background-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color.has-primary-background-color, + .entry .entry-content .wp-block-file .wp-block-file__button { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* + * Set Color for: + * - all links + * - main navigation links + * - Post navigation links + * - Post entry meta hover + * - Post entry header more-link hover + * - main navigation svg + * - comment navigation + * - Comment edit link hover + * - Site Footer Link hover + * - Widget links + */ + a, + a:visited, + .main-navigation .main-menu > li, + .main-navigation ul.main-menu > li > a, + .post-navigation .post-title, + .entry .entry-meta a:hover, + .entry .entry-footer a:hover, + .entry .entry-content .more-link:hover, + .main-navigation .main-menu > li > a + svg, + .comment .comment-metadata > a:hover, + .comment .comment-metadata .comment-edit-link:hover, + #colophon .site-info a:hover, + .widget a, + .entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), + .entry .entry-content > .has-primary-color, + .entry .entry-content > *[class^="wp-block-"] .has-primary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-primary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-primary-color p { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* + * Set border color for: + * wp block quote + * :focus + */ + blockquote, + .entry .entry-content blockquote, + .entry .entry-content .wp-block-quote:not(.is-large), + .entry .entry-content .wp-block-quote:not(.is-style-large), + input[type="text"]:focus, + input[type="email"]:focus, + input[type="url"]:focus, + input[type="password"]:focus, + input[type="search"]:focus, + input[type="number"]:focus, + input[type="tel"]:focus, + input[type="range"]:focus, + input[type="date"]:focus, + input[type="month"]:focus, + input[type="week"]:focus, + input[type="time"]:focus, + input[type="datetime"]:focus, + input[type="datetime-local"]:focus, + input[type="color"]:focus, + textarea:focus { + border-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .gallery-item > div > a:focus { + box-shadow: 0 0 0 2px hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* Hover colors */ + a:hover, a:active, + .main-navigation .main-menu > li > a:hover, + .main-navigation .main-menu > li > a:hover + svg, + .post-navigation .nav-links a:hover, + .post-navigation .nav-links a:hover .post-title, + .author-bio .author-description .author-link:hover, + .entry .entry-content > .has-secondary-color, + .entry .entry-content > *[class^="wp-block-"] .has-secondary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-secondary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-secondary-color p, + .comment .comment-author .fn a:hover, + .comment-reply-link:hover, + .comment-navigation .nav-previous a:hover, + .comment-navigation .nav-next a:hover, + #cancel-comment-reply-link:hover, + .widget a:hover { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness_hover . ' ); /* base: #005177; */ + } + + .main-navigation .sub-menu > li > a:hover, + .main-navigation .sub-menu > li > a:focus, + .main-navigation .sub-menu > li > a:hover:after, + .main-navigation .sub-menu > li > a:focus:after, + .main-navigation .sub-menu > li > .menu-item-link-return:hover, + .main-navigation .sub-menu > li > .menu-item-link-return:focus, + .main-navigation .sub-menu > li > a:not(.submenu-expand):hover, + .main-navigation .sub-menu > li > a:not(.submenu-expand):focus, + .entry .entry-content > .has-secondary-background-color, + .entry .entry-content > *[class^="wp-block-"].has-secondary-background-color, + .entry .entry-content > *[class^="wp-block-"] .has-secondary-background-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color.has-secondary-background-color { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness_hover . ' ); /* base: #005177; */ + } + + /* Text selection colors */ + ::selection { + background-color: hsl( ' . $primary_color . ', ' . $saturation_selection . ', ' . $lightness_selection . ' ); /* base: #005177; */ + } + ::-moz-selection { + background-color: hsl( ' . $primary_color . ', ' . $saturation_selection . ', ' . $lightness_selection . ' ); /* base: #005177; */ + }'; + + $editor_css = ' + /* + * Set colors for: + * - links + * - blockquote + * - pullquote (solid color) + * - buttons + */ + .editor-block-list__layout .editor-block-list__block a, + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline:hover .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline:focus .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline:active .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-file .wp-block-file__textlink { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .editor-block-list__layout .editor-block-list__block .wp-block-quote:not(.is-large):not(.is-style-large), + .editor-styles-wrapper .editor-block-list__layout .wp-block-freeform blockquote { + border-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .editor-block-list__layout .editor-block-list__block .wp-block-pullquote.is-style-solid-color:not(.has-background-color) { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .editor-block-list__layout .editor-block-list__block .wp-block-file .wp-block-file__button, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link:active, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link:focus, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link:hover { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* Hover colors */ + .editor-block-list__layout .editor-block-list__block a:hover, + .editor-block-list__layout .editor-block-list__block a:active, + .editor-block-list__layout .editor-block-list__block .wp-block-file .wp-block-file__textlink:hover { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness_hover . ' ); /* base: #005177; */ + } + + /* Do not overwrite solid color pullquote or cover links */ + .editor-block-list__layout .editor-block-list__block .wp-block-pullquote.is-style-solid-color a, + .editor-block-list__layout .editor-block-list__block .wp-block-cover a { + color: inherit; + } + '; + + if ( function_exists( 'register_block_type' ) && is_admin() ) { + $theme_css = $editor_css; + } + + /** + * Filters Twenty Nineteen custom colors CSS. + * + * @since Twenty Nineteen 1.0 + * + * @param string $css Base theme colors CSS. + * @param int $primary_color The user's selected color hue. + * @param string $saturation Filtered theme color saturation level. + */ + return apply_filters( 'twentynineteen_custom_colors_css', $theme_css, $primary_color, $saturation ); +} diff --git a/wp-content/themes/twentynineteen/inc/customizer.php b/wp-content/themes/twentynineteen/inc/customizer.php new file mode 100644 index 0000000..22d69ae --- /dev/null +++ b/wp-content/themes/twentynineteen/inc/customizer.php @@ -0,0 +1,158 @@ +get_setting( 'blogname' )->transport = 'postMessage'; + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; + + if ( isset( $wp_customize->selective_refresh ) ) { + $wp_customize->selective_refresh->add_partial( + 'blogname', + array( + 'selector' => '.site-title a', + 'render_callback' => 'twentynineteen_customize_partial_blogname', + ) + ); + $wp_customize->selective_refresh->add_partial( + 'blogdescription', + array( + 'selector' => '.site-description', + 'render_callback' => 'twentynineteen_customize_partial_blogdescription', + ) + ); + } + + /** + * Primary color. + */ + $wp_customize->add_setting( + 'primary_color', + array( + 'default' => 'default', + 'transport' => 'postMessage', + 'sanitize_callback' => 'twentynineteen_sanitize_color_option', + ) + ); + + $wp_customize->add_control( + 'primary_color', + array( + 'type' => 'radio', + 'label' => __( 'Primary Color', 'twentynineteen' ), + 'choices' => array( + 'default' => _x( 'Default', 'primary color', 'twentynineteen' ), + 'custom' => _x( 'Custom', 'primary color', 'twentynineteen' ), + ), + 'section' => 'colors', + 'priority' => 5, + ) + ); + + // Add primary color hue setting and control. + $wp_customize->add_setting( + 'primary_color_hue', + array( + 'default' => 199, + 'transport' => 'postMessage', + 'sanitize_callback' => 'absint', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'primary_color_hue', + array( + 'description' => __( 'Apply a custom color for buttons, links, featured images, etc.', 'twentynineteen' ), + 'section' => 'colors', + 'mode' => 'hue', + ) + ) + ); + + // Add image filter setting and control. + $wp_customize->add_setting( + 'image_filter', + array( + 'default' => 1, + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'image_filter', + array( + 'label' => __( 'Apply a filter to featured images using the primary color', 'twentynineteen' ), + 'section' => 'colors', + 'type' => 'checkbox', + ) + ); +} +add_action( 'customize_register', 'twentynineteen_customize_register' ); + +/** + * Render the site title for the selective refresh partial. + * + * @return void + */ +function twentynineteen_customize_partial_blogname() { + bloginfo( 'name' ); +} + +/** + * Render the site tagline for the selective refresh partial. + * + * @return void + */ +function twentynineteen_customize_partial_blogdescription() { + bloginfo( 'description' ); +} + +/** + * Bind JS handlers to instantly live-preview changes. + */ +function twentynineteen_customize_preview_js() { + wp_enqueue_script( 'twentynineteen-customize-preview', get_theme_file_uri( '/js/customize-preview.js' ), array( 'customize-preview' ), '20181214', true ); +} +add_action( 'customize_preview_init', 'twentynineteen_customize_preview_js' ); + +/** + * Load dynamic logic for the customizer controls area. + */ +function twentynineteen_panels_js() { + wp_enqueue_script( 'twentynineteen-customize-controls', get_theme_file_uri( '/js/customize-controls.js' ), array(), '20181214', true ); +} +add_action( 'customize_controls_enqueue_scripts', 'twentynineteen_panels_js' ); + +/** + * Sanitize custom color choice. + * + * @param string $choice Whether image filter is active. + * + * @return string + */ +function twentynineteen_sanitize_color_option( $choice ) { + $valid = array( + 'default', + 'custom', + ); + + if ( in_array( $choice, $valid, true ) ) { + return $choice; + } + + return 'default'; +} diff --git a/wp-content/themes/twentynineteen/inc/helper-functions.php b/wp-content/themes/twentynineteen/inc/helper-functions.php new file mode 100644 index 0000000..ef06cdd --- /dev/null +++ b/wp-content/themes/twentynineteen/inc/helper-functions.php @@ -0,0 +1,163 @@ +user_id > 0 ) { + $user = get_userdata( $comment->user_id ); + $post = get_post( $comment->comment_post_ID ); + if ( ! empty( $user ) && ! empty( $post ) ) { + return $comment->user_id === $post->post_author; + } + } + return false; +} + +/** + * Returns information about the current post's discussion, with cache support. + */ +function twentynineteen_get_discussion_data() { + static $discussion, $post_id; + + $current_post_id = get_the_ID(); + if ( $current_post_id === $post_id ) { + return $discussion; /* If we have discussion information for post ID, return cached object */ + } else { + $post_id = $current_post_id; + } + + $comments = get_comments( + array( + 'post_id' => $current_post_id, + 'orderby' => 'comment_date_gmt', + 'order' => get_option( 'comment_order', 'asc' ), /* Respect comment order from Settings » Discussion. */ + 'status' => 'approve', + 'number' => 20, /* Only retrieve the last 20 comments, as the end goal is just 6 unique authors */ + ) + ); + + $authors = array(); + foreach ( $comments as $comment ) { + $authors[] = ( (int) $comment->user_id > 0 ) ? (int) $comment->user_id : $comment->comment_author_email; + } + + $authors = array_unique( $authors ); + $discussion = (object) array( + 'authors' => array_slice( $authors, 0, 6 ), /* Six unique authors commenting on the post. */ + 'responses' => get_comments_number( $current_post_id ), /* Number of responses. */ + ); + + return $discussion; +} + +/** + * Converts HSL to HEX colors. + */ +function twentynineteen_hsl_hex( $h, $s, $l, $to_hex = true ) { + + $h /= 360; + $s /= 100; + $l /= 100; + + $r = $l; + $g = $l; + $b = $l; + $v = ( $l <= 0.5 ) ? ( $l * ( 1.0 + $s ) ) : ( $l + $s - $l * $s ); + if ( $v > 0 ) { + $m; + $sv; + $sextant; + $fract; + $vsf; + $mid1; + $mid2; + + $m = $l + $l - $v; + $sv = ( $v - $m ) / $v; + $h *= 6.0; + $sextant = floor( $h ); + $fract = $h - $sextant; + $vsf = $v * $sv * $fract; + $mid1 = $m + $vsf; + $mid2 = $v - $vsf; + + switch ( $sextant ) { + case 0: + $r = $v; + $g = $mid1; + $b = $m; + break; + case 1: + $r = $mid2; + $g = $v; + $b = $m; + break; + case 2: + $r = $m; + $g = $v; + $b = $mid1; + break; + case 3: + $r = $m; + $g = $mid2; + $b = $v; + break; + case 4: + $r = $mid1; + $g = $m; + $b = $v; + break; + case 5: + $r = $v; + $g = $m; + $b = $mid2; + break; + } + } + $r = round( $r * 255, 0 ); + $g = round( $g * 255, 0 ); + $b = round( $b * 255, 0 ); + + if ( $to_hex ) { + + $r = ( $r < 15 ) ? '0' . dechex( $r ) : dechex( $r ); + $g = ( $g < 15 ) ? '0' . dechex( $g ) : dechex( $g ); + $b = ( $b < 15 ) ? '0' . dechex( $b ) : dechex( $b ); + + return "#$r$g$b"; + + } + + return "rgb($r, $g, $b)"; +} diff --git a/wp-content/themes/twentynineteen/inc/icon-functions.php b/wp-content/themes/twentynineteen/inc/icon-functions.php new file mode 100644 index 0000000..f5dccb0 --- /dev/null +++ b/wp-content/themes/twentynineteen/inc/icon-functions.php @@ -0,0 +1,108 @@ +theme_location ) { + $svg = twentynineteen_get_social_link_svg( $item->url, 26 ); + if ( empty( $svg ) ) { + $svg = twentynineteen_get_icon_svg( 'link' ); + } + $item_output = str_replace( $args->link_after, '' . $svg, $item_output ); + } + + return $item_output; +} +add_filter( 'walker_nav_menu_start_el', 'twentynineteen_nav_menu_social_icons', 10, 4 ); + +/** + * Add a dropdown icon to top-level menu items. + * + * @param string $output Nav menu item start element. + * @param object $item Nav menu item. + * @param int $depth Depth. + * @param object $args Nav menu args. + * @return string Nav menu item start element. + * Add a dropdown icon to top-level menu items + */ +function twentynineteen_add_dropdown_icons( $output, $item, $depth, $args ) { + + // Only add class to 'top level' items on the 'primary' menu. + if ( ! isset( $args->theme_location ) || 'menu-1' !== $args->theme_location ) { + return $output; + } + + if ( in_array( 'mobile-parent-nav-menu-item', $item->classes, true ) && isset( $item->original_id ) ) { + // Inject the keyboard_arrow_left SVG inside the parent nav menu item, and let the item link to the parent item. + // @todo Only do this for nested submenus? If on a first-level submenu, then really the link could be "#" since the desire is to remove the target entirely. + $link = sprintf( + '. + $output = preg_replace( + '##i', + '', + $output, + 1 // Limit. + ); + + } elseif ( in_array( 'menu-item-has-children', $item->classes, true ) ) { + + // Add SVG icon to parent items. + $icon = twentynineteen_get_icon_svg( 'keyboard_arrow_down', 24 ); + + $output .= sprintf( + '', + $icon + ); + } + + return $output; +} +add_filter( 'walker_nav_menu_start_el', 'twentynineteen_add_dropdown_icons', 10, 4 ); diff --git a/wp-content/themes/twentynineteen/inc/template-functions.php b/wp-content/themes/twentynineteen/inc/template-functions.php new file mode 100644 index 0000000..3babf9f --- /dev/null +++ b/wp-content/themes/twentynineteen/inc/template-functions.php @@ -0,0 +1,211 @@ +'; + } +} +add_action( 'wp_head', 'twentynineteen_pingback_header' ); + +/** + * Changes comment form default fields. + */ +function twentynineteen_comment_form_defaults( $defaults ) { + $comment_field = $defaults['comment_field']; + + // Adjust height of comment form. + $defaults['comment_field'] = preg_replace( '/rows="\d+"/', 'rows="5"', $comment_field ); + + return $defaults; +} +add_filter( 'comment_form_defaults', 'twentynineteen_comment_form_defaults' ); + +/** + * Filters the default archive titles. + */ +function twentynineteen_get_the_archive_title() { + if ( is_category() ) { + $title = __( 'Category Archives: ', 'twentynineteen' ) . '' . single_term_title( '', false ) . ''; + } elseif ( is_tag() ) { + $title = __( 'Tag Archives: ', 'twentynineteen' ) . '' . single_term_title( '', false ) . ''; + } elseif ( is_author() ) { + $title = __( 'Author Archives: ', 'twentynineteen' ) . '' . get_the_author_meta( 'display_name' ) . ''; + } elseif ( is_year() ) { + $title = __( 'Yearly Archives: ', 'twentynineteen' ) . '' . get_the_date( _x( 'Y', 'yearly archives date format', 'twentynineteen' ) ) . ''; + } elseif ( is_month() ) { + $title = __( 'Monthly Archives: ', 'twentynineteen' ) . '' . get_the_date( _x( 'F Y', 'monthly archives date format', 'twentynineteen' ) ) . ''; + } elseif ( is_day() ) { + $title = __( 'Daily Archives: ', 'twentynineteen' ) . '' . get_the_date() . ''; + } elseif ( is_post_type_archive() ) { + $title = __( 'Post Type Archives: ', 'twentynineteen' ) . '' . post_type_archive_title( '', false ) . ''; + } elseif ( is_tax() ) { + $tax = get_taxonomy( get_queried_object()->taxonomy ); + /* translators: %s: Taxonomy singular name. */ + $title = sprintf( esc_html__( '%s Archives:', 'twentynineteen' ), $tax->labels->singular_name ); + } else { + $title = __( 'Archives:', 'twentynineteen' ); + } + return $title; +} +add_filter( 'get_the_archive_title', 'twentynineteen_get_the_archive_title' ); + +/** + * Add custom sizes attribute to responsive image functionality for post thumbnails. + * + * @origin Twenty Nineteen 1.0 + * + * @param array $attr Attributes for the image markup. + * @return string Value for use in post thumbnail 'sizes' attribute. + */ +function twentynineteen_post_thumbnail_sizes_attr( $attr ) { + + if ( is_admin() ) { + return $attr; + } + + if ( ! is_singular() ) { + $attr['sizes'] = '(max-width: 34.9rem) calc(100vw - 2rem), (max-width: 53rem) calc(8 * (100vw / 12)), (min-width: 53rem) calc(6 * (100vw / 12)), 100vw'; + } + + return $attr; +} +add_filter( 'wp_get_attachment_image_attributes', 'twentynineteen_post_thumbnail_sizes_attr', 10, 1 ); + +/** + * Add an extra menu to our nav for our priority+ navigation to use + * + * @param object $nav_menu Nav menu. + * @param object $args Nav menu args. + * @return string More link for hidden menu items. + */ +function twentynineteen_add_ellipses_to_nav( $nav_menu, $args ) { + + if ( 'menu-1' === $args->theme_location ) : + + $nav_menu .= ' + '; + + endif; + + return $nav_menu; +} +add_filter( 'wp_nav_menu', 'twentynineteen_add_ellipses_to_nav', 10, 2 ); + +/** + * WCAG 2.0 Attributes for Dropdown Menus + * + * Adjustments to menu attributes tot support WCAG 2.0 recommendations + * for flyout and dropdown menus. + * + * @ref https://www.w3.org/WAI/tutorials/menus/flyout/ + */ +function twentynineteen_nav_menu_link_attributes( $atts, $item, $args, $depth ) { + + // Add [aria-haspopup] and [aria-expanded] to menu items that have children. + $item_has_children = in_array( 'menu-item-has-children', $item->classes ); + if ( $item_has_children ) { + $atts['aria-haspopup'] = 'true'; + $atts['aria-expanded'] = 'false'; + } + + return $atts; +} +add_filter( 'nav_menu_link_attributes', 'twentynineteen_nav_menu_link_attributes', 10, 4 ); + +/** + * Create a nav menu item to be displayed on mobile to navigate from submenu back to the parent. + * + * This duplicates each parent nav menu item and makes it the first child of itself. + * + * @param array $sorted_menu_items Sorted nav menu items. + * @param object $args Nav menu args. + * @return array Amended nav menu items. + */ +function twentynineteen_add_mobile_parent_nav_menu_items( $sorted_menu_items, $args ) { + static $pseudo_id = 0; + if ( ! isset( $args->theme_location ) || 'menu-1' !== $args->theme_location ) { + return $sorted_menu_items; + } + + $amended_menu_items = array(); + foreach ( $sorted_menu_items as $nav_menu_item ) { + $amended_menu_items[] = $nav_menu_item; + if ( in_array( 'menu-item-has-children', $nav_menu_item->classes, true ) ) { + $parent_menu_item = clone $nav_menu_item; + $parent_menu_item->original_id = $nav_menu_item->ID; + $parent_menu_item->ID = --$pseudo_id; + $parent_menu_item->db_id = $parent_menu_item->ID; + $parent_menu_item->object_id = $parent_menu_item->ID; + $parent_menu_item->classes = array( 'mobile-parent-nav-menu-item' ); + $parent_menu_item->menu_item_parent = $nav_menu_item->ID; + + $amended_menu_items[] = $parent_menu_item; + } + } + + return $amended_menu_items; +} +add_filter( 'wp_nav_menu_objects', 'twentynineteen_add_mobile_parent_nav_menu_items', 10, 2 ); diff --git a/wp-content/themes/twentynineteen/inc/template-tags.php b/wp-content/themes/twentynineteen/inc/template-tags.php new file mode 100644 index 0000000..e5a61aa --- /dev/null +++ b/wp-content/themes/twentynineteen/inc/template-tags.php @@ -0,0 +1,258 @@ +%2$s'; + if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { + $time_string = ''; + } + + $time_string = sprintf( + $time_string, + esc_attr( get_the_date( DATE_W3C ) ), + esc_html( get_the_date() ), + esc_attr( get_the_modified_date( DATE_W3C ) ), + esc_html( get_the_modified_date() ) + ); + + printf( + '%1$s%3$s', + twentynineteen_get_icon_svg( 'watch', 16 ), + esc_url( get_permalink() ), + $time_string + ); + } +endif; + +if ( ! function_exists( 'twentynineteen_posted_by' ) ) : + /** + * Prints HTML with meta information about theme author. + */ + function twentynineteen_posted_by() { + printf( + /* translators: 1: SVG icon. 2: Post author, only visible to screen readers. 3: Author link. */ + '', + twentynineteen_get_icon_svg( 'person', 16 ), + __( 'Posted by', 'twentynineteen' ), + esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), + esc_html( get_the_author() ) + ); + } +endif; + +if ( ! function_exists( 'twentynineteen_comment_count' ) ) : + /** + * Prints HTML with the comment count for the current post. + */ + function twentynineteen_comment_count() { + if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) { + echo ''; + echo twentynineteen_get_icon_svg( 'comment', 16 ); + + /* translators: %s: Post title. Only visible to screen readers. */ + comments_popup_link( sprintf( __( 'Leave a comment on %s', 'twentynineteen' ), get_the_title() ) ); + + echo ''; + } + } +endif; + +if ( ! function_exists( 'twentynineteen_entry_footer' ) ) : + /** + * Prints HTML with meta information for the categories, tags and comments. + */ + function twentynineteen_entry_footer() { + + // Hide author, post date, category and tag text for pages. + if ( 'post' === get_post_type() ) { + + // Posted by. + twentynineteen_posted_by(); + + // Posted on. + twentynineteen_posted_on(); + + /* translators: Used between list items, there is a space after the comma. */ + $categories_list = get_the_category_list( __( ', ', 'twentynineteen' ) ); + if ( $categories_list ) { + printf( + /* translators: 1: SVG icon. 2: Posted in label, only visible to screen readers. 3: List of categories. */ + '%1$s%2$s%3$s', + twentynineteen_get_icon_svg( 'archive', 16 ), + __( 'Posted in', 'twentynineteen' ), + $categories_list + ); // WPCS: XSS OK. + } + + /* translators: Used between list items, there is a space after the comma. */ + $tags_list = get_the_tag_list( '', __( ', ', 'twentynineteen' ) ); + if ( $tags_list ) { + printf( + /* translators: 1: SVG icon. 2: Posted in label, only visible to screen readers. 3: List of tags. */ + '%1$s%2$s %3$s', + twentynineteen_get_icon_svg( 'tag', 16 ), + __( 'Tags:', 'twentynineteen' ), + $tags_list + ); // WPCS: XSS OK. + } + } + + // Comment count. + if ( ! is_singular() ) { + twentynineteen_comment_count(); + } + + // Edit post link. + edit_post_link( + sprintf( + wp_kses( + /* translators: %s: Post title. Only visible to screen readers. */ + __( 'Edit %s', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ), + '' . twentynineteen_get_icon_svg( 'edit', 16 ), + '' + ); + } +endif; + +if ( ! function_exists( 'twentynineteen_post_thumbnail' ) ) : + /** + * Displays an optional post thumbnail. + * + * Wraps the post thumbnail in an anchor element on index views, or a div + * element when on single views. + */ + function twentynineteen_post_thumbnail() { + if ( ! twentynineteen_can_show_post_thumbnail() ) { + return; + } + + if ( is_singular() ) : + ?> + +
            + +
            + + + +
            + +
            + + %s
            ', get_avatar( $id_or_email, twentynineteen_get_avatar_size() ) ); + } +endif; + +if ( ! function_exists( 'twentynineteen_discussion_avatars_list' ) ) : + /** + * Displays a list of avatars involved in a discussion for a given post. + */ + function twentynineteen_discussion_avatars_list( $comment_authors ) { + if ( empty( $comment_authors ) ) { + return; + } + echo '
              ', "\n"; + foreach ( $comment_authors as $id_or_email ) { + printf( + "
            1. %s
            2. \n", + twentynineteen_get_user_avatar_markup( $id_or_email ) + ); + } + echo '
            ', "\n"; + } +endif; + +if ( ! function_exists( 'twentynineteen_comment_form' ) ) : + /** + * Documentation for function. + */ + function twentynineteen_comment_form( $order ) { + if ( true === $order || strtolower( $order ) === strtolower( get_option( 'comment_order', 'asc' ) ) ) { + + comment_form( + array( + 'logged_in_as' => null, + 'title_reply' => null, + ) + ); + } + } +endif; + +if ( ! function_exists( 'twentynineteen_the_posts_navigation' ) ) : + /** + * Documentation for function. + */ + function twentynineteen_the_posts_navigation() { + the_posts_pagination( + array( + 'mid_size' => 2, + 'prev_text' => sprintf( + '%s %s', + twentynineteen_get_icon_svg( 'chevron_left', 22 ), + __( 'Newer posts', 'twentynineteen' ) + ), + 'next_text' => sprintf( + '%s %s', + __( 'Older posts', 'twentynineteen' ), + twentynineteen_get_icon_svg( 'chevron_right', 22 ) + ), + ) + ); + } +endif; + +if ( ! function_exists( 'wp_body_open' ) ) : + /** + * Fire the wp_body_open action. + * + * Added for backward compatibility to support pre-5.2.0 WordPress versions. + * + * @since Twenty Nineteen 1.4 + */ + function wp_body_open() { + /** + * Triggered after the opening tag. + * + * @since Twenty Nineteen 1.4 + */ + do_action( 'wp_body_open' ); + } +endif; diff --git a/wp-content/themes/twentynineteen/index.php b/wp-content/themes/twentynineteen/index.php new file mode 100644 index 0000000..ceaf2ae --- /dev/null +++ b/wp-content/themes/twentynineteen/index.php @@ -0,0 +1,47 @@ + + +
            +
            + + + +
            +
            + + getAvailableSpace( button, container ); + } + + /** + * Set menu container variable. + */ + var navContainer = document.querySelector('.main-navigation'); + var breaks = []; + + /** + * Let’s bail if we our menu doesn't exist. + */ + if ( ! navContainer ) { + return; + } + + /** + * Refreshes the list item from the menu depending on the menu size. + */ + function updateNavigationMenu( container ) { + + /** + * Let’s bail if our menu is empty. + */ + if ( ! container.parentNode.querySelector('.main-menu[id]') ) { + return; + } + + // Adds the necessary UI to operate the menu. + var visibleList = container.parentNode.querySelector('.main-menu[id]'); + var hiddenList = visibleList.parentNode.nextElementSibling.querySelector('.hidden-links'); + var toggleButton = visibleList.parentNode.nextElementSibling.querySelector('.main-menu-more-toggle'); + + if ( isOverflowingNavivation( visibleList, toggleButton, container ) ) { + + // Record the width of the list. + breaks.push( visibleList.offsetWidth ); + // Move last item to the hidden list. + prependElement( hiddenList, ! visibleList.lastChild || null === visibleList.lastChild ? visibleList.previousElementSibling : visibleList.lastChild ); + // Show the toggle button. + showButton( toggleButton ); + + } else { + + // There is space for another item in the nav. + if ( getAvailableSpace( toggleButton, container ) > breaks[breaks.length - 1] ) { + // Move the item to the visible list. + visibleList.appendChild( hiddenList.firstChild.nextSibling ); + breaks.pop(); + } + + // Hide the dropdown btn if hidden list is empty. + if (breaks.length < 2) { + hideButton( toggleButton ); + } + } + + // Recur if the visible list is still overflowing the nav. + if ( isOverflowingNavivation( visibleList, toggleButton, container ) ) { + updateNavigationMenu( container ); + } + } + + /** + * Run our priority+ function as soon as the document is `ready`. + */ + document.addEventListener( 'DOMContentLoaded', function() { + + updateNavigationMenu( navContainer ); + + // Also, run our priority+ function on selective refresh in the customizer. + var hasSelectiveRefresh = ( + 'undefined' !== typeof wp && + wp.customize && + wp.customize.selectiveRefresh && + wp.customize.navMenusPreview.NavMenuInstancePartial + ); + + if ( hasSelectiveRefresh ) { + // Re-run our priority+ function on Nav Menu partial refreshes. + wp.customize.selectiveRefresh.bind( 'partial-content-rendered', function ( placement ) { + + var isNewNavMenu = ( + placement && + placement.partial.id.includes( 'nav_menu_instance' ) && + 'null' !== placement.container[0].parentNode && + placement.container[0].parentNode.classList.contains( 'main-navigation' ) + ); + + if ( isNewNavMenu ) { + updateNavigationMenu( placement.container[0].parentNode ); + } + }); + } + }); + + /** + * Run our priority+ function on load. + */ + window.addEventListener( 'load', function() { + updateNavigationMenu( navContainer ); + }); + + /** + * Run our priority+ function every time the window resizes. + */ + var isResizing = false; + window.addEventListener( 'resize', + debounce( function() { + if ( isResizing ) { + return; + } + + isResizing = true; + setTimeout( function() { + updateNavigationMenu( navContainer ); + isResizing = false; + }, 150 ); + } ) + ); + + /** + * Run our priority+ function. + */ + updateNavigationMenu( navContainer ); + +})(); diff --git a/wp-content/themes/twentynineteen/js/skip-link-focus-fix.js b/wp-content/themes/twentynineteen/js/skip-link-focus-fix.js new file mode 100644 index 0000000..32ba80c --- /dev/null +++ b/wp-content/themes/twentynineteen/js/skip-link-focus-fix.js @@ -0,0 +1,33 @@ +/** + * File skip-link-focus-fix.js. + * + * Helps with accessibility for keyboard only users. + * + * This is the source file for what is minified in the twentynineteen_skip_link_focus_fix() PHP function. + * + * Learn more: https://git.io/vWdr2 + */ +( function() { + var isIe = /(trident|msie)/i.test( navigator.userAgent ); + + if ( isIe && document.getElementById && window.addEventListener ) { + window.addEventListener( 'hashchange', function() { + var id = location.hash.substring( 1 ), + element; + + if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) { + return; + } + + element = document.getElementById( id ); + + if ( element ) { + if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) { + element.tabIndex = -1; + } + + element.focus(); + } + }, false ); + } +} )(); diff --git a/wp-content/themes/twentynineteen/js/touch-keyboard-navigation.js b/wp-content/themes/twentynineteen/js/touch-keyboard-navigation.js new file mode 100644 index 0000000..c8d1dd0 --- /dev/null +++ b/wp-content/themes/twentynineteen/js/touch-keyboard-navigation.js @@ -0,0 +1,354 @@ +/** + * Touch & Keyboard navigation. + * + * Contains handlers for touch devices and keyboard navigation. + */ + +(function() { + + /** + * Debounce. + * + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + */ + function debounce(func, wait, immediate) { + 'use strict'; + + var timeout; + wait = (typeof wait !== 'undefined') ? wait : 20; + immediate = (typeof immediate !== 'undefined') ? immediate : true; + + return function() { + + var context = this, args = arguments; + var later = function() { + timeout = null; + + if (!immediate) { + func.apply(context, args); + } + }; + + var callNow = immediate && !timeout; + + clearTimeout(timeout); + timeout = setTimeout(later, wait); + + if (callNow) { + func.apply(context, args); + } + }; + } + + /** + * Add class. + * + * @param {Object} el + * @param {string} cls + */ + function addClass(el, cls) { + if ( ! el.className.match( '(?:^|\\s)' + cls + '(?!\\S)') ) { + el.className += ' ' + cls; + } + } + + /** + * Delete class. + * + * @param {Object} el + * @param {string} cls + */ + function deleteClass(el, cls) { + el.className = el.className.replace( new RegExp( '(?:^|\\s)' + cls + '(?!\\S)' ),'' ); + } + + /** + * Has class? + * + * @param {Object} el + * @param {string} cls + * + * @returns {boolean} Has class + */ + function hasClass(el, cls) { + + if ( el.className.match( '(?:^|\\s)' + cls + '(?!\\S)' ) ) { + return true; + } + } + + /** + * Toggle Aria Expanded state for screenreaders. + * + * @param {Object} ariaItem + */ + function toggleAriaExpandedState( ariaItem ) { + 'use strict'; + + var ariaState = ariaItem.getAttribute('aria-expanded'); + + if ( ariaState === 'true' ) { + ariaState = 'false'; + } else { + ariaState = 'true'; + } + + ariaItem.setAttribute('aria-expanded', ariaState); + } + + /** + * Open sub-menu. + * + * @param {Object} currentSubMenu + */ + function openSubMenu( currentSubMenu ) { + 'use strict'; + + // Update classes. + // classList.add is not supported in IE11. + currentSubMenu.parentElement.className += ' off-canvas'; + currentSubMenu.parentElement.lastElementChild.className += ' expanded-true'; + + // Update aria-expanded state. + toggleAriaExpandedState( currentSubMenu ); + } + + /** + * Close sub-menu. + * + * @param {Object} currentSubMenu + */ + function closeSubMenu( currentSubMenu ) { + 'use strict'; + + var menuItem = getCurrentParent( currentSubMenu, '.menu-item' ); // this.parentNode + var menuItemAria = menuItem.querySelector('a[aria-expanded]'); + var subMenu = currentSubMenu.closest('.sub-menu'); + + // If this is in a sub-sub-menu, go back to parent sub-menu. + if ( getCurrentParent( currentSubMenu, 'ul' ).classList.contains( 'sub-menu' ) ) { + + // Update classes. + // classList.remove is not supported in IE11. + menuItem.className = menuItem.className.replace( 'off-canvas', '' ); + subMenu.className = subMenu.className.replace( 'expanded-true', '' ); + + // Update aria-expanded and :focus states. + toggleAriaExpandedState( menuItemAria ); + + // Or else close all sub-menus. + } else { + + // Update classes. + // classList.remove is not supported in IE11. + menuItem.className = menuItem.className.replace( 'off-canvas', '' ); + menuItem.lastElementChild.className = menuItem.lastElementChild.className.replace( 'expanded-true', '' ); + + // Update aria-expanded and :focus states. + toggleAriaExpandedState( menuItemAria ); + } + } + + /** + * Find first ancestor of an element by selector. + * + * @param {Object} child + * @param {String} selector + * @param {String} stopSelector + */ + function getCurrentParent( child, selector, stopSelector ) { + + var currentParent = null; + + while ( child ) { + + if ( child.matches(selector) ) { + + currentParent = child; + break; + + } else if ( stopSelector && child.matches(stopSelector) ) { + + break; + } + + child = child.parentElement; + } + + return currentParent; + } + + /** + * Remove all off-canvas states. + */ + function removeAllFocusStates() { + 'use strict'; + + var siteBranding = document.getElementsByClassName( 'site-branding' )[0]; + var getFocusedElements = siteBranding.querySelectorAll(':hover, :focus, :focus-within'); + var getFocusedClassElements = siteBranding.querySelectorAll('.is-focused'); + var i; + var o; + + for ( i = 0; i < getFocusedElements.length; i++) { + getFocusedElements[i].blur(); + } + + for ( o = 0; o < getFocusedClassElements.length; o++) { + deleteClass( getFocusedClassElements[o], 'is-focused' ); + } + } + + /** + * Matches polyfill for IE11. + */ + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector; + } + + /** + * Toggle `focus` class to allow sub-menu access on touch screens. + */ + function toggleSubmenuDisplay() { + + document.addEventListener('touchstart', function(event) { + + if ( event.target.matches('a') ) { + + var url = event.target.getAttribute( 'href' ) ? event.target.getAttribute( 'href' ) : ''; + + // Open submenu if URL is #. + if ( '#' === url && event.target.nextSibling.matches('.submenu-expand') ) { + openSubMenu( event.target ); + } + } + + // Check if .submenu-expand is touched. + if ( event.target.matches('.submenu-expand') ) { + openSubMenu(event.target); + + // Check if child of .submenu-expand is touched. + } else if ( null != getCurrentParent( event.target, '.submenu-expand' ) && + getCurrentParent( event.target, '.submenu-expand' ).matches( '.submenu-expand' ) ) { + openSubMenu( getCurrentParent( event.target, '.submenu-expand' ) ); + + // Check if .menu-item-link-return is touched. + } else if ( event.target.matches('.menu-item-link-return') ) { + closeSubMenu( event.target ); + + // Check if child of .menu-item-link-return is touched. + } else if ( null != getCurrentParent( event.target, '.menu-item-link-return' ) && getCurrentParent( event.target, '.menu-item-link-return' ).matches( '.menu-item-link-return' ) ) { + closeSubMenu( event.target ); + } + + // Prevent default mouse/focus events. + removeAllFocusStates(); + + }, false); + + document.addEventListener('touchend', function(event) { + + var mainNav = getCurrentParent( event.target, '.main-navigation' ); + + if ( null != mainNav && hasClass( mainNav, '.main-navigation' ) ) { + // Prevent default mouse events. + event.preventDefault(); + + } else if ( + event.target.matches('.submenu-expand') || + null != getCurrentParent( event.target, '.submenu-expand' ) && + getCurrentParent( event.target, '.submenu-expand' ).matches( '.submenu-expand' ) || + event.target.matches('.menu-item-link-return') || + null != getCurrentParent( event.target, '.menu-item-link-return' ) && + getCurrentParent( event.target, '.menu-item-link-return' ).matches( '.menu-item-link-return' ) ) { + // Prevent default mouse events. + event.preventDefault(); + } + + // Prevent default mouse/focus events. + removeAllFocusStates(); + + }, false); + + document.addEventListener('focus', function(event) { + + if ( event.target.matches('.main-navigation > div > ul > li a') ) { + + // Remove Focused elements in sibling div. + var currentDiv = getCurrentParent( event.target, 'div', '.main-navigation' ); + var currentDivSibling = currentDiv.previousElementSibling === null ? currentDiv.nextElementSibling : currentDiv.previousElementSibling; + var focusedElement = currentDivSibling.querySelector( '.is-focused' ); + var focusedClass = 'is-focused'; + var prevLi = getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ).previousElementSibling; + var nextLi = getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ).nextElementSibling; + + if ( null !== focusedElement && null !== hasClass( focusedElement, focusedClass ) ) { + deleteClass( focusedElement, focusedClass ); + } + + // Add .is-focused class to top-level li. + if ( getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ) ) { + addClass( getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ), focusedClass ); + } + + // Check for previous li. + if ( prevLi && hasClass( prevLi, focusedClass ) ) { + deleteClass( prevLi, focusedClass ); + } + + // Check for next li. + if ( nextLi && hasClass( nextLi, focusedClass ) ) { + deleteClass( nextLi, focusedClass ); + } + } + + }, true); + + document.addEventListener('click', function(event) { + + // Remove all focused menu states when clicking outside site branding. + if ( event.target !== document.getElementsByClassName( 'site-branding' )[0] ) { + removeAllFocusStates(); + } else { + // Nothing. + } + + }, false); + } + + /** + * Run our sub-menu function as soon as the document is `ready`. + */ + document.addEventListener( 'DOMContentLoaded', function() { + toggleSubmenuDisplay(); + }); + + /** + * Run our sub-menu function on selective refresh in the customizer. + */ + document.addEventListener( 'customize-preview-menu-refreshed', function( e, params ) { + if ( 'menu-1' === params.wpNavMenuArgs.theme_location ) { + toggleSubmenuDisplay(); + } + }); + + /** + * Run our sub-menu function every time the window resizes. + */ + var isResizing = false; + window.addEventListener( 'resize', function() { + isResizing = true; + debounce( function() { + if ( isResizing ) { + return; + } + + toggleSubmenuDisplay(); + isResizing = false; + + }, 150 ); + } ); + +})(); diff --git a/wp-content/themes/twentynineteen/package-lock.json b/wp-content/themes/twentynineteen/package-lock.json new file mode 100644 index 0000000..59d5354 --- /dev/null +++ b/wp-content/themes/twentynineteen/package-lock.json @@ -0,0 +1,4627 @@ +{ + "name": "twentynineteen", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", + "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", + "dev": true + }, + "@wordpress/browserslist-config": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-2.5.0.tgz", + "integrity": "sha512-cspE4iJ87YjweKAtnIsCxm7ZJQ/ved3TdRJWS0DX/0AOukoRhOMYh7CP1aVc0M3J1kB4LtTY7u3HOcqF2Yf2VA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "dev": true, + "requires": { + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.16", + "postcss-value-parser": "^3.3.1" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30000978", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000978.tgz", + "integrity": "sha512-H6gK6kxUzG6oAwg/Jal279z8pHw0BzrpZfwo/CA9FFm/vA0l8IhDfkZtepyJNE2Y4V6Dp3P3ubz6czby1/Mgsw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.1.tgz", + "integrity": "sha512-gfw3p2oQV2wEt+8VuMlNsPjCxDxvvgnm/kz+uATu805mWVF8IJN7uz9DN7iBz+RMJISmiVbCOBFs9qBGMjtPfQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + } + }, + "chokidar-cli": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.0.0.tgz", + "integrity": "sha512-E3N0WlV1L4c60cs9owdGQpZXY5obZya5Xds7+sF6GTVWWZKwqlq9QG7c2ESPNtjS+5QusAg8VmUEnOnAtZYNcg==", + "dev": true, + "requires": { + "bluebird": "3.5.5", + "chokidar": "3.0.2", + "lodash": "4.17.15", + "yargs": "13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "dev": true, + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.0.tgz", + "integrity": "sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.3.tgz", + "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "dependency-graph": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", + "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", + "dev": true + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.179.tgz", + "integrity": "sha512-hRjlOdKImgIRicKYRY6hHbUMrX2NJYBrIusTepwPt/apcabuzrzhXpkkWu7elWdTZEQwKV6BfX8EvWIBWLCNQw==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.24.tgz", + "integrity": "sha512-wym2jptfuKowMmkZsfCSTsn8qAVo8zm+UiQA6l5dNqUcpfChZSnS/vbbpOeXczf+VdPhutxh+99lWHhdd6xKzg==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "node-sass": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.11", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-cli": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-6.1.2.tgz", + "integrity": "sha512-jIWfIkqt8cTThSpH8DBaNxHlBf99OKSem2RseRpfVPqWayxHKQB0IWdS/IF5XSGeFU5QslSDTdVHnw6qggXGkA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "chokidar": "^2.0.0", + "dependency-graph": "^0.8.0", + "fs-extra": "^7.0.0", + "get-stdin": "^6.0.0", + "globby": "^9.0.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "postcss-reporter": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "yargs": "^12.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-reporter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", + "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "postcss": "^7.0.7" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", + "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rtlcss": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.4.0.tgz", + "integrity": "sha512-hdjFhZ5FCI0ABOfyXOMOhBtwPWtANLCG7rOiOcRf+yi5eDdxmDjqBruWouEnwVdzfh/TWF6NNncIEsigOCFZOA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "findup": "^0.1.5", + "mkdirp": "^0.5.1", + "postcss": "^6.0.14", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/wp-content/themes/twentynineteen/package.json b/wp-content/themes/twentynineteen/package.json new file mode 100644 index 0000000..b2c6879 --- /dev/null +++ b/wp-content/themes/twentynineteen/package.json @@ -0,0 +1,44 @@ +{ + "name": "twentynineteen", + "version": "1.0.0", + "description": "Default WP Theme", + "bugs": { + "url": "https://github.com/WordPress/twentynineteen/issues" + }, + "homepage": "https://github.com/WordPress/twentynineteen#readme", + "devDependencies": { + "@wordpress/browserslist-config": "^2.5.0", + "autoprefixer": "^9.6.0", + "chokidar-cli": "^2.0.0", + "node-sass": "^4.12.0", + "npm-run-all": "^4.1.5", + "postcss-cli": "^6.1.2", + "postcss-focus-within": "^3.0.0", + "rtlcss": "^2.4.0" + }, + "rtlcssConfig": { + "options": { + "autoRename": false, + "autoRenameStrict": false, + "blacklist": {}, + "clean": true, + "greedy": false, + "processUrls": false, + "stringMap": [] + }, + "plugins": [], + "map": false + }, + "browserslist": [ + "extends @wordpress/browserslist-config" + ], + "scripts": { + "build:style": "node-sass style.scss style.css --output-style expanded && postcss -r style.css", + "build:style-editor": "node-sass style-editor.scss style-editor.css --output-style expanded && postcss -r style-editor.css", + "build:style-editor-customizer": "node-sass style-editor-customizer.scss style-editor-customizer.css --output-style expanded && postcss -r style-editor-customizer.css", + "build:rtl": "rtlcss style.css style-rtl.css", + "build:print": "node-sass print.scss print.css --output-style expanded && postcss -r print.css", + "build": "run-p \"build:*\"", + "watch": "chokidar \"**/*.scss\" -c \"npm run build\" --initial" + } +} diff --git a/wp-content/themes/twentynineteen/page.php b/wp-content/themes/twentynineteen/page.php new file mode 100644 index 0000000..6666edb --- /dev/null +++ b/wp-content/themes/twentynineteen/page.php @@ -0,0 +1,38 @@ + + +
            +
            + + + +
            +
            + +>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Margins +# Typography +# Page breaks +# Links +# Visibility +--------------------------------------------------------------*/ +@media print { + /* Margins */ + @page { + margin: 2cm; + } + .entry { + margin-top: 1em; + } + .entry .entry-header, .site-footer .site-info { + margin: 0; + } + /* Fonts */ + body { + font: 13pt Georgia, "Times New Roman", Times, serif; + line-height: 1.3; + background: #fff !important; + color: #000; + } + h1 { + font-size: 24pt; + } + h2, + h3, + h4, + .has-regular-font-size, + .has-large-font-size, + h2.author-title, + p.author-bio, + .comments-title, h3 { + font-size: 14pt; + margin-top: 25px; + } + /* Page breaks */ + a { + page-break-inside: avoid; + } + blockquote { + page-break-inside: avoid; + } + h1, + h2, + h3, + h4, + h5, + h6 { + page-break-after: avoid; + page-break-inside: avoid; + } + img { + page-break-inside: avoid; + page-break-after: avoid; + } + table, pre { + page-break-inside: avoid; + } + ul, ol, dl { + page-break-before: avoid; + } + /* Links */ + a:link, a:visited, a { + background: transparent; + font-weight: bold; + text-decoration: underline; + text-align: left; + } + a { + page-break-inside: avoid; + } + a[href^=http]:after { + content: " < " attr(href) "> "; + } + a:after > img { + content: ""; + } + article a[href^="#"]:after { + content: ""; + } + a:not(:local-link):after { + content: " < " attr(href) "> "; + } + /* Visibility */ + .main-navigation, + .site-title + .main-navigation, + .social-navigation, + .site-branding-container:before, + .entry .entry-title:before, + .entry-footer, + .author-description:before, + .post-navigation, + .widget-area, + .comment-form-flex, + .comment-reply, + .comment .comment-metadata .edit-link { + display: none; + } + .entry .entry-content .wp-block-button .wp-block-button__link, + .entry .entry-content .button { + color: #000; + background: none; + } + /* Site Header (With Featured Image) */ + .site-header.featured-image { + min-height: 0; + } + .site-header.featured-image .main-navigation a, + .site-header.featured-image .main-navigation a + svg, + .site-header.featured-image .social-navigation a, + .site-header.featured-image .site-title a, + .site-header.featured-image .site-featured-image a, + .site-header.featured-image .site-branding .site-title, + .site-header.featured-image .site-branding .site-description, + .site-header.featured-image .main-navigation a:after, + .site-header.featured-image .main-navigation .main-menu > li.menu-item-has-children:after, + .site-header.featured-image .main-navigation li, + .site-header.featured-image .social-navigation li, + .site-header.featured-image .entry-meta, + .site-header.featured-image .entry-title, + .site-header.featured-image#masthead .site-title a { + color: #000; + text-shadow: none; + } + .site-header.featured-image .site-featured-image .entry-header, + .site-header.featured-image .site-branding-container { + margin-top: 0; + margin-bottom: 0; + } + .site-header.featured-image .site-featured-image .post-thumbnail img { + position: relative; + height: initial; + width: initial; + object-fit: none; + min-width: 0; + min-height: 0; + max-width: 100%; + margin-top: 1rem; + } + /* Remove image filters from featured image */ + .image-filters-enabled *:after { + display: none !important; + } + .image-filters-enabled .site-header.featured-image .site-featured-image:before { + display: none; + } + .image-filters-enabled .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: none; + } +} diff --git a/wp-content/themes/twentynineteen/print.scss b/wp-content/themes/twentynineteen/print.scss new file mode 100644 index 0000000..47976da --- /dev/null +++ b/wp-content/themes/twentynineteen/print.scss @@ -0,0 +1,198 @@ +/* +Theme Name: Twenty Nineteen + +Adding print support. The print styles are based on the the great work of +Andreas Hecht in https://www.jotform.com/blog/css-perfect-print-stylesheet-98272/. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Margins +# Typography +# Page breaks +# Links +# Visibility +--------------------------------------------------------------*/ + +@media print { + + /* Margins */ + + @page { + margin: 2cm; + } + + .entry { + margin-top: 1em; + } + + .entry .entry-header, .site-footer .site-info { + margin: 0; + } + + /* Fonts */ + + body { + font: 13pt Georgia, "Times New Roman", Times, serif; + line-height: 1.3; + background: #fff !important; + color: #000; + } + + h1 { + font-size: 24pt; + } + + h2, + h3, + h4, + .has-regular-font-size, + .has-large-font-size, + h2.author-title, + p.author-bio, + .comments-title, h3 { + font-size: 14pt; + margin-top: 25px; + } + + /* Page breaks */ + + a { + page-break-inside: avoid + } + + blockquote { + page-break-inside: avoid; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + page-break-after: avoid; + page-break-inside: avoid + } + + img { + page-break-inside: avoid; + page-break-after: avoid; + } + + table, pre { + page-break-inside: avoid; + } + + ul, ol, dl { + page-break-before: avoid; + } + + /* Links */ + + a:link, a:visited, a { + background: transparent; + font-weight: bold; + text-decoration: underline; + text-align: left; + } + + a { + page-break-inside: avoid; + } + + a[href^=http]:after { + content: " < " attr(href) "> "; + } + + a:after > img { + content: ""; + } + + article a[href^="#"]:after { + content: ""; + } + + a:not(:local-link):after { + content: " < " attr(href) "> "; + } + + /* Visibility */ + .main-navigation, + .site-title + .main-navigation, + .social-navigation, + .site-branding-container:before, + .entry .entry-title:before, + .entry-footer, + .author-description:before, + .post-navigation, + .widget-area, + .comment-form-flex, + .comment-reply, + .comment .comment-metadata .edit-link { + display: none; + } + + .entry .entry-content .wp-block-button .wp-block-button__link, + .entry .entry-content .button { + color: #000; + background: none; + } + + /* Site Header (With Featured Image) */ + .site-header.featured-image { + min-height: 0; + + .main-navigation a, + .main-navigation a + svg, + .social-navigation a, + .site-title a, + .site-featured-image a, + .site-branding .site-title, + .site-branding .site-description, + .main-navigation a:after, + .main-navigation .main-menu > li.menu-item-has-children:after, + .main-navigation li, + .social-navigation li, + .entry-meta, + .entry-title, + &#masthead .site-title a { + color: #000; + text-shadow: none; + } + + .site-featured-image .entry-header, + .site-branding-container { + margin-top: 0; + margin-bottom: 0; + } + + .site-featured-image .post-thumbnail img { + position: relative; + height: initial; + width: initial; + object-fit: none; + min-width: 0; + min-height: 0; + max-width: 100%; + margin-top: 1rem; + } + } + + /* Remove image filters from featured image */ + .image-filters-enabled { + + *:after { + display: none !important; + } + + .site-header.featured-image .site-featured-image:before { + display: none; + } + + .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: none; + } + } +} \ No newline at end of file diff --git a/wp-content/themes/twentynineteen/readme.txt b/wp-content/themes/twentynineteen/readme.txt new file mode 100644 index 0000000..c871d92 --- /dev/null +++ b/wp-content/themes/twentynineteen/readme.txt @@ -0,0 +1,74 @@ +=== Twenty Nineteen === +Contributors: wordpressdotorg +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready +Requires at least: 4.9.6 +Tested up to: 5.0 +Stable tag: 1.5 +License: GPLv2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +Our 2019 default theme is designed to show off the power of the block editor. + +== Description == +Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. + +For more information about Twenty Nineteen please go to https://wordpress.org/support/article/twenty-nineteen/. + +== Installation == + +1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +2. Type in Twenty Nineteen in the search form and press the 'Enter' key on your keyboard. +3. Click on the 'Activate' button to use your new theme right away. +4. Go to https://wordpress.org/support/article/twenty-nineteen/ for a guide on how to customize this theme. +5. Navigate to Appearance > Customize in your admin panel and customize to taste. + +== Copyright == + +Twenty Nineteen WordPress Theme, Copyright 2018-2020 WordPress.org +Twenty Nineteen is distributed under the terms of the GNU GPL + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +== Changelog == + += 1.5 = +* Released: March 31, 2020 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.5 + += 1.4 = +* Released: May 7, 2019 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.4 + += 1.3 = +* Released: February 21, 2019 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.3 + += 1.2 = +* Released: January 9, 2019 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.2 + += 1.1 = +* Released: December 19, 2018 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.1 + += 1.0 = +* Released: December 6, 2018 + +Initial release + +== Resources == +* normalize.css, © 2012-2018 Nicolas Gallagher and Jonathan Neal, MIT +* Underscores, © 2012-2019 Automattic, Inc., GNU GPL v2 or later diff --git a/wp-content/themes/twentynineteen/sass/_normalize.scss b/wp-content/themes/twentynineteen/sass/_normalize.scss new file mode 100644 index 0000000..c5ad67a --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/_normalize.scss @@ -0,0 +1,341 @@ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/wp-content/themes/twentynineteen/sass/blocks/_blocks.scss b/wp-content/themes/twentynineteen/sass/blocks/_blocks.scss new file mode 100644 index 0000000..e4b3134 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/blocks/_blocks.scss @@ -0,0 +1,1032 @@ +/* !Block styles */ + + +// Default block margin and alignment rules. +// These are replicated inside of the Group block +// so that child blocks in there appear the same way. +.entry .entry-content > *, +.entry .entry-summary > *, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + max-width: 100%; + + @include postContentMaxWidth(); + + @include media(tablet) { + margin: 32px 0; + } + + &.alignwide { + margin-left: auto; + margin-right: auto; + clear: both; + + @include media(tablet) { + width: 100%; + max-width: 100%; + } + } + + &.alignfull { + position: relative; + left: -#{$size__spacing-unit }; + width: calc( 100% + (2 * #{$size__spacing-unit})); + max-width: calc( 100% + (2 * #{$size__spacing-unit})); + clear: both; + + @include media(tablet) { + margin-top: calc(2 * #{$size__spacing-unit}); + margin-bottom: calc(2 * #{$size__spacing-unit}); + left: calc( -12.5% - 75px ); + width: calc( 125% + 150px ); + max-width: calc( 125% + 150px ); + } + } + + &.alignleft { + /*rtl:ignore*/ + float: left; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-left: 0; + /*rtl:ignore*/ + margin-right: $size__spacing-unit; + + @include media(tablet) { + max-width: calc(4 * (100vw / 12)); + /*rtl:ignore*/ + margin-right: calc(2 * #{$size__spacing-unit}); + } + } + + &.alignright { + /*rtl:ignore*/ + float: right; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-right: 0; + /*rtl:ignore*/ + margin-left: $size__spacing-unit; + + @include media(tablet) { + max-width: calc(4 * (100vw / 12)); + margin-right: 0; + /*rtl:ignore*/ + margin-left: calc(2 * #{$size__spacing-unit}); + } + } + &.aligncenter { + margin-left: auto; + margin-right: auto; + + @include postContentMaxWidth(); + + @include media(tablet) { + margin-left: 0; + margin-right: 0; + } + } +} + +.entry .entry-content > *, +.entry .entry-summary > * { + + > *:first-child { + margin-top: 0; + } + + > *:last-child { + margin-bottom: 0; + } +} + +/* + * Unset nested content selector styles + * - Prevents layout styles from cascading too deeply + * - helps with plugin compatibility + */ +.entry .entry-content, +.entry .entry-summary { + + .entry-content, + .entry-summary, + .entry { + margin: inherit; + max-width: inherit; + padding: inherit; + + @include media(tablet) { + margin: inherit; + max-width: inherit; + padding: inherit; + } + } +} + +.entry .entry-content { + + //! Paragraphs + p.has-background { + padding: 20px 30px; + } + + //! Audio + .wp-block-audio { + + width: 100%; + + audio { + width: 100%; + } + + &.alignleft audio, + &.alignright audio { + + max-width: (0.33 * $mobile_width); + + @include media(tablet) { + max-width: (0.5 * $tablet_width); + } + + @include media(wide) { + max-width: (0.33 * $desktop_width); + } + } + } + + //! Video + .wp-block-video { + + video { + width: 100%; + } + } + + //! Button + .wp-block-button { + + .wp-block-button__link { + @include button-transition; + border: none; + font-size: $font__size-sm; + @include font-family( $font__heading ); + line-height: $font__line-height-heading; + box-sizing: border-box; + font-weight: bold; + text-decoration: none; + padding: ($size__spacing-unit * .76) $size__spacing-unit; + outline: none; + outline: none; + + &:not(.has-background) { + background-color: $color__background-button; + } + + &:not(.has-text-color) { + color: white; + } + + &:hover { + color: white; + background: $color__background-button-hover; + cursor: pointer; + } + + &:focus { + color: white; + background: $color__background-button-hover; + outline: thin dotted; + outline-offset: -4px; + } + } + + &:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; + } + + &.is-style-outline .wp-block-button__link, + &.is-style-outline .wp-block-button__link:focus, + &.is-style-outline .wp-block-button__link:active { + @include button-all-transition; + border-width: 2px; + border-style: solid; + + &:not(.has-background) { + background: transparent; + } + + &:not(.has-text-color) { + color: $color__background-button; + border-color: currentColor; + } + } + + &.is-style-outline .wp-block-button__link:hover { + color: white; + border-color: $color__background-button-hover; + &:not(.has-background) { + color: $color__background-button-hover; + } + } + } + + //! Latest posts, categories, archives + .wp-block-archives, + .wp-block-categories, + .wp-block-latest-posts { + padding: 0; + list-style: none; + + li > a { + @include font-family( $font__heading ); + font-size: calc(#{$font__size_base} * #{$font__size-ratio}); + font-weight: bold; + line-height: $font__line-height-heading; + text-decoration: none; + } + } + + .wp-block-archives, + .wp-block-categories { + + &.aligncenter { + text-align: center; + } + } + + //! Latest categories + .wp-block-categories { + + ul { + padding-top: ( .75 * $size__spacing-unit ); + } + + li ul { + list-style: none; + padding-left: 0; + } + + @include nestedSubMenuPadding(); + } + + //! Latest posts + .wp-block-latest-posts { + + .wp-block-latest-posts__post-date { + @include font-family( $font__heading ); + font-size: $font__size-xs; + color: $color__text-light; + line-height: 1.2; + } + + .wp-block-latest-posts__post-full-content, + .wp-block-latest-posts__post-excerpt { + margin-top: $size__spacing-unit; + margin-bottom: $size__spacing-unit; + } + + li { + padding-bottom: ( .5 * $size__spacing-unit ); + + &.menu-item-has-children, + &:last-child { + padding-bottom: 0; + } + + :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: ( .5 * $size__spacing-unit ); + } + } + + &.is-grid li { + border-top: 2px solid $color__border; + padding-top: (1 * $size__spacing-unit); + margin-bottom: (2 * $size__spacing-unit); + a { + &:after { + content: ''; + } + } + &:last-child { + margin-bottom: auto; + a:after { + content: ''; + } + } + } + } + + //! Latest preformatted text + .wp-block-preformatted { + font-size: $font__size-xs; + line-height: 1.8; + padding: $size__spacing-unit; + } + + //! Verse + .wp-block-verse { + @include font-family( $font__body ); + font-size: $font__size_base; + line-height: 1.8; + } + + //! Paragraphs + .has-drop-cap { + &:not(:focus):first-letter { + @include font-family( $font__heading ); + font-size: $font__size-xxxl; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; + } + } + + //! Pullquote + .wp-block-pullquote { + border-color: transparent; + border-width: 2px; + padding: $size__spacing-unit; + + blockquote { + color: $color__text-main; + border: none; + margin-top: calc(4 * #{ $size__spacing-unit}); + margin-bottom: calc(4.33 * #{ $size__spacing-unit}); + margin-right: 0; + padding-left: 0; + } + + p { + font-size: $font__size-lg; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + + em { + font-style: normal; + } + + @include media(tablet) { + font-size: $font__size-xl; + } + } + + cite { + display: inline-block; + @include font-family( $font__heading ); + line-height: 1.6; + text-transform: none; + color: $color__text-light; + + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * #{$font__size-ratio})); + } + + &.alignleft, + &.alignright { + width: 100%; + padding: 0; + + blockquote { + margin: $size__spacing-unit 0; + padding: 0; + text-align: left; + max-width: 100%; + + p:first-child { + margin-top: 0; + } + } + } + + &.is-style-solid-color { + background-color: $color__link; + padding-left: 0; + padding-right: 0; + + @include media(tablet) { + padding-left: 10%; + padding-right: 10%; + } + + p { + font-size: $font__size-lg; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + + @include media(tablet) { + font-size: $font__size-xl; + } + } + + a { + color: $color__background-body; + } + + cite { + color: inherit; + } + + blockquote { + max-width: 100%; + color: $color__background-body; + padding-left: 0; + margin-left: $size__spacing-unit; + margin-right: $size__spacing-unit; + + &.has-text-color p, + &.has-text-color a, + &.has-primary-color, + &.has-secondary-color, + &.has-dark-gray-color, + &.has-light-gray-color, + &.has-white-color { + color: inherit; + } + + @include media(tablet) { + margin-left: 0; + margin-right: 0; + } + } + + &.alignright, + &.alignleft { + + @include media(tablet) { + padding: $size__spacing-unit calc(2 * #{$size__spacing-unit}); + } + } + + &.alignfull { + + @include media(tablet) { + padding-left: calc(10% + 58px + (2 * #{$size__spacing-unit})); + padding-right: calc(10% + 58px + (2 * #{$size__spacing-unit})); + } + } + } + } + + //! Blockquote + .wp-block-quote { + + &:not(.is-large), + &:not(.is-style-large) { + border-width: 2px; + border-color: $color__link; + padding-top: 0; + padding-bottom: 0; + } + + p { + font-size: 1em; + font-style: normal; + line-height: 1.8; + } + + cite { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * #{$font__size-ratio})); + } + + &.is-large, + &.is-style-large { + margin: $size__spacing-unit 0; + padding: 0; + border-left: none; + + p { + font-size: $font__size-lg; + line-height: 1.4; + font-style: italic; + } + + cite, + footer { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * #{$font__size-ratio})); + } + + @include media(tablet) { + margin: $size__spacing-unit 0; + padding: $size__spacing-unit 0; + + p { + font-size: $font__size-lg; + } + } + } + } + + //! Image + .wp-block-image { + max-width: 100%; + + img { + display: block; + } + + // If an image does not have a left/center/right alignment, + // it's a direct child of .wp-block-img. If it has no other + // alignment added, we want to make sure the image does not + // extend beyond the width of the text column. + &:not(.alignwide):not(.alignfull) > img { + @include postContentMaxWidth(); + } + + .aligncenter { + + @include postContentMaxWidth(); + + @include media(tablet) { + margin: 0; + width: $size__site-tablet-content; + + img { + margin: 0 auto; + } + } + + @include media(desktop) { + width: $size__site-desktop-content; + + img { + margin: 0 auto; + } + } + } + + &.alignfull img { + width: 100vw; + max-width: calc( 100% + (2 * #{$size__spacing-unit})); + + @include media(tablet) { + max-width: calc( 125% + 150px ); + margin-left: auto; + margin-right: auto; + } + } + } + + //! Cover Image + .wp-block-cover-image, + .wp-block-cover { + position: relative; + min-height: 430px; + padding: $size__spacing-unit; + + @include media(tablet) { + padding: $size__spacing-unit 10%; + } + + .wp-block-cover-image-text, + .wp-block-cover-text, + h2 { + @include font-family( $font__heading ); + font-size: $font__size-lg; + font-weight: bold; + line-height: 1.25; + padding: 0; + color: #fff; + + @include media(tablet) { + font-size: $font__size-xl; + max-width: 100%; + } + } + + &.alignleft, + &.alignright { + width: 100%; + + @include media(tablet) { + padding: $size__spacing-unit calc(2 * #{$size__spacing-unit}); + } + } + + &.alignfull { + + .wp-block-cover-image-text, + .wp-block-cover-text, + h2 { + @include postContentMaxWidth(); + } + + @include media(tablet) { + padding-left: calc(10% + 58px + (2 * #{$size__spacing-unit})); + padding-right: calc(10% + 58px + (2 * #{$size__spacing-unit})); + + .wp-block-cover-image-text, + .wp-block-cover-text, + h2 { + padding: 0; + } + } + } + } + + //! Galleries + .wp-block-gallery { + list-style-type: none; + padding-left: 0; + + .blocks-gallery-image:last-child, + .blocks-gallery-item:last-child { + margin-bottom: 16px; + } + + figcaption a { + color: #fff; + } + } + + //! Captions + .wp-block-audio figcaption, + .wp-block-video figcaption, + .wp-block-image figcaption, + .wp-block-gallery .blocks-gallery-image figcaption, + .wp-block-gallery .blocks-gallery-item figcaption { + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); + text-align: center; + } + + //! Separator + .wp-block-separator, + hr { + background-color: $color__text-light; + border: 0; + height: 2px; + margin-bottom: (2 * $size__spacing-unit); + margin-top: (2 * $size__spacing-unit); + max-width: 2.25em; + text-align: left; + + &.is-style-wide { + max-width: 100%; + @include postContentMaxWidth(); + } + + &.is-style-dots { + max-width: 100%; + @include postContentMaxWidth(); + background-color: inherit; + border: inherit; + height: inherit; + text-align: center; + + // Only apply the default dot color if there's no separator color specified. + &:not(.has-text-color):not(.has-background) { + color: $color__text-light; + } + + &:before { + font-size: $font__size-lg; + letter-spacing: $font__size-sm; + padding-left: $font__size-sm; + } + } + + /* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ + & + h1, + & + h2 { + + &:before { + display: none; + } + } + } + + //! Twitter Embed + .wp-block-embed-twitter { + word-break: break-word; + } + + //! Table + .wp-block-table { + + th, + td { + border-color: $color__text-light; + } + } + + //! File + .wp-block-file { + @include font-family( $font__heading ); + + .wp-block-file__button { + display: table; + @include button-transition; + border: none; + border-radius: 5px; + background: $color__background-button; + font-size: $font__size-base; + @include font-family( $font__heading ); + line-height: $font__line-height-heading; + text-decoration: none; + font-weight: bold; + padding: ($size__spacing-unit * .75) $size__spacing-unit; + color: #fff; + margin-left: 0; + margin-top: calc(0.75 * #{$size__spacing-unit}); + + @include media(desktop) { + font-size: $font__size-base; + padding: ($size__spacing-unit * .875) ($size__spacing-unit * 1.5); + } + + &:hover { + background: $color__background-button-hover; + cursor: pointer; + } + + &:focus { + background: $color__background-button-hover; + outline: thin dotted; + outline-offset: -4px; + } + } + } + + //! Code + .wp-block-code { + border-radius: 0; + + code { + font-size: $font__size-md; + white-space: pre-wrap; + word-break: break-word; + } + } + + //! Columns + .wp-block-columns { + + .wp-block-column > * { + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + + // Ensure images do not expand beyond the column. + .wp-block-image > img:not(.alignwide):not(.alignfull), + .wp-block-image > figure { + + @include media(tablet) { + max-width: 100%; + } + + @include media(desktop) { + max-width: 100%; + } + } + + @include media(tablet) { + flex-wrap: nowrap; + + .wp-block-column:not(:first-child) { + margin-left: 32px; + } + } + } + + //! Group + .wp-block-group { + + // When the Group block is standard/wide, we need to prevent full-aligned + // child blocks from expanding out of their container. + &:not(.alignfull) > .wp-block-group__inner-container > .alignfull, + &:not(.alignfull) > .wp-block-group__inner-container > .wp-block-image > img { + + @include media(tablet) { + left: 0; + max-width: 100%; + } + } + + // The full-width Group block's inner container should mimic .entry-content styles. + &.alignfull > .wp-block-group__inner-container { + max-width: calc(100% - (2 * #{ $size__spacing-unit })); + margin: 0 $size__spacing-unit; + + @include media(tablet) { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } + } + + // Group block with a colored background. + &.has-background { + padding: $size__spacing-unit; + margin-top: 0; + margin-bottom: 0; + + // Remove the top and bottom margins of inner blocks. + .wp-block-group__inner-container { + + > *:first-child { + margin-top: 0; + } + + > *:last-child { + margin-bottom: 0; + } + } + + // If the Group block is full-width, it does not need this extra padding. + &.alignfull { + padding-left: 0; + padding-right: 0; + + @include media(tablet) { + padding-top: $size__spacing-unit; + padding-bottom: $size__spacing-unit; + } + } + + // Full-aligned child blocks should take up the maximum width available in their container. + &:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: 100%; + max-width: 100%; + + @include media(tablet) { + width: calc( 100% + #{$size__spacing-unit * 2} ); + max-width: calc( 100% + #{$size__spacing-unit * 2} ); + margin-left: -#{$size__spacing-unit}; + } + } + } + + } + + //! Latest Comments + .wp-block-latest-comments { + + .wp-block-latest-comments__comment-meta { + @include font-family( $font__heading ); + font-weight: bold; + + .wp-block-latest-comments__comment-date { + font-weight: normal; + } + } + + .wp-block-latest-comments__comment, + .wp-block-latest-comments__comment-date, + .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; + } + + &.has-avatars { + + } + + &.has-dates { + + .wp-block-latest-comments__comment-date { + font-size: $font__size-xs; + } + } + + &.has-excerpts { + + } + } + + //! Font Sizes + .has-small-font-size { + font-size: $font__size-sm; + } + + .has-normal-font-size { + font-size: $font__size-md; + } + + .has-large-font-size { + font-size: $font__size-lg; + } + + .has-huge-font-size { + font-size: $font__size-xl; + } + + //! Custom background colors + .has-primary-background-color, + .has-secondary-background-color, + .has-dark-gray-background-color, + .has-light-gray-background-color { + + // Use white text against these backgrounds by default. + color: $color__background-body; + + > p, + > h1, + > h2, + > h3, + > h4, + > h5, + > h6, + > a { + color: $color__background-body; + } + } + + .has-white-background-color { + color: $color__text-main; + + // Use dark gray text against this background by default. + > p, + > h1, + > h2, + > h3, + > h4, + > h5, + > h6, + > a { + color: $color__text-main; + } + } + + .has-primary-background-color, + .wp-block-pullquote.is-style-solid-color.has-primary-background-color { + background-color: $color__link; + } + + .has-secondary-background-color, + .wp-block-pullquote.is-style-solid-color.has-secondary-background-color { + background-color: $color__border-link-hover; + } + + .has-dark-gray-background-color, + .wp-block-pullquote.is-style-solid-color.has-dark-gray-background-color { + background-color: $color__text-main; + } + + .has-light-gray-background-color, + .wp-block-pullquote.is-style-solid-color.has-light-gray-background-color { + background-color: $color__text-light; + } + + .has-white-background-color, + .wp-block-pullquote.is-style-solid-color.has-white-background-color { + background-color: #FFF; + } + + //! Custom foreground colors + .has-primary-color, + .wp-block-pullquote blockquote.has-primary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color > p { + color: $color__link; + } + + .has-secondary-color, + .wp-block-pullquote blockquote.has-secondary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color > p { + color: $color__border-link-hover; + } + + .has-dark-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color > p { + color: $color__text-main; + } + + .has-light-gray-color, + .wp-block-pullquote blockquote.has-light-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color > p { + color: $color__text-light; + } + + .has-white-color, + .wp-block-pullquote blockquote.has-white-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: #FFF; + } +} diff --git a/wp-content/themes/twentynineteen/sass/elements/_elements.scss b/wp-content/themes/twentynineteen/sass/elements/_elements.scss new file mode 100644 index 0000000..b1fad05 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/elements/_elements.scss @@ -0,0 +1,92 @@ +html { + box-sizing: border-box; +} + +::-moz-selection { + background-color: $color__background_selection; +} + +::selection { + background-color: $color__background_selection; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + background-color: $color__background-body; +} + +a { + @include link-transition; + color: $color__link; +} + +a:visited { + +} + +a:hover, +a:active { + color: $color__link-hover; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin; + outline-style: dotted; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + margin: $size__spacing-unit 0; +} + +h1:not(.site-title), +h2 { + @include post-section-dash; +} + +hr { + background-color: $color__text-light; + border: 0; + height: 2px; +} + +@import "lists"; + +img { + height: auto; + max-width: 100%; + position: relative; +} + +figure { + margin: 0; +} + +blockquote { + border-left: 2px solid $color__link; + margin-left: 0; + padding: 0 0 0 $size__spacing-unit; + + > p { + margin: 0 0 $size__spacing-unit; + } + + cite { + color: $color__text-light; + } +} + +@import "tables"; diff --git a/wp-content/themes/twentynineteen/sass/elements/_lists.scss b/wp-content/themes/twentynineteen/sass/elements/_lists.scss new file mode 100644 index 0000000..1db7633 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/elements/_lists.scss @@ -0,0 +1,33 @@ +ul, +ol { + padding-left: ( 1 * $size__spacing-unit ); +} + +ul { + list-style: disc; + + ul { + list-style-type: circle; + } +} + +ol { + list-style: decimal; +} + +li { + line-height: $font__line-height-body; +} + +li > ul, +li > ol { + padding-left: ( 2 * $size__spacing-unit ); +} + +dt { + font-weight: bold; +} + +dd { + margin: 0 $size__spacing-unit $size__spacing-unit; +} diff --git a/wp-content/themes/twentynineteen/sass/elements/_tables.scss b/wp-content/themes/twentynineteen/sass/elements/_tables.scss new file mode 100644 index 0000000..0f653a5 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/elements/_tables.scss @@ -0,0 +1,13 @@ +table { + margin: 0 0 $size__spacing-unit; + border-collapse: collapse; + width: 100%; + @include font-family( $font__heading ); + + td, + th { + padding: 0.5em; + border: 1px solid $color__text-light; + word-break: break-all; + } +} diff --git a/wp-content/themes/twentynineteen/sass/forms/_buttons.scss b/wp-content/themes/twentynineteen/sass/forms/_buttons.scss new file mode 100644 index 0000000..f527a08 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/forms/_buttons.scss @@ -0,0 +1,37 @@ +.button, +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + + @include button-transition; + background: $color__background-button; + border: none; + border-radius: 5px; + box-sizing: border-box; + color: $color__background-body; + @include font-family( $font__heading ); + font-size: $font__size-sm; + font-weight: 700; + line-height: $font__line-height-heading; + outline: none; + padding: ( $size__spacing-unit * .76 ) $size__spacing-unit; + text-decoration: none; + vertical-align: bottom; + + &:hover { + background: $color__background-button-hover; + cursor: pointer; + } + + &:visited { + color: $color__background-body; + text-decoration: none; + } + + &:focus { + background: $color__background-button-hover; + outline: thin dotted; + outline-offset: -4px; + } +} diff --git a/wp-content/themes/twentynineteen/sass/forms/_fields.scss b/wp-content/themes/twentynineteen/sass/forms/_fields.scss new file mode 100644 index 0000000..448b707 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/forms/_fields.scss @@ -0,0 +1,58 @@ +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"], +textarea { + -webkit-backface-visibility: hidden; + background: $color__background-input; + border: solid 1px $color__border; + box-sizing: border-box; + outline: none; + padding: #{.36 * $size__spacing-unit} #{.66 * $size__spacing-unit}; + -webkit-appearance: none; + outline-offset: 0; + border-radius: 0; + + &:focus { + border-color: $color__link; + outline: thin solid rgba( $color__link, 0.15 ); + outline-offset: -4px; + } +} + +input[type="search"] { + &::-webkit-search-decoration { + display: none; + } +} + +select { + +} + +textarea { + box-sizing: border-box; + display: block; + width: 100%; + max-width: 100%; + resize: vertical; +} + +form { + + p { + margin: $size__spacing-unit 0; + } + +} \ No newline at end of file diff --git a/wp-content/themes/twentynineteen/sass/forms/_forms.scss b/wp-content/themes/twentynineteen/sass/forms/_forms.scss new file mode 100644 index 0000000..2036ef9 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/forms/_forms.scss @@ -0,0 +1,3 @@ +@import "buttons"; + +@import "fields"; diff --git a/wp-content/themes/twentynineteen/sass/layout/_layout.scss b/wp-content/themes/twentynineteen/sass/layout/_layout.scss new file mode 100644 index 0000000..e0e2c76 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/layout/_layout.scss @@ -0,0 +1,11 @@ + +/** === Layout === */ + +#page { + width: 100%; +} + +.site-content { + overflow: hidden; +} + diff --git a/wp-content/themes/twentynineteen/sass/media/_captions.scss b/wp-content/themes/twentynineteen/sass/media/_captions.scss new file mode 100644 index 0000000..761eb2f --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/media/_captions.scss @@ -0,0 +1,32 @@ +.wp-caption { + margin-bottom: calc(1.5 * #{$size__spacing-unit}); + + &.aligncenter { + + @include media(tablet) { + position: relative; + left: calc( #{$size__site-tablet-content} / 2 ); + transform: translateX( -50% ); + } + + @include media(desktop) { + left: calc( #{$size__site-desktop-content} / 2 ); + } + } +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.wp-caption-text { + color: $color__text-light; + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); + text-align: center; +} diff --git a/wp-content/themes/twentynineteen/sass/media/_galleries.scss b/wp-content/themes/twentynineteen/sass/media/_galleries.scss new file mode 100644 index 0000000..fbc0bb1 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/media/_galleries.scss @@ -0,0 +1,52 @@ +.gallery { + display: flex; + flex-flow: row wrap; + justify-content: center; + margin-bottom: calc(1.5 * #{$size__spacing-unit}); +} + +.gallery-item { + display: inline-block; + margin-right: 16px; + margin-bottom: 16px; + text-align: center; + vertical-align: top; + width: 100%; + + // Loops to enumerate the classes for gallery columns. + @for $i from 2 through 9 { + .gallery-columns-#{$i} & { + max-width: calc((100% - 16px * #{ $i - 1 }) / #{ $i }); + + &:nth-of-type(#{$i}n+#{$i}) { + margin-right: 0; + } + } + } + + &:last-of-type { + padding-right: 0; + } +} + +.gallery-caption { + display: block; + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); +} + +.gallery-item > div > a { + display: block; + line-height: 0; + + // Accessibility + box-shadow: 0 0 0 0 transparent; + + &:focus { + box-shadow: 0 0 0 2px rgba( $color__link, 1 ); + } +} + diff --git a/wp-content/themes/twentynineteen/sass/media/_media.scss b/wp-content/themes/twentynineteen/sass/media/_media.scss new file mode 100644 index 0000000..3fba8c6 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/media/_media.scss @@ -0,0 +1,41 @@ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +embed, +iframe, +object { + max-width: 100%; +} + +.custom-logo-link { + display: inline-block; +} + +.avatar { + border-radius: 100%; + display: block; + height: calc(2.25 * #{$size__spacing-unit}); + min-height: inherit; + width: calc(2.25 * #{$size__spacing-unit}); +} + +svg { + transition: fill $icon_transition ease-in-out; + fill: currentColor; +} + +/*-------------------------------------------------------------- +## Captions +--------------------------------------------------------------*/ +@import "captions"; + +/*-------------------------------------------------------------- +## Galleries +--------------------------------------------------------------*/ +@import "galleries"; diff --git a/wp-content/themes/twentynineteen/sass/mixins/_mixins-master.scss b/wp-content/themes/twentynineteen/sass/mixins/_mixins-master.scss new file mode 100644 index 0000000..16065f9 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/mixins/_mixins-master.scss @@ -0,0 +1,132 @@ +// Rem output with px fallback +@mixin font-size($sizeValue: 1) { + font-size: ($sizeValue * 16) * 1px; + font-size: $sizeValue * 1rem; +} + +// Center block +@mixin center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +// Clearfix +@mixin clearfix() { + content: ""; + display: table; + table-layout: fixed; +} + +// Clear after (not all clearfix need this also) +@mixin clearfix-after() { + clear: both; +} + +// Column width with margin +@mixin column-width($numberColumns: 3) { + width: map-get($columns, $numberColumns) - (($columns__margin * ($numberColumns - 1)) / $numberColumns); +} + +@mixin filter-duotone { + + &:before { + background: $color__link; + mix-blend-mode: screen; + opacity: 0.1; + z-index: 2; + } + + &:after { + background: $color__link; + mix-blend-mode: multiply; + opacity: .8; + z-index: 3; + + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ + @supports (mix-blend-mode: multiply) { + opacity: 1; + } + } +} + +@mixin filter-grayscale { + + position: relative; + filter: grayscale(100%); + z-index: 1; + + &:after { + display: block; + width: 100%; + height: 100%; + z-index: 10; + } +} + +@mixin post-section-dash { + + &:before { + background: $color__text-light; + content: "\020"; + display: block; + height: 2px; + margin: $size__spacing-unit 0; + width: 1em; + } +} + +/* If we add the border using a regular CSS border, it won't look good on non-retina devices, + * since its edges can look jagged due to lack of antialiasing. In this case, we are several + * layers of box-shadow to add the border visually, which will render the border smoother. */ + +@mixin box-shadow( $size ) { + box-shadow: + 0 0 0 $size $color__text-light inset, // Original border. + 0 0 0 ($size + 1px) $color__text-light inset, // Antialiasing, inner edge. + 0 0 1px 0 rgba( $color__text-light, 0.7 ); // Antialiasing, outer edge. +} + +/* Calculates maximum width for post content */ +@mixin postContentMaxWidth() { + + @include media(tablet) { + max-width: $size__site-tablet-content; + } + + @include media(desktop) { + max-width: $size__site-desktop-content; + } +} + +/* Nested sub-menu padding: 10 levels deep */ +@mixin nestedSubMenuPadding() { + + ul { + counter-reset: submenu; + } + + ul > li > a::before { + font-family: $font__body; + font-weight: normal; + content: "\2013\00a0" counters(submenu, "\2013\00a0", none); + counter-increment: submenu + } +} + +/* Ensure all font family declarations come with non-latin fallbacks */ +@mixin font-family( $font_family: $font__body ) { + font-family: $font_family; + @extend %non-latin-fonts; +} + +/* Build our non-latin font styles */ +%non-latin-fonts { + @each $lang, $font__fallback in $font__fallbacks { + &:lang(#{$lang}) { + font-family: unquote( $font__fallback ); + } + } +} + +@import "utilities"; diff --git a/wp-content/themes/twentynineteen/sass/mixins/_utilities.scss b/wp-content/themes/twentynineteen/sass/mixins/_utilities.scss new file mode 100644 index 0000000..c753fe2 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/mixins/_utilities.scss @@ -0,0 +1,51 @@ + +@mixin media( $res ) { + @if mobile == $res { + @media only screen and (min-width: $mobile_width) { + @content; + } + } + + @if tablet == $res { + @media only screen and (min-width: $tablet_width) { + @content; + } + } + + @if desktop == $res { + @media only screen and (min-width: $desktop_width) { + @content; + } + } + + @if wide == $res { + @media only screen and (min-width: $wide_width) { + @content; + } + } +} + +@mixin link-transition( $attr: color ) { + transition: $attr $link_transition ease-in-out; +} + +@mixin button-transition() { + transition: background $button_transition ease-in-out; +} + +@mixin button-all-transition() { + transition: all $button_transition ease-in-out; +} + +@mixin background-transition() { + transition: background $background_transition ease-in-out; +} + +@mixin selection { + ::-moz-selection { + @content; + } + ::selection { + @content; + } +} diff --git a/wp-content/themes/twentynineteen/sass/modules/_accessibility.scss b/wp-content/themes/twentynineteen/sass/modules/_accessibility.scss new file mode 100644 index 0000000..e911942 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/modules/_accessibility.scss @@ -0,0 +1,38 @@ +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */ + + &:focus { + background-color: $color__background-screen; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + clip-path: none; + color: $color__text-screen; + display: block; + font-size: 0.875rem; + font-weight: bold; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; /* Above WP toolbar. */ + } +} + +/* Do not show the outline on the skip link target. */ +#content[tabindex="-1"]:focus { + outline: 0; +} diff --git a/wp-content/themes/twentynineteen/sass/modules/_alignments.scss b/wp-content/themes/twentynineteen/sass/modules/_alignments.scss new file mode 100644 index 0000000..2fb584a --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/modules/_alignments.scss @@ -0,0 +1,28 @@ +.alignleft { + /*rtl:ignore*/ + float: left; + /*rtl:ignore*/ + margin-right: $size__spacing-unit; + + @include media(tablet) { + /*rtl:ignore*/ + margin-right: calc(2 * #{$size__spacing-unit}); + } +} + +.alignright { + /*rtl:ignore*/ + float: right; + /*rtl:ignore*/ + margin-left: $size__spacing-unit; + + @include media(tablet) { + /*rtl:ignore*/ + margin-left: calc(2 * #{$size__spacing-unit}); + } +} + +.aligncenter { + clear: both; + @include center-block; +} diff --git a/wp-content/themes/twentynineteen/sass/modules/_clearings.scss b/wp-content/themes/twentynineteen/sass/modules/_clearings.scss new file mode 100644 index 0000000..444b6b6 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/modules/_clearings.scss @@ -0,0 +1,23 @@ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after { + @include clearfix; +} + +.clear:after, +.entry-content:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after { + @include clearfix-after; +} diff --git a/wp-content/themes/twentynineteen/sass/navigation/_links.scss b/wp-content/themes/twentynineteen/sass/navigation/_links.scss new file mode 100644 index 0000000..cbee457 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/navigation/_links.scss @@ -0,0 +1,21 @@ +a { + + @include link-transition; + color: $color__link; + + &:visited { + color: $color__link-visited; + } + + &:hover, + &:active { + color: $color__link-hover; + outline: 0; + text-decoration: none; + } + + &:focus { + outline: thin dotted; + text-decoration: underline; + } +} diff --git a/wp-content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss b/wp-content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss new file mode 100644 index 0000000..afe6971 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss @@ -0,0 +1,22 @@ +/** === Footer menu === */ + +.footer-navigation { + + display: inline; + + & > div { + display: inline; + } + + .footer-menu { + + display: inline; + padding-left: 0; + + li { + display: inline; + margin-right: 1rem; + } + } + +} \ No newline at end of file diff --git a/wp-content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss b/wp-content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss new file mode 100644 index 0000000..4bbd9cf --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss @@ -0,0 +1,506 @@ +/** === Main menu === */ + +.main-navigation { + + display: block; + margin-top: #{0.25 * $size__spacing-unit}; + + body.page & { + display: block; + } + + > div { + display: inline; + } + + /* Un-style buttons */ + button { + display: inline-block; + border: none; + padding: 0; + margin: 0; + font-family: $font__heading; + font-weight: 700; + line-height: $font__line-height-heading; + text-decoration: none; + background: transparent; + color: inherit; + cursor: pointer; + transition: + background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; + + &:hover, + &:focus { + background: transparent; + } + + &:focus { + outline: 1px solid transparent; + outline-offset: -4px; + } + + &:active { + transform: scale(0.99); + } + } + + .main-menu { + + display: inline-block; + margin: 0; + padding: 0; + + > li { + + color: $color__link; + display: inline; + position: relative; + + > a { + + font-weight: 700; + color: $color__link; + margin-right: #{0.5 * $size__spacing-unit}; + + + svg { + margin-right: #{0.5 * $size__spacing-unit}; + } + + &:hover, + &:hover + svg { + color: $color__link-hover; + } + } + + &.menu-item-has-children { + + display: inline-block; + position: inherit; + + @include media(tablet) { + position: relative; + } + + > a { + margin-right: #{0.125 * $size__spacing-unit}; + } + + & > a, + .menu-item-has-children > a { + + &:after { + content: ""; + display: none; + } + } + + .submenu-expand { + + display: inline-block; + margin-right: #{0.25 * $size__spacing-unit}; + + /* Priority+ Menu */ + &.main-menu-more-toggle { + + position: relative; + height: 24px; + line-height: $font__line-height-heading; + width: 24px; + padding: 0; + margin-left: #{0.5 * $size__spacing-unit}; + + svg { + height: 24px; + width: 24px; + top: #{-0.125 * $size__spacing-unit}; + vertical-align: text-bottom; + } + } + + .wp-customizer-unloading &, + &.is-empty { + display: none; + } + + svg { + position: relative; + top: 0.2rem; + } + } + } + + &:last-child > a, + &:last-child.menu-item-has-children .submenu-expand { + margin-right: 0; + } + } + } + + .sub-menu { + + background-color: $color__link; + color: $color__background-body; + list-style: none; + padding-left: 0; + + position: absolute; + opacity: 0; + left: -9999px; + z-index: 99999; + + @include media(tablet) { + width: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + } + + > li { + + display: block; + float: none; + position: relative; + + &.menu-item-has-children { + + .submenu-expand { + display: inline-block; + position: absolute; + width: calc( 24px + #{$size__spacing-unit} ); + right: 0; + top: calc( .125 * #{$size__spacing-unit} ); + bottom: 0; + color: white; + line-height: 1; + padding: calc( .5 * #{$size__spacing-unit} ); + + svg { + top: 0; + } + } + + .submenu-expand { + margin-right: 0; + } + + @include media(tablet) { + + .menu-item-has-children > a { + + &:after { + content: "\203a"; + } + } + } + } + + > a, + > .menu-item-link-return { + + color: $color__background-body; + display: block; + line-height: $font__line-height-heading; + text-shadow: none; + padding: calc( .5 * #{$size__spacing-unit} ) calc( 24px + #{$size__spacing-unit} ) calc( .5 * #{$size__spacing-unit} ) $size__spacing-unit; + white-space: nowrap; + + &:hover, + &:focus { + background: $color__link-hover; + + &:after { + background: $color__link-hover; + } + } + } + + > .menu-item-link-return { + width: 100%; + font-size: $font__size_base; + font-weight: normal; + text-align: left; + } + + > a:empty { + display: none; + } + + &.mobile-parent-nav-menu-item { + + display: none; + font-size: $font__size-sm; + font-weight: normal; + + svg { + position: relative; + top: 0.2rem; + margin-right: calc( .25 * #{$size__spacing-unit} ); + } + } + } + } + + /* + * Sub-menu styles + * + * :focus-within needs its own selector so other similar + * selectors don’t get ignored if a browser doesn’t recognize it + */ + .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + + + /* Non-mobile position */ + @include media(tablet) { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + + &.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; + + @include media(tablet) { + right: 0; + left: auto; + display: block; + width: max-content; + } + } + + .submenu-expand { + display: none; + } + + .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + + /* Non-mobile position */ + @include media(tablet) { + float: none; + max-width: 100%; + } + } + + /* Nested sub-menu dashes */ + .sub-menu { + counter-reset: submenu; + } + + .sub-menu > li > a::before { + font-family: $font__body; + font-weight: normal; + content: "\2013\00a0" counters(submenu, "\2013\00a0", none); + counter-increment: submenu + } + } + + .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, + .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, + .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + + + /* Non-mobile position */ + @include media(tablet) { + display: block; + float: none; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + + &.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; + + @include media(tablet) { + right: 0; + left: auto; + display: table; + width: max-content; + } + } + + .submenu-expand { + display: none; + } + + .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + + /* Non-mobile position */ + @include media(tablet) { + float: none; + max-width: 100%; + } + } + + /* Nested sub-menu dashes */ + .sub-menu { + counter-reset: submenu; + } + + .sub-menu > li > a::before { + font-family: $font__body; + font-weight: normal; + content: "\2013\00a0" counters(submenu, "\2013\00a0", none); + counter-increment: submenu + } + } + + /** + * Fade-in animation for top-level submenus + */ + .main-menu > .menu-item-has-children:not(.off-canvas):hover > .sub-menu { + animation: fade_in 0.1s forwards; + } + + /** + * Off-canvas touch device styles + */ + .main-menu .menu-item-has-children.off-canvas .sub-menu { + + .submenu-expand .svg-icon { + transform: rotate(270deg); + } + + .sub-menu { + opacity: 0; + position: absolute; + z-index: 0; + transform: translateX(-100%); + } + + li:hover, + li:focus, + li > a:hover, + li > a:focus { + background-color: transparent; + } + + > li > a, + > li > .menu-item-link-return { + white-space: inherit; + } + + &.expanded-true { + + display: table; + margin-top: 0; + opacity: 1; + padding-left: 0; + + /* Mobile position */ + left: 0; + top: 0; + right: 0; + bottom: 0; + position: fixed; + z-index: 100000; /* Make sure appears above mobile admin bar */ + width: 100vw; + height: 100vh; + max-width: 100vw; + transform: translateX(+100%); + animation: slide_in_right 0.3s forwards; + + > .mobile-parent-nav-menu-item { + display: block; + } + + /* Prevent menu from being blocked by admin bar */ + .admin-bar & { + top: 46px; + height: calc( 100vh - 46px ); + + .sub-menu.expanded-true { + top: 0; + } + + /* WP core breakpoint */ + @media only screen and ( min-width: 782px ) { + top: 32px; + height: calc( 100vh - 32px ); + + .sub-menu.expanded-true { + top: 0; + } + } + } + } + } + + // Hide duplicate menu-more-link when re-loading a menu in the customizer + .main-menu-more { + &:nth-child(n+3) { + display: none; + } + } + +} + +/* Menu animation */ + +@keyframes slide_in_right { + 100% { + transform: translateX(0%); + } +} + +@keyframes fade_in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/wp-content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss b/wp-content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss new file mode 100644 index 0000000..00724b5 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss @@ -0,0 +1,66 @@ +/* Social menu */ + +.social-navigation { + margin-top: calc(#{$size__spacing-unit} / 2 ); + text-align: left; + + ul.social-links-menu { + @include clearfix; + + display: inline-block; + margin: 0; + padding: 0; + + li { + display: inline-block; + vertical-align: bottom; + vertical-align: -webkit-baseline-middle; + list-style: none; + + &:nth-child(n+2) { + margin-left: 0.1em; + } + + a { + border-bottom: 1px solid transparent; + display: block; + color: $color__text-main; + margin-bottom: -1px; + transition: opacity $link_transition ease-in-out; + + &:hover, + &:active { + color: $color__text-main; + opacity: 0.6; + } + + &:focus { + color: $color__text-main; + opacity: 1; + border-bottom: 1px solid $color__text-main; + } + + svg { + display: block; + width: 32px; + height: 32px; + + // Prevent icons from jumping in Safari using hardware acceleration. + transform: translateZ(0); + + &#ui-icon-link { + transform: rotate(-45deg); + } + } + } + } + } +} + +.site-title + .social-navigation, +.site-description + .social-navigation { + + @include media(tablet) { + margin-top: calc(#{$size__spacing-unit} / 5 ); + } +} diff --git a/wp-content/themes/twentynineteen/sass/navigation/_navigation.scss b/wp-content/themes/twentynineteen/sass/navigation/_navigation.scss new file mode 100644 index 0000000..a4cf515 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/navigation/_navigation.scss @@ -0,0 +1,16 @@ +/*-------------------------------------------------------------- +## Links +--------------------------------------------------------------*/ +@import "links"; + +/*-------------------------------------------------------------- +## Menus +--------------------------------------------------------------*/ +@import "menu-main-navigation"; +@import "menu-social-navigation"; +@import "menu-footer-navigation"; + +/*-------------------------------------------------------------- +## Next / Previous +--------------------------------------------------------------*/ +@import "next-previous"; diff --git a/wp-content/themes/twentynineteen/sass/navigation/_next-previous.scss b/wp-content/themes/twentynineteen/sass/navigation/_next-previous.scss new file mode 100644 index 0000000..b2a4c1d --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/navigation/_next-previous.scss @@ -0,0 +1,201 @@ +/* Next/Previous navigation */ + +// Singular navigation +.post-navigation { + + margin: calc(3 * 1rem) 0; + + @include media(tablet) { + margin: calc(3 * 1rem) $size__site-margins; + max-width: calc(6 * (100vw / 12)); + } + + @include media(desktop) { + margin: calc(3 * 1rem) 0; + max-width: 100%; + } + + .nav-links { + + margin: 0 $size__spacing-unit; + max-width: 100%; + display: flex; + flex-direction: column; + + @include media(tablet) { + margin: 0; + } + + @include media(desktop) { + flex-direction: row; + margin: 0 $size__site-margins; + max-width: $size__site-desktop-content; + } + + a { + .meta-nav { + color: $color__text-light; + user-select: none; + + &:before, + &:after { + display: none; + content: "—"; + width: 2em; + color: $color__text-light; + height: 1em; + } + } + + .post-title { + hyphens: auto; + } + + &:hover { + color: $color__link-hover; + } + } + + .nav-previous, + .nav-next { + + @include media(desktop) { + min-width: calc(50% - 2 * #{$size__spacing-unit}); + } + } + + .nav-previous { + order: 2; + + @include media(desktop) { + order: 1; + } + + + .nav-next { + margin-bottom: $size__spacing-unit; + } + + .meta-nav { + &:before { + display: inline; + } + } + } + + .nav-next { + order: 1; + + @include media(desktop) { + order: 2; + padding-left: $size__spacing-unit; + } + + .meta-nav { + &:after { + display: inline; + } + } + } + } +} + +// Index/archive navigation +.pagination { + + .nav-links { + + display: flex; + flex-wrap: wrap; + padding: 0 calc(.5 * #{$size__spacing-unit}); + + + & > * { + padding: calc(.5 * #{$size__spacing-unit}); + + &.dots, + &.prev { + padding-left: 0; + } + + &.dots, + &.next { + padding-right: 0; + } + } + + a:focus { + text-decoration: underline; + outline-offset: -1px; + + &.prev, + &.next { + text-decoration: none; + + .nav-prev-text, + .nav-next-text { + text-decoration: underline; + } + } + } + + .nav-next-text, + .nav-prev-text { + display: none; + } + + @include media(tablet) { + + margin-left: $size__site-margins; + padding: 0; + + .prev, + .next { + + & > * { + display: inline-block; + vertical-align: text-bottom; + } + } + + & > * { + padding: $size__spacing-unit; + } + } + } +} + +// Comments navigation +.comment-navigation { + + .nav-links { + display: flex; + flex-direction: row; + } + + .nav-previous, + .nav-next { + min-width: 50%; + width: 100%; + @include font-family( $font__heading ); + font-weight: bold; + + .secondary-text { + display: none; + + @include media(tablet) { + display: inline; + } + } + + svg { + vertical-align: middle; + position: relative; + margin: 0 -0.35em; + top: -1px; + } + } + + .nav-next { + text-align: right; + } +} diff --git a/wp-content/themes/twentynineteen/sass/site/_site.scss b/wp-content/themes/twentynineteen/sass/site/_site.scss new file mode 100644 index 0000000..692244f --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/_site.scss @@ -0,0 +1,27 @@ + +/*-------------------------------------------------------------- +## Header +--------------------------------------------------------------*/ +@import "header/site-header"; +@import "header/site-featured-image"; + +/*-------------------------------------------------------------- +## Posts and pages +--------------------------------------------------------------*/ +@import "primary/posts-and-pages"; + +/*-------------------------------------------------------------- +## Comments +--------------------------------------------------------------*/ +@import "primary/comments"; + +/*-------------------------------------------------------------- +## Archives +--------------------------------------------------------------*/ +@import "primary/archives"; + +/*-------------------------------------------------------------- +## Footer +--------------------------------------------------------------*/ +@import "footer/site-footer"; + diff --git a/wp-content/themes/twentynineteen/sass/site/footer/_site-footer.scss b/wp-content/themes/twentynineteen/sass/site/footer/_site-footer.scss new file mode 100644 index 0000000..4e13794 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/footer/_site-footer.scss @@ -0,0 +1,53 @@ +/* Site footer */ + +#colophon { + + .widget-area, + .site-info { + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit; + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + } + + .widget-column { + display: flex; + flex-wrap: wrap; + .widget { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + width: 100%; + word-wrap: break-word; + @include media(desktop) { + margin-right: calc(3 * #{$size__spacing-unit}); + width: calc(50% - (3 * #{$size__spacing-unit})); + } + } + } + + .site-info { + color: $color__text-light; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-wrap: break-word; + + a { + color: inherit; + + &:hover { + text-decoration: none; + color: $color__link; + } + } + + .imprint, + .privacy-policy-link { + margin-right: $size__spacing-unit; + } + } +} \ No newline at end of file diff --git a/wp-content/themes/twentynineteen/sass/site/header/_site-featured-image.scss b/wp-content/themes/twentynineteen/sass/site/header/_site-featured-image.scss new file mode 100644 index 0000000..5e67aa2 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/header/_site-featured-image.scss @@ -0,0 +1,301 @@ +// Featured image styles + +.site-header.featured-image { + + /* Hide overflow for overflowing featured image */ + overflow: hidden; + + /* Need relative positioning to properly align layers. */ + position: relative; + + /* Add text shadow to text, to increase readability. */ + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + + /* Set white text color when featured image is set. */ + .site-branding .site-title, + .site-branding .site-description, + .main-navigation a:after, + .main-navigation .main-menu > li.menu-item-has-children:after, + .main-navigation li, + .social-navigation li, + .entry-meta, + .entry-title { + color: $color__background-body; + } + + .main-navigation a, + .main-navigation a + svg, + .social-navigation a, + .site-title a, + .site-featured-image a { + color: $color__background-body; + transition: opacity $link_transition ease-in-out; + + &:hover, + &:active, + &:hover + svg, + &:active + svg { + color: $color__background-body; + opacity: 0.6; + } + + &:focus, + &:focus + svg { + color: $color__background-body; + } + } + + .main-navigation .sub-menu a { + opacity: inherit; + } + + /* add focus state to social media icons */ + .social-navigation a { + &:focus { + color: $color__background-body; + opacity: 1; + border-bottom: 1px solid $color__background-body; + } + } + + .social-navigation svg, + .site-featured-image svg { + /* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */ + -webkit-filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35) ); + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35) ); + } + + /* Entry header */ + .site-featured-image { + + /* First layer: grayscale. */ + .post-thumbnail img { + height: auto; + left: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100vw; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: auto; + z-index: 1; + + @supports ( object-fit: cover ) { + height: 100%; + left: 0; + object-fit: cover; + top: 0; + transform: none; + width: 100%; + } + + /* When image filters are active, make it grayscale to colorize it blue. */ + .image-filters-enabled & { + filter: grayscale(100%); + } + } + + .entry-header { + + margin-top: calc( 4 * #{$size__spacing-unit}); + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + + @include media (tablet) { + + margin-left: $size__site-margins; + margin-right: $size__site-margins; + } + + .entry-title { + + &:before { + background: $color__background-body; + } + } + + /* Entry meta */ + + .entry-meta { + + font-weight: 500; + + > span { + + margin-right: $size__spacing-unit; + display: inline-block; + + &:last-child { + margin-right: 0; + } + } + + a { + + @include link-transition; + color: currentColor; + + &:hover { + text-decoration: none; + } + } + + .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; + } + + .discussion-avatar-list { + display: none; + } + } + + &.has-discussion { + + @include media (tablet) { + + .entry-meta { + display: flex; + position: relative; + } + + .entry-title { + padding-right: calc(1 * (100vw / 12) + #{$size__spacing-unit}); + } + + .entry-meta .comment-count { + position: absolute; + right: 0; + } + + .entry-meta .discussion-avatar-list { + display: block; + position: absolute; + bottom: 100%; + } + } + } + } + } + + /* Custom Logo Link */ + + .custom-logo-link { + + background: $color__background-body; + box-shadow: 0 0 0 0 rgba($color__background-body, 0); + + &:hover, + &:active, + &:focus { + box-shadow: 0 0 0 2px rgba($color__background-body, 1); + } + } + + /* Make sure important elements are above pseudo elements used for effects. */ + .site-branding { + position: relative; + z-index: 10; + } + + .site-featured-image .entry-header { + position: relative; + z-index: 9; + } + + /* Set up image filter layer positioning */ + .site-branding-container:after, + .site-featured-image:before, + .site-featured-image:after, + &:after { + display: block; + position: absolute; + top: 0; left: 0; + content: "\020"; + width: 100%; + height: 100%; + } + + /* Background & Effects */ + /* Shared background settings between pseudo elements. */ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + + /* The intensity of each blend mode is controlled via layer opacity. */ + + /* Second layer: screen. */ + .image-filters-enabled & .site-featured-image:before { + background: $color__link; + mix-blend-mode: screen; + opacity: 0.1; + } + + /* Third layer: multiply. */ + /* When image filters are inactive, a black overlay is added. */ + .site-featured-image:after { + background: #000; + mix-blend-mode: multiply; + opacity: .7; + + /* When image filters are active, a blue overlay is added. */ + .image-filters-enabled & { + background: $color__link; + opacity: .8; + z-index: 3; + + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ + @supports (mix-blend-mode: multiply) { + opacity: 1; + } + } + } + + /* Fourth layer: overlay. */ + .image-filters-enabled & .site-branding-container:after { + background: rgba(0, 0, 0, 0.35); + mix-blend-mode: overlay; + opacity: 0.5; + z-index: 4; + + /* Browsers supporting mix-blend-mode can have a light overlay */ + @supports (mix-blend-mode: overlay) { + background: rgba($color__background-body, 0.35); + } + } + + /* Fifth layer: readability overlay */ + &:after { + background: #000; + /** + * Add a transition to the readability overlay, to add a subtle + * but smooth effect when resizing the screen. + */ + transition: opacity 1200ms ease-in-out; + opacity: 0.7; + z-index: 5; + + /* When image filters are active, a blue overlay is added. */ + .image-filters-enabled & { + background: mix($color__link, black, 12%); + opacity: 0.38; + + @include media(tablet) { + opacity: 0.18; + } + } + } + + + ::-moz-selection { + background: rgba($color__background-body, 0.17); + } + + ::selection { + background: rgba($color__background-body, 0.17); + } +} diff --git a/wp-content/themes/twentynineteen/sass/site/header/_site-header.scss b/wp-content/themes/twentynineteen/sass/site/header/_site-header.scss new file mode 100644 index 0000000..3f723ba --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/header/_site-header.scss @@ -0,0 +1,139 @@ +// Site header + +.site-header { + padding: 1em; + + &.featured-image { + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 90vh; + + .site-branding-container { + margin-bottom: auto; + } + } + + @include media(tablet) { + margin: 0; + padding: 3rem 0; + + &.featured-image { + min-height: 100vh; + margin-bottom: 3rem; + } + } +} + +// Site branding + +.site-branding { + + color: $color__text-light; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + position: relative; + word-wrap: break-word; + + @include media(tablet) { + margin: 0 $size__site-margins; + } +} + +// Site logo + +.site-logo { + + position: relative; + z-index: 999; + margin-bottom: calc(.66 * #{$size__spacing-unit}); + + @include media(tablet) { + margin-bottom: 0; + position: absolute; + right: calc(100% + (1.25 * #{$size__spacing-unit})); + top: 4px; // Accounts for box-shadow widths + z-index: 999; + } + + .custom-logo-link { + border-radius: 100%; + box-sizing: content-box; + box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); + display: block; + width: 50px; + height: 50px; + overflow: hidden; + transition: box-shadow $background_transition ease-in-out; + + .custom-logo { + min-height: inherit; + } + + &:hover, + &:active, + &:focus { + box-shadow: 0 0 0 2px rgba(0, 0, 0, 1); + } + + @include media(tablet) { + width: 64px; + height: 64px; + } + } +} + +// Site title + +.site-title { + margin: auto; + display: inline; + color: $color__text-main; + + a { + color: $color__text-main; + + &:link, + &:visited { + color: $color__text-main; + } + + &:hover { + color: $color__text-hover; + } + } + + .featured-image & { + margin: 0; + + @include media(tablet) { + display: inline-block; + } + } + + /* When there is no description set, make sure navigation appears below title. */ + + .main-navigation { + display: block; + } + + @include media(tablet) { + display: inline; + } + + &:not(:empty) + .site-description:not(:empty):before { + content: "\2014"; + margin: 0 .2em; + } +} + +// Site description + +.site-description { + + display: inline; + color: $color__text-light; + font-weight: normal; + margin: 0; +} diff --git a/wp-content/themes/twentynineteen/sass/site/primary/_archives.scss b/wp-content/themes/twentynineteen/sass/site/primary/_archives.scss new file mode 100644 index 0000000..a3cb801 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/primary/_archives.scss @@ -0,0 +1,65 @@ +.archive .page-header, +.search .page-header, +.error404 .page-header { + + margin: $size__spacing-unit $size__spacing-unit calc(3 * #{$size__spacing-unit}); + + @include media(tablet) { + margin: 0 $size__site-margins calc(3 * #{$size__spacing-unit}); + } + + .page-title { + + color: $color__text-light; + display: inline; + letter-spacing: normal; + + &:before { + display: none; + } + } + + .search-term, + .page-description { + display: inherit; + clear: both; + } +} + +.archive .page-header .page-description, +.search .page-header .page-description { + display: block; + color: $color__text-main; + font-size: 1em; +} + +.hfeed .entry .entry-header { + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins calc(#{ $size__spacing-unit } / 2); + } +} + +/* 404 & Not found */ + +.error-404.not-found, +.no-results.not-found { + + .page-content { + + margin: calc(3 * #{$size__spacing-unit}) #{$size__spacing-unit}; + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins calc(#{ $size__spacing-unit } / 2); + } + } + + .search-submit { + vertical-align: middle; + margin: $size__spacing-unit 0; + } + + .search-field { + width: 100%; + } +} diff --git a/wp-content/themes/twentynineteen/sass/site/primary/_comments.scss b/wp-content/themes/twentynineteen/sass/site/primary/_comments.scss new file mode 100644 index 0000000..ec9fb12 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/primary/_comments.scss @@ -0,0 +1,405 @@ +.comment-content a { + word-wrap: break-word; +} + +.bypostauthor { + display: block; +} + +.comments-area { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit; + word-wrap: break-word; + @include postContentMaxWidth(); + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + + & > * { + margin-top: calc(2 * #{$size__spacing-unit}); + margin-bottom: calc(2 * #{$size__spacing-unit}); + + @include media(tablet) { + margin-top: calc(3 * #{$size__spacing-unit}); + margin-bottom: calc(3 * #{$size__spacing-unit}); + } + } + + /* Add extra margin when the comments section is located immediately after the + * post itself (this happens on pages). + */ + .entry + & { + margin-top: calc(3 * #{$size__spacing-unit}); + } + + .comments-title-wrap { + + @include media(tablet) { + align-items: baseline; + display: flex; + justify-content: space-between; + } + + .comments-title { + @include post-section-dash; + margin: 0; + + @include media(tablet) { + flex: 1 0 calc(3 * (100vw / 12)); + } + } + + .discussion-meta { + @include media(tablet) { + flex: 0 0 calc(2 * (100vw / 12)); + margin-left: #{$size__spacing-unit}; + } + } + } +} + +#comment { + max-width: 100%; + box-sizing: border-box; +} + +#respond { + position: relative; + + .comment-user-avatar { + margin: $size__spacing-unit 0 -#{$size__spacing-unit}; + } + + .comment .comment-form { + padding-left: 0; + } + + > small { + display: block; + font-size: $font__size_base; + position: absolute; + left: calc(#{$size__spacing-unit} + 100%); + top: calc(-3.5 * #{$size__spacing-unit}); + width: calc(100vw / 12 ); + } +} + +#comments { + + > .comments-title:last-child { + display: none; + } +} + +.comment-form-flex { + display: flex; + flex-direction: column; + + .comments-title { + display: none; + margin: 0; + order: 1; + } + + #respond { + order: 2; + + + .comments-title { + display: block; + } + } +} + +.comment-list { + list-style: none; + padding: 0; + + .children { + margin: 0; + padding: 0 0 0 $size__spacing-unit; + } + + > .comment:first-child { + margin-top: 0; + } + + .pingback, + .trackback { + + .comment-body { + color: $color__text-light; + @include font-family( $font__heading ); + font-size: $font__size-xs; + font-weight: 500; + margin-top: $size__spacing-unit; + margin-bottom: $size__spacing-unit; + + a:not(.comment-edit-link) { + font-weight: bold; + font-size: $font__size-base / (1 * $font__size-ratio); + line-height: 1.5; + padding-right: #{0.5 * $size__spacing-unit}; + display: block; + } + + .comment-edit-link { + color: $color__text-light; + @include font-family( $font__heading ); + font-weight: 500; + } + } + } +} + +.comment-reply { + + #respond + & { + display: none; + } + + .comment-reply-link { + display: inline-block; + } +} + +.comment { + list-style: none; + position: relative; + + @include media(tablet) { + padding-left: calc(.5 * (#{$size__spacing-unit} + calc(100vw / 12 ))); + + &.depth-1, + .children { + padding-left: 0; + } + + &.depth-1 { + margin-left: calc(3.25 * #{$size__spacing-unit}); + } + } + + .comment-body { + margin: calc(2 * #{$size__spacing-unit}) 0 0; + } + + + .comment-meta { + position: relative; + } + + .comment-author { + + .avatar { + float: left; + margin-right: $size__spacing-unit; + position: relative; + + @include media(tablet) { + float: inherit; + margin-right: inherit; + position: absolute; + top: 0; + right: calc(100% + #{$size__spacing-unit}); + } + } + + .fn { + position: relative; + display: block; + + a { + color: inherit; + + &:hover { + color: $color__link-hover; + } + } + } + + .post-author-badge { + border-radius: 100%; + display: block; + height: 18px; + position: absolute; + background: lighten( $color__link, 8% ); + right: calc(100% - #{$size__spacing-unit * 2.5}); + top: -3px; + width: 18px; + + @include media(tablet) { + right: calc(100% + #{$size__spacing-unit * .75}); + } + + svg { + width: inherit; + height: inherit; + display: block; + fill: white; + transform: scale(0.875); + } + } + } + + .comment-metadata { + + > a, + .comment-edit-link { + display: inline; + font-weight: 500; + color: $color__text-light; + vertical-align: baseline; + + time { + vertical-align: baseline; + } + + &:hover { + color: $color__link-hover; + text-decoration: none; + } + } + + > * { + display: inline-block; + } + + .edit-link-sep { + color: $color__text-light; + margin: 0 0.2em; + vertical-align: baseline; + } + + .edit-link { + color: $color__text-light; + + svg { + transform: scale(0.8); + vertical-align: baseline; + margin-right: 0.1em; + } + } + + .comment-edit-link { + position: relative; + padding-left: $size__spacing-unit; + margin-left: -#{$size__spacing-unit}; + z-index: 1; + + &:hover { + color: $color__link; + } + } + } + + .comment-content { + + margin: $size__spacing-unit 0; + + @include media(desktop) { + padding-right: $size__spacing-unit; + } + + > *:first-child { + margin-top: 0; + } + + > *:last-child { + margin-bottom: 0; + } + + blockquote { + margin-left: 0; + } + + a { + text-decoration: underline; + + &:hover { + text-decoration: none; + } + } + } +} + +.comment-reply-link, +#cancel-comment-reply-link { + font-weight: 500; + + &:hover { + color: $color__link-hover; + } +} + +.discussion-avatar-list { + @include clearfix; + + margin: 0; + padding: 0; + + li { + position: relative; + list-style: none; + margin: 0 -8px 0 0; + padding: 0; + float: left; + } + + .comment-user-avatar { + + img { + height: calc(1.5 * #{$size__spacing-unit}); + width: calc(1.5 * #{$size__spacing-unit}); + } + } +} + +.discussion-meta { + + .discussion-meta-info { + margin: 0; + + .svg-icon { + vertical-align: middle; + fill: currentColor; + transform: scale( 0.6 ) scaleX(-1) translateY(-0.1em); + margin-left: -#{.25 * $size__spacing-unit}; // Align icon with avatars above. + } + } + +} + +.comment-form { + + .comment-notes, + label { + @include font-family( $font__heading ); + font-size: $font__size-xs; + color: $color__text-light; + } + + .comment-form-author, + .comment-form-email { + @include media(tablet) { + width: calc(50% - #{$size__spacing-unit / 2}); + float: left; + } + } + + .comment-form-email { + @include media(tablet) { + margin-left: $size__spacing-unit; + } + } + + input[name="author"], + input[name="email"], + input[name="url"] { + display: block; + width: 100%; + } +} diff --git a/wp-content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss b/wp-content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss new file mode 100644 index 0000000..ce1c6f2 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss @@ -0,0 +1,304 @@ +.sticky { + display: block; +} + +.sticky-post { + background: $color__background-button; + color: #fff; + display: inline-block; + font-weight: bold; + line-height: 1; + padding: .25rem; + position: absolute; + text-transform: uppercase; + top: -$size__spacing-unit; + z-index: 1; +} + +.updated:not(.published) { + display: none; +} + +.page-links { + clear: both; + margin: 0 0 calc(1.5 * #{$size__spacing-unit}); +} + +.entry { + + margin-top: calc(6 * #{$size__spacing-unit}); + + &:first-of-type { + margin-top: 0; + } + + .entry-header { + + margin: calc(3 * #{ $size__spacing-unit}) $size__spacing-unit $size__spacing-unit; + position: relative; + + @include media(tablet) { + margin: calc(3 * #{ $size__spacing-unit}) $size__site-margins $size__spacing-unit; + } + } + + .entry-title { + + @include post-section-dash; + margin: 0; + + a { + color: inherit; + + &:hover { + color: $color__text-hover; + } + } + } + + .entry-meta, + .entry-footer { + + color: $color__text-light; + font-weight: 500; + + > span { + + margin-right: $size__spacing-unit; + display: inline-block; + + &:last-child { + margin-right: 0; + } + } + + a { + + @include link-transition; + color: currentColor; + + &:hover { + text-decoration: none; + color: $color__link; + } + } + + .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; + } + } + + .entry-meta { + margin: $size__spacing-unit 0; + } + + .entry-footer { + + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit $size__spacing-unit; + + @include media(tablet) { + margin: $size__spacing-unit $size__site-margins calc(3 * #{$size__spacing-unit}); + max-width: $size__site-tablet-content; + } + + @include media(tablet) { + max-width: $size__site-desktop-content; + } + } + + .post-thumbnail { + + margin: $size__spacing-unit; + + @include media(tablet) { + margin: $size__spacing-unit $size__site-margins; + } + + &:focus { + outline: none; + } + + .post-thumbnail-inner { + display: block; + + img { + position: relative; + display: block; + width: 100%; + } + } + } + + .image-filters-enabled & { + + .post-thumbnail { + position: relative; + display: block; + + .post-thumbnail-inner { + filter: grayscale(100%); + + &:after { + background: rgba(0, 0, 0, 0.35); + content: ""; + display: block; + height: 100%; + opacity: .5; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; + z-index: 4; + + @supports (mix-blend-mode: multiply) { + display: none; + } + } + } + + &:before, + &:after { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; left: 0; + content: "\020"; + pointer-events: none; + } + + @include filter-duotone; + + } + } + + .entry-content, + .entry-summary { + max-width: calc(100% - (2 * #{ $size__spacing-unit })); + margin: 0 $size__spacing-unit; + + @include media(tablet) { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } + } + + .entry-content { + + p { + word-wrap: break-word; + } + + .more-link { + @include link-transition; + display: inline; + color: inherit; + + &:after { + content: "\02192"; + display: inline-block; + margin-left: 0.5em; + } + + &:hover { + color: $color__link; + text-decoration: none; + } + } + + a { + text-decoration: underline; + + &.button, + &:hover { + text-decoration: none; + } + + &.button { + display: inline-block; + } + + &.button:hover { + background: $color__background-button-hover; + color: $color__background-body; + cursor: pointer; + } + } + + // Overwrite iframe embeds that have inline styles. + > iframe[style] { + + margin: 32px 0 !important; + max-width: 100% !important; + + @include media(tablet) { + max-width: $size__site-tablet-content !important; + } + + @include media(desktop) { + max-width: $size__site-desktop-content !important; + } + } + + // Page links + .page-links a { + margin: calc(0.5 * #{$size__spacing-unit}); + text-decoration: none; + } + + // Classic editor audio embeds. + .wp-audio-shortcode { + max-width: calc(100vw - (2 * #{ $size__spacing-unit })); + + @include media(tablet) { + max-width: $size__site-tablet-content; + } + + @include media(desktop) { + max-width: $size__site-desktop-content; + } + } + } +} + +/* Author description */ + +.author-bio { + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit $size__spacing-unit; + + @include postContentMaxWidth(); + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + + @include media(desktop) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + + .author-title { + @include post-section-dash; + display: inline; + } + + .author-description { + + display: inline; + color: $color__text-light; + font-size: $font__size-md; + line-height: $font__line-height-heading; + + .author-link { + display: inline-block; + + &:hover { + color: $color__link-hover; + text-decoration: none; + } + } + } +} diff --git a/wp-content/themes/twentynineteen/sass/site/secondary/_widgets.scss b/wp-content/themes/twentynineteen/sass/site/secondary/_widgets.scss new file mode 100644 index 0000000..7ade14c --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/site/secondary/_widgets.scss @@ -0,0 +1,102 @@ +.widget { + margin: 0 0 #{$size__spacing-unit}; + + /* Make sure select elements fit in widgets. */ + select { + max-width: 100%; + } + + a { + color: $color__link; + + &:hover { + color: $color__link-hover; + } + } +} + +.widget_archive, +.widget_categories, +.widget_meta, +.widget_nav_menu, +.widget_pages, +.widget_recent_comments, +.widget_recent_entries, +.widget_rss { + + ul { + padding: 0; + list-style: none; + + li { + color: $color__text-light; + @include font-family( $font__heading ); + font-size: calc(#{$font__size_base} * #{$font__size-ratio}); + font-weight: 700; + line-height: $font__line-height-heading; + margin-top: #{0.5 * $size__spacing-unit}; + margin-bottom: #{0.5 * $size__spacing-unit}; + } + + @include nestedSubMenuPadding(); + } +} + +.widget_tag_cloud { + + .tagcloud { + @include font-family( $font__heading ); + font-weight: 700; + } +} + + +.widget_search { + + .search-field { + width: 100%; + + @include media(mobile) { + width: auto; + } + } + + .search-submit { + display: block; + margin-top: $size__spacing-unit; + } +} + +.widget_calendar .calendar_wrap { + text-align: center; + + table td, + table th { + border: none; + } + + a { + text-decoration: underline; + } + + .wp-calendar-table { + margin-bottom: 0; + } + + .wp-calendar-nav { + margin: 0 0 $size__spacing-unit; + display: table; + width: 100%; + @include font-family( $font__heading ); + + span { + display: table-cell; + padding: 0.5em; + } + } + + .wp-calendar-nav-prev, + .wp-calendar-nav-next { + width: 40%; + } +} \ No newline at end of file diff --git a/wp-content/themes/twentynineteen/sass/typography/_copy.scss b/wp-content/themes/twentynineteen/sass/typography/_copy.scss new file mode 100644 index 0000000..bfbd0fe --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/typography/_copy.scss @@ -0,0 +1,62 @@ +p { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + + cite { + font-size: $font__size-xs; + font-style: normal; + @include font-family( $font__heading ); + } +} + +pre { + font-size: $font__size-sm; + font-family: $font__pre; + line-height: $font__line-height-body; + overflow: auto; +} + +code, +kbd, +tt, +var { + font-size: $font__size-sm; + font-family: $font__code; +} + +abbr, acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +a { + text-decoration: none; + + &:hover { + text-decoration: none; + } + + &:focus { + text-decoration: underline; + } +} diff --git a/wp-content/themes/twentynineteen/sass/typography/_headings.scss b/wp-content/themes/twentynineteen/sass/typography/_headings.scss new file mode 100644 index 0000000..21ea2e4 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/typography/_headings.scss @@ -0,0 +1,164 @@ +.author-description .author-link, +.comment-metadata, +.comment-reply-link, +.comments-title, +.comment-author .fn, +.discussion-meta-info, +.entry-meta, +.entry-footer, +.main-navigation, +.no-comments, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.page-links, +.page-description, +.pagination .nav-links, +.sticky-post, +.site-title, +.site-info, +#cancel-comment-reply-link, +h1, +h2, +h3, +h4, +h5, +h6 { + @include font-family( $font__heading ); +} + +.main-navigation, +.page-description, +.author-description .author-link, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.pagination .nav-links, +.comments-title, +.comment-author .fn, +.no-comments, +.site-title, +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 700; + letter-spacing: -0.02em; + line-height: $font__line-height-heading; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.page-title { + @include font-family( $font__body ); +} + +.site-branding, +.main-navigation ul.main-menu > li, +.social-navigation, +.author-description .author-bio, +.nav-links { + line-height: 1.25; +} + +h1 { + font-size: $font__size-xl; + + @include media(tablet) { + font-size: $font__size-xxl; + } +} + +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.has-larger-font-size, +h2 { + font-size: $font__size-lg; + + @include media(tablet) { + font-size: $font__size-xl; + } +} + +.has-regular-font-size, +.has-large-font-size, +.comments-title, +h3 { + font-size: $font__size-lg; +} + +.site-title, +.site-description, +.main-navigation, +.nav-links, +.page-title, +.page-description, +.comment-author .fn, +.no-comments, +h2.author-title, +p.author-bio, +h4 { + font-size: $font__size-md; +} + +.pagination .nav-links, +.comment-content, +h5 { + font-size: $font__size-sm; +} + +.entry-meta, +.entry-footer, +.discussion-meta-info, +.site-info, +.has-small-font-size, +.comment-reply-link, +.comment-metadata, +.comment-notes, +.sticky-post, +#cancel-comment-reply-link, +img:after, +h6 { + font-size: $font__size-xs; +} + +.site-title, +.page-title { + font-weight: normal; +} + +.page-description, +.page-links a { + font-weight: bold; +} + +.site-description { + letter-spacing: -0.01em; +} + +.post-navigation .post-title, +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.comments-title, +blockquote { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; + word-wrap: break-word; +} + +/* Do not hyphenate entry title on tablet view and bigger. */ +.entry-title { + @include media(tablet) { + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + } +} diff --git a/wp-content/themes/twentynineteen/sass/typography/_typography.scss b/wp-content/themes/twentynineteen/sass/typography/_typography.scss new file mode 100644 index 0000000..055b7a6 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/typography/_typography.scss @@ -0,0 +1,32 @@ + +html { + font-size: $font__size_base; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: $color__text-main; + @include font-family( $font__body ); + font-weight: 400; + font-size: 1em; + line-height: $font__line-height-body; + margin: 0; + text-rendering: optimizeLegibility; +} + +button, +input, +select, +optgroup, +textarea { + color: $color__text-main; + @include font-family( $font__body ); + font-weight: 400; + line-height: $font__line-height-body; + text-rendering: optimizeLegibility; +} + +@import "headings"; + +@import "copy"; diff --git a/wp-content/themes/twentynineteen/sass/variables-site/_colors.scss b/wp-content/themes/twentynineteen/sass/variables-site/_colors.scss new file mode 100644 index 0000000..989daa0 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/variables-site/_colors.scss @@ -0,0 +1,34 @@ + +// Backgrounds +$color__background-body: #fff; +$color__background-input: #fff; +$color__background-screen: #f1f1f1; +$color__background-hr: #ccc; +$color__background-button: #0073aa; +$color__background-button-hover: #111; +$color__background-pre: #eee; +$color__background-ins: #fff9c0; +$color__background_selection: mix( $color__background-body, $color__background-button, 75% ); // lighten( salmon, 22.5% ); // lighten( #0999d4, 48% ); + +// Text +$color__text-main: #111; +$color__text-light: #767676; +$color__text-hover: lighten( #111, 22.5% ); +$color__text-screen: #21759b; +$color__text-input: #666; +$color__text-input-focus: #111; + +// Links +$color__link: #0073aa; +$color__link-visited: #0073aa; +$color__link-hover: darken( $color__link, 10% ); + +// Borders +$color__border: #ccc; +$color__border-link: #0073aa; +$color__border-link-hover: darken( $color__link, 10% ); +$color__border-button: #ccc #ccc #bbb; +$color__border-button-hover: #ccc #bbb #aaa; +$color__border-button-focus: #aaa #bbb #bbb; +$color__border-input: $color__border; +$color__border-abbr: #666; diff --git a/wp-content/themes/twentynineteen/sass/variables-site/_columns.scss b/wp-content/themes/twentynineteen/sass/variables-site/_columns.scss new file mode 100644 index 0000000..6bd29bc --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/variables-site/_columns.scss @@ -0,0 +1,16 @@ +$columns: ( + 1: calc(1 * (100vw / 12)), + 2: calc(2 * (100vw / 12)), + 3: calc(3 * (100vw / 12)), + 4: calc(4 * (100vw / 12)), + 5: calc(5 * (100vw / 12)), + 6: calc(6 * (100vw / 12)), + 7: calc(7 * (100vw / 12)), + 8: calc(8 * (100vw / 12)), + 9: calc(9 * (100vw / 12)), + 10: calc(10 * (100vw / 12)), + 11: calc(11 * (100vw / 12)), + 12: calc(12 * (100vw / 12)) +); + +$columns__margin: $size__spacing-unit; diff --git a/wp-content/themes/twentynineteen/sass/variables-site/_fonts.scss b/wp-content/themes/twentynineteen/sass/variables-site/_fonts.scss new file mode 100644 index 0000000..59ab20b --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/variables-site/_fonts.scss @@ -0,0 +1,83 @@ +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually inserting + * a custom font that includes just a Hoefler Text space replacement for that + * character instead. + */ +@font-face { + font-family: 'NonBreakingSpaceOverride'; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format('woff2'), + url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format('woff'); + +} + +// Font and typographic variables + +$font__body: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; +$font__heading: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +$font__fallbacks: ( + /* Arabic */ + ar: 'Tahoma, Arial, sans-serif', + ary: 'Tahoma, Arial, sans-serif', + azb: 'Tahoma, Arial, sans-serif', + ckb: 'Tahoma, Arial, sans-serif', + fa-IR: 'Tahoma, Arial, sans-serif', + haz: 'Tahoma, Arial, sans-serif', + ps: 'Tahoma, Arial, sans-serif', + /* Cyrillic */ + be: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + bg-BG: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + kk: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + mk-MK: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + mn: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + ru-RU: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + sah: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + sr-RS: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + tt-RU: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + uk: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + /* Chinese (Hong Kong) */ + zh-HK: '-apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif', + /* Chinese (Taiwan) */ + zh-TW: '-apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif', + /* Chinese (China) */ + zh-CN: '-apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif', + /* Devanagari */ + bn-BD: 'Arial, sans-serif', + hi-IN: 'Arial, sans-serif', + mr: 'Arial, sans-serif', + ne-NP: 'Arial, sans-serif', + /* Greek */ + el: '"Helvetica Neue", Helvetica, Arial, sans-serif', + /* Gujarati */ + gu: 'Arial, sans-serif', + /* Hebrew */ + he-IL: '"Arial Hebrew", Arial, sans-serif', + /* Japanese */ + ja: '-apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif', + /* Korean */ + ko-KR: '"Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif', + /* Thai */ + th: '"Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif', + /* Vietnamese */ + vi: '"Libre Franklin", sans-serif', +); +$font__code: Menlo, monaco, Consolas, Lucida Console, monospace; +$font__pre: "Courier 10 Pitch", Courier, monospace; + +$font__size_base: 22px; +$font__size-ratio: 1.125; + +$font__size-xxs: 1em / (1.5 * $font__size-ratio); +$font__size-xs: 1em / (1.25 * $font__size-ratio); +$font__size-sm: 1em / (1 * $font__size-ratio); +$font__size-md: 1em * (1 * $font__size-ratio); +$font__size-lg: 1em * (1.5 * $font__size-ratio); +$font__size-xl: 1em * (2 * $font__size-ratio); +$font__size-xxl: 1em * (2.5 * $font__size-ratio); +$font__size-xxxl: 1em * (3 * $font__size-ratio); + +$font__line-height-body: 1.8; +$font__line-height-pre: 1.6; +$font__line-height-heading: 1.2; +$font__line-height-double: 2 * $font__line-height-heading; \ No newline at end of file diff --git a/wp-content/themes/twentynineteen/sass/variables-site/_structure.scss b/wp-content/themes/twentynineteen/sass/variables-site/_structure.scss new file mode 100644 index 0000000..dc62145 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/variables-site/_structure.scss @@ -0,0 +1,16 @@ +// Responsive widths. + +$size__spacing-unit: 1rem; +$size__site-main: 100%; +$size__site-sidebar: 25%; +$size__site-margins: calc(10% + 60px); +$size__site-tablet-content: calc(8 * (100vw / 12) - 28px); +$size__site-desktop-content: calc(6 * (100vw / 12) - 28px); + +// Responsive widths. + +$mobile_width: 600px; +$tablet_width: 768px; +$desktop_width: 1168px; +$wide_width: 1379px; + diff --git a/wp-content/themes/twentynineteen/sass/variables-site/_transitions.scss b/wp-content/themes/twentynineteen/sass/variables-site/_transitions.scss new file mode 100644 index 0000000..f0eebbd --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/variables-site/_transitions.scss @@ -0,0 +1,6 @@ +// Transition timeouts. + +$link_transition: 110ms; +$icon_transition: 120ms; +$button_transition: 150ms; +$background_transition: 200ms; \ No newline at end of file diff --git a/wp-content/themes/twentynineteen/sass/variables-site/_variables-site.scss b/wp-content/themes/twentynineteen/sass/variables-site/_variables-site.scss new file mode 100644 index 0000000..9d527f9 --- /dev/null +++ b/wp-content/themes/twentynineteen/sass/variables-site/_variables-site.scss @@ -0,0 +1,5 @@ +@import "colors"; +@import "fonts"; +@import "structure"; +@import "columns"; +@import "transitions"; diff --git a/wp-content/themes/twentynineteen/screenshot.png b/wp-content/themes/twentynineteen/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc53c5f1dd491737726a367be64577af426a106 GIT binary patch literal 175535 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 literal 0 HcmV?d00001 diff --git a/wp-content/themes/twentynineteen/search.php b/wp-content/themes/twentynineteen/search.php new file mode 100644 index 0000000..6c8f0e1 --- /dev/null +++ b/wp-content/themes/twentynineteen/search.php @@ -0,0 +1,56 @@ + + +
            +
            + + + + + + +
            +
            + + + +
            +
            + + sprintf( __( 'Published in%s', 'twentynineteen' ), '%title' ), + ) + ); + } elseif ( is_singular( 'post' ) ) { + // Previous/next post navigation. + the_post_navigation( + array( + 'next_text' => ' ' . + '' . __( 'Next post:', 'twentynineteen' ) . '
            ' . + '%title', + 'prev_text' => ' ' . + '' . __( 'Previous post:', 'twentynineteen' ) . '
            ' . + '%title', + ) + ); + } + + // If comments are open or we have at least one comment, load up the comment template. + if ( comments_open() || get_comments_number() ) { + comments_template(); + } + + endwhile; // End the loop. + ?> + +
            +
            + + a:lang(ar), +.wp-block-categories li > a:lang(ar), +.wp-block-latest-posts li > a:lang(ar), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ar), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ar), .wp-caption dd:lang(ar), .wp-block-freeform blockquote cite:lang(ar) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ary), h1:lang(ary), +h2:lang(ary), +h3:lang(ary), +h4:lang(ary), +h5:lang(ary), +h6:lang(ary), figcaption:lang(ary), +.gallery-caption:lang(ary), .editor-post-title__block .editor-post-title__input:lang(ary), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ary), .wp-block-paragraph.has-drop-cap:lang(ary):not(:focus)::first-letter, .wp-block-table:lang(ary), .wp-block-cover h2:lang(ary), +.wp-block-cover .wp-block-cover-text:lang(ary), .wp-block-button .wp-block-button__link:lang(ary), .wp-block-quote cite:lang(ary), +.wp-block-quote footer:lang(ary), +.wp-block-quote .wp-block-quote__citation:lang(ary), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ary), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ary), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ary), .wp-block-file:lang(ary), ul.wp-block-archives li > a:lang(ary), +.wp-block-categories li > a:lang(ary), +.wp-block-latest-posts li > a:lang(ary), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ary), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ary), .wp-caption dd:lang(ary), .wp-block-freeform blockquote cite:lang(ary) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(azb), h1:lang(azb), +h2:lang(azb), +h3:lang(azb), +h4:lang(azb), +h5:lang(azb), +h6:lang(azb), figcaption:lang(azb), +.gallery-caption:lang(azb), .editor-post-title__block .editor-post-title__input:lang(azb), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(azb), .wp-block-paragraph.has-drop-cap:lang(azb):not(:focus)::first-letter, .wp-block-table:lang(azb), .wp-block-cover h2:lang(azb), +.wp-block-cover .wp-block-cover-text:lang(azb), .wp-block-button .wp-block-button__link:lang(azb), .wp-block-quote cite:lang(azb), +.wp-block-quote footer:lang(azb), +.wp-block-quote .wp-block-quote__citation:lang(azb), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(azb), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(azb), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(azb), .wp-block-file:lang(azb), ul.wp-block-archives li > a:lang(azb), +.wp-block-categories li > a:lang(azb), +.wp-block-latest-posts li > a:lang(azb), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(azb), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(azb), .wp-caption dd:lang(azb), .wp-block-freeform blockquote cite:lang(azb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ckb), h1:lang(ckb), +h2:lang(ckb), +h3:lang(ckb), +h4:lang(ckb), +h5:lang(ckb), +h6:lang(ckb), figcaption:lang(ckb), +.gallery-caption:lang(ckb), .editor-post-title__block .editor-post-title__input:lang(ckb), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ckb), .wp-block-paragraph.has-drop-cap:lang(ckb):not(:focus)::first-letter, .wp-block-table:lang(ckb), .wp-block-cover h2:lang(ckb), +.wp-block-cover .wp-block-cover-text:lang(ckb), .wp-block-button .wp-block-button__link:lang(ckb), .wp-block-quote cite:lang(ckb), +.wp-block-quote footer:lang(ckb), +.wp-block-quote .wp-block-quote__citation:lang(ckb), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ckb), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ckb), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ckb), .wp-block-file:lang(ckb), ul.wp-block-archives li > a:lang(ckb), +.wp-block-categories li > a:lang(ckb), +.wp-block-latest-posts li > a:lang(ckb), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ckb), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ckb), .wp-caption dd:lang(ckb), .wp-block-freeform blockquote cite:lang(ckb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(fa-IR), h1:lang(fa-IR), +h2:lang(fa-IR), +h3:lang(fa-IR), +h4:lang(fa-IR), +h5:lang(fa-IR), +h6:lang(fa-IR), figcaption:lang(fa-IR), +.gallery-caption:lang(fa-IR), .editor-post-title__block .editor-post-title__input:lang(fa-IR), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(fa-IR), .wp-block-paragraph.has-drop-cap:lang(fa-IR):not(:focus)::first-letter, .wp-block-table:lang(fa-IR), .wp-block-cover h2:lang(fa-IR), +.wp-block-cover .wp-block-cover-text:lang(fa-IR), .wp-block-button .wp-block-button__link:lang(fa-IR), .wp-block-quote cite:lang(fa-IR), +.wp-block-quote footer:lang(fa-IR), +.wp-block-quote .wp-block-quote__citation:lang(fa-IR), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(fa-IR), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(fa-IR), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(fa-IR), .wp-block-file:lang(fa-IR), ul.wp-block-archives li > a:lang(fa-IR), +.wp-block-categories li > a:lang(fa-IR), +.wp-block-latest-posts li > a:lang(fa-IR), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(fa-IR), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(fa-IR), .wp-caption dd:lang(fa-IR), .wp-block-freeform blockquote cite:lang(fa-IR) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(haz), h1:lang(haz), +h2:lang(haz), +h3:lang(haz), +h4:lang(haz), +h5:lang(haz), +h6:lang(haz), figcaption:lang(haz), +.gallery-caption:lang(haz), .editor-post-title__block .editor-post-title__input:lang(haz), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(haz), .wp-block-paragraph.has-drop-cap:lang(haz):not(:focus)::first-letter, .wp-block-table:lang(haz), .wp-block-cover h2:lang(haz), +.wp-block-cover .wp-block-cover-text:lang(haz), .wp-block-button .wp-block-button__link:lang(haz), .wp-block-quote cite:lang(haz), +.wp-block-quote footer:lang(haz), +.wp-block-quote .wp-block-quote__citation:lang(haz), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(haz), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(haz), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(haz), .wp-block-file:lang(haz), ul.wp-block-archives li > a:lang(haz), +.wp-block-categories li > a:lang(haz), +.wp-block-latest-posts li > a:lang(haz), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(haz), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(haz), .wp-caption dd:lang(haz), .wp-block-freeform blockquote cite:lang(haz) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ps), h1:lang(ps), +h2:lang(ps), +h3:lang(ps), +h4:lang(ps), +h5:lang(ps), +h6:lang(ps), figcaption:lang(ps), +.gallery-caption:lang(ps), .editor-post-title__block .editor-post-title__input:lang(ps), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ps), .wp-block-paragraph.has-drop-cap:lang(ps):not(:focus)::first-letter, .wp-block-table:lang(ps), .wp-block-cover h2:lang(ps), +.wp-block-cover .wp-block-cover-text:lang(ps), .wp-block-button .wp-block-button__link:lang(ps), .wp-block-quote cite:lang(ps), +.wp-block-quote footer:lang(ps), +.wp-block-quote .wp-block-quote__citation:lang(ps), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ps), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ps), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ps), .wp-block-file:lang(ps), ul.wp-block-archives li > a:lang(ps), +.wp-block-categories li > a:lang(ps), +.wp-block-latest-posts li > a:lang(ps), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ps), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ps), .wp-caption dd:lang(ps), .wp-block-freeform blockquote cite:lang(ps) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(be), h1:lang(be), +h2:lang(be), +h3:lang(be), +h4:lang(be), +h5:lang(be), +h6:lang(be), figcaption:lang(be), +.gallery-caption:lang(be), .editor-post-title__block .editor-post-title__input:lang(be), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(be), .wp-block-paragraph.has-drop-cap:lang(be):not(:focus)::first-letter, .wp-block-table:lang(be), .wp-block-cover h2:lang(be), +.wp-block-cover .wp-block-cover-text:lang(be), .wp-block-button .wp-block-button__link:lang(be), .wp-block-quote cite:lang(be), +.wp-block-quote footer:lang(be), +.wp-block-quote .wp-block-quote__citation:lang(be), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(be), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(be), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(be), .wp-block-file:lang(be), ul.wp-block-archives li > a:lang(be), +.wp-block-categories li > a:lang(be), +.wp-block-latest-posts li > a:lang(be), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(be), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(be), .wp-caption dd:lang(be), .wp-block-freeform blockquote cite:lang(be) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(bg-BG), h1:lang(bg-BG), +h2:lang(bg-BG), +h3:lang(bg-BG), +h4:lang(bg-BG), +h5:lang(bg-BG), +h6:lang(bg-BG), figcaption:lang(bg-BG), +.gallery-caption:lang(bg-BG), .editor-post-title__block .editor-post-title__input:lang(bg-BG), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(bg-BG), .wp-block-paragraph.has-drop-cap:lang(bg-BG):not(:focus)::first-letter, .wp-block-table:lang(bg-BG), .wp-block-cover h2:lang(bg-BG), +.wp-block-cover .wp-block-cover-text:lang(bg-BG), .wp-block-button .wp-block-button__link:lang(bg-BG), .wp-block-quote cite:lang(bg-BG), +.wp-block-quote footer:lang(bg-BG), +.wp-block-quote .wp-block-quote__citation:lang(bg-BG), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(bg-BG), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(bg-BG), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(bg-BG), .wp-block-file:lang(bg-BG), ul.wp-block-archives li > a:lang(bg-BG), +.wp-block-categories li > a:lang(bg-BG), +.wp-block-latest-posts li > a:lang(bg-BG), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bg-BG), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bg-BG), .wp-caption dd:lang(bg-BG), .wp-block-freeform blockquote cite:lang(bg-BG) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(kk), h1:lang(kk), +h2:lang(kk), +h3:lang(kk), +h4:lang(kk), +h5:lang(kk), +h6:lang(kk), figcaption:lang(kk), +.gallery-caption:lang(kk), .editor-post-title__block .editor-post-title__input:lang(kk), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(kk), .wp-block-paragraph.has-drop-cap:lang(kk):not(:focus)::first-letter, .wp-block-table:lang(kk), .wp-block-cover h2:lang(kk), +.wp-block-cover .wp-block-cover-text:lang(kk), .wp-block-button .wp-block-button__link:lang(kk), .wp-block-quote cite:lang(kk), +.wp-block-quote footer:lang(kk), +.wp-block-quote .wp-block-quote__citation:lang(kk), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(kk), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(kk), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(kk), .wp-block-file:lang(kk), ul.wp-block-archives li > a:lang(kk), +.wp-block-categories li > a:lang(kk), +.wp-block-latest-posts li > a:lang(kk), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(kk), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(kk), .wp-caption dd:lang(kk), .wp-block-freeform blockquote cite:lang(kk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mk-MK), h1:lang(mk-MK), +h2:lang(mk-MK), +h3:lang(mk-MK), +h4:lang(mk-MK), +h5:lang(mk-MK), +h6:lang(mk-MK), figcaption:lang(mk-MK), +.gallery-caption:lang(mk-MK), .editor-post-title__block .editor-post-title__input:lang(mk-MK), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(mk-MK), .wp-block-paragraph.has-drop-cap:lang(mk-MK):not(:focus)::first-letter, .wp-block-table:lang(mk-MK), .wp-block-cover h2:lang(mk-MK), +.wp-block-cover .wp-block-cover-text:lang(mk-MK), .wp-block-button .wp-block-button__link:lang(mk-MK), .wp-block-quote cite:lang(mk-MK), +.wp-block-quote footer:lang(mk-MK), +.wp-block-quote .wp-block-quote__citation:lang(mk-MK), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(mk-MK), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(mk-MK), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(mk-MK), .wp-block-file:lang(mk-MK), ul.wp-block-archives li > a:lang(mk-MK), +.wp-block-categories li > a:lang(mk-MK), +.wp-block-latest-posts li > a:lang(mk-MK), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mk-MK), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mk-MK), .wp-caption dd:lang(mk-MK), .wp-block-freeform blockquote cite:lang(mk-MK) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mn), h1:lang(mn), +h2:lang(mn), +h3:lang(mn), +h4:lang(mn), +h5:lang(mn), +h6:lang(mn), figcaption:lang(mn), +.gallery-caption:lang(mn), .editor-post-title__block .editor-post-title__input:lang(mn), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(mn), .wp-block-paragraph.has-drop-cap:lang(mn):not(:focus)::first-letter, .wp-block-table:lang(mn), .wp-block-cover h2:lang(mn), +.wp-block-cover .wp-block-cover-text:lang(mn), .wp-block-button .wp-block-button__link:lang(mn), .wp-block-quote cite:lang(mn), +.wp-block-quote footer:lang(mn), +.wp-block-quote .wp-block-quote__citation:lang(mn), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(mn), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(mn), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(mn), .wp-block-file:lang(mn), ul.wp-block-archives li > a:lang(mn), +.wp-block-categories li > a:lang(mn), +.wp-block-latest-posts li > a:lang(mn), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mn), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mn), .wp-caption dd:lang(mn), .wp-block-freeform blockquote cite:lang(mn) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(ru-RU), h1:lang(ru-RU), +h2:lang(ru-RU), +h3:lang(ru-RU), +h4:lang(ru-RU), +h5:lang(ru-RU), +h6:lang(ru-RU), figcaption:lang(ru-RU), +.gallery-caption:lang(ru-RU), .editor-post-title__block .editor-post-title__input:lang(ru-RU), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ru-RU), .wp-block-paragraph.has-drop-cap:lang(ru-RU):not(:focus)::first-letter, .wp-block-table:lang(ru-RU), .wp-block-cover h2:lang(ru-RU), +.wp-block-cover .wp-block-cover-text:lang(ru-RU), .wp-block-button .wp-block-button__link:lang(ru-RU), .wp-block-quote cite:lang(ru-RU), +.wp-block-quote footer:lang(ru-RU), +.wp-block-quote .wp-block-quote__citation:lang(ru-RU), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ru-RU), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ru-RU), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ru-RU), .wp-block-file:lang(ru-RU), ul.wp-block-archives li > a:lang(ru-RU), +.wp-block-categories li > a:lang(ru-RU), +.wp-block-latest-posts li > a:lang(ru-RU), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ru-RU), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ru-RU), .wp-caption dd:lang(ru-RU), .wp-block-freeform blockquote cite:lang(ru-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sah), h1:lang(sah), +h2:lang(sah), +h3:lang(sah), +h4:lang(sah), +h5:lang(sah), +h6:lang(sah), figcaption:lang(sah), +.gallery-caption:lang(sah), .editor-post-title__block .editor-post-title__input:lang(sah), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(sah), .wp-block-paragraph.has-drop-cap:lang(sah):not(:focus)::first-letter, .wp-block-table:lang(sah), .wp-block-cover h2:lang(sah), +.wp-block-cover .wp-block-cover-text:lang(sah), .wp-block-button .wp-block-button__link:lang(sah), .wp-block-quote cite:lang(sah), +.wp-block-quote footer:lang(sah), +.wp-block-quote .wp-block-quote__citation:lang(sah), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(sah), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(sah), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(sah), .wp-block-file:lang(sah), ul.wp-block-archives li > a:lang(sah), +.wp-block-categories li > a:lang(sah), +.wp-block-latest-posts li > a:lang(sah), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sah), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sah), .wp-caption dd:lang(sah), .wp-block-freeform blockquote cite:lang(sah) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sr-RS), h1:lang(sr-RS), +h2:lang(sr-RS), +h3:lang(sr-RS), +h4:lang(sr-RS), +h5:lang(sr-RS), +h6:lang(sr-RS), figcaption:lang(sr-RS), +.gallery-caption:lang(sr-RS), .editor-post-title__block .editor-post-title__input:lang(sr-RS), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(sr-RS), .wp-block-paragraph.has-drop-cap:lang(sr-RS):not(:focus)::first-letter, .wp-block-table:lang(sr-RS), .wp-block-cover h2:lang(sr-RS), +.wp-block-cover .wp-block-cover-text:lang(sr-RS), .wp-block-button .wp-block-button__link:lang(sr-RS), .wp-block-quote cite:lang(sr-RS), +.wp-block-quote footer:lang(sr-RS), +.wp-block-quote .wp-block-quote__citation:lang(sr-RS), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(sr-RS), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(sr-RS), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(sr-RS), .wp-block-file:lang(sr-RS), ul.wp-block-archives li > a:lang(sr-RS), +.wp-block-categories li > a:lang(sr-RS), +.wp-block-latest-posts li > a:lang(sr-RS), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sr-RS), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sr-RS), .wp-caption dd:lang(sr-RS), .wp-block-freeform blockquote cite:lang(sr-RS) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(tt-RU), h1:lang(tt-RU), +h2:lang(tt-RU), +h3:lang(tt-RU), +h4:lang(tt-RU), +h5:lang(tt-RU), +h6:lang(tt-RU), figcaption:lang(tt-RU), +.gallery-caption:lang(tt-RU), .editor-post-title__block .editor-post-title__input:lang(tt-RU), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(tt-RU), .wp-block-paragraph.has-drop-cap:lang(tt-RU):not(:focus)::first-letter, .wp-block-table:lang(tt-RU), .wp-block-cover h2:lang(tt-RU), +.wp-block-cover .wp-block-cover-text:lang(tt-RU), .wp-block-button .wp-block-button__link:lang(tt-RU), .wp-block-quote cite:lang(tt-RU), +.wp-block-quote footer:lang(tt-RU), +.wp-block-quote .wp-block-quote__citation:lang(tt-RU), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(tt-RU), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(tt-RU), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(tt-RU), .wp-block-file:lang(tt-RU), ul.wp-block-archives li > a:lang(tt-RU), +.wp-block-categories li > a:lang(tt-RU), +.wp-block-latest-posts li > a:lang(tt-RU), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(tt-RU), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(tt-RU), .wp-caption dd:lang(tt-RU), .wp-block-freeform blockquote cite:lang(tt-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(uk), h1:lang(uk), +h2:lang(uk), +h3:lang(uk), +h4:lang(uk), +h5:lang(uk), +h6:lang(uk), figcaption:lang(uk), +.gallery-caption:lang(uk), .editor-post-title__block .editor-post-title__input:lang(uk), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(uk), .wp-block-paragraph.has-drop-cap:lang(uk):not(:focus)::first-letter, .wp-block-table:lang(uk), .wp-block-cover h2:lang(uk), +.wp-block-cover .wp-block-cover-text:lang(uk), .wp-block-button .wp-block-button__link:lang(uk), .wp-block-quote cite:lang(uk), +.wp-block-quote footer:lang(uk), +.wp-block-quote .wp-block-quote__citation:lang(uk), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(uk), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(uk), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(uk), .wp-block-file:lang(uk), ul.wp-block-archives li > a:lang(uk), +.wp-block-categories li > a:lang(uk), +.wp-block-latest-posts li > a:lang(uk), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(uk), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(uk), .wp-caption dd:lang(uk), .wp-block-freeform blockquote cite:lang(uk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(zh-HK), h1:lang(zh-HK), +h2:lang(zh-HK), +h3:lang(zh-HK), +h4:lang(zh-HK), +h5:lang(zh-HK), +h6:lang(zh-HK), figcaption:lang(zh-HK), +.gallery-caption:lang(zh-HK), .editor-post-title__block .editor-post-title__input:lang(zh-HK), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(zh-HK), .wp-block-paragraph.has-drop-cap:lang(zh-HK):not(:focus)::first-letter, .wp-block-table:lang(zh-HK), .wp-block-cover h2:lang(zh-HK), +.wp-block-cover .wp-block-cover-text:lang(zh-HK), .wp-block-button .wp-block-button__link:lang(zh-HK), .wp-block-quote cite:lang(zh-HK), +.wp-block-quote footer:lang(zh-HK), +.wp-block-quote .wp-block-quote__citation:lang(zh-HK), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(zh-HK), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(zh-HK), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(zh-HK), .wp-block-file:lang(zh-HK), ul.wp-block-archives li > a:lang(zh-HK), +.wp-block-categories li > a:lang(zh-HK), +.wp-block-latest-posts li > a:lang(zh-HK), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-HK), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-HK), .wp-caption dd:lang(zh-HK), .wp-block-freeform blockquote cite:lang(zh-HK) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-TW), h1:lang(zh-TW), +h2:lang(zh-TW), +h3:lang(zh-TW), +h4:lang(zh-TW), +h5:lang(zh-TW), +h6:lang(zh-TW), figcaption:lang(zh-TW), +.gallery-caption:lang(zh-TW), .editor-post-title__block .editor-post-title__input:lang(zh-TW), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(zh-TW), .wp-block-paragraph.has-drop-cap:lang(zh-TW):not(:focus)::first-letter, .wp-block-table:lang(zh-TW), .wp-block-cover h2:lang(zh-TW), +.wp-block-cover .wp-block-cover-text:lang(zh-TW), .wp-block-button .wp-block-button__link:lang(zh-TW), .wp-block-quote cite:lang(zh-TW), +.wp-block-quote footer:lang(zh-TW), +.wp-block-quote .wp-block-quote__citation:lang(zh-TW), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(zh-TW), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(zh-TW), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(zh-TW), .wp-block-file:lang(zh-TW), ul.wp-block-archives li > a:lang(zh-TW), +.wp-block-categories li > a:lang(zh-TW), +.wp-block-latest-posts li > a:lang(zh-TW), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-TW), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-TW), .wp-caption dd:lang(zh-TW), .wp-block-freeform blockquote cite:lang(zh-TW) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-CN), h1:lang(zh-CN), +h2:lang(zh-CN), +h3:lang(zh-CN), +h4:lang(zh-CN), +h5:lang(zh-CN), +h6:lang(zh-CN), figcaption:lang(zh-CN), +.gallery-caption:lang(zh-CN), .editor-post-title__block .editor-post-title__input:lang(zh-CN), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(zh-CN), .wp-block-paragraph.has-drop-cap:lang(zh-CN):not(:focus)::first-letter, .wp-block-table:lang(zh-CN), .wp-block-cover h2:lang(zh-CN), +.wp-block-cover .wp-block-cover-text:lang(zh-CN), .wp-block-button .wp-block-button__link:lang(zh-CN), .wp-block-quote cite:lang(zh-CN), +.wp-block-quote footer:lang(zh-CN), +.wp-block-quote .wp-block-quote__citation:lang(zh-CN), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(zh-CN), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(zh-CN), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(zh-CN), .wp-block-file:lang(zh-CN), ul.wp-block-archives li > a:lang(zh-CN), +.wp-block-categories li > a:lang(zh-CN), +.wp-block-latest-posts li > a:lang(zh-CN), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-CN), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-CN), .wp-caption dd:lang(zh-CN), .wp-block-freeform blockquote cite:lang(zh-CN) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(bn-BD), h1:lang(bn-BD), +h2:lang(bn-BD), +h3:lang(bn-BD), +h4:lang(bn-BD), +h5:lang(bn-BD), +h6:lang(bn-BD), figcaption:lang(bn-BD), +.gallery-caption:lang(bn-BD), .editor-post-title__block .editor-post-title__input:lang(bn-BD), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(bn-BD), .wp-block-paragraph.has-drop-cap:lang(bn-BD):not(:focus)::first-letter, .wp-block-table:lang(bn-BD), .wp-block-cover h2:lang(bn-BD), +.wp-block-cover .wp-block-cover-text:lang(bn-BD), .wp-block-button .wp-block-button__link:lang(bn-BD), .wp-block-quote cite:lang(bn-BD), +.wp-block-quote footer:lang(bn-BD), +.wp-block-quote .wp-block-quote__citation:lang(bn-BD), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(bn-BD), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(bn-BD), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(bn-BD), .wp-block-file:lang(bn-BD), ul.wp-block-archives li > a:lang(bn-BD), +.wp-block-categories li > a:lang(bn-BD), +.wp-block-latest-posts li > a:lang(bn-BD), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bn-BD), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bn-BD), .wp-caption dd:lang(bn-BD), .wp-block-freeform blockquote cite:lang(bn-BD) { + font-family: Arial, sans-serif; +} + +body:lang(hi-IN), h1:lang(hi-IN), +h2:lang(hi-IN), +h3:lang(hi-IN), +h4:lang(hi-IN), +h5:lang(hi-IN), +h6:lang(hi-IN), figcaption:lang(hi-IN), +.gallery-caption:lang(hi-IN), .editor-post-title__block .editor-post-title__input:lang(hi-IN), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(hi-IN), .wp-block-paragraph.has-drop-cap:lang(hi-IN):not(:focus)::first-letter, .wp-block-table:lang(hi-IN), .wp-block-cover h2:lang(hi-IN), +.wp-block-cover .wp-block-cover-text:lang(hi-IN), .wp-block-button .wp-block-button__link:lang(hi-IN), .wp-block-quote cite:lang(hi-IN), +.wp-block-quote footer:lang(hi-IN), +.wp-block-quote .wp-block-quote__citation:lang(hi-IN), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(hi-IN), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(hi-IN), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(hi-IN), .wp-block-file:lang(hi-IN), ul.wp-block-archives li > a:lang(hi-IN), +.wp-block-categories li > a:lang(hi-IN), +.wp-block-latest-posts li > a:lang(hi-IN), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(hi-IN), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(hi-IN), .wp-caption dd:lang(hi-IN), .wp-block-freeform blockquote cite:lang(hi-IN) { + font-family: Arial, sans-serif; +} + +body:lang(mr), h1:lang(mr), +h2:lang(mr), +h3:lang(mr), +h4:lang(mr), +h5:lang(mr), +h6:lang(mr), figcaption:lang(mr), +.gallery-caption:lang(mr), .editor-post-title__block .editor-post-title__input:lang(mr), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(mr), .wp-block-paragraph.has-drop-cap:lang(mr):not(:focus)::first-letter, .wp-block-table:lang(mr), .wp-block-cover h2:lang(mr), +.wp-block-cover .wp-block-cover-text:lang(mr), .wp-block-button .wp-block-button__link:lang(mr), .wp-block-quote cite:lang(mr), +.wp-block-quote footer:lang(mr), +.wp-block-quote .wp-block-quote__citation:lang(mr), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(mr), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(mr), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(mr), .wp-block-file:lang(mr), ul.wp-block-archives li > a:lang(mr), +.wp-block-categories li > a:lang(mr), +.wp-block-latest-posts li > a:lang(mr), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mr), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mr), .wp-caption dd:lang(mr), .wp-block-freeform blockquote cite:lang(mr) { + font-family: Arial, sans-serif; +} + +body:lang(ne-NP), h1:lang(ne-NP), +h2:lang(ne-NP), +h3:lang(ne-NP), +h4:lang(ne-NP), +h5:lang(ne-NP), +h6:lang(ne-NP), figcaption:lang(ne-NP), +.gallery-caption:lang(ne-NP), .editor-post-title__block .editor-post-title__input:lang(ne-NP), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ne-NP), .wp-block-paragraph.has-drop-cap:lang(ne-NP):not(:focus)::first-letter, .wp-block-table:lang(ne-NP), .wp-block-cover h2:lang(ne-NP), +.wp-block-cover .wp-block-cover-text:lang(ne-NP), .wp-block-button .wp-block-button__link:lang(ne-NP), .wp-block-quote cite:lang(ne-NP), +.wp-block-quote footer:lang(ne-NP), +.wp-block-quote .wp-block-quote__citation:lang(ne-NP), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ne-NP), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ne-NP), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ne-NP), .wp-block-file:lang(ne-NP), ul.wp-block-archives li > a:lang(ne-NP), +.wp-block-categories li > a:lang(ne-NP), +.wp-block-latest-posts li > a:lang(ne-NP), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ne-NP), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ne-NP), .wp-caption dd:lang(ne-NP), .wp-block-freeform blockquote cite:lang(ne-NP) { + font-family: Arial, sans-serif; +} + +body:lang(el), h1:lang(el), +h2:lang(el), +h3:lang(el), +h4:lang(el), +h5:lang(el), +h6:lang(el), figcaption:lang(el), +.gallery-caption:lang(el), .editor-post-title__block .editor-post-title__input:lang(el), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(el), .wp-block-paragraph.has-drop-cap:lang(el):not(:focus)::first-letter, .wp-block-table:lang(el), .wp-block-cover h2:lang(el), +.wp-block-cover .wp-block-cover-text:lang(el), .wp-block-button .wp-block-button__link:lang(el), .wp-block-quote cite:lang(el), +.wp-block-quote footer:lang(el), +.wp-block-quote .wp-block-quote__citation:lang(el), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(el), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(el), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(el), .wp-block-file:lang(el), ul.wp-block-archives li > a:lang(el), +.wp-block-categories li > a:lang(el), +.wp-block-latest-posts li > a:lang(el), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(el), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(el), .wp-caption dd:lang(el), .wp-block-freeform blockquote cite:lang(el) { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +body:lang(gu), h1:lang(gu), +h2:lang(gu), +h3:lang(gu), +h4:lang(gu), +h5:lang(gu), +h6:lang(gu), figcaption:lang(gu), +.gallery-caption:lang(gu), .editor-post-title__block .editor-post-title__input:lang(gu), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(gu), .wp-block-paragraph.has-drop-cap:lang(gu):not(:focus)::first-letter, .wp-block-table:lang(gu), .wp-block-cover h2:lang(gu), +.wp-block-cover .wp-block-cover-text:lang(gu), .wp-block-button .wp-block-button__link:lang(gu), .wp-block-quote cite:lang(gu), +.wp-block-quote footer:lang(gu), +.wp-block-quote .wp-block-quote__citation:lang(gu), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(gu), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(gu), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(gu), .wp-block-file:lang(gu), ul.wp-block-archives li > a:lang(gu), +.wp-block-categories li > a:lang(gu), +.wp-block-latest-posts li > a:lang(gu), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(gu), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(gu), .wp-caption dd:lang(gu), .wp-block-freeform blockquote cite:lang(gu) { + font-family: Arial, sans-serif; +} + +body:lang(he-IL), h1:lang(he-IL), +h2:lang(he-IL), +h3:lang(he-IL), +h4:lang(he-IL), +h5:lang(he-IL), +h6:lang(he-IL), figcaption:lang(he-IL), +.gallery-caption:lang(he-IL), .editor-post-title__block .editor-post-title__input:lang(he-IL), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(he-IL), .wp-block-paragraph.has-drop-cap:lang(he-IL):not(:focus)::first-letter, .wp-block-table:lang(he-IL), .wp-block-cover h2:lang(he-IL), +.wp-block-cover .wp-block-cover-text:lang(he-IL), .wp-block-button .wp-block-button__link:lang(he-IL), .wp-block-quote cite:lang(he-IL), +.wp-block-quote footer:lang(he-IL), +.wp-block-quote .wp-block-quote__citation:lang(he-IL), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(he-IL), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(he-IL), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(he-IL), .wp-block-file:lang(he-IL), ul.wp-block-archives li > a:lang(he-IL), +.wp-block-categories li > a:lang(he-IL), +.wp-block-latest-posts li > a:lang(he-IL), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(he-IL), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(he-IL), .wp-caption dd:lang(he-IL), .wp-block-freeform blockquote cite:lang(he-IL) { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +body:lang(ja), h1:lang(ja), +h2:lang(ja), +h3:lang(ja), +h4:lang(ja), +h5:lang(ja), +h6:lang(ja), figcaption:lang(ja), +.gallery-caption:lang(ja), .editor-post-title__block .editor-post-title__input:lang(ja), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ja), .wp-block-paragraph.has-drop-cap:lang(ja):not(:focus)::first-letter, .wp-block-table:lang(ja), .wp-block-cover h2:lang(ja), +.wp-block-cover .wp-block-cover-text:lang(ja), .wp-block-button .wp-block-button__link:lang(ja), .wp-block-quote cite:lang(ja), +.wp-block-quote footer:lang(ja), +.wp-block-quote .wp-block-quote__citation:lang(ja), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ja), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ja), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ja), .wp-block-file:lang(ja), ul.wp-block-archives li > a:lang(ja), +.wp-block-categories li > a:lang(ja), +.wp-block-latest-posts li > a:lang(ja), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ja), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ja), .wp-caption dd:lang(ja), .wp-block-freeform blockquote cite:lang(ja) { + font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif; +} + +body:lang(ko-KR), h1:lang(ko-KR), +h2:lang(ko-KR), +h3:lang(ko-KR), +h4:lang(ko-KR), +h5:lang(ko-KR), +h6:lang(ko-KR), figcaption:lang(ko-KR), +.gallery-caption:lang(ko-KR), .editor-post-title__block .editor-post-title__input:lang(ko-KR), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ko-KR), .wp-block-paragraph.has-drop-cap:lang(ko-KR):not(:focus)::first-letter, .wp-block-table:lang(ko-KR), .wp-block-cover h2:lang(ko-KR), +.wp-block-cover .wp-block-cover-text:lang(ko-KR), .wp-block-button .wp-block-button__link:lang(ko-KR), .wp-block-quote cite:lang(ko-KR), +.wp-block-quote footer:lang(ko-KR), +.wp-block-quote .wp-block-quote__citation:lang(ko-KR), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ko-KR), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ko-KR), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ko-KR), .wp-block-file:lang(ko-KR), ul.wp-block-archives li > a:lang(ko-KR), +.wp-block-categories li > a:lang(ko-KR), +.wp-block-latest-posts li > a:lang(ko-KR), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ko-KR), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ko-KR), .wp-caption dd:lang(ko-KR), .wp-block-freeform blockquote cite:lang(ko-KR) { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +body:lang(th), h1:lang(th), +h2:lang(th), +h3:lang(th), +h4:lang(th), +h5:lang(th), +h6:lang(th), figcaption:lang(th), +.gallery-caption:lang(th), .editor-post-title__block .editor-post-title__input:lang(th), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(th), .wp-block-paragraph.has-drop-cap:lang(th):not(:focus)::first-letter, .wp-block-table:lang(th), .wp-block-cover h2:lang(th), +.wp-block-cover .wp-block-cover-text:lang(th), .wp-block-button .wp-block-button__link:lang(th), .wp-block-quote cite:lang(th), +.wp-block-quote footer:lang(th), +.wp-block-quote .wp-block-quote__citation:lang(th), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(th), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(th), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(th), .wp-block-file:lang(th), ul.wp-block-archives li > a:lang(th), +.wp-block-categories li > a:lang(th), +.wp-block-latest-posts li > a:lang(th), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(th), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(th), .wp-caption dd:lang(th), .wp-block-freeform blockquote cite:lang(th) { + font-family: "Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif; +} + +body:lang(vi), h1:lang(vi), +h2:lang(vi), +h3:lang(vi), +h4:lang(vi), +h5:lang(vi), +h6:lang(vi), figcaption:lang(vi), +.gallery-caption:lang(vi), .editor-post-title__block .editor-post-title__input:lang(vi), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(vi), .wp-block-paragraph.has-drop-cap:lang(vi):not(:focus)::first-letter, .wp-block-table:lang(vi), .wp-block-cover h2:lang(vi), +.wp-block-cover .wp-block-cover-text:lang(vi), .wp-block-button .wp-block-button__link:lang(vi), .wp-block-quote cite:lang(vi), +.wp-block-quote footer:lang(vi), +.wp-block-quote .wp-block-quote__citation:lang(vi), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(vi), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(vi), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(vi), .wp-block-file:lang(vi), ul.wp-block-archives li > a:lang(vi), +.wp-block-categories li > a:lang(vi), +.wp-block-latest-posts li > a:lang(vi), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(vi), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(vi), .wp-caption dd:lang(vi), .wp-block-freeform blockquote cite:lang(vi) { + font-family: "Libre Franklin", sans-serif; +} + +/** === Editor Frame === */ +body .wp-block[data-align="full"] { + width: calc(100% + 28px); + max-width: calc(100% + 28px); +} + +@media only screen and (min-width: 600px) { + body .wp-block[data-align="full"] { + width: calc( 100% + 116px); + max-width: calc( 100% + 115px); + } +} + +@media only screen and (min-width: 768px) { + body .editor-writing-flow { + max-width: 80%; + margin: 0 10%; + } + body .editor-default-block-appender, + body .editor-block-list__block { + margin-left: 0; + margin-right: 0; + } + body .wp-block[data-align="wide"] { + width: 100%; + } + body .wp-block[data-align="right"] { + max-width: 125%; + } +} + +/** === Content Width === */ +.wp-block { + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .wp-block { + width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block { + width: calc(6 * (100vw / 12 )); + } +} + +.wp-block .wp-block { + width: 100%; +} + +/** === Base Typography === */ +body { + font-size: 22px; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + line-height: 1.8; + color: #111; +} + +p { + font-size: 22px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; +} + +h1 { + font-size: 2.25em; +} + +h1:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +@media only screen and (min-width: 768px) { + h1 { + font-size: 2.8125em; + } +} + +h2 { + font-size: 1.6875em; +} + +h2:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +@media only screen and (min-width: 768px) { + h2 { + font-size: 2.25em; + } +} + +h3 { + font-size: 1.6875em; +} + +h4 { + font-size: 1.125em; +} + +h5 { + font-size: 0.88889em; +} + +h6 { + font-size: 0.71111em; +} + +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:hover, a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: 0; + text-decoration: underline; +} + +.has-primary-background-color, +.has-secondary-background-color, +.has-dark-gray-background-color, +.has-light-gray-background-color { + color: #fff; +} + +.has-primary-background-color p, +.has-primary-background-color h1, +.has-primary-background-color h2, +.has-primary-background-color h3, +.has-primary-background-color h4, +.has-primary-background-color h5, +.has-primary-background-color h6, +.has-primary-background-color a, +.has-secondary-background-color p, +.has-secondary-background-color h1, +.has-secondary-background-color h2, +.has-secondary-background-color h3, +.has-secondary-background-color h4, +.has-secondary-background-color h5, +.has-secondary-background-color h6, +.has-secondary-background-color a, +.has-dark-gray-background-color p, +.has-dark-gray-background-color h1, +.has-dark-gray-background-color h2, +.has-dark-gray-background-color h3, +.has-dark-gray-background-color h4, +.has-dark-gray-background-color h5, +.has-dark-gray-background-color h6, +.has-dark-gray-background-color a, +.has-light-gray-background-color p, +.has-light-gray-background-color h1, +.has-light-gray-background-color h2, +.has-light-gray-background-color h3, +.has-light-gray-background-color h4, +.has-light-gray-background-color h5, +.has-light-gray-background-color h6, +.has-light-gray-background-color a { + color: #fff; +} + +.has-white-background-color { + color: #111; +} + +.has-white-background-color p, +.has-white-background-color h1, +.has-white-background-color h2, +.has-white-background-color h3, +.has-white-background-color h4, +.has-white-background-color h5, +.has-white-background-color h6, +.has-white-background-color a { + color: #111; +} + +figcaption, +.gallery-caption { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + line-height: 1.6; + color: #767676; +} + +/** === Post Title === */ +.editor-post-title__block:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.editor-post-title__block:before { + width: 2.8125em; + margin-top: 0; + margin-bottom: 0; + margin-left: 1rem; + position: relative; + top: 0.5em; +} + +@media only screen and (min-width: 600px) { + .editor-post-title__block:before { + margin-left: 0; + } +} + +.editor-post-title__block .editor-post-title__input { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 2.8125em; + font-weight: 700; +} + +/** === Default Appender === */ +.block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-size: 22px; +} + +/** === Heading === */ +.wp-block-heading strong { + font-weight: bolder; +} + +/** === Paragraph === */ +.wp-block-paragraph.has-drop-cap:not(:focus)::first-letter { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 3.375em; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; +} + +/** === Table === */ +.wp-block-table { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +/** === Cover === */ +.wp-block-cover h2, +.wp-block-cover .wp-block-cover-text { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 1.6875em; + font-weight: bold; + line-height: 1.4; + padding-left: 1rem; + padding-right: 1rem; +} + +.wp-block-cover h2 strong, +.wp-block-cover .wp-block-cover-text strong { + font-weight: bolder; +} + +@media only screen and (min-width: 768px) { + .wp-block-cover h2, + .wp-block-cover .wp-block-cover-text { + margin-left: auto; + margin-right: auto; + padding: 0; + } +} + +@media only screen and (min-width: 768px) { + .wp-block-cover { + padding-left: 10%; + padding-right: 10%; + } + .wp-block-cover h2, + .wp-block-cover .wp-block-cover-text { + font-size: 2.25em; + } +} + +.wp-block[data-type="core/cover"][data-align="left"] .editor-block-list__block-edit, +.wp-block[data-type="core/cover"][data-align="right"] .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); +} + +.wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover, +.wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover { + width: 100%; + max-width: 100%; + padding: calc(1.375 * 1rem); +} + +.wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover p, +.wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover p { + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover, + .wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover { + padding: calc(2.75 * 1rem) calc(2.75 * 1rem) calc(3.125 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/cover"][data-align="wide"] h2, + .wp-block[data-type="core/cover"][data-align="wide"] .wp-block-cover-text, + .wp-block[data-type="core/cover"][data-align="full"] h2, + .wp-block[data-type="core/cover"][data-align="full"] .wp-block-cover-text { + max-width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/cover"][data-align="wide"] h2, + .wp-block[data-type="core/cover"][data-align="wide"] .wp-block-cover-text, + .wp-block[data-type="core/cover"][data-align="full"] h2, + .wp-block[data-type="core/cover"][data-align="full"] .wp-block-cover-text { + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/cover"][data-align="full"] .wp-block-cover { + padding-left: calc(10% + 64px); + padding-right: calc(10% + 64px); + } +} + +/** === Gallery === */ +.wp-block-gallery .blocks-gallery-image figcaption, +.wp-block-gallery .blocks-gallery-item figcaption, +.wp-block-gallery .gallery-item .gallery-caption { + font-size: 0.71111em; + line-height: 1.6; +} + +/** === Button === */ +.wp-block-button .wp-block-button__link { + line-height: 1.8; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.88889em; + font-weight: bold; +} + +.wp-block-button:not(.is-style-outline) .wp-block-button__link { + background: #0073aa; +} + +.wp-block-button:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; +} + +.wp-block-button.is-style-outline, .wp-block-button.is-style-outline:hover, .wp-block-button.is-style-outline:focus, .wp-block-button.is-style-outline:active { + background: transparent; + color: #0073aa; +} + +.wp-block-button.is-style-outline .wp-block-button__link, .wp-block-button.is-style-outline:hover .wp-block-button__link, .wp-block-button.is-style-outline:focus .wp-block-button__link, .wp-block-button.is-style-outline:active .wp-block-button__link { + background: transparent; +} + +.wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), .wp-block-button.is-style-outline:hover .wp-block-button__link:not(.has-text-color), .wp-block-button.is-style-outline:focus .wp-block-button__link:not(.has-text-color), .wp-block-button.is-style-outline:active .wp-block-button__link:not(.has-text-color) { + color: #0073aa; +} + +/** === Blockquote === */ +.wp-block-quote:not(.is-large):not(.is-style-large) { + border-width: 2px; + border-color: #0073aa; +} + +.wp-block-quote.is-large, .wp-block-quote.is-style-large { + margin-top: 2.8125em; + margin-bottom: 2.8125em; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-size: 1.6875em; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +.wp-block-quote cite, +.wp-block-quote footer, +.wp-block-quote .wp-block-quote__citation { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + line-height: 1.6; + color: #767676; +} + +/** === Pullquote === */ +.wp-block-pullquote { + border-color: transparent; + border-width: 2px; + color: #000; +} + +.wp-block-pullquote blockquote { + margin-top: calc(3 * 1rem); + margin-bottom: calc(3.33 * 1rem); + hyphens: auto; + word-break: break-word; +} + +.wp-block-pullquote:not(.is-style-solid-color) .wp-block-pullquote__citation { + color: #767676; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + width: calc(100% - (2 * 1rem)); + max-width: calc( 100% - (2 * 1rem)); +} + +.wp-block-pullquote.is-style-solid-color blockquote a, +.wp-block-pullquote.is-style-solid-color blockquote.has-text-color p, +.wp-block-pullquote.is-style-solid-color blockquote.has-text-color a { + color: inherit; +} + +.wp-block-pullquote.is-style-solid-color blockquote:not(.has-text-color) { + color: #fff; +} + +@media only screen and (min-width: 768px) { + .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 80%; + } +} + +.wp-block-pullquote.is-style-solid-color:not(.has-background-color) { + background-color: #0073aa; +} + +.wp-block[data-type="core/pullquote"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"] p, +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="left"] p, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="right"] p { + font-size: 1.6875em; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/pullquote"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + .wp-block[data-type="core/pullquote"] blockquote > .editor-rich-text p, + .wp-block[data-type="core/pullquote"] p, + .wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + .wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .editor-rich-text p, + .wp-block[data-type="core/pullquote"][data-align="left"] p, + .wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + .wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .editor-rich-text p, + .wp-block[data-type="core/pullquote"][data-align="right"] p { + font-size: 2.25em; + } +} + +.wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation, +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation, +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + line-height: 1.6; + text-transform: none; +} + +.wp-block[data-type="core/pullquote"] em, +.wp-block[data-type="core/pullquote"][data-align="left"] em, +.wp-block[data-type="core/pullquote"][data-align="right"] em { + font-style: normal; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] .editor-block-list__block-edit, +.wp-block[data-type="core/pullquote"][data-align="right"] .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); + max-width: 50%; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] .editor-block-list__block-edit .wp-block-pullquote:not(.is-style-solid-color), +.wp-block[data-type="core/pullquote"][data-align="right"] .editor-block-list__block-edit .wp-block-pullquote:not(.is-style-solid-color) { + padding: 0; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] .editor-block-list__block-edit .wp-block-pullquote.is-style-solid-color, +.wp-block[data-type="core/pullquote"][data-align="right"] .editor-block-list__block-edit .wp-block-pullquote.is-style-solid-color { + padding: 1em; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="left"] p, +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="right"] p, +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation { + text-align: left; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote blockquote { + max-width: calc(80% - 128px); + } +} + +/** === File === */ +.wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.wp-block-file .wp-block-file__textlink { + text-decoration: underline; + color: #0073aa; +} + +.wp-block-file .wp-block-file__textlink:hover { + color: #005177; + text-decoration: none; +} + +.wp-block-file .wp-block-file__button { + display: table; + line-height: 1.8; + font-size: 0.88889em; + font-weight: bold; + background-color: #0073aa; + border-radius: 5px; +} + +.wp-block-file .wp-block-file__button-richtext-wrapper { + display: block; + margin-top: calc(0.75 * 1rem); + margin-left: 0; +} + +/** === Verse === */ +.wp-block-verse, +.wp-block-verse pre { + padding: 0; +} + +/** === Code === */ +.wp-block-code { + border-radius: 0; +} + +/** === Table === */ +.wp-block-table td, .wp-block-table th { + border-color: #767676; +} + +/** === Separator === */ +.wp-block-separator:not(.is-style-dots) { + background-color: #767676; + height: 2px; +} + +.wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + width: 2.25em; + margin-left: 0; +} + +.wp-block-separator.is-style-dots { + color: #767676; +} + +.wp-block-separator.is-style-dots:before { + font-size: 1.6875em; + letter-spacing: calc(2 * 1rem); + padding-left: calc(2 * 1rem); +} + +/* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h1:before, +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h2:before { + display: none; +} + +/** === Latest Posts, Archives, Categories === */ +ul.wp-block-archives, +.wp-block-categories, +.wp-block-latest-posts { + padding: 0; + list-style-type: none; +} + +ul.wp-block-archives ul, +.wp-block-categories ul, +.wp-block-latest-posts ul { + padding: 0; + list-style-type: none; +} + +ul.wp-block-archives li > a, +.wp-block-categories li > a, +.wp-block-latest-posts li > a { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: bold; + line-height: 1.2; + text-decoration: none; +} + +ul.wp-block-archives li ul, +.wp-block-categories li ul, +.wp-block-latest-posts li ul { + padding-left: 1rem; +} + +.wp-block-categories ul { + padding-top: 0.75rem; +} + +.wp-block-categories ul ul { + counter-reset: submenu; +} + +.wp-block-categories ul ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.wp-block-categories li ul { + list-style: none; + padding-left: 0; + margin-bottom: -0.75rem; +} + +/** === Latest Posts === */ +.wp-block-latest-posts .wp-block-latest-posts__post-date { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; + line-height: 1.2; +} + +.wp-block-latest-posts .wp-block-latest-posts__post-full-content, +.wp-block-latest-posts .wp-block-latest-posts__post-excerpt { + margin-top: 22px; + margin-bottom: 22px; +} + +.wp-block-latest-posts .wp-block-latest-posts__post-full-content > div > p:first-child, +.wp-block-latest-posts .wp-block-latest-posts__post-excerpt > div > p:first-child { + margin-top: 22px; +} + +.wp-block-latest-posts li { + padding-bottom: 0.5rem; +} + +.wp-block-latest-posts li.menu-item-has-children, .wp-block-latest-posts li:last-child { + padding-bottom: 0; +} + +.wp-block-latest-posts li :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: 0.5rem; +} + +.wp-block-latest-posts.is-grid li { + border-top: 2px solid #ccc; + padding-top: 1rem; + margin-bottom: 2rem; +} + +.wp-block-latest-posts.is-grid li a:after { + content: ''; +} + +.wp-block-latest-posts.is-grid li:last-child { + margin-bottom: auto; +} + +.wp-block-latest-posts.is-grid li:last-child a:after { + content: ''; +} + +/** === Latest Comments === */ +.wp-block-latest-comments .wp-block-latest-comments__comment-meta { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment-meta .wp-block-latest-comments__comment-date { + font-weight: normal; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment, +.wp-block-latest-comments .wp-block-latest-comments__comment-date, +.wp-block-latest-comments .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment-date { + font-size: 0.71111em; +} + +/** === Classic Editor === */ +/* Properly center-align captions in the classic-editor block */ +.wp-caption dd { + color: #767676; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: left; + text-align: center; + -webkit-margin-start: 0px; + margin-inline-start: 0px; +} + +.wp-block-freeform { + /* Add style for galleries in classic-editor block */ +} + +.wp-block-freeform blockquote { + border-left: 2px solid #0073aa; +} + +.wp-block-freeform blockquote cite { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + font-style: normal; + line-height: 1.6; + color: #767676; +} + +/** === Group Block === */ +.wp-block[data-type="core/group"] > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + margin-right: 0; +} + +.wp-block[data-type="core/group"] > .wp-block-group.has-background { + padding: 22px; +} + +.wp-block[data-type="core/group"] > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: -22px; + width: calc(100% + 44px); + max-width: calc(100% + 44px); +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(6 * (100vw / 12 )); + } +} + +.wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(8 * (100vw / 12) - 44px); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(6 * (100vw / 12 ) - 44px); + } +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + padding-left: 46px; + padding-right: 46px; + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + width: 80%; + margin-left: 10%; + margin-right: 10%; + padding-left: 48px; + padding-right: 48px; + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="full"]) { + max-width: calc(100vw - (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="full"]) { + max-width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="full"]) { + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="right"] { + max-width: 125%; + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="wide"] { + width: calc(100% + 4px); + max-width: calc(100% + 4px); + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align=full] { + max-width: calc(100vw + (2 * 1rem)); +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align=full] { + width: calc(100% + 92px); + left: -46px; + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align=full] { + left: calc(-12.5% - 58px); + width: calc(125% + 120px); + max-width: calc(125% + 119px); + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background { + padding: 22px 0; +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background { + padding-left: 0; + padding-right: 0; + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + width: 100%; +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + width: calc(100% + 92px); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + width: calc(125% + 120px); + } +} diff --git a/wp-content/themes/twentynineteen/style-editor.scss b/wp-content/themes/twentynineteen/style-editor.scss new file mode 100644 index 0000000..b5c422f --- /dev/null +++ b/wp-content/themes/twentynineteen/style-editor.scss @@ -0,0 +1,943 @@ +/*! +Twenty Nineteen Editor Styles +*/ + +/** === Includes === */ + +@import "sass/variables-site/variables-site"; +@import "sass/mixins/mixins-master"; + +/** === Editor Frame === */ + +body { + + .wp-block[data-align="full"] { + width: calc(100% + 28px); + max-width: calc(100% + 28px); + } + + @include media(mobile) { + + .wp-block[data-align="full"] { + width: calc( 100% + 116px ); + max-width: calc( 100% + 115px ); + } + } + + @include media(tablet) { + + .editor-writing-flow { + max-width: 80%; + margin: 0 10%; + } + + .editor-default-block-appender, + .editor-block-list__block { + margin-left: 0; + margin-right: 0; + } + + .wp-block[data-align="wide"] { + width: 100%; + } + + .wp-block[data-align="right"] { + max-width: 125%; + } + } +} + +/** === Content Width === */ + +.wp-block { + max-width: 100%; + + @include media(tablet) { + width: calc(8 * (100vw / 12)); + } + + @include media(desktop) { + width: calc(6 * (100vw / 12 )); + } + + // Only the top level blocks need specific widths, therefore override for every nested block. + .wp-block { + width: 100%; + } +} + +/** === Base Typography === */ + +body { + font-size: $font__size_base; + @include font-family( $font__body ); + line-height: $font__line-height-body; + color: $color__text-main; +} + +p { + font-size: $font__size_base; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + @include font-family( $font__heading ); + font-weight: 700; +} + +h1 { + font-size: $font__size-xl; + @include post-section-dash; + + @include media(tablet) { + font-size: $font__size-xxl; + } +} + +h2 { + font-size: $font__size-lg; + @include post-section-dash; + + @include media(tablet) { + font-size: $font__size-xl; + } +} + +h3 { + font-size: $font__size-lg; +} + +h4 { + font-size: $font__size-md; +} + +h5 { + font-size: $font__size-sm; +} + +h6 { + font-size: $font__size-xs; +} + +a { + @include link-transition; + color: $color__link; + + *:visited { + + } + + &:hover, + &:active { + color: $color__link-hover; + outline: 0; + text-decoration: none; + } + + &:focus { + outline: 0; + text-decoration: underline; + } +} + +// Use white text against these backgrounds by default. +.has-primary-background-color, +.has-secondary-background-color, +.has-dark-gray-background-color, +.has-light-gray-background-color { + color: $color__background-body; + + p, + h1, + h2, + h3, + h4, + h5, + h6, + a { + color: $color__background-body; + } +} + +// Use dark gray text against this background by default. +.has-white-background-color { + color: $color__text-main; + + p, + h1, + h2, + h3, + h4, + h5, + h6, + a { + color: $color__text-main; + } +} + +figcaption, +.gallery-caption { + @include font-family( $font__heading ); + font-size: $font__size-xs; + line-height: 1.6; + color: $color__text-light; +} + +/** === Post Title === */ + +.editor-post-title__block { + @include post-section-dash; + + &:before { + width: $font__size-xxl; + margin-top: 0; + margin-bottom: 0; + margin-left: 1rem; + position: relative; + top: 0.5em; + + @include media(mobile) { + margin-left: 0; + } + } + + .editor-post-title__input { + @include font-family( $font__heading ); + font-size: $font__size-xxl; + font-weight: 700; + } +} + +/** === Default Appender === */ + +.block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + @include font-family( $font__body ); + font-size: $font__size_base; +} + +/** === Heading === */ + +.wp-block-heading { + strong { + font-weight: bolder; + } +} +/** === Paragraph === */ + +.wp-block-paragraph { + + &.has-drop-cap:not(:focus)::first-letter { + @include font-family( $font__heading ); + font-size: $font__size-xxxl; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; + } +} + +/** === Table === */ + +.wp-block-table { + @include font-family( $font__heading ); +} + +/** === Cover === */ + +.wp-block-cover { + + h2, + .wp-block-cover-text { + @include font-family( $font__heading ); + font-size: $font__size-lg; + font-weight: bold; + line-height: 1.4; + padding-left: $size__spacing-unit; + padding-right: $size__spacing-unit; + + strong { + font-weight: bolder; + } + + @include media(tablet) { + margin-left: auto; + margin-right: auto; + padding: 0; + } + } + + @include media(tablet) { + padding-left: 10%; + padding-right: 10%; + + h2, + .wp-block-cover-text { + font-size: $font__size-xl; + } + } +} + +.wp-block[data-type="core/cover"][data-align="left"], +.wp-block[data-type="core/cover"][data-align="right"] { + + .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); + } + + .wp-block-cover { + width: 100%; + max-width: 100%; + padding: calc(1.375 * #{$size__spacing-unit}); + + p { + padding-left: 0; + padding-right: 0; + } + + @include media(tablet) { + padding: calc(2.75 * #{$size__spacing-unit}) calc(2.75 * #{$size__spacing-unit}) calc(3.125 * #{$size__spacing-unit}); + } + } +} + +.wp-block[data-type="core/cover"][data-align="wide"], +.wp-block[data-type="core/cover"][data-align="full"] { + + @include media(tablet) { + + h2, + .wp-block-cover-text { + max-width: calc(8 * (100vw / 12)); + } + } + + @include media(desktop) { + + h2, + .wp-block-cover-text { + max-width: calc(6 * (100vw / 12)); + } + } +} + +.wp-block[data-type="core/cover"][data-align="full"] { + + @include media(tablet) { + + .wp-block-cover { + padding-left: calc(10% + 64px); + padding-right: calc(10% + 64px); + } + } +} + +/** === Gallery === */ + +.wp-block-gallery { + + .blocks-gallery-image figcaption, + .blocks-gallery-item figcaption, + .gallery-item .gallery-caption { + font-size: $font__size-xs; + line-height: 1.6; + } +} + +/** === Button === */ + +.wp-block-button { + + .wp-block-button__link { + line-height: 1.8; + @include font-family( $font__heading ); + font-size: $font__size-sm; + font-weight: bold; + } + + &:not(.is-style-outline) .wp-block-button__link { + background: $color__background-button; + } + + &:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; + } + + &.is-style-outline, + &.is-style-outline:hover, + &.is-style-outline:focus, + &.is-style-outline:active { + background: transparent; + color: $color__background-button; + + .wp-block-button__link { + background: transparent; + + &:not(.has-text-color) { + color: $color__background-button; + } + } + } +} + +/** === Blockquote === */ + +.wp-block-quote { + + &:not(.is-large):not(.is-style-large) { + border-width: 2px; + border-color: $color__link; + } + + &.is-large, + &.is-style-large { + margin-top: $font__size-xxl; + margin-bottom: $font__size-xxl; + } + + &.is-large p, + &.is-style-large p { + font-size: $font__size-lg; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + } + + cite, + footer, + .wp-block-quote__citation { + @include font-family( $font__heading ); + font-size: $font__size-xs; + line-height: 1.6; + color: $color__text-light; + } +} + +/** === Pullquote === */ + +.wp-block-pullquote { + border-color: transparent; + border-width: 2px; + color: #000; + + blockquote { + margin-top: calc(3 * #{ $size__spacing-unit}); + margin-bottom: calc(3.33 * #{ $size__spacing-unit}); + hyphens: auto; + word-break: break-word; + } + + &:not(.is-style-solid-color) .wp-block-pullquote__citation { + color: $color__text-light; + } + + &.is-style-solid-color { + + blockquote { + width: calc(100% - (2 * #{ $size__spacing-unit})); + max-width: calc( 100% - (2 * #{ $size__spacing-unit})); + + a, + &.has-text-color p, + &.has-text-color a { + color: inherit; + } + + &:not(.has-text-color) { + color: $color__background-body; + } + + @include media(tablet) { + max-width: 80%; + } + } + + &:not(.has-background-color) { + background-color: $color__link; + } + } +} + +.wp-block[data-type="core/pullquote"], +.wp-block[data-type="core/pullquote"][data-align="left"], +.wp-block[data-type="core/pullquote"][data-align="right"] { + + blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + blockquote > .editor-rich-text p, + p { + font-size: $font__size-lg; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + + @include media(tablet) { + font-size: $font__size-xl; + } + } + + .wp-block-pullquote__citation { + @include font-family( $font__heading ); + font-size: $font__size-xs; + line-height: 1.6; + text-transform: none; + } + + em { + font-style: normal; + } +} + +.wp-block[data-type="core/pullquote"][data-align="left"], +.wp-block[data-type="core/pullquote"][data-align="right"] { + + .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); + max-width: 50%; + + .wp-block-pullquote:not(.is-style-solid-color) { + padding: 0; + } + + .wp-block-pullquote.is-style-solid-color { + padding: 1em; + } + } + + blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + blockquote > .editor-rich-text p, + p, + .wp-block-pullquote__citation { + text-align: left; + } +} + +.wp-block[data-type="core/pullquote"][data-align="full"] { + + @include media(tablet) { + + .wp-block-pullquote blockquote { + max-width: calc(80% - 128px); + } + } +} + + +/** === File === */ + +.wp-block-file { + @include font-family( $font__heading ); + + .wp-block-file__textlink { + text-decoration: underline; + color: $color__link; + + &:hover { + color: $color__link-hover; + text-decoration: none; + } + } + + .wp-block-file__button { + display: table; + line-height: 1.8; + font-size: $font__size-sm; + font-weight: bold; + background-color: $color__link; + border-radius: 5px; + } + + .wp-block-file__button-richtext-wrapper { + display: block; + margin-top: calc(0.75 * #{$size__spacing-unit}); + margin-left: 0; + } + +} + +/** === Verse === */ + +.wp-block-verse, +.wp-block-verse pre { + padding: 0; +} + +/** === Code === */ + +.wp-block-code { + border-radius: 0; +} + +/** === Table === */ + +.wp-block-table { + + td, th { + border-color: $color__text-light; + } +} + +/** === Separator === */ + +.wp-block-separator { + + &:not(.is-style-dots) { + background-color: $color__text-light; + height: 2px; + } + + &:not(.is-style-wide):not(.is-style-dots) { + width: $font__size-xl; + margin-left: 0; + } + + &.is-style-dots { + color: $color__text-light; + } + + &.is-style-dots:before { + font-size: $font__size-lg; + letter-spacing: calc(2 * #{$size__spacing-unit}); + padding-left: calc(2 * #{$size__spacing-unit}); + } +} + +/* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h1:before, +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h2:before { + display: none; +} + +/** === Latest Posts, Archives, Categories === */ + +ul.wp-block-archives, +.wp-block-categories, +.wp-block-latest-posts { + padding: 0; + list-style-type: none; + + ul { + padding: 0; + list-style-type: none; + } + + li { + + > a { + @include font-family( $font__heading ); + font-size: calc(#{$font__size_base} * #{$font__size-ratio}); + font-weight: bold; + line-height: $font__line-height-heading; + text-decoration: none; + } + + ul { + padding-left: $size__spacing-unit; + } + } +} + +.wp-block-categories { + + ul { + padding-top: ( .75 * $size__spacing-unit ); + @include nestedSubMenuPadding(); + } + + li ul { + list-style: none; + padding-left: 0; + margin-bottom: ( -.75 * $size__spacing-unit ); + } + +} + +/** === Latest Posts === */ +.wp-block-latest-posts { + + .wp-block-latest-posts__post-date { + @include font-family( $font__heading ); + font-size: $font__size-xs; + color: $color__text-light; + line-height: 1.2; + } + + .wp-block-latest-posts__post-full-content, + .wp-block-latest-posts__post-excerpt { + margin-top: $font__size_base; + margin-bottom: $font__size_base; + + > div > p:first-child { + margin-top: $font__size_base; + } + } + + li { + padding-bottom: ( .5 * $size__spacing-unit ); + + &.menu-item-has-children, + &:last-child { + padding-bottom: 0; + } + + :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: ( .5 * $size__spacing-unit ); + } + } + + &.is-grid { + li { + border-top: 2px solid $color__border; + padding-top: (1 * $size__spacing-unit); + margin-bottom: (2 * $size__spacing-unit); + a { + &:after { + content: ''; + } + } + &:last-child { + margin-bottom: auto; + a:after { + content: ''; + } + } + } + } +} + +/** === Latest Comments === */ + +.wp-block-latest-comments { + + .wp-block-latest-comments__comment-meta { + @include font-family( $font__heading ); + font-weight: bold; + + .wp-block-latest-comments__comment-date { + font-weight: normal; + } + } + + .wp-block-latest-comments__comment, + .wp-block-latest-comments__comment-date, + .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; + } + + .wp-block-latest-comments__comment-date { + font-size: $font__size-xs; + } +} + +/** === Classic Editor === */ + +/* Properly center-align captions in the classic-editor block */ +.wp-caption { + dd { + color: $color__text-light; + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); + text-align: left; + text-align: center; + -webkit-margin-start: 0px; + margin-inline-start: 0px; + } +} + +.wp-block-freeform { + + /* Add style for galleries in classic-editor block */ + blockquote { + border-left: 2px solid $color__link; + + cite { + @include font-family( $font__heading ); + font-size: $font__size-xs; + font-style: normal; + line-height: 1.6; + color: $color__text-light; + } + } +} + +/** === Group Block === */ + +// This matches the 22px value for 1rem that used on the front end. +// It must be specified in pixels for the editor, since the root font +// size is different here. +$group-block-background__padding: $font__size_base; + +.wp-block[data-type="core/group"] { + + // Group block base styles + > .wp-block-group { + + // Child: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + margin-right: 0; + } + } + + // Group block with background color + > .wp-block-group.has-background { + padding: $group-block-background__padding; + + // Child: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: -$group-block-background__padding; + width: calc(100% + #{$group-block-background__padding * 2}); + max-width: calc(100% + #{$group-block-background__padding * 2}); + } + } + + // Wide and full alignments + &[data-align="wide"] > .is-block-content { + + // Group block base styles. + > .wp-block-group { + + // Child blocks: Default alignments + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + @include media(tablet) { + width: calc(8 * (100vw / 12)); + } + + @include media(desktop) { + width: calc(6 * (100vw / 12 )); + } + } + + // Child blocks: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-left: 0; + padding-right: 0; + } + } + + // Group block with background color + > .wp-block-group.has-background { + + // Child blocks: Default alignments + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + @include media(tablet) { + width: calc(8 * (100vw / 12) - #{$group-block-background__padding * 2}); + } + + @include media(desktop) { + width: calc(6 * (100vw / 12 ) - #{$group-block-background__padding * 2}); + } + } + } + } + + // Full alignment + &[data-align="full"] { + + // Group block base styles + > .is-block-content > .wp-block-group { + + // Margins & padding are added to this container to mimic + // the style + spacing of the .editor-writing-flow global + // container. This way, child items sync up with the placement + // and size of other top-level blocks. + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + + @include media(mobile) { + padding-left: 46px; + padding-right: 46px; + } + + // 2px of extra padding are added to each side here + // To better match up with the spacing of the whole + // document. + @include media(tablet) { + width: 80%; + margin-left: 10%; + margin-right: 10%; + padding-left: 48px; + padding-right: 48px; + } + + // Child blocks: All alignments except full + > .wp-block:not([data-align="full"]) { + max-width: calc(100vw - (2 * 1rem)); + + @include media(tablet) { + max-width: calc(8 * (100vw / 12)); + } + + @include media(desktop) { + max-width: calc(6 * (100vw / 12)); + } + } + + // Child blocks: Right alignments + > .wp-block[data-align="right"] { + + @include media(tablet) { + max-width: 125%; + } + } + + // Child blocks: Wide alignments + > .wp-block[data-align="wide"] { + + @include media(tablet) { + width: calc(100% + 4px); + max-width: calc(100% + 4px); + } + } + + // Child blocks: Full alignments + > .wp-block[data-align=full] { + max-width: calc(100vw + (2 * 1rem)); + + @include media(mobile) { + width: calc(100% + 92px); + left: -46px; + } + + @include media(tablet) { + left: calc(-12.5% - 58px); + width: calc(125% + 120px); + max-width: calc(125% + 119px); + } + } + } + } + + // Group block with background color + > .is-block-content > .wp-block-group.has-background { + + // When the Group block is full width, we can remove the left/right padding + // and let this inherit the + padding: $group-block-background__padding 0; + + @include media(mobile) { + padding-left: 0; + padding-right: 0; + } + + // Child blocks: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + width: 100%; + + @include media(mobile) { + width: calc(100% + 92px); + } + + @include media(tablet) { + width: calc(125% + 120px); + } + } + } + } +} diff --git a/wp-content/themes/twentynineteen/style-rtl.css b/wp-content/themes/twentynineteen/style-rtl.css new file mode 100644 index 0000000..892bc1e --- /dev/null +++ b/wp-content/themes/twentynineteen/style-rtl.css @@ -0,0 +1,6513 @@ +@charset "UTF-8"; +/* +Theme Name: Twenty Nineteen +Theme URI: https://wordpress.org/themes/twentynineteen/ +Author: the WordPress team +Author URI: https://wordpress.org/ +Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. +Requires at least: 4.9.6 +Requires PHP: 5.2.4 +Version: 1.5 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: twentynineteen +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. + +Twenty Nineteen is based on Underscores https://underscores.me/, (C) 2012-2019 Automattic, Inc. +Underscores is distributed under the terms of the GNU GPL v2 or later. + +Normalizing styles have been helped along thanks to the fine work of +Nicolas Gallagher and Jonathan Neal https://necolas.github.io/normalize.css/ +*/ +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Variables +# Normalize +# Typography + ## Headings + ## Copy +# Elements + ## Lists + ## Tables +# Forms + ## Buttons + ## Fields +# Navigation + ## Links + ## Menus + ## Next & Previous +# Accessibility +# Alignments +# Clearings +# Layout +# Widgets +# Content + ## Archives + ## Posts and pages + ## Comments +# Blocks +# Media + ## Captions + ## Galleries +--------------------------------------------------------------*/ +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually inserting + * a custom font that includes just a Hoefler Text space replacement for that + * character instead. + */ +@font-face { + font-family: 'NonBreakingSpaceOverride'; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* If we add the border using a regular CSS border, it won't look good on non-retina devices, + * since its edges can look jagged due to lack of antialiasing. In this case, we are several + * layers of box-shadow to add the border visually, which will render the border smoother. */ +/* Calculates maximum width for post content */ +/* Nested sub-menu padding: 10 levels deep */ +/* Ensure all font family declarations come with non-latin fallbacks */ +/* Build our non-latin font styles */ +body:lang(ar), button:lang(ar), +input:lang(ar), +select:lang(ar), +optgroup:lang(ar), +textarea:lang(ar), .author-description .author-link:lang(ar), +.comment-metadata:lang(ar), +.comment-reply-link:lang(ar), +.comments-title:lang(ar), +.comment-author .fn:lang(ar), +.discussion-meta-info:lang(ar), +.entry-meta:lang(ar), +.entry-footer:lang(ar), +.main-navigation:lang(ar), +.no-comments:lang(ar), +.not-found .page-title:lang(ar), +.error-404 .page-title:lang(ar), +.post-navigation .post-title:lang(ar), +.page-links:lang(ar), +.page-description:lang(ar), +.pagination .nav-links:lang(ar), +.sticky-post:lang(ar), +.site-title:lang(ar), +.site-info:lang(ar), +#cancel-comment-reply-link:lang(ar), +h1:lang(ar), +h2:lang(ar), +h3:lang(ar), +h4:lang(ar), +h5:lang(ar), +h6:lang(ar), .page-title:lang(ar), blockquote cite:lang(ar), table:lang(ar), .button:lang(ar), +input:lang(ar)[type="button"], +input:lang(ar)[type="reset"], +input:lang(ar)[type="submit"], .comment-navigation .nav-previous:lang(ar), +.comment-navigation .nav-next:lang(ar), .comment-list .pingback .comment-body:lang(ar), +.comment-list .trackback .comment-body:lang(ar), .comment-list .pingback .comment-body .comment-edit-link:lang(ar), +.comment-list .trackback .comment-body .comment-edit-link:lang(ar), .comment-form .comment-notes:lang(ar), +.comment-form label:lang(ar), .widget_archive ul li:lang(ar), +.widget_categories ul li:lang(ar), +.widget_meta ul li:lang(ar), +.widget_nav_menu ul li:lang(ar), +.widget_pages ul li:lang(ar), +.widget_recent_comments ul li:lang(ar), +.widget_recent_entries ul li:lang(ar), +.widget_rss ul li:lang(ar), .widget_tag_cloud .tagcloud:lang(ar), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ar), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ar), .entry .entry-content .wp-block-archives li > a:lang(ar), +.entry .entry-content .wp-block-categories li > a:lang(ar), +.entry .entry-content .wp-block-latest-posts li > a:lang(ar), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ar), .entry .entry-content .wp-block-verse:lang(ar), .entry .entry-content .has-drop-cap:lang(ar):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ar), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover-image h2:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover h2:lang(ar), .entry .entry-content .wp-block-audio figcaption:lang(ar), +.entry .entry-content .wp-block-video figcaption:lang(ar), +.entry .entry-content .wp-block-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ar), .entry .entry-content .wp-block-file:lang(ar), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ar), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ar), .wp-caption-text:lang(ar), .gallery-caption:lang(ar) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ary), button:lang(ary), +input:lang(ary), +select:lang(ary), +optgroup:lang(ary), +textarea:lang(ary), .author-description .author-link:lang(ary), +.comment-metadata:lang(ary), +.comment-reply-link:lang(ary), +.comments-title:lang(ary), +.comment-author .fn:lang(ary), +.discussion-meta-info:lang(ary), +.entry-meta:lang(ary), +.entry-footer:lang(ary), +.main-navigation:lang(ary), +.no-comments:lang(ary), +.not-found .page-title:lang(ary), +.error-404 .page-title:lang(ary), +.post-navigation .post-title:lang(ary), +.page-links:lang(ary), +.page-description:lang(ary), +.pagination .nav-links:lang(ary), +.sticky-post:lang(ary), +.site-title:lang(ary), +.site-info:lang(ary), +#cancel-comment-reply-link:lang(ary), +h1:lang(ary), +h2:lang(ary), +h3:lang(ary), +h4:lang(ary), +h5:lang(ary), +h6:lang(ary), .page-title:lang(ary), blockquote cite:lang(ary), table:lang(ary), .button:lang(ary), +input:lang(ary)[type="button"], +input:lang(ary)[type="reset"], +input:lang(ary)[type="submit"], .comment-navigation .nav-previous:lang(ary), +.comment-navigation .nav-next:lang(ary), .comment-list .pingback .comment-body:lang(ary), +.comment-list .trackback .comment-body:lang(ary), .comment-list .pingback .comment-body .comment-edit-link:lang(ary), +.comment-list .trackback .comment-body .comment-edit-link:lang(ary), .comment-form .comment-notes:lang(ary), +.comment-form label:lang(ary), .widget_archive ul li:lang(ary), +.widget_categories ul li:lang(ary), +.widget_meta ul li:lang(ary), +.widget_nav_menu ul li:lang(ary), +.widget_pages ul li:lang(ary), +.widget_recent_comments ul li:lang(ary), +.widget_recent_entries ul li:lang(ary), +.widget_rss ul li:lang(ary), .widget_tag_cloud .tagcloud:lang(ary), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ary), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ary), .entry .entry-content .wp-block-archives li > a:lang(ary), +.entry .entry-content .wp-block-categories li > a:lang(ary), +.entry .entry-content .wp-block-latest-posts li > a:lang(ary), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ary), .entry .entry-content .wp-block-verse:lang(ary), .entry .entry-content .has-drop-cap:lang(ary):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ary), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover-image h2:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover h2:lang(ary), .entry .entry-content .wp-block-audio figcaption:lang(ary), +.entry .entry-content .wp-block-video figcaption:lang(ary), +.entry .entry-content .wp-block-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ary), .entry .entry-content .wp-block-file:lang(ary), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ary), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ary), .wp-caption-text:lang(ary), .gallery-caption:lang(ary) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(azb), button:lang(azb), +input:lang(azb), +select:lang(azb), +optgroup:lang(azb), +textarea:lang(azb), .author-description .author-link:lang(azb), +.comment-metadata:lang(azb), +.comment-reply-link:lang(azb), +.comments-title:lang(azb), +.comment-author .fn:lang(azb), +.discussion-meta-info:lang(azb), +.entry-meta:lang(azb), +.entry-footer:lang(azb), +.main-navigation:lang(azb), +.no-comments:lang(azb), +.not-found .page-title:lang(azb), +.error-404 .page-title:lang(azb), +.post-navigation .post-title:lang(azb), +.page-links:lang(azb), +.page-description:lang(azb), +.pagination .nav-links:lang(azb), +.sticky-post:lang(azb), +.site-title:lang(azb), +.site-info:lang(azb), +#cancel-comment-reply-link:lang(azb), +h1:lang(azb), +h2:lang(azb), +h3:lang(azb), +h4:lang(azb), +h5:lang(azb), +h6:lang(azb), .page-title:lang(azb), blockquote cite:lang(azb), table:lang(azb), .button:lang(azb), +input:lang(azb)[type="button"], +input:lang(azb)[type="reset"], +input:lang(azb)[type="submit"], .comment-navigation .nav-previous:lang(azb), +.comment-navigation .nav-next:lang(azb), .comment-list .pingback .comment-body:lang(azb), +.comment-list .trackback .comment-body:lang(azb), .comment-list .pingback .comment-body .comment-edit-link:lang(azb), +.comment-list .trackback .comment-body .comment-edit-link:lang(azb), .comment-form .comment-notes:lang(azb), +.comment-form label:lang(azb), .widget_archive ul li:lang(azb), +.widget_categories ul li:lang(azb), +.widget_meta ul li:lang(azb), +.widget_nav_menu ul li:lang(azb), +.widget_pages ul li:lang(azb), +.widget_recent_comments ul li:lang(azb), +.widget_recent_entries ul li:lang(azb), +.widget_rss ul li:lang(azb), .widget_tag_cloud .tagcloud:lang(azb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(azb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(azb), .entry .entry-content .wp-block-archives li > a:lang(azb), +.entry .entry-content .wp-block-categories li > a:lang(azb), +.entry .entry-content .wp-block-latest-posts li > a:lang(azb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(azb), .entry .entry-content .wp-block-verse:lang(azb), .entry .entry-content .has-drop-cap:lang(azb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(azb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover-image h2:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover h2:lang(azb), .entry .entry-content .wp-block-audio figcaption:lang(azb), +.entry .entry-content .wp-block-video figcaption:lang(azb), +.entry .entry-content .wp-block-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(azb), .entry .entry-content .wp-block-file:lang(azb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(azb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(azb), .wp-caption-text:lang(azb), .gallery-caption:lang(azb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ckb), button:lang(ckb), +input:lang(ckb), +select:lang(ckb), +optgroup:lang(ckb), +textarea:lang(ckb), .author-description .author-link:lang(ckb), +.comment-metadata:lang(ckb), +.comment-reply-link:lang(ckb), +.comments-title:lang(ckb), +.comment-author .fn:lang(ckb), +.discussion-meta-info:lang(ckb), +.entry-meta:lang(ckb), +.entry-footer:lang(ckb), +.main-navigation:lang(ckb), +.no-comments:lang(ckb), +.not-found .page-title:lang(ckb), +.error-404 .page-title:lang(ckb), +.post-navigation .post-title:lang(ckb), +.page-links:lang(ckb), +.page-description:lang(ckb), +.pagination .nav-links:lang(ckb), +.sticky-post:lang(ckb), +.site-title:lang(ckb), +.site-info:lang(ckb), +#cancel-comment-reply-link:lang(ckb), +h1:lang(ckb), +h2:lang(ckb), +h3:lang(ckb), +h4:lang(ckb), +h5:lang(ckb), +h6:lang(ckb), .page-title:lang(ckb), blockquote cite:lang(ckb), table:lang(ckb), .button:lang(ckb), +input:lang(ckb)[type="button"], +input:lang(ckb)[type="reset"], +input:lang(ckb)[type="submit"], .comment-navigation .nav-previous:lang(ckb), +.comment-navigation .nav-next:lang(ckb), .comment-list .pingback .comment-body:lang(ckb), +.comment-list .trackback .comment-body:lang(ckb), .comment-list .pingback .comment-body .comment-edit-link:lang(ckb), +.comment-list .trackback .comment-body .comment-edit-link:lang(ckb), .comment-form .comment-notes:lang(ckb), +.comment-form label:lang(ckb), .widget_archive ul li:lang(ckb), +.widget_categories ul li:lang(ckb), +.widget_meta ul li:lang(ckb), +.widget_nav_menu ul li:lang(ckb), +.widget_pages ul li:lang(ckb), +.widget_recent_comments ul li:lang(ckb), +.widget_recent_entries ul li:lang(ckb), +.widget_rss ul li:lang(ckb), .widget_tag_cloud .tagcloud:lang(ckb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ckb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ckb), .entry .entry-content .wp-block-archives li > a:lang(ckb), +.entry .entry-content .wp-block-categories li > a:lang(ckb), +.entry .entry-content .wp-block-latest-posts li > a:lang(ckb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ckb), .entry .entry-content .wp-block-verse:lang(ckb), .entry .entry-content .has-drop-cap:lang(ckb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ckb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover-image h2:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover h2:lang(ckb), .entry .entry-content .wp-block-audio figcaption:lang(ckb), +.entry .entry-content .wp-block-video figcaption:lang(ckb), +.entry .entry-content .wp-block-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ckb), .entry .entry-content .wp-block-file:lang(ckb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ckb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ckb), .wp-caption-text:lang(ckb), .gallery-caption:lang(ckb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(fa-IR), button:lang(fa-IR), +input:lang(fa-IR), +select:lang(fa-IR), +optgroup:lang(fa-IR), +textarea:lang(fa-IR), .author-description .author-link:lang(fa-IR), +.comment-metadata:lang(fa-IR), +.comment-reply-link:lang(fa-IR), +.comments-title:lang(fa-IR), +.comment-author .fn:lang(fa-IR), +.discussion-meta-info:lang(fa-IR), +.entry-meta:lang(fa-IR), +.entry-footer:lang(fa-IR), +.main-navigation:lang(fa-IR), +.no-comments:lang(fa-IR), +.not-found .page-title:lang(fa-IR), +.error-404 .page-title:lang(fa-IR), +.post-navigation .post-title:lang(fa-IR), +.page-links:lang(fa-IR), +.page-description:lang(fa-IR), +.pagination .nav-links:lang(fa-IR), +.sticky-post:lang(fa-IR), +.site-title:lang(fa-IR), +.site-info:lang(fa-IR), +#cancel-comment-reply-link:lang(fa-IR), +h1:lang(fa-IR), +h2:lang(fa-IR), +h3:lang(fa-IR), +h4:lang(fa-IR), +h5:lang(fa-IR), +h6:lang(fa-IR), .page-title:lang(fa-IR), blockquote cite:lang(fa-IR), table:lang(fa-IR), .button:lang(fa-IR), +input:lang(fa-IR)[type="button"], +input:lang(fa-IR)[type="reset"], +input:lang(fa-IR)[type="submit"], .comment-navigation .nav-previous:lang(fa-IR), +.comment-navigation .nav-next:lang(fa-IR), .comment-list .pingback .comment-body:lang(fa-IR), +.comment-list .trackback .comment-body:lang(fa-IR), .comment-list .pingback .comment-body .comment-edit-link:lang(fa-IR), +.comment-list .trackback .comment-body .comment-edit-link:lang(fa-IR), .comment-form .comment-notes:lang(fa-IR), +.comment-form label:lang(fa-IR), .widget_archive ul li:lang(fa-IR), +.widget_categories ul li:lang(fa-IR), +.widget_meta ul li:lang(fa-IR), +.widget_nav_menu ul li:lang(fa-IR), +.widget_pages ul li:lang(fa-IR), +.widget_recent_comments ul li:lang(fa-IR), +.widget_recent_entries ul li:lang(fa-IR), +.widget_rss ul li:lang(fa-IR), .widget_tag_cloud .tagcloud:lang(fa-IR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(fa-IR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(fa-IR), .entry .entry-content .wp-block-archives li > a:lang(fa-IR), +.entry .entry-content .wp-block-categories li > a:lang(fa-IR), +.entry .entry-content .wp-block-latest-posts li > a:lang(fa-IR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(fa-IR), .entry .entry-content .wp-block-verse:lang(fa-IR), .entry .entry-content .has-drop-cap:lang(fa-IR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(fa-IR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image h2:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover h2:lang(fa-IR), .entry .entry-content .wp-block-audio figcaption:lang(fa-IR), +.entry .entry-content .wp-block-video figcaption:lang(fa-IR), +.entry .entry-content .wp-block-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(fa-IR), .entry .entry-content .wp-block-file:lang(fa-IR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(fa-IR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(fa-IR), .wp-caption-text:lang(fa-IR), .gallery-caption:lang(fa-IR) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(haz), button:lang(haz), +input:lang(haz), +select:lang(haz), +optgroup:lang(haz), +textarea:lang(haz), .author-description .author-link:lang(haz), +.comment-metadata:lang(haz), +.comment-reply-link:lang(haz), +.comments-title:lang(haz), +.comment-author .fn:lang(haz), +.discussion-meta-info:lang(haz), +.entry-meta:lang(haz), +.entry-footer:lang(haz), +.main-navigation:lang(haz), +.no-comments:lang(haz), +.not-found .page-title:lang(haz), +.error-404 .page-title:lang(haz), +.post-navigation .post-title:lang(haz), +.page-links:lang(haz), +.page-description:lang(haz), +.pagination .nav-links:lang(haz), +.sticky-post:lang(haz), +.site-title:lang(haz), +.site-info:lang(haz), +#cancel-comment-reply-link:lang(haz), +h1:lang(haz), +h2:lang(haz), +h3:lang(haz), +h4:lang(haz), +h5:lang(haz), +h6:lang(haz), .page-title:lang(haz), blockquote cite:lang(haz), table:lang(haz), .button:lang(haz), +input:lang(haz)[type="button"], +input:lang(haz)[type="reset"], +input:lang(haz)[type="submit"], .comment-navigation .nav-previous:lang(haz), +.comment-navigation .nav-next:lang(haz), .comment-list .pingback .comment-body:lang(haz), +.comment-list .trackback .comment-body:lang(haz), .comment-list .pingback .comment-body .comment-edit-link:lang(haz), +.comment-list .trackback .comment-body .comment-edit-link:lang(haz), .comment-form .comment-notes:lang(haz), +.comment-form label:lang(haz), .widget_archive ul li:lang(haz), +.widget_categories ul li:lang(haz), +.widget_meta ul li:lang(haz), +.widget_nav_menu ul li:lang(haz), +.widget_pages ul li:lang(haz), +.widget_recent_comments ul li:lang(haz), +.widget_recent_entries ul li:lang(haz), +.widget_rss ul li:lang(haz), .widget_tag_cloud .tagcloud:lang(haz), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(haz), .entry .entry-content .wp-block-button .wp-block-button__link:lang(haz), .entry .entry-content .wp-block-archives li > a:lang(haz), +.entry .entry-content .wp-block-categories li > a:lang(haz), +.entry .entry-content .wp-block-latest-posts li > a:lang(haz), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(haz), .entry .entry-content .wp-block-verse:lang(haz), .entry .entry-content .has-drop-cap:lang(haz):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(haz), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover-image h2:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover h2:lang(haz), .entry .entry-content .wp-block-audio figcaption:lang(haz), +.entry .entry-content .wp-block-video figcaption:lang(haz), +.entry .entry-content .wp-block-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(haz), .entry .entry-content .wp-block-file:lang(haz), .entry .entry-content .wp-block-file .wp-block-file__button:lang(haz), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(haz), .wp-caption-text:lang(haz), .gallery-caption:lang(haz) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ps), button:lang(ps), +input:lang(ps), +select:lang(ps), +optgroup:lang(ps), +textarea:lang(ps), .author-description .author-link:lang(ps), +.comment-metadata:lang(ps), +.comment-reply-link:lang(ps), +.comments-title:lang(ps), +.comment-author .fn:lang(ps), +.discussion-meta-info:lang(ps), +.entry-meta:lang(ps), +.entry-footer:lang(ps), +.main-navigation:lang(ps), +.no-comments:lang(ps), +.not-found .page-title:lang(ps), +.error-404 .page-title:lang(ps), +.post-navigation .post-title:lang(ps), +.page-links:lang(ps), +.page-description:lang(ps), +.pagination .nav-links:lang(ps), +.sticky-post:lang(ps), +.site-title:lang(ps), +.site-info:lang(ps), +#cancel-comment-reply-link:lang(ps), +h1:lang(ps), +h2:lang(ps), +h3:lang(ps), +h4:lang(ps), +h5:lang(ps), +h6:lang(ps), .page-title:lang(ps), blockquote cite:lang(ps), table:lang(ps), .button:lang(ps), +input:lang(ps)[type="button"], +input:lang(ps)[type="reset"], +input:lang(ps)[type="submit"], .comment-navigation .nav-previous:lang(ps), +.comment-navigation .nav-next:lang(ps), .comment-list .pingback .comment-body:lang(ps), +.comment-list .trackback .comment-body:lang(ps), .comment-list .pingback .comment-body .comment-edit-link:lang(ps), +.comment-list .trackback .comment-body .comment-edit-link:lang(ps), .comment-form .comment-notes:lang(ps), +.comment-form label:lang(ps), .widget_archive ul li:lang(ps), +.widget_categories ul li:lang(ps), +.widget_meta ul li:lang(ps), +.widget_nav_menu ul li:lang(ps), +.widget_pages ul li:lang(ps), +.widget_recent_comments ul li:lang(ps), +.widget_recent_entries ul li:lang(ps), +.widget_rss ul li:lang(ps), .widget_tag_cloud .tagcloud:lang(ps), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ps), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ps), .entry .entry-content .wp-block-archives li > a:lang(ps), +.entry .entry-content .wp-block-categories li > a:lang(ps), +.entry .entry-content .wp-block-latest-posts li > a:lang(ps), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ps), .entry .entry-content .wp-block-verse:lang(ps), .entry .entry-content .has-drop-cap:lang(ps):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ps), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover-image h2:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover h2:lang(ps), .entry .entry-content .wp-block-audio figcaption:lang(ps), +.entry .entry-content .wp-block-video figcaption:lang(ps), +.entry .entry-content .wp-block-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ps), .entry .entry-content .wp-block-file:lang(ps), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ps), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ps), .wp-caption-text:lang(ps), .gallery-caption:lang(ps) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(be), button:lang(be), +input:lang(be), +select:lang(be), +optgroup:lang(be), +textarea:lang(be), .author-description .author-link:lang(be), +.comment-metadata:lang(be), +.comment-reply-link:lang(be), +.comments-title:lang(be), +.comment-author .fn:lang(be), +.discussion-meta-info:lang(be), +.entry-meta:lang(be), +.entry-footer:lang(be), +.main-navigation:lang(be), +.no-comments:lang(be), +.not-found .page-title:lang(be), +.error-404 .page-title:lang(be), +.post-navigation .post-title:lang(be), +.page-links:lang(be), +.page-description:lang(be), +.pagination .nav-links:lang(be), +.sticky-post:lang(be), +.site-title:lang(be), +.site-info:lang(be), +#cancel-comment-reply-link:lang(be), +h1:lang(be), +h2:lang(be), +h3:lang(be), +h4:lang(be), +h5:lang(be), +h6:lang(be), .page-title:lang(be), blockquote cite:lang(be), table:lang(be), .button:lang(be), +input:lang(be)[type="button"], +input:lang(be)[type="reset"], +input:lang(be)[type="submit"], .comment-navigation .nav-previous:lang(be), +.comment-navigation .nav-next:lang(be), .comment-list .pingback .comment-body:lang(be), +.comment-list .trackback .comment-body:lang(be), .comment-list .pingback .comment-body .comment-edit-link:lang(be), +.comment-list .trackback .comment-body .comment-edit-link:lang(be), .comment-form .comment-notes:lang(be), +.comment-form label:lang(be), .widget_archive ul li:lang(be), +.widget_categories ul li:lang(be), +.widget_meta ul li:lang(be), +.widget_nav_menu ul li:lang(be), +.widget_pages ul li:lang(be), +.widget_recent_comments ul li:lang(be), +.widget_recent_entries ul li:lang(be), +.widget_rss ul li:lang(be), .widget_tag_cloud .tagcloud:lang(be), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(be), .entry .entry-content .wp-block-button .wp-block-button__link:lang(be), .entry .entry-content .wp-block-archives li > a:lang(be), +.entry .entry-content .wp-block-categories li > a:lang(be), +.entry .entry-content .wp-block-latest-posts li > a:lang(be), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(be), .entry .entry-content .wp-block-verse:lang(be), .entry .entry-content .has-drop-cap:lang(be):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(be), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover-image h2:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover h2:lang(be), .entry .entry-content .wp-block-audio figcaption:lang(be), +.entry .entry-content .wp-block-video figcaption:lang(be), +.entry .entry-content .wp-block-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(be), .entry .entry-content .wp-block-file:lang(be), .entry .entry-content .wp-block-file .wp-block-file__button:lang(be), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(be), .wp-caption-text:lang(be), .gallery-caption:lang(be) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(bg-BG), button:lang(bg-BG), +input:lang(bg-BG), +select:lang(bg-BG), +optgroup:lang(bg-BG), +textarea:lang(bg-BG), .author-description .author-link:lang(bg-BG), +.comment-metadata:lang(bg-BG), +.comment-reply-link:lang(bg-BG), +.comments-title:lang(bg-BG), +.comment-author .fn:lang(bg-BG), +.discussion-meta-info:lang(bg-BG), +.entry-meta:lang(bg-BG), +.entry-footer:lang(bg-BG), +.main-navigation:lang(bg-BG), +.no-comments:lang(bg-BG), +.not-found .page-title:lang(bg-BG), +.error-404 .page-title:lang(bg-BG), +.post-navigation .post-title:lang(bg-BG), +.page-links:lang(bg-BG), +.page-description:lang(bg-BG), +.pagination .nav-links:lang(bg-BG), +.sticky-post:lang(bg-BG), +.site-title:lang(bg-BG), +.site-info:lang(bg-BG), +#cancel-comment-reply-link:lang(bg-BG), +h1:lang(bg-BG), +h2:lang(bg-BG), +h3:lang(bg-BG), +h4:lang(bg-BG), +h5:lang(bg-BG), +h6:lang(bg-BG), .page-title:lang(bg-BG), blockquote cite:lang(bg-BG), table:lang(bg-BG), .button:lang(bg-BG), +input:lang(bg-BG)[type="button"], +input:lang(bg-BG)[type="reset"], +input:lang(bg-BG)[type="submit"], .comment-navigation .nav-previous:lang(bg-BG), +.comment-navigation .nav-next:lang(bg-BG), .comment-list .pingback .comment-body:lang(bg-BG), +.comment-list .trackback .comment-body:lang(bg-BG), .comment-list .pingback .comment-body .comment-edit-link:lang(bg-BG), +.comment-list .trackback .comment-body .comment-edit-link:lang(bg-BG), .comment-form .comment-notes:lang(bg-BG), +.comment-form label:lang(bg-BG), .widget_archive ul li:lang(bg-BG), +.widget_categories ul li:lang(bg-BG), +.widget_meta ul li:lang(bg-BG), +.widget_nav_menu ul li:lang(bg-BG), +.widget_pages ul li:lang(bg-BG), +.widget_recent_comments ul li:lang(bg-BG), +.widget_recent_entries ul li:lang(bg-BG), +.widget_rss ul li:lang(bg-BG), .widget_tag_cloud .tagcloud:lang(bg-BG), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bg-BG), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bg-BG), .entry .entry-content .wp-block-archives li > a:lang(bg-BG), +.entry .entry-content .wp-block-categories li > a:lang(bg-BG), +.entry .entry-content .wp-block-latest-posts li > a:lang(bg-BG), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bg-BG), .entry .entry-content .wp-block-verse:lang(bg-BG), .entry .entry-content .has-drop-cap:lang(bg-BG):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bg-BG), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image h2:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover h2:lang(bg-BG), .entry .entry-content .wp-block-audio figcaption:lang(bg-BG), +.entry .entry-content .wp-block-video figcaption:lang(bg-BG), +.entry .entry-content .wp-block-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bg-BG), .entry .entry-content .wp-block-file:lang(bg-BG), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bg-BG), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bg-BG), .wp-caption-text:lang(bg-BG), .gallery-caption:lang(bg-BG) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(kk), button:lang(kk), +input:lang(kk), +select:lang(kk), +optgroup:lang(kk), +textarea:lang(kk), .author-description .author-link:lang(kk), +.comment-metadata:lang(kk), +.comment-reply-link:lang(kk), +.comments-title:lang(kk), +.comment-author .fn:lang(kk), +.discussion-meta-info:lang(kk), +.entry-meta:lang(kk), +.entry-footer:lang(kk), +.main-navigation:lang(kk), +.no-comments:lang(kk), +.not-found .page-title:lang(kk), +.error-404 .page-title:lang(kk), +.post-navigation .post-title:lang(kk), +.page-links:lang(kk), +.page-description:lang(kk), +.pagination .nav-links:lang(kk), +.sticky-post:lang(kk), +.site-title:lang(kk), +.site-info:lang(kk), +#cancel-comment-reply-link:lang(kk), +h1:lang(kk), +h2:lang(kk), +h3:lang(kk), +h4:lang(kk), +h5:lang(kk), +h6:lang(kk), .page-title:lang(kk), blockquote cite:lang(kk), table:lang(kk), .button:lang(kk), +input:lang(kk)[type="button"], +input:lang(kk)[type="reset"], +input:lang(kk)[type="submit"], .comment-navigation .nav-previous:lang(kk), +.comment-navigation .nav-next:lang(kk), .comment-list .pingback .comment-body:lang(kk), +.comment-list .trackback .comment-body:lang(kk), .comment-list .pingback .comment-body .comment-edit-link:lang(kk), +.comment-list .trackback .comment-body .comment-edit-link:lang(kk), .comment-form .comment-notes:lang(kk), +.comment-form label:lang(kk), .widget_archive ul li:lang(kk), +.widget_categories ul li:lang(kk), +.widget_meta ul li:lang(kk), +.widget_nav_menu ul li:lang(kk), +.widget_pages ul li:lang(kk), +.widget_recent_comments ul li:lang(kk), +.widget_recent_entries ul li:lang(kk), +.widget_rss ul li:lang(kk), .widget_tag_cloud .tagcloud:lang(kk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(kk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(kk), .entry .entry-content .wp-block-archives li > a:lang(kk), +.entry .entry-content .wp-block-categories li > a:lang(kk), +.entry .entry-content .wp-block-latest-posts li > a:lang(kk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(kk), .entry .entry-content .wp-block-verse:lang(kk), .entry .entry-content .has-drop-cap:lang(kk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(kk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover-image h2:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover h2:lang(kk), .entry .entry-content .wp-block-audio figcaption:lang(kk), +.entry .entry-content .wp-block-video figcaption:lang(kk), +.entry .entry-content .wp-block-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(kk), .entry .entry-content .wp-block-file:lang(kk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(kk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(kk), .wp-caption-text:lang(kk), .gallery-caption:lang(kk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mk-MK), button:lang(mk-MK), +input:lang(mk-MK), +select:lang(mk-MK), +optgroup:lang(mk-MK), +textarea:lang(mk-MK), .author-description .author-link:lang(mk-MK), +.comment-metadata:lang(mk-MK), +.comment-reply-link:lang(mk-MK), +.comments-title:lang(mk-MK), +.comment-author .fn:lang(mk-MK), +.discussion-meta-info:lang(mk-MK), +.entry-meta:lang(mk-MK), +.entry-footer:lang(mk-MK), +.main-navigation:lang(mk-MK), +.no-comments:lang(mk-MK), +.not-found .page-title:lang(mk-MK), +.error-404 .page-title:lang(mk-MK), +.post-navigation .post-title:lang(mk-MK), +.page-links:lang(mk-MK), +.page-description:lang(mk-MK), +.pagination .nav-links:lang(mk-MK), +.sticky-post:lang(mk-MK), +.site-title:lang(mk-MK), +.site-info:lang(mk-MK), +#cancel-comment-reply-link:lang(mk-MK), +h1:lang(mk-MK), +h2:lang(mk-MK), +h3:lang(mk-MK), +h4:lang(mk-MK), +h5:lang(mk-MK), +h6:lang(mk-MK), .page-title:lang(mk-MK), blockquote cite:lang(mk-MK), table:lang(mk-MK), .button:lang(mk-MK), +input:lang(mk-MK)[type="button"], +input:lang(mk-MK)[type="reset"], +input:lang(mk-MK)[type="submit"], .comment-navigation .nav-previous:lang(mk-MK), +.comment-navigation .nav-next:lang(mk-MK), .comment-list .pingback .comment-body:lang(mk-MK), +.comment-list .trackback .comment-body:lang(mk-MK), .comment-list .pingback .comment-body .comment-edit-link:lang(mk-MK), +.comment-list .trackback .comment-body .comment-edit-link:lang(mk-MK), .comment-form .comment-notes:lang(mk-MK), +.comment-form label:lang(mk-MK), .widget_archive ul li:lang(mk-MK), +.widget_categories ul li:lang(mk-MK), +.widget_meta ul li:lang(mk-MK), +.widget_nav_menu ul li:lang(mk-MK), +.widget_pages ul li:lang(mk-MK), +.widget_recent_comments ul li:lang(mk-MK), +.widget_recent_entries ul li:lang(mk-MK), +.widget_rss ul li:lang(mk-MK), .widget_tag_cloud .tagcloud:lang(mk-MK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mk-MK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mk-MK), .entry .entry-content .wp-block-archives li > a:lang(mk-MK), +.entry .entry-content .wp-block-categories li > a:lang(mk-MK), +.entry .entry-content .wp-block-latest-posts li > a:lang(mk-MK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mk-MK), .entry .entry-content .wp-block-verse:lang(mk-MK), .entry .entry-content .has-drop-cap:lang(mk-MK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mk-MK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image h2:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover h2:lang(mk-MK), .entry .entry-content .wp-block-audio figcaption:lang(mk-MK), +.entry .entry-content .wp-block-video figcaption:lang(mk-MK), +.entry .entry-content .wp-block-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mk-MK), .entry .entry-content .wp-block-file:lang(mk-MK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mk-MK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mk-MK), .wp-caption-text:lang(mk-MK), .gallery-caption:lang(mk-MK) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mn), button:lang(mn), +input:lang(mn), +select:lang(mn), +optgroup:lang(mn), +textarea:lang(mn), .author-description .author-link:lang(mn), +.comment-metadata:lang(mn), +.comment-reply-link:lang(mn), +.comments-title:lang(mn), +.comment-author .fn:lang(mn), +.discussion-meta-info:lang(mn), +.entry-meta:lang(mn), +.entry-footer:lang(mn), +.main-navigation:lang(mn), +.no-comments:lang(mn), +.not-found .page-title:lang(mn), +.error-404 .page-title:lang(mn), +.post-navigation .post-title:lang(mn), +.page-links:lang(mn), +.page-description:lang(mn), +.pagination .nav-links:lang(mn), +.sticky-post:lang(mn), +.site-title:lang(mn), +.site-info:lang(mn), +#cancel-comment-reply-link:lang(mn), +h1:lang(mn), +h2:lang(mn), +h3:lang(mn), +h4:lang(mn), +h5:lang(mn), +h6:lang(mn), .page-title:lang(mn), blockquote cite:lang(mn), table:lang(mn), .button:lang(mn), +input:lang(mn)[type="button"], +input:lang(mn)[type="reset"], +input:lang(mn)[type="submit"], .comment-navigation .nav-previous:lang(mn), +.comment-navigation .nav-next:lang(mn), .comment-list .pingback .comment-body:lang(mn), +.comment-list .trackback .comment-body:lang(mn), .comment-list .pingback .comment-body .comment-edit-link:lang(mn), +.comment-list .trackback .comment-body .comment-edit-link:lang(mn), .comment-form .comment-notes:lang(mn), +.comment-form label:lang(mn), .widget_archive ul li:lang(mn), +.widget_categories ul li:lang(mn), +.widget_meta ul li:lang(mn), +.widget_nav_menu ul li:lang(mn), +.widget_pages ul li:lang(mn), +.widget_recent_comments ul li:lang(mn), +.widget_recent_entries ul li:lang(mn), +.widget_rss ul li:lang(mn), .widget_tag_cloud .tagcloud:lang(mn), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mn), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mn), .entry .entry-content .wp-block-archives li > a:lang(mn), +.entry .entry-content .wp-block-categories li > a:lang(mn), +.entry .entry-content .wp-block-latest-posts li > a:lang(mn), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mn), .entry .entry-content .wp-block-verse:lang(mn), .entry .entry-content .has-drop-cap:lang(mn):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mn), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover-image h2:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover h2:lang(mn), .entry .entry-content .wp-block-audio figcaption:lang(mn), +.entry .entry-content .wp-block-video figcaption:lang(mn), +.entry .entry-content .wp-block-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mn), .entry .entry-content .wp-block-file:lang(mn), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mn), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mn), .wp-caption-text:lang(mn), .gallery-caption:lang(mn) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(ru-RU), button:lang(ru-RU), +input:lang(ru-RU), +select:lang(ru-RU), +optgroup:lang(ru-RU), +textarea:lang(ru-RU), .author-description .author-link:lang(ru-RU), +.comment-metadata:lang(ru-RU), +.comment-reply-link:lang(ru-RU), +.comments-title:lang(ru-RU), +.comment-author .fn:lang(ru-RU), +.discussion-meta-info:lang(ru-RU), +.entry-meta:lang(ru-RU), +.entry-footer:lang(ru-RU), +.main-navigation:lang(ru-RU), +.no-comments:lang(ru-RU), +.not-found .page-title:lang(ru-RU), +.error-404 .page-title:lang(ru-RU), +.post-navigation .post-title:lang(ru-RU), +.page-links:lang(ru-RU), +.page-description:lang(ru-RU), +.pagination .nav-links:lang(ru-RU), +.sticky-post:lang(ru-RU), +.site-title:lang(ru-RU), +.site-info:lang(ru-RU), +#cancel-comment-reply-link:lang(ru-RU), +h1:lang(ru-RU), +h2:lang(ru-RU), +h3:lang(ru-RU), +h4:lang(ru-RU), +h5:lang(ru-RU), +h6:lang(ru-RU), .page-title:lang(ru-RU), blockquote cite:lang(ru-RU), table:lang(ru-RU), .button:lang(ru-RU), +input:lang(ru-RU)[type="button"], +input:lang(ru-RU)[type="reset"], +input:lang(ru-RU)[type="submit"], .comment-navigation .nav-previous:lang(ru-RU), +.comment-navigation .nav-next:lang(ru-RU), .comment-list .pingback .comment-body:lang(ru-RU), +.comment-list .trackback .comment-body:lang(ru-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(ru-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(ru-RU), .comment-form .comment-notes:lang(ru-RU), +.comment-form label:lang(ru-RU), .widget_archive ul li:lang(ru-RU), +.widget_categories ul li:lang(ru-RU), +.widget_meta ul li:lang(ru-RU), +.widget_nav_menu ul li:lang(ru-RU), +.widget_pages ul li:lang(ru-RU), +.widget_recent_comments ul li:lang(ru-RU), +.widget_recent_entries ul li:lang(ru-RU), +.widget_rss ul li:lang(ru-RU), .widget_tag_cloud .tagcloud:lang(ru-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ru-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ru-RU), .entry .entry-content .wp-block-archives li > a:lang(ru-RU), +.entry .entry-content .wp-block-categories li > a:lang(ru-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(ru-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ru-RU), .entry .entry-content .wp-block-verse:lang(ru-RU), .entry .entry-content .has-drop-cap:lang(ru-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ru-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image h2:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover h2:lang(ru-RU), .entry .entry-content .wp-block-audio figcaption:lang(ru-RU), +.entry .entry-content .wp-block-video figcaption:lang(ru-RU), +.entry .entry-content .wp-block-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ru-RU), .entry .entry-content .wp-block-file:lang(ru-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ru-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ru-RU), .wp-caption-text:lang(ru-RU), .gallery-caption:lang(ru-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sah), button:lang(sah), +input:lang(sah), +select:lang(sah), +optgroup:lang(sah), +textarea:lang(sah), .author-description .author-link:lang(sah), +.comment-metadata:lang(sah), +.comment-reply-link:lang(sah), +.comments-title:lang(sah), +.comment-author .fn:lang(sah), +.discussion-meta-info:lang(sah), +.entry-meta:lang(sah), +.entry-footer:lang(sah), +.main-navigation:lang(sah), +.no-comments:lang(sah), +.not-found .page-title:lang(sah), +.error-404 .page-title:lang(sah), +.post-navigation .post-title:lang(sah), +.page-links:lang(sah), +.page-description:lang(sah), +.pagination .nav-links:lang(sah), +.sticky-post:lang(sah), +.site-title:lang(sah), +.site-info:lang(sah), +#cancel-comment-reply-link:lang(sah), +h1:lang(sah), +h2:lang(sah), +h3:lang(sah), +h4:lang(sah), +h5:lang(sah), +h6:lang(sah), .page-title:lang(sah), blockquote cite:lang(sah), table:lang(sah), .button:lang(sah), +input:lang(sah)[type="button"], +input:lang(sah)[type="reset"], +input:lang(sah)[type="submit"], .comment-navigation .nav-previous:lang(sah), +.comment-navigation .nav-next:lang(sah), .comment-list .pingback .comment-body:lang(sah), +.comment-list .trackback .comment-body:lang(sah), .comment-list .pingback .comment-body .comment-edit-link:lang(sah), +.comment-list .trackback .comment-body .comment-edit-link:lang(sah), .comment-form .comment-notes:lang(sah), +.comment-form label:lang(sah), .widget_archive ul li:lang(sah), +.widget_categories ul li:lang(sah), +.widget_meta ul li:lang(sah), +.widget_nav_menu ul li:lang(sah), +.widget_pages ul li:lang(sah), +.widget_recent_comments ul li:lang(sah), +.widget_recent_entries ul li:lang(sah), +.widget_rss ul li:lang(sah), .widget_tag_cloud .tagcloud:lang(sah), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sah), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sah), .entry .entry-content .wp-block-archives li > a:lang(sah), +.entry .entry-content .wp-block-categories li > a:lang(sah), +.entry .entry-content .wp-block-latest-posts li > a:lang(sah), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sah), .entry .entry-content .wp-block-verse:lang(sah), .entry .entry-content .has-drop-cap:lang(sah):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sah), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover-image h2:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover h2:lang(sah), .entry .entry-content .wp-block-audio figcaption:lang(sah), +.entry .entry-content .wp-block-video figcaption:lang(sah), +.entry .entry-content .wp-block-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sah), .entry .entry-content .wp-block-file:lang(sah), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sah), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sah), .wp-caption-text:lang(sah), .gallery-caption:lang(sah) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sr-RS), button:lang(sr-RS), +input:lang(sr-RS), +select:lang(sr-RS), +optgroup:lang(sr-RS), +textarea:lang(sr-RS), .author-description .author-link:lang(sr-RS), +.comment-metadata:lang(sr-RS), +.comment-reply-link:lang(sr-RS), +.comments-title:lang(sr-RS), +.comment-author .fn:lang(sr-RS), +.discussion-meta-info:lang(sr-RS), +.entry-meta:lang(sr-RS), +.entry-footer:lang(sr-RS), +.main-navigation:lang(sr-RS), +.no-comments:lang(sr-RS), +.not-found .page-title:lang(sr-RS), +.error-404 .page-title:lang(sr-RS), +.post-navigation .post-title:lang(sr-RS), +.page-links:lang(sr-RS), +.page-description:lang(sr-RS), +.pagination .nav-links:lang(sr-RS), +.sticky-post:lang(sr-RS), +.site-title:lang(sr-RS), +.site-info:lang(sr-RS), +#cancel-comment-reply-link:lang(sr-RS), +h1:lang(sr-RS), +h2:lang(sr-RS), +h3:lang(sr-RS), +h4:lang(sr-RS), +h5:lang(sr-RS), +h6:lang(sr-RS), .page-title:lang(sr-RS), blockquote cite:lang(sr-RS), table:lang(sr-RS), .button:lang(sr-RS), +input:lang(sr-RS)[type="button"], +input:lang(sr-RS)[type="reset"], +input:lang(sr-RS)[type="submit"], .comment-navigation .nav-previous:lang(sr-RS), +.comment-navigation .nav-next:lang(sr-RS), .comment-list .pingback .comment-body:lang(sr-RS), +.comment-list .trackback .comment-body:lang(sr-RS), .comment-list .pingback .comment-body .comment-edit-link:lang(sr-RS), +.comment-list .trackback .comment-body .comment-edit-link:lang(sr-RS), .comment-form .comment-notes:lang(sr-RS), +.comment-form label:lang(sr-RS), .widget_archive ul li:lang(sr-RS), +.widget_categories ul li:lang(sr-RS), +.widget_meta ul li:lang(sr-RS), +.widget_nav_menu ul li:lang(sr-RS), +.widget_pages ul li:lang(sr-RS), +.widget_recent_comments ul li:lang(sr-RS), +.widget_recent_entries ul li:lang(sr-RS), +.widget_rss ul li:lang(sr-RS), .widget_tag_cloud .tagcloud:lang(sr-RS), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sr-RS), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sr-RS), .entry .entry-content .wp-block-archives li > a:lang(sr-RS), +.entry .entry-content .wp-block-categories li > a:lang(sr-RS), +.entry .entry-content .wp-block-latest-posts li > a:lang(sr-RS), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sr-RS), .entry .entry-content .wp-block-verse:lang(sr-RS), .entry .entry-content .has-drop-cap:lang(sr-RS):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sr-RS), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image h2:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover h2:lang(sr-RS), .entry .entry-content .wp-block-audio figcaption:lang(sr-RS), +.entry .entry-content .wp-block-video figcaption:lang(sr-RS), +.entry .entry-content .wp-block-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sr-RS), .entry .entry-content .wp-block-file:lang(sr-RS), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sr-RS), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sr-RS), .wp-caption-text:lang(sr-RS), .gallery-caption:lang(sr-RS) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(tt-RU), button:lang(tt-RU), +input:lang(tt-RU), +select:lang(tt-RU), +optgroup:lang(tt-RU), +textarea:lang(tt-RU), .author-description .author-link:lang(tt-RU), +.comment-metadata:lang(tt-RU), +.comment-reply-link:lang(tt-RU), +.comments-title:lang(tt-RU), +.comment-author .fn:lang(tt-RU), +.discussion-meta-info:lang(tt-RU), +.entry-meta:lang(tt-RU), +.entry-footer:lang(tt-RU), +.main-navigation:lang(tt-RU), +.no-comments:lang(tt-RU), +.not-found .page-title:lang(tt-RU), +.error-404 .page-title:lang(tt-RU), +.post-navigation .post-title:lang(tt-RU), +.page-links:lang(tt-RU), +.page-description:lang(tt-RU), +.pagination .nav-links:lang(tt-RU), +.sticky-post:lang(tt-RU), +.site-title:lang(tt-RU), +.site-info:lang(tt-RU), +#cancel-comment-reply-link:lang(tt-RU), +h1:lang(tt-RU), +h2:lang(tt-RU), +h3:lang(tt-RU), +h4:lang(tt-RU), +h5:lang(tt-RU), +h6:lang(tt-RU), .page-title:lang(tt-RU), blockquote cite:lang(tt-RU), table:lang(tt-RU), .button:lang(tt-RU), +input:lang(tt-RU)[type="button"], +input:lang(tt-RU)[type="reset"], +input:lang(tt-RU)[type="submit"], .comment-navigation .nav-previous:lang(tt-RU), +.comment-navigation .nav-next:lang(tt-RU), .comment-list .pingback .comment-body:lang(tt-RU), +.comment-list .trackback .comment-body:lang(tt-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(tt-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(tt-RU), .comment-form .comment-notes:lang(tt-RU), +.comment-form label:lang(tt-RU), .widget_archive ul li:lang(tt-RU), +.widget_categories ul li:lang(tt-RU), +.widget_meta ul li:lang(tt-RU), +.widget_nav_menu ul li:lang(tt-RU), +.widget_pages ul li:lang(tt-RU), +.widget_recent_comments ul li:lang(tt-RU), +.widget_recent_entries ul li:lang(tt-RU), +.widget_rss ul li:lang(tt-RU), .widget_tag_cloud .tagcloud:lang(tt-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(tt-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(tt-RU), .entry .entry-content .wp-block-archives li > a:lang(tt-RU), +.entry .entry-content .wp-block-categories li > a:lang(tt-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(tt-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(tt-RU), .entry .entry-content .wp-block-verse:lang(tt-RU), .entry .entry-content .has-drop-cap:lang(tt-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(tt-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image h2:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover h2:lang(tt-RU), .entry .entry-content .wp-block-audio figcaption:lang(tt-RU), +.entry .entry-content .wp-block-video figcaption:lang(tt-RU), +.entry .entry-content .wp-block-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(tt-RU), .entry .entry-content .wp-block-file:lang(tt-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(tt-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(tt-RU), .wp-caption-text:lang(tt-RU), .gallery-caption:lang(tt-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(uk), button:lang(uk), +input:lang(uk), +select:lang(uk), +optgroup:lang(uk), +textarea:lang(uk), .author-description .author-link:lang(uk), +.comment-metadata:lang(uk), +.comment-reply-link:lang(uk), +.comments-title:lang(uk), +.comment-author .fn:lang(uk), +.discussion-meta-info:lang(uk), +.entry-meta:lang(uk), +.entry-footer:lang(uk), +.main-navigation:lang(uk), +.no-comments:lang(uk), +.not-found .page-title:lang(uk), +.error-404 .page-title:lang(uk), +.post-navigation .post-title:lang(uk), +.page-links:lang(uk), +.page-description:lang(uk), +.pagination .nav-links:lang(uk), +.sticky-post:lang(uk), +.site-title:lang(uk), +.site-info:lang(uk), +#cancel-comment-reply-link:lang(uk), +h1:lang(uk), +h2:lang(uk), +h3:lang(uk), +h4:lang(uk), +h5:lang(uk), +h6:lang(uk), .page-title:lang(uk), blockquote cite:lang(uk), table:lang(uk), .button:lang(uk), +input:lang(uk)[type="button"], +input:lang(uk)[type="reset"], +input:lang(uk)[type="submit"], .comment-navigation .nav-previous:lang(uk), +.comment-navigation .nav-next:lang(uk), .comment-list .pingback .comment-body:lang(uk), +.comment-list .trackback .comment-body:lang(uk), .comment-list .pingback .comment-body .comment-edit-link:lang(uk), +.comment-list .trackback .comment-body .comment-edit-link:lang(uk), .comment-form .comment-notes:lang(uk), +.comment-form label:lang(uk), .widget_archive ul li:lang(uk), +.widget_categories ul li:lang(uk), +.widget_meta ul li:lang(uk), +.widget_nav_menu ul li:lang(uk), +.widget_pages ul li:lang(uk), +.widget_recent_comments ul li:lang(uk), +.widget_recent_entries ul li:lang(uk), +.widget_rss ul li:lang(uk), .widget_tag_cloud .tagcloud:lang(uk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(uk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(uk), .entry .entry-content .wp-block-archives li > a:lang(uk), +.entry .entry-content .wp-block-categories li > a:lang(uk), +.entry .entry-content .wp-block-latest-posts li > a:lang(uk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(uk), .entry .entry-content .wp-block-verse:lang(uk), .entry .entry-content .has-drop-cap:lang(uk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(uk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover-image h2:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover h2:lang(uk), .entry .entry-content .wp-block-audio figcaption:lang(uk), +.entry .entry-content .wp-block-video figcaption:lang(uk), +.entry .entry-content .wp-block-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(uk), .entry .entry-content .wp-block-file:lang(uk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(uk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(uk), .wp-caption-text:lang(uk), .gallery-caption:lang(uk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(zh-HK), button:lang(zh-HK), +input:lang(zh-HK), +select:lang(zh-HK), +optgroup:lang(zh-HK), +textarea:lang(zh-HK), .author-description .author-link:lang(zh-HK), +.comment-metadata:lang(zh-HK), +.comment-reply-link:lang(zh-HK), +.comments-title:lang(zh-HK), +.comment-author .fn:lang(zh-HK), +.discussion-meta-info:lang(zh-HK), +.entry-meta:lang(zh-HK), +.entry-footer:lang(zh-HK), +.main-navigation:lang(zh-HK), +.no-comments:lang(zh-HK), +.not-found .page-title:lang(zh-HK), +.error-404 .page-title:lang(zh-HK), +.post-navigation .post-title:lang(zh-HK), +.page-links:lang(zh-HK), +.page-description:lang(zh-HK), +.pagination .nav-links:lang(zh-HK), +.sticky-post:lang(zh-HK), +.site-title:lang(zh-HK), +.site-info:lang(zh-HK), +#cancel-comment-reply-link:lang(zh-HK), +h1:lang(zh-HK), +h2:lang(zh-HK), +h3:lang(zh-HK), +h4:lang(zh-HK), +h5:lang(zh-HK), +h6:lang(zh-HK), .page-title:lang(zh-HK), blockquote cite:lang(zh-HK), table:lang(zh-HK), .button:lang(zh-HK), +input:lang(zh-HK)[type="button"], +input:lang(zh-HK)[type="reset"], +input:lang(zh-HK)[type="submit"], .comment-navigation .nav-previous:lang(zh-HK), +.comment-navigation .nav-next:lang(zh-HK), .comment-list .pingback .comment-body:lang(zh-HK), +.comment-list .trackback .comment-body:lang(zh-HK), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-HK), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-HK), .comment-form .comment-notes:lang(zh-HK), +.comment-form label:lang(zh-HK), .widget_archive ul li:lang(zh-HK), +.widget_categories ul li:lang(zh-HK), +.widget_meta ul li:lang(zh-HK), +.widget_nav_menu ul li:lang(zh-HK), +.widget_pages ul li:lang(zh-HK), +.widget_recent_comments ul li:lang(zh-HK), +.widget_recent_entries ul li:lang(zh-HK), +.widget_rss ul li:lang(zh-HK), .widget_tag_cloud .tagcloud:lang(zh-HK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-HK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-HK), .entry .entry-content .wp-block-archives li > a:lang(zh-HK), +.entry .entry-content .wp-block-categories li > a:lang(zh-HK), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-HK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-HK), .entry .entry-content .wp-block-verse:lang(zh-HK), .entry .entry-content .has-drop-cap:lang(zh-HK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-HK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image h2:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover h2:lang(zh-HK), .entry .entry-content .wp-block-audio figcaption:lang(zh-HK), +.entry .entry-content .wp-block-video figcaption:lang(zh-HK), +.entry .entry-content .wp-block-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-HK), .entry .entry-content .wp-block-file:lang(zh-HK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-HK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-HK), .wp-caption-text:lang(zh-HK), .gallery-caption:lang(zh-HK) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-TW), button:lang(zh-TW), +input:lang(zh-TW), +select:lang(zh-TW), +optgroup:lang(zh-TW), +textarea:lang(zh-TW), .author-description .author-link:lang(zh-TW), +.comment-metadata:lang(zh-TW), +.comment-reply-link:lang(zh-TW), +.comments-title:lang(zh-TW), +.comment-author .fn:lang(zh-TW), +.discussion-meta-info:lang(zh-TW), +.entry-meta:lang(zh-TW), +.entry-footer:lang(zh-TW), +.main-navigation:lang(zh-TW), +.no-comments:lang(zh-TW), +.not-found .page-title:lang(zh-TW), +.error-404 .page-title:lang(zh-TW), +.post-navigation .post-title:lang(zh-TW), +.page-links:lang(zh-TW), +.page-description:lang(zh-TW), +.pagination .nav-links:lang(zh-TW), +.sticky-post:lang(zh-TW), +.site-title:lang(zh-TW), +.site-info:lang(zh-TW), +#cancel-comment-reply-link:lang(zh-TW), +h1:lang(zh-TW), +h2:lang(zh-TW), +h3:lang(zh-TW), +h4:lang(zh-TW), +h5:lang(zh-TW), +h6:lang(zh-TW), .page-title:lang(zh-TW), blockquote cite:lang(zh-TW), table:lang(zh-TW), .button:lang(zh-TW), +input:lang(zh-TW)[type="button"], +input:lang(zh-TW)[type="reset"], +input:lang(zh-TW)[type="submit"], .comment-navigation .nav-previous:lang(zh-TW), +.comment-navigation .nav-next:lang(zh-TW), .comment-list .pingback .comment-body:lang(zh-TW), +.comment-list .trackback .comment-body:lang(zh-TW), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-TW), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-TW), .comment-form .comment-notes:lang(zh-TW), +.comment-form label:lang(zh-TW), .widget_archive ul li:lang(zh-TW), +.widget_categories ul li:lang(zh-TW), +.widget_meta ul li:lang(zh-TW), +.widget_nav_menu ul li:lang(zh-TW), +.widget_pages ul li:lang(zh-TW), +.widget_recent_comments ul li:lang(zh-TW), +.widget_recent_entries ul li:lang(zh-TW), +.widget_rss ul li:lang(zh-TW), .widget_tag_cloud .tagcloud:lang(zh-TW), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-TW), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-TW), .entry .entry-content .wp-block-archives li > a:lang(zh-TW), +.entry .entry-content .wp-block-categories li > a:lang(zh-TW), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-TW), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-TW), .entry .entry-content .wp-block-verse:lang(zh-TW), .entry .entry-content .has-drop-cap:lang(zh-TW):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-TW), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image h2:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover h2:lang(zh-TW), .entry .entry-content .wp-block-audio figcaption:lang(zh-TW), +.entry .entry-content .wp-block-video figcaption:lang(zh-TW), +.entry .entry-content .wp-block-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-TW), .entry .entry-content .wp-block-file:lang(zh-TW), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-TW), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-TW), .wp-caption-text:lang(zh-TW), .gallery-caption:lang(zh-TW) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-CN), button:lang(zh-CN), +input:lang(zh-CN), +select:lang(zh-CN), +optgroup:lang(zh-CN), +textarea:lang(zh-CN), .author-description .author-link:lang(zh-CN), +.comment-metadata:lang(zh-CN), +.comment-reply-link:lang(zh-CN), +.comments-title:lang(zh-CN), +.comment-author .fn:lang(zh-CN), +.discussion-meta-info:lang(zh-CN), +.entry-meta:lang(zh-CN), +.entry-footer:lang(zh-CN), +.main-navigation:lang(zh-CN), +.no-comments:lang(zh-CN), +.not-found .page-title:lang(zh-CN), +.error-404 .page-title:lang(zh-CN), +.post-navigation .post-title:lang(zh-CN), +.page-links:lang(zh-CN), +.page-description:lang(zh-CN), +.pagination .nav-links:lang(zh-CN), +.sticky-post:lang(zh-CN), +.site-title:lang(zh-CN), +.site-info:lang(zh-CN), +#cancel-comment-reply-link:lang(zh-CN), +h1:lang(zh-CN), +h2:lang(zh-CN), +h3:lang(zh-CN), +h4:lang(zh-CN), +h5:lang(zh-CN), +h6:lang(zh-CN), .page-title:lang(zh-CN), blockquote cite:lang(zh-CN), table:lang(zh-CN), .button:lang(zh-CN), +input:lang(zh-CN)[type="button"], +input:lang(zh-CN)[type="reset"], +input:lang(zh-CN)[type="submit"], .comment-navigation .nav-previous:lang(zh-CN), +.comment-navigation .nav-next:lang(zh-CN), .comment-list .pingback .comment-body:lang(zh-CN), +.comment-list .trackback .comment-body:lang(zh-CN), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-CN), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-CN), .comment-form .comment-notes:lang(zh-CN), +.comment-form label:lang(zh-CN), .widget_archive ul li:lang(zh-CN), +.widget_categories ul li:lang(zh-CN), +.widget_meta ul li:lang(zh-CN), +.widget_nav_menu ul li:lang(zh-CN), +.widget_pages ul li:lang(zh-CN), +.widget_recent_comments ul li:lang(zh-CN), +.widget_recent_entries ul li:lang(zh-CN), +.widget_rss ul li:lang(zh-CN), .widget_tag_cloud .tagcloud:lang(zh-CN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-CN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-CN), .entry .entry-content .wp-block-archives li > a:lang(zh-CN), +.entry .entry-content .wp-block-categories li > a:lang(zh-CN), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-CN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-CN), .entry .entry-content .wp-block-verse:lang(zh-CN), .entry .entry-content .has-drop-cap:lang(zh-CN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-CN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image h2:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover h2:lang(zh-CN), .entry .entry-content .wp-block-audio figcaption:lang(zh-CN), +.entry .entry-content .wp-block-video figcaption:lang(zh-CN), +.entry .entry-content .wp-block-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-CN), .entry .entry-content .wp-block-file:lang(zh-CN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-CN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-CN), .wp-caption-text:lang(zh-CN), .gallery-caption:lang(zh-CN) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(bn-BD), button:lang(bn-BD), +input:lang(bn-BD), +select:lang(bn-BD), +optgroup:lang(bn-BD), +textarea:lang(bn-BD), .author-description .author-link:lang(bn-BD), +.comment-metadata:lang(bn-BD), +.comment-reply-link:lang(bn-BD), +.comments-title:lang(bn-BD), +.comment-author .fn:lang(bn-BD), +.discussion-meta-info:lang(bn-BD), +.entry-meta:lang(bn-BD), +.entry-footer:lang(bn-BD), +.main-navigation:lang(bn-BD), +.no-comments:lang(bn-BD), +.not-found .page-title:lang(bn-BD), +.error-404 .page-title:lang(bn-BD), +.post-navigation .post-title:lang(bn-BD), +.page-links:lang(bn-BD), +.page-description:lang(bn-BD), +.pagination .nav-links:lang(bn-BD), +.sticky-post:lang(bn-BD), +.site-title:lang(bn-BD), +.site-info:lang(bn-BD), +#cancel-comment-reply-link:lang(bn-BD), +h1:lang(bn-BD), +h2:lang(bn-BD), +h3:lang(bn-BD), +h4:lang(bn-BD), +h5:lang(bn-BD), +h6:lang(bn-BD), .page-title:lang(bn-BD), blockquote cite:lang(bn-BD), table:lang(bn-BD), .button:lang(bn-BD), +input:lang(bn-BD)[type="button"], +input:lang(bn-BD)[type="reset"], +input:lang(bn-BD)[type="submit"], .comment-navigation .nav-previous:lang(bn-BD), +.comment-navigation .nav-next:lang(bn-BD), .comment-list .pingback .comment-body:lang(bn-BD), +.comment-list .trackback .comment-body:lang(bn-BD), .comment-list .pingback .comment-body .comment-edit-link:lang(bn-BD), +.comment-list .trackback .comment-body .comment-edit-link:lang(bn-BD), .comment-form .comment-notes:lang(bn-BD), +.comment-form label:lang(bn-BD), .widget_archive ul li:lang(bn-BD), +.widget_categories ul li:lang(bn-BD), +.widget_meta ul li:lang(bn-BD), +.widget_nav_menu ul li:lang(bn-BD), +.widget_pages ul li:lang(bn-BD), +.widget_recent_comments ul li:lang(bn-BD), +.widget_recent_entries ul li:lang(bn-BD), +.widget_rss ul li:lang(bn-BD), .widget_tag_cloud .tagcloud:lang(bn-BD), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bn-BD), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bn-BD), .entry .entry-content .wp-block-archives li > a:lang(bn-BD), +.entry .entry-content .wp-block-categories li > a:lang(bn-BD), +.entry .entry-content .wp-block-latest-posts li > a:lang(bn-BD), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bn-BD), .entry .entry-content .wp-block-verse:lang(bn-BD), .entry .entry-content .has-drop-cap:lang(bn-BD):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bn-BD), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image h2:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover h2:lang(bn-BD), .entry .entry-content .wp-block-audio figcaption:lang(bn-BD), +.entry .entry-content .wp-block-video figcaption:lang(bn-BD), +.entry .entry-content .wp-block-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bn-BD), .entry .entry-content .wp-block-file:lang(bn-BD), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bn-BD), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bn-BD), .wp-caption-text:lang(bn-BD), .gallery-caption:lang(bn-BD) { + font-family: Arial, sans-serif; +} + +body:lang(hi-IN), button:lang(hi-IN), +input:lang(hi-IN), +select:lang(hi-IN), +optgroup:lang(hi-IN), +textarea:lang(hi-IN), .author-description .author-link:lang(hi-IN), +.comment-metadata:lang(hi-IN), +.comment-reply-link:lang(hi-IN), +.comments-title:lang(hi-IN), +.comment-author .fn:lang(hi-IN), +.discussion-meta-info:lang(hi-IN), +.entry-meta:lang(hi-IN), +.entry-footer:lang(hi-IN), +.main-navigation:lang(hi-IN), +.no-comments:lang(hi-IN), +.not-found .page-title:lang(hi-IN), +.error-404 .page-title:lang(hi-IN), +.post-navigation .post-title:lang(hi-IN), +.page-links:lang(hi-IN), +.page-description:lang(hi-IN), +.pagination .nav-links:lang(hi-IN), +.sticky-post:lang(hi-IN), +.site-title:lang(hi-IN), +.site-info:lang(hi-IN), +#cancel-comment-reply-link:lang(hi-IN), +h1:lang(hi-IN), +h2:lang(hi-IN), +h3:lang(hi-IN), +h4:lang(hi-IN), +h5:lang(hi-IN), +h6:lang(hi-IN), .page-title:lang(hi-IN), blockquote cite:lang(hi-IN), table:lang(hi-IN), .button:lang(hi-IN), +input:lang(hi-IN)[type="button"], +input:lang(hi-IN)[type="reset"], +input:lang(hi-IN)[type="submit"], .comment-navigation .nav-previous:lang(hi-IN), +.comment-navigation .nav-next:lang(hi-IN), .comment-list .pingback .comment-body:lang(hi-IN), +.comment-list .trackback .comment-body:lang(hi-IN), .comment-list .pingback .comment-body .comment-edit-link:lang(hi-IN), +.comment-list .trackback .comment-body .comment-edit-link:lang(hi-IN), .comment-form .comment-notes:lang(hi-IN), +.comment-form label:lang(hi-IN), .widget_archive ul li:lang(hi-IN), +.widget_categories ul li:lang(hi-IN), +.widget_meta ul li:lang(hi-IN), +.widget_nav_menu ul li:lang(hi-IN), +.widget_pages ul li:lang(hi-IN), +.widget_recent_comments ul li:lang(hi-IN), +.widget_recent_entries ul li:lang(hi-IN), +.widget_rss ul li:lang(hi-IN), .widget_tag_cloud .tagcloud:lang(hi-IN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(hi-IN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(hi-IN), .entry .entry-content .wp-block-archives li > a:lang(hi-IN), +.entry .entry-content .wp-block-categories li > a:lang(hi-IN), +.entry .entry-content .wp-block-latest-posts li > a:lang(hi-IN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(hi-IN), .entry .entry-content .wp-block-verse:lang(hi-IN), .entry .entry-content .has-drop-cap:lang(hi-IN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(hi-IN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image h2:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover h2:lang(hi-IN), .entry .entry-content .wp-block-audio figcaption:lang(hi-IN), +.entry .entry-content .wp-block-video figcaption:lang(hi-IN), +.entry .entry-content .wp-block-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(hi-IN), .entry .entry-content .wp-block-file:lang(hi-IN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(hi-IN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(hi-IN), .wp-caption-text:lang(hi-IN), .gallery-caption:lang(hi-IN) { + font-family: Arial, sans-serif; +} + +body:lang(mr), button:lang(mr), +input:lang(mr), +select:lang(mr), +optgroup:lang(mr), +textarea:lang(mr), .author-description .author-link:lang(mr), +.comment-metadata:lang(mr), +.comment-reply-link:lang(mr), +.comments-title:lang(mr), +.comment-author .fn:lang(mr), +.discussion-meta-info:lang(mr), +.entry-meta:lang(mr), +.entry-footer:lang(mr), +.main-navigation:lang(mr), +.no-comments:lang(mr), +.not-found .page-title:lang(mr), +.error-404 .page-title:lang(mr), +.post-navigation .post-title:lang(mr), +.page-links:lang(mr), +.page-description:lang(mr), +.pagination .nav-links:lang(mr), +.sticky-post:lang(mr), +.site-title:lang(mr), +.site-info:lang(mr), +#cancel-comment-reply-link:lang(mr), +h1:lang(mr), +h2:lang(mr), +h3:lang(mr), +h4:lang(mr), +h5:lang(mr), +h6:lang(mr), .page-title:lang(mr), blockquote cite:lang(mr), table:lang(mr), .button:lang(mr), +input:lang(mr)[type="button"], +input:lang(mr)[type="reset"], +input:lang(mr)[type="submit"], .comment-navigation .nav-previous:lang(mr), +.comment-navigation .nav-next:lang(mr), .comment-list .pingback .comment-body:lang(mr), +.comment-list .trackback .comment-body:lang(mr), .comment-list .pingback .comment-body .comment-edit-link:lang(mr), +.comment-list .trackback .comment-body .comment-edit-link:lang(mr), .comment-form .comment-notes:lang(mr), +.comment-form label:lang(mr), .widget_archive ul li:lang(mr), +.widget_categories ul li:lang(mr), +.widget_meta ul li:lang(mr), +.widget_nav_menu ul li:lang(mr), +.widget_pages ul li:lang(mr), +.widget_recent_comments ul li:lang(mr), +.widget_recent_entries ul li:lang(mr), +.widget_rss ul li:lang(mr), .widget_tag_cloud .tagcloud:lang(mr), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mr), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mr), .entry .entry-content .wp-block-archives li > a:lang(mr), +.entry .entry-content .wp-block-categories li > a:lang(mr), +.entry .entry-content .wp-block-latest-posts li > a:lang(mr), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mr), .entry .entry-content .wp-block-verse:lang(mr), .entry .entry-content .has-drop-cap:lang(mr):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mr), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover-image h2:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover h2:lang(mr), .entry .entry-content .wp-block-audio figcaption:lang(mr), +.entry .entry-content .wp-block-video figcaption:lang(mr), +.entry .entry-content .wp-block-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mr), .entry .entry-content .wp-block-file:lang(mr), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mr), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mr), .wp-caption-text:lang(mr), .gallery-caption:lang(mr) { + font-family: Arial, sans-serif; +} + +body:lang(ne-NP), button:lang(ne-NP), +input:lang(ne-NP), +select:lang(ne-NP), +optgroup:lang(ne-NP), +textarea:lang(ne-NP), .author-description .author-link:lang(ne-NP), +.comment-metadata:lang(ne-NP), +.comment-reply-link:lang(ne-NP), +.comments-title:lang(ne-NP), +.comment-author .fn:lang(ne-NP), +.discussion-meta-info:lang(ne-NP), +.entry-meta:lang(ne-NP), +.entry-footer:lang(ne-NP), +.main-navigation:lang(ne-NP), +.no-comments:lang(ne-NP), +.not-found .page-title:lang(ne-NP), +.error-404 .page-title:lang(ne-NP), +.post-navigation .post-title:lang(ne-NP), +.page-links:lang(ne-NP), +.page-description:lang(ne-NP), +.pagination .nav-links:lang(ne-NP), +.sticky-post:lang(ne-NP), +.site-title:lang(ne-NP), +.site-info:lang(ne-NP), +#cancel-comment-reply-link:lang(ne-NP), +h1:lang(ne-NP), +h2:lang(ne-NP), +h3:lang(ne-NP), +h4:lang(ne-NP), +h5:lang(ne-NP), +h6:lang(ne-NP), .page-title:lang(ne-NP), blockquote cite:lang(ne-NP), table:lang(ne-NP), .button:lang(ne-NP), +input:lang(ne-NP)[type="button"], +input:lang(ne-NP)[type="reset"], +input:lang(ne-NP)[type="submit"], .comment-navigation .nav-previous:lang(ne-NP), +.comment-navigation .nav-next:lang(ne-NP), .comment-list .pingback .comment-body:lang(ne-NP), +.comment-list .trackback .comment-body:lang(ne-NP), .comment-list .pingback .comment-body .comment-edit-link:lang(ne-NP), +.comment-list .trackback .comment-body .comment-edit-link:lang(ne-NP), .comment-form .comment-notes:lang(ne-NP), +.comment-form label:lang(ne-NP), .widget_archive ul li:lang(ne-NP), +.widget_categories ul li:lang(ne-NP), +.widget_meta ul li:lang(ne-NP), +.widget_nav_menu ul li:lang(ne-NP), +.widget_pages ul li:lang(ne-NP), +.widget_recent_comments ul li:lang(ne-NP), +.widget_recent_entries ul li:lang(ne-NP), +.widget_rss ul li:lang(ne-NP), .widget_tag_cloud .tagcloud:lang(ne-NP), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ne-NP), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ne-NP), .entry .entry-content .wp-block-archives li > a:lang(ne-NP), +.entry .entry-content .wp-block-categories li > a:lang(ne-NP), +.entry .entry-content .wp-block-latest-posts li > a:lang(ne-NP), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ne-NP), .entry .entry-content .wp-block-verse:lang(ne-NP), .entry .entry-content .has-drop-cap:lang(ne-NP):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ne-NP), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image h2:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover h2:lang(ne-NP), .entry .entry-content .wp-block-audio figcaption:lang(ne-NP), +.entry .entry-content .wp-block-video figcaption:lang(ne-NP), +.entry .entry-content .wp-block-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ne-NP), .entry .entry-content .wp-block-file:lang(ne-NP), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ne-NP), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ne-NP), .wp-caption-text:lang(ne-NP), .gallery-caption:lang(ne-NP) { + font-family: Arial, sans-serif; +} + +body:lang(el), button:lang(el), +input:lang(el), +select:lang(el), +optgroup:lang(el), +textarea:lang(el), .author-description .author-link:lang(el), +.comment-metadata:lang(el), +.comment-reply-link:lang(el), +.comments-title:lang(el), +.comment-author .fn:lang(el), +.discussion-meta-info:lang(el), +.entry-meta:lang(el), +.entry-footer:lang(el), +.main-navigation:lang(el), +.no-comments:lang(el), +.not-found .page-title:lang(el), +.error-404 .page-title:lang(el), +.post-navigation .post-title:lang(el), +.page-links:lang(el), +.page-description:lang(el), +.pagination .nav-links:lang(el), +.sticky-post:lang(el), +.site-title:lang(el), +.site-info:lang(el), +#cancel-comment-reply-link:lang(el), +h1:lang(el), +h2:lang(el), +h3:lang(el), +h4:lang(el), +h5:lang(el), +h6:lang(el), .page-title:lang(el), blockquote cite:lang(el), table:lang(el), .button:lang(el), +input:lang(el)[type="button"], +input:lang(el)[type="reset"], +input:lang(el)[type="submit"], .comment-navigation .nav-previous:lang(el), +.comment-navigation .nav-next:lang(el), .comment-list .pingback .comment-body:lang(el), +.comment-list .trackback .comment-body:lang(el), .comment-list .pingback .comment-body .comment-edit-link:lang(el), +.comment-list .trackback .comment-body .comment-edit-link:lang(el), .comment-form .comment-notes:lang(el), +.comment-form label:lang(el), .widget_archive ul li:lang(el), +.widget_categories ul li:lang(el), +.widget_meta ul li:lang(el), +.widget_nav_menu ul li:lang(el), +.widget_pages ul li:lang(el), +.widget_recent_comments ul li:lang(el), +.widget_recent_entries ul li:lang(el), +.widget_rss ul li:lang(el), .widget_tag_cloud .tagcloud:lang(el), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(el), .entry .entry-content .wp-block-button .wp-block-button__link:lang(el), .entry .entry-content .wp-block-archives li > a:lang(el), +.entry .entry-content .wp-block-categories li > a:lang(el), +.entry .entry-content .wp-block-latest-posts li > a:lang(el), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(el), .entry .entry-content .wp-block-verse:lang(el), .entry .entry-content .has-drop-cap:lang(el):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(el), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover-image h2:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover h2:lang(el), .entry .entry-content .wp-block-audio figcaption:lang(el), +.entry .entry-content .wp-block-video figcaption:lang(el), +.entry .entry-content .wp-block-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(el), .entry .entry-content .wp-block-file:lang(el), .entry .entry-content .wp-block-file .wp-block-file__button:lang(el), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(el), .wp-caption-text:lang(el), .gallery-caption:lang(el) { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +body:lang(gu), button:lang(gu), +input:lang(gu), +select:lang(gu), +optgroup:lang(gu), +textarea:lang(gu), .author-description .author-link:lang(gu), +.comment-metadata:lang(gu), +.comment-reply-link:lang(gu), +.comments-title:lang(gu), +.comment-author .fn:lang(gu), +.discussion-meta-info:lang(gu), +.entry-meta:lang(gu), +.entry-footer:lang(gu), +.main-navigation:lang(gu), +.no-comments:lang(gu), +.not-found .page-title:lang(gu), +.error-404 .page-title:lang(gu), +.post-navigation .post-title:lang(gu), +.page-links:lang(gu), +.page-description:lang(gu), +.pagination .nav-links:lang(gu), +.sticky-post:lang(gu), +.site-title:lang(gu), +.site-info:lang(gu), +#cancel-comment-reply-link:lang(gu), +h1:lang(gu), +h2:lang(gu), +h3:lang(gu), +h4:lang(gu), +h5:lang(gu), +h6:lang(gu), .page-title:lang(gu), blockquote cite:lang(gu), table:lang(gu), .button:lang(gu), +input:lang(gu)[type="button"], +input:lang(gu)[type="reset"], +input:lang(gu)[type="submit"], .comment-navigation .nav-previous:lang(gu), +.comment-navigation .nav-next:lang(gu), .comment-list .pingback .comment-body:lang(gu), +.comment-list .trackback .comment-body:lang(gu), .comment-list .pingback .comment-body .comment-edit-link:lang(gu), +.comment-list .trackback .comment-body .comment-edit-link:lang(gu), .comment-form .comment-notes:lang(gu), +.comment-form label:lang(gu), .widget_archive ul li:lang(gu), +.widget_categories ul li:lang(gu), +.widget_meta ul li:lang(gu), +.widget_nav_menu ul li:lang(gu), +.widget_pages ul li:lang(gu), +.widget_recent_comments ul li:lang(gu), +.widget_recent_entries ul li:lang(gu), +.widget_rss ul li:lang(gu), .widget_tag_cloud .tagcloud:lang(gu), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(gu), .entry .entry-content .wp-block-button .wp-block-button__link:lang(gu), .entry .entry-content .wp-block-archives li > a:lang(gu), +.entry .entry-content .wp-block-categories li > a:lang(gu), +.entry .entry-content .wp-block-latest-posts li > a:lang(gu), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(gu), .entry .entry-content .wp-block-verse:lang(gu), .entry .entry-content .has-drop-cap:lang(gu):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(gu), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover-image h2:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover h2:lang(gu), .entry .entry-content .wp-block-audio figcaption:lang(gu), +.entry .entry-content .wp-block-video figcaption:lang(gu), +.entry .entry-content .wp-block-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(gu), .entry .entry-content .wp-block-file:lang(gu), .entry .entry-content .wp-block-file .wp-block-file__button:lang(gu), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(gu), .wp-caption-text:lang(gu), .gallery-caption:lang(gu) { + font-family: Arial, sans-serif; +} + +body:lang(he-IL), button:lang(he-IL), +input:lang(he-IL), +select:lang(he-IL), +optgroup:lang(he-IL), +textarea:lang(he-IL), .author-description .author-link:lang(he-IL), +.comment-metadata:lang(he-IL), +.comment-reply-link:lang(he-IL), +.comments-title:lang(he-IL), +.comment-author .fn:lang(he-IL), +.discussion-meta-info:lang(he-IL), +.entry-meta:lang(he-IL), +.entry-footer:lang(he-IL), +.main-navigation:lang(he-IL), +.no-comments:lang(he-IL), +.not-found .page-title:lang(he-IL), +.error-404 .page-title:lang(he-IL), +.post-navigation .post-title:lang(he-IL), +.page-links:lang(he-IL), +.page-description:lang(he-IL), +.pagination .nav-links:lang(he-IL), +.sticky-post:lang(he-IL), +.site-title:lang(he-IL), +.site-info:lang(he-IL), +#cancel-comment-reply-link:lang(he-IL), +h1:lang(he-IL), +h2:lang(he-IL), +h3:lang(he-IL), +h4:lang(he-IL), +h5:lang(he-IL), +h6:lang(he-IL), .page-title:lang(he-IL), blockquote cite:lang(he-IL), table:lang(he-IL), .button:lang(he-IL), +input:lang(he-IL)[type="button"], +input:lang(he-IL)[type="reset"], +input:lang(he-IL)[type="submit"], .comment-navigation .nav-previous:lang(he-IL), +.comment-navigation .nav-next:lang(he-IL), .comment-list .pingback .comment-body:lang(he-IL), +.comment-list .trackback .comment-body:lang(he-IL), .comment-list .pingback .comment-body .comment-edit-link:lang(he-IL), +.comment-list .trackback .comment-body .comment-edit-link:lang(he-IL), .comment-form .comment-notes:lang(he-IL), +.comment-form label:lang(he-IL), .widget_archive ul li:lang(he-IL), +.widget_categories ul li:lang(he-IL), +.widget_meta ul li:lang(he-IL), +.widget_nav_menu ul li:lang(he-IL), +.widget_pages ul li:lang(he-IL), +.widget_recent_comments ul li:lang(he-IL), +.widget_recent_entries ul li:lang(he-IL), +.widget_rss ul li:lang(he-IL), .widget_tag_cloud .tagcloud:lang(he-IL), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(he-IL), .entry .entry-content .wp-block-button .wp-block-button__link:lang(he-IL), .entry .entry-content .wp-block-archives li > a:lang(he-IL), +.entry .entry-content .wp-block-categories li > a:lang(he-IL), +.entry .entry-content .wp-block-latest-posts li > a:lang(he-IL), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(he-IL), .entry .entry-content .wp-block-verse:lang(he-IL), .entry .entry-content .has-drop-cap:lang(he-IL):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(he-IL), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image h2:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover h2:lang(he-IL), .entry .entry-content .wp-block-audio figcaption:lang(he-IL), +.entry .entry-content .wp-block-video figcaption:lang(he-IL), +.entry .entry-content .wp-block-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(he-IL), .entry .entry-content .wp-block-file:lang(he-IL), .entry .entry-content .wp-block-file .wp-block-file__button:lang(he-IL), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(he-IL), .wp-caption-text:lang(he-IL), .gallery-caption:lang(he-IL) { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +body:lang(ja), button:lang(ja), +input:lang(ja), +select:lang(ja), +optgroup:lang(ja), +textarea:lang(ja), .author-description .author-link:lang(ja), +.comment-metadata:lang(ja), +.comment-reply-link:lang(ja), +.comments-title:lang(ja), +.comment-author .fn:lang(ja), +.discussion-meta-info:lang(ja), +.entry-meta:lang(ja), +.entry-footer:lang(ja), +.main-navigation:lang(ja), +.no-comments:lang(ja), +.not-found .page-title:lang(ja), +.error-404 .page-title:lang(ja), +.post-navigation .post-title:lang(ja), +.page-links:lang(ja), +.page-description:lang(ja), +.pagination .nav-links:lang(ja), +.sticky-post:lang(ja), +.site-title:lang(ja), +.site-info:lang(ja), +#cancel-comment-reply-link:lang(ja), +h1:lang(ja), +h2:lang(ja), +h3:lang(ja), +h4:lang(ja), +h5:lang(ja), +h6:lang(ja), .page-title:lang(ja), blockquote cite:lang(ja), table:lang(ja), .button:lang(ja), +input:lang(ja)[type="button"], +input:lang(ja)[type="reset"], +input:lang(ja)[type="submit"], .comment-navigation .nav-previous:lang(ja), +.comment-navigation .nav-next:lang(ja), .comment-list .pingback .comment-body:lang(ja), +.comment-list .trackback .comment-body:lang(ja), .comment-list .pingback .comment-body .comment-edit-link:lang(ja), +.comment-list .trackback .comment-body .comment-edit-link:lang(ja), .comment-form .comment-notes:lang(ja), +.comment-form label:lang(ja), .widget_archive ul li:lang(ja), +.widget_categories ul li:lang(ja), +.widget_meta ul li:lang(ja), +.widget_nav_menu ul li:lang(ja), +.widget_pages ul li:lang(ja), +.widget_recent_comments ul li:lang(ja), +.widget_recent_entries ul li:lang(ja), +.widget_rss ul li:lang(ja), .widget_tag_cloud .tagcloud:lang(ja), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ja), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ja), .entry .entry-content .wp-block-archives li > a:lang(ja), +.entry .entry-content .wp-block-categories li > a:lang(ja), +.entry .entry-content .wp-block-latest-posts li > a:lang(ja), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ja), .entry .entry-content .wp-block-verse:lang(ja), .entry .entry-content .has-drop-cap:lang(ja):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ja), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover-image h2:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover h2:lang(ja), .entry .entry-content .wp-block-audio figcaption:lang(ja), +.entry .entry-content .wp-block-video figcaption:lang(ja), +.entry .entry-content .wp-block-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ja), .entry .entry-content .wp-block-file:lang(ja), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ja), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ja), .wp-caption-text:lang(ja), .gallery-caption:lang(ja) { + font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif; +} + +body:lang(ko-KR), button:lang(ko-KR), +input:lang(ko-KR), +select:lang(ko-KR), +optgroup:lang(ko-KR), +textarea:lang(ko-KR), .author-description .author-link:lang(ko-KR), +.comment-metadata:lang(ko-KR), +.comment-reply-link:lang(ko-KR), +.comments-title:lang(ko-KR), +.comment-author .fn:lang(ko-KR), +.discussion-meta-info:lang(ko-KR), +.entry-meta:lang(ko-KR), +.entry-footer:lang(ko-KR), +.main-navigation:lang(ko-KR), +.no-comments:lang(ko-KR), +.not-found .page-title:lang(ko-KR), +.error-404 .page-title:lang(ko-KR), +.post-navigation .post-title:lang(ko-KR), +.page-links:lang(ko-KR), +.page-description:lang(ko-KR), +.pagination .nav-links:lang(ko-KR), +.sticky-post:lang(ko-KR), +.site-title:lang(ko-KR), +.site-info:lang(ko-KR), +#cancel-comment-reply-link:lang(ko-KR), +h1:lang(ko-KR), +h2:lang(ko-KR), +h3:lang(ko-KR), +h4:lang(ko-KR), +h5:lang(ko-KR), +h6:lang(ko-KR), .page-title:lang(ko-KR), blockquote cite:lang(ko-KR), table:lang(ko-KR), .button:lang(ko-KR), +input:lang(ko-KR)[type="button"], +input:lang(ko-KR)[type="reset"], +input:lang(ko-KR)[type="submit"], .comment-navigation .nav-previous:lang(ko-KR), +.comment-navigation .nav-next:lang(ko-KR), .comment-list .pingback .comment-body:lang(ko-KR), +.comment-list .trackback .comment-body:lang(ko-KR), .comment-list .pingback .comment-body .comment-edit-link:lang(ko-KR), +.comment-list .trackback .comment-body .comment-edit-link:lang(ko-KR), .comment-form .comment-notes:lang(ko-KR), +.comment-form label:lang(ko-KR), .widget_archive ul li:lang(ko-KR), +.widget_categories ul li:lang(ko-KR), +.widget_meta ul li:lang(ko-KR), +.widget_nav_menu ul li:lang(ko-KR), +.widget_pages ul li:lang(ko-KR), +.widget_recent_comments ul li:lang(ko-KR), +.widget_recent_entries ul li:lang(ko-KR), +.widget_rss ul li:lang(ko-KR), .widget_tag_cloud .tagcloud:lang(ko-KR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ko-KR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ko-KR), .entry .entry-content .wp-block-archives li > a:lang(ko-KR), +.entry .entry-content .wp-block-categories li > a:lang(ko-KR), +.entry .entry-content .wp-block-latest-posts li > a:lang(ko-KR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ko-KR), .entry .entry-content .wp-block-verse:lang(ko-KR), .entry .entry-content .has-drop-cap:lang(ko-KR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ko-KR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image h2:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover h2:lang(ko-KR), .entry .entry-content .wp-block-audio figcaption:lang(ko-KR), +.entry .entry-content .wp-block-video figcaption:lang(ko-KR), +.entry .entry-content .wp-block-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ko-KR), .entry .entry-content .wp-block-file:lang(ko-KR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ko-KR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ko-KR), .wp-caption-text:lang(ko-KR), .gallery-caption:lang(ko-KR) { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +body:lang(th), button:lang(th), +input:lang(th), +select:lang(th), +optgroup:lang(th), +textarea:lang(th), .author-description .author-link:lang(th), +.comment-metadata:lang(th), +.comment-reply-link:lang(th), +.comments-title:lang(th), +.comment-author .fn:lang(th), +.discussion-meta-info:lang(th), +.entry-meta:lang(th), +.entry-footer:lang(th), +.main-navigation:lang(th), +.no-comments:lang(th), +.not-found .page-title:lang(th), +.error-404 .page-title:lang(th), +.post-navigation .post-title:lang(th), +.page-links:lang(th), +.page-description:lang(th), +.pagination .nav-links:lang(th), +.sticky-post:lang(th), +.site-title:lang(th), +.site-info:lang(th), +#cancel-comment-reply-link:lang(th), +h1:lang(th), +h2:lang(th), +h3:lang(th), +h4:lang(th), +h5:lang(th), +h6:lang(th), .page-title:lang(th), blockquote cite:lang(th), table:lang(th), .button:lang(th), +input:lang(th)[type="button"], +input:lang(th)[type="reset"], +input:lang(th)[type="submit"], .comment-navigation .nav-previous:lang(th), +.comment-navigation .nav-next:lang(th), .comment-list .pingback .comment-body:lang(th), +.comment-list .trackback .comment-body:lang(th), .comment-list .pingback .comment-body .comment-edit-link:lang(th), +.comment-list .trackback .comment-body .comment-edit-link:lang(th), .comment-form .comment-notes:lang(th), +.comment-form label:lang(th), .widget_archive ul li:lang(th), +.widget_categories ul li:lang(th), +.widget_meta ul li:lang(th), +.widget_nav_menu ul li:lang(th), +.widget_pages ul li:lang(th), +.widget_recent_comments ul li:lang(th), +.widget_recent_entries ul li:lang(th), +.widget_rss ul li:lang(th), .widget_tag_cloud .tagcloud:lang(th), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(th), .entry .entry-content .wp-block-button .wp-block-button__link:lang(th), .entry .entry-content .wp-block-archives li > a:lang(th), +.entry .entry-content .wp-block-categories li > a:lang(th), +.entry .entry-content .wp-block-latest-posts li > a:lang(th), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(th), .entry .entry-content .wp-block-verse:lang(th), .entry .entry-content .has-drop-cap:lang(th):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(th), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover-image h2:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover h2:lang(th), .entry .entry-content .wp-block-audio figcaption:lang(th), +.entry .entry-content .wp-block-video figcaption:lang(th), +.entry .entry-content .wp-block-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(th), .entry .entry-content .wp-block-file:lang(th), .entry .entry-content .wp-block-file .wp-block-file__button:lang(th), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(th), .wp-caption-text:lang(th), .gallery-caption:lang(th) { + font-family: "Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif; +} + +body:lang(vi), button:lang(vi), +input:lang(vi), +select:lang(vi), +optgroup:lang(vi), +textarea:lang(vi), .author-description .author-link:lang(vi), +.comment-metadata:lang(vi), +.comment-reply-link:lang(vi), +.comments-title:lang(vi), +.comment-author .fn:lang(vi), +.discussion-meta-info:lang(vi), +.entry-meta:lang(vi), +.entry-footer:lang(vi), +.main-navigation:lang(vi), +.no-comments:lang(vi), +.not-found .page-title:lang(vi), +.error-404 .page-title:lang(vi), +.post-navigation .post-title:lang(vi), +.page-links:lang(vi), +.page-description:lang(vi), +.pagination .nav-links:lang(vi), +.sticky-post:lang(vi), +.site-title:lang(vi), +.site-info:lang(vi), +#cancel-comment-reply-link:lang(vi), +h1:lang(vi), +h2:lang(vi), +h3:lang(vi), +h4:lang(vi), +h5:lang(vi), +h6:lang(vi), .page-title:lang(vi), blockquote cite:lang(vi), table:lang(vi), .button:lang(vi), +input:lang(vi)[type="button"], +input:lang(vi)[type="reset"], +input:lang(vi)[type="submit"], .comment-navigation .nav-previous:lang(vi), +.comment-navigation .nav-next:lang(vi), .comment-list .pingback .comment-body:lang(vi), +.comment-list .trackback .comment-body:lang(vi), .comment-list .pingback .comment-body .comment-edit-link:lang(vi), +.comment-list .trackback .comment-body .comment-edit-link:lang(vi), .comment-form .comment-notes:lang(vi), +.comment-form label:lang(vi), .widget_archive ul li:lang(vi), +.widget_categories ul li:lang(vi), +.widget_meta ul li:lang(vi), +.widget_nav_menu ul li:lang(vi), +.widget_pages ul li:lang(vi), +.widget_recent_comments ul li:lang(vi), +.widget_recent_entries ul li:lang(vi), +.widget_rss ul li:lang(vi), .widget_tag_cloud .tagcloud:lang(vi), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(vi), .entry .entry-content .wp-block-button .wp-block-button__link:lang(vi), .entry .entry-content .wp-block-archives li > a:lang(vi), +.entry .entry-content .wp-block-categories li > a:lang(vi), +.entry .entry-content .wp-block-latest-posts li > a:lang(vi), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(vi), .entry .entry-content .wp-block-verse:lang(vi), .entry .entry-content .has-drop-cap:lang(vi):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(vi), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover-image h2:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover h2:lang(vi), .entry .entry-content .wp-block-audio figcaption:lang(vi), +.entry .entry-content .wp-block-video figcaption:lang(vi), +.entry .entry-content .wp-block-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(vi), .entry .entry-content .wp-block-file:lang(vi), .entry .entry-content .wp-block-file .wp-block-file__button:lang(vi), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(vi), .wp-caption-text:lang(vi), .gallery-caption:lang(vi) { + font-family: "Libre Franklin", sans-serif; +} + +/* Normalize */ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} + +/* Typography */ +html { + font-size: 22px; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + font-size: 1em; + line-height: 1.8; + margin: 0; + text-rendering: optimizeLegibility; +} + +button, +input, +select, +optgroup, +textarea { + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + line-height: 1.8; + text-rendering: optimizeLegibility; +} + +.author-description .author-link, +.comment-metadata, +.comment-reply-link, +.comments-title, +.comment-author .fn, +.discussion-meta-info, +.entry-meta, +.entry-footer, +.main-navigation, +.no-comments, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.page-links, +.page-description, +.pagination .nav-links, +.sticky-post, +.site-title, +.site-info, +#cancel-comment-reply-link, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.main-navigation, +.page-description, +.author-description .author-link, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.pagination .nav-links, +.comments-title, +.comment-author .fn, +.no-comments, +.site-title, +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.2; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.page-title { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; +} + +.site-branding, +.main-navigation ul.main-menu > li, +.social-navigation, +.author-description .author-bio, +.nav-links { + line-height: 1.25; +} + +h1 { + font-size: 2.25em; +} + +@media only screen and (min-width: 768px) { + h1 { + font-size: 2.8125em; + } +} + +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.has-larger-font-size, +h2 { + font-size: 1.6875em; +} + +@media only screen and (min-width: 768px) { + .entry-title, + .not-found .page-title, + .error-404 .page-title, + .has-larger-font-size, + h2 { + font-size: 2.25em; + } +} + +.has-regular-font-size, +.has-large-font-size, +.comments-title, +h3 { + font-size: 1.6875em; +} + +.site-title, +.site-description, +.main-navigation, +.nav-links, +.page-title, +.page-description, +.comment-author .fn, +.no-comments, +h2.author-title, +p.author-bio, +h4 { + font-size: 1.125em; +} + +.pagination .nav-links, +.comment-content, +h5 { + font-size: 0.88889em; +} + +.entry-meta, +.entry-footer, +.discussion-meta-info, +.site-info, +.has-small-font-size, +.comment-reply-link, +.comment-metadata, +.comment-notes, +.sticky-post, +#cancel-comment-reply-link, +img:after, +h6 { + font-size: 0.71111em; +} + +.site-title, +.page-title { + font-weight: normal; +} + +.page-description, +.page-links a { + font-weight: bold; +} + +.site-description { + letter-spacing: -0.01em; +} + +.post-navigation .post-title, +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.comments-title, +blockquote { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; + word-wrap: break-word; +} + +/* Do not hyphenate entry title on tablet view and bigger. */ +@media only screen and (min-width: 768px) { + .entry-title { + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + } +} + +p { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote cite { + font-size: 0.71111em; + font-style: normal; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +pre { + font-size: 0.88889em; + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 1.8; + overflow: auto; +} + +code, +kbd, +tt, +var { + font-size: 0.88889em; + font-family: Menlo, monaco, Consolas, Lucida Console, monospace; +} + +abbr, acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: none; +} + +a:focus { + text-decoration: underline; +} + +/* Elements */ +html { + box-sizing: border-box; +} + +::-moz-selection { + background-color: #bfdcea; +} + +::selection { + background-color: #bfdcea; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + background-color: #fff; +} + +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin; + outline-style: dotted; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + margin: 1rem 0; +} + +h1:not(.site-title):before, +h2:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +hr { + background-color: #767676; + border: 0; + height: 2px; +} + +ul, +ol { + padding-right: 1rem; +} + +ul { + list-style: disc; +} + +ul ul { + list-style-type: circle; +} + +ol { + list-style: decimal; +} + +li { + line-height: 1.8; +} + +li > ul, +li > ol { + padding-right: 2rem; +} + +dt { + font-weight: bold; +} + +dd { + margin: 0 1rem 1rem; +} + +img { + height: auto; + max-width: 100%; + position: relative; +} + +figure { + margin: 0; +} + +blockquote { + border-right: 2px solid #0073aa; + margin-right: 0; + padding: 0 1rem 0 0; +} + +blockquote > p { + margin: 0 0 1rem; +} + +blockquote cite { + color: #767676; +} + +table { + margin: 0 0 1rem; + border-collapse: collapse; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +table td, +table th { + padding: 0.5em; + border: 1px solid #767676; + word-break: break-all; +} + +/* Forms */ +.button, +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + transition: background 150ms ease-in-out; + background: #0073aa; + border: none; + border-radius: 5px; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.88889em; + font-weight: 700; + line-height: 1.2; + outline: none; + padding: 0.76rem 1rem; + text-decoration: none; + vertical-align: bottom; +} + +.button:hover, +button:hover, +input[type="button"]:hover, +input[type="reset"]:hover, +input[type="submit"]:hover { + background: #111; + cursor: pointer; +} + +.button:visited, +button:visited, +input[type="button"]:visited, +input[type="reset"]:visited, +input[type="submit"]:visited { + color: #fff; + text-decoration: none; +} + +.button:focus, +button:focus, +input[type="button"]:focus, +input[type="reset"]:focus, +input[type="submit"]:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"], +textarea { + -webkit-backface-visibility: hidden; + background: #fff; + border: solid 1px #ccc; + box-sizing: border-box; + outline: none; + padding: 0.36rem 0.66rem; + -webkit-appearance: none; + outline-offset: 0; + border-radius: 0; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +input[type="search"]:focus, +input[type="number"]:focus, +input[type="tel"]:focus, +input[type="range"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="week"]:focus, +input[type="time"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="color"]:focus, +textarea:focus { + border-color: #0073aa; + outline: thin solid rgba(0, 115, 170, 0.15); + outline-offset: -4px; +} + +input[type="search"]::-webkit-search-decoration { + display: none; +} + +textarea { + box-sizing: border-box; + display: block; + width: 100%; + max-width: 100%; + resize: vertical; +} + +form p { + margin: 1rem 0; +} + +/* Navigation */ +/*-------------------------------------------------------------- +## Links +--------------------------------------------------------------*/ +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:visited { + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin dotted; + text-decoration: underline; +} + +/*-------------------------------------------------------------- +## Menus +--------------------------------------------------------------*/ +/** === Main menu === */ +.main-navigation { + display: block; + margin-top: 0.25rem; + /* Un-style buttons */ + /* + * Sub-menu styles + * + * :focus-within needs its own selector so other similar + * selectors don’t get ignored if a browser doesn’t recognize it + */ + /** + * Fade-in animation for top-level submenus + */ + /** + * Off-canvas touch device styles + */ +} + +body.page .main-navigation { + display: block; +} + +.main-navigation > div { + display: inline; +} + +.main-navigation button { + display: inline-block; + border: none; + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; + line-height: 1.2; + text-decoration: none; + background: transparent; + color: inherit; + cursor: pointer; + transition: background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; +} + +.main-navigation button:hover, .main-navigation button:focus { + background: transparent; +} + +.main-navigation button:focus { + outline: 1px solid transparent; + outline-offset: -4px; +} + +.main-navigation button:active { + transform: scale(0.99); +} + +.main-navigation .main-menu { + display: inline-block; + margin: 0; + padding: 0; +} + +.main-navigation .main-menu > li { + color: #0073aa; + display: inline; + position: relative; +} + +.main-navigation .main-menu > li > a { + font-weight: 700; + color: #0073aa; + margin-left: 0.5rem; +} + +.main-navigation .main-menu > li > a + svg { + margin-left: 0.5rem; +} + +.main-navigation .main-menu > li > a:hover, +.main-navigation .main-menu > li > a:hover + svg { + color: #005177; +} + +.main-navigation .main-menu > li.menu-item-has-children { + display: inline-block; + position: inherit; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu > li.menu-item-has-children { + position: relative; + } +} + +.main-navigation .main-menu > li.menu-item-has-children > a { + margin-left: 0.125rem; +} + +.main-navigation .main-menu > li.menu-item-has-children > a:after, +.main-navigation .main-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: ""; + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + margin-left: 0.25rem; + /* Priority+ Menu */ +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle { + position: relative; + height: 24px; + line-height: 1.2; + width: 24px; + padding: 0; + margin-right: 0.5rem; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle svg { + height: 24px; + width: 24px; + top: -0.125rem; + vertical-align: text-bottom; +} + +.wp-customizer-unloading .main-navigation .main-menu > li.menu-item-has-children .submenu-expand, .main-navigation .main-menu > li.menu-item-has-children .submenu-expand.is-empty { + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand svg { + position: relative; + top: 0.2rem; +} + +.main-navigation .main-menu > li:last-child > a, +.main-navigation .main-menu > li:last-child.menu-item-has-children .submenu-expand { + margin-left: 0; +} + +.main-navigation .sub-menu { + background-color: #0073aa; + color: #fff; + list-style: none; + padding-right: 0; + position: absolute; + opacity: 0; + right: -9999px; + z-index: 99999; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu { + width: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + } +} + +.main-navigation .sub-menu > li { + display: block; + float: none; + position: relative; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + position: absolute; + width: calc( 24px + 1rem); + left: 0; + top: calc( .125 * 1rem); + bottom: 0; + color: white; + line-height: 1; + padding: calc( .5 * 1rem); +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand svg { + top: 0; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + margin-left: 0; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: "\203a"; + } +} + +.main-navigation .sub-menu > li > a, +.main-navigation .sub-menu > li > .menu-item-link-return { + color: #fff; + display: block; + line-height: 1.2; + text-shadow: none; + padding: calc( .5 * 1rem) 1rem calc( .5 * 1rem) calc( 24px + 1rem); + white-space: nowrap; +} + +.main-navigation .sub-menu > li > a:hover, .main-navigation .sub-menu > li > a:focus, +.main-navigation .sub-menu > li > .menu-item-link-return:hover, +.main-navigation .sub-menu > li > .menu-item-link-return:focus { + background: #005177; +} + +.main-navigation .sub-menu > li > a:hover:after, .main-navigation .sub-menu > li > a:focus:after, +.main-navigation .sub-menu > li > .menu-item-link-return:hover:after, +.main-navigation .sub-menu > li > .menu-item-link-return:focus:after { + background: #005177; +} + +.main-navigation .sub-menu > li > .menu-item-link-return { + width: 100%; + font-size: 22px; + font-weight: normal; + text-align: right; +} + +.main-navigation .sub-menu > li > a:empty { + display: none; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item { + display: none; + font-size: 0.88889em; + font-weight: normal; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item svg { + position: relative; + top: 0.2rem; + margin-left: calc( .25 * 1rem); +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + right: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + right: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + right: 0; + left: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + right: 0; + left: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + right: 0; + width: 100%; + display: table; + position: absolute; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + right: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + left: 0; + right: auto; + display: block; + width: max-content; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + left: 0; + right: auto; + display: block; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + right: 0; + opacity: 1; + /* Non-mobile position */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + right: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + right: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + float: none; + margin-top: 0; + opacity: 1; + position: absolute; + right: 0; + left: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + right: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + left: 0; + right: auto; + display: table; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + right: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu > .menu-item-has-children:not(.off-canvas):hover > .sub-menu { + animation: fade_in 0.1s forwards; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .submenu-expand .svg-icon { + transform: rotate(-270deg); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .sub-menu { + opacity: 0; + position: absolute; + z-index: 0; + transform: translateX(100%); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:focus, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:focus { + background-color: transparent; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > a, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > .menu-item-link-return { + white-space: inherit; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + display: table; + margin-top: 0; + opacity: 1; + padding-right: 0; + /* Mobile position */ + right: 0; + top: 0; + left: 0; + bottom: 0; + position: fixed; + z-index: 100000; + /* Make sure appears above mobile admin bar */ + width: 100vw; + height: 100vh; + max-width: 100vw; + transform: translateX(-100%); + animation: slide_in_right 0.3s forwards; + /* Prevent menu from being blocked by admin bar */ +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true > .mobile-parent-nav-menu-item { + display: block; +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 46px; + height: calc( 100vh - 46px); + /* WP core breakpoint */ +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; +} + +@media only screen and (min-width: 782px) { + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 32px; + height: calc( 100vh - 32px); + } + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; + } +} + +.main-navigation .main-menu-more:nth-child(n+3) { + display: none; +} + +/* Menu animation */ +@keyframes slide_in_right { + 100% { + transform: translateX(0%); + } +} + +@keyframes fade_in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Social menu */ +.social-navigation { + margin-top: calc(1rem / 2); + text-align: right; +} + +.social-navigation ul.social-links-menu { + content: ""; + display: table; + table-layout: fixed; + display: inline-block; + margin: 0; + padding: 0; +} + +.social-navigation ul.social-links-menu li { + display: inline-block; + vertical-align: bottom; + vertical-align: -webkit-baseline-middle; + list-style: none; +} + +.social-navigation ul.social-links-menu li:nth-child(n+2) { + margin-right: 0.1em; +} + +.social-navigation ul.social-links-menu li a { + border-bottom: 1px solid transparent; + display: block; + color: #111; + margin-bottom: -1px; + transition: opacity 110ms ease-in-out; +} + +.social-navigation ul.social-links-menu li a:hover, .social-navigation ul.social-links-menu li a:active { + color: #111; + opacity: 0.6; +} + +.social-navigation ul.social-links-menu li a:focus { + color: #111; + opacity: 1; + border-bottom: 1px solid #111; +} + +.social-navigation ul.social-links-menu li a svg { + display: block; + width: 32px; + height: 32px; + transform: translateZ(0); +} + +.social-navigation ul.social-links-menu li a svg#ui-icon-link { + transform: rotate(45deg); +} + +@media only screen and (min-width: 768px) { + .site-title + .social-navigation, + .site-description + .social-navigation { + margin-top: calc(1rem / 5); + } +} + +/** === Footer menu === */ +.footer-navigation { + display: inline; +} + +.footer-navigation > div { + display: inline; +} + +.footer-navigation .footer-menu { + display: inline; + padding-right: 0; +} + +.footer-navigation .footer-menu li { + display: inline; + margin-left: 1rem; +} + +/*-------------------------------------------------------------- +## Next / Previous +--------------------------------------------------------------*/ +/* Next/Previous navigation */ +.post-navigation { + margin: calc(3 * 1rem) 0; +} + +@media only screen and (min-width: 768px) { + .post-navigation { + margin: calc(3 * 1rem) calc(10% + 60px); + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation { + margin: calc(3 * 1rem) 0; + max-width: 100%; + } +} + +.post-navigation .nav-links { + margin: 0 1rem; + max-width: 100%; + display: flex; + flex-direction: column; +} + +@media only screen and (min-width: 768px) { + .post-navigation .nav-links { + margin: 0; + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links { + flex-direction: row; + margin: 0 calc(10% + 60px); + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.post-navigation .nav-links a .meta-nav { + color: #767676; + user-select: none; +} + +.post-navigation .nav-links a .meta-nav:before, .post-navigation .nav-links a .meta-nav:after { + display: none; + content: "—"; + width: 2em; + color: #767676; + height: 1em; +} + +.post-navigation .nav-links a .post-title { + hyphens: auto; +} + +.post-navigation .nav-links a:hover { + color: #005177; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous, + .post-navigation .nav-links .nav-next { + min-width: calc(50% - 2 * 1rem); + } +} + +.post-navigation .nav-links .nav-previous { + order: 2; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous { + order: 1; + } +} + +.post-navigation .nav-links .nav-previous + .nav-next { + margin-bottom: 1rem; +} + +.post-navigation .nav-links .nav-previous .meta-nav:before { + display: inline; +} + +.post-navigation .nav-links .nav-next { + order: 1; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-next { + order: 2; + padding-right: 1rem; + } +} + +.post-navigation .nav-links .nav-next .meta-nav:after { + display: inline; +} + +.pagination .nav-links { + display: flex; + flex-wrap: wrap; + padding: 0 calc(.5 * 1rem); +} + +.pagination .nav-links > * { + padding: calc(.5 * 1rem); +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.prev { + padding-right: 0; +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.next { + padding-left: 0; +} + +.pagination .nav-links a:focus { + text-decoration: underline; + outline-offset: -1px; +} + +.pagination .nav-links a:focus.prev, .pagination .nav-links a:focus.next { + text-decoration: none; +} + +.pagination .nav-links a:focus.prev .nav-prev-text, +.pagination .nav-links a:focus.prev .nav-next-text, .pagination .nav-links a:focus.next .nav-prev-text, +.pagination .nav-links a:focus.next .nav-next-text { + text-decoration: underline; +} + +.pagination .nav-links .nav-next-text, +.pagination .nav-links .nav-prev-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .pagination .nav-links { + margin-right: calc(10% + 60px); + padding: 0; + } + .pagination .nav-links .prev > *, + .pagination .nav-links .next > * { + display: inline-block; + vertical-align: text-bottom; + } + .pagination .nav-links > * { + padding: 1rem; + } +} + +.comment-navigation .nav-links { + display: flex; + flex-direction: row; +} + +.comment-navigation .nav-previous, +.comment-navigation .nav-next { + min-width: 50%; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.comment-navigation .nav-previous .secondary-text, +.comment-navigation .nav-next .secondary-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .comment-navigation .nav-previous .secondary-text, + .comment-navigation .nav-next .secondary-text { + display: inline; + } +} + +.comment-navigation .nav-previous svg, +.comment-navigation .nav-next svg { + vertical-align: middle; + position: relative; + margin: 0 -0.35em; + top: -1px; +} + +.comment-navigation .nav-next { + text-align: left; +} + +/* Accessibility */ +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; + /* Many screen reader and browser combinations announce broken words as they would appear visually. */ +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + clip-path: none; + color: #21759b; + display: block; + font-size: 0.875rem; + font-weight: bold; + height: auto; + right: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; + /* Above WP toolbar. */ +} + +/* Do not show the outline on the skip link target. */ +#content[tabindex="-1"]:focus { + outline: 0; +} + +/* Alignments */ +.alignleft { + float: left; + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignleft { + margin-right: calc(2 * 1rem); + } +} + +.alignright { + float: right; + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignright { + margin-left: calc(2 * 1rem); + } +} + +.aligncenter { + clear: both; + display: block; + margin-right: auto; + margin-left: auto; +} + +/* Clearings */ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after { + clear: both; +} + +/* Layout */ +/** === Layout === */ +#page { + width: 100%; +} + +.site-content { + overflow: hidden; +} + +/* Content */ +/*-------------------------------------------------------------- +## Header +--------------------------------------------------------------*/ +.site-header { + padding: 1em; +} + +.site-header.featured-image { + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 90vh; +} + +.site-header.featured-image .site-branding-container { + margin-bottom: auto; +} + +@media only screen and (min-width: 768px) { + .site-header { + margin: 0; + padding: 3rem 0; + } + .site-header.featured-image { + min-height: 100vh; + margin-bottom: 3rem; + } +} + +.site-branding { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + position: relative; + word-wrap: break-word; +} + +@media only screen and (min-width: 768px) { + .site-branding { + margin: 0 calc(10% + 60px); + } +} + +.site-logo { + position: relative; + z-index: 999; + margin-bottom: calc(.66 * 1rem); +} + +@media only screen and (min-width: 768px) { + .site-logo { + margin-bottom: 0; + position: absolute; + left: calc(100% + (1.25 * 1rem)); + top: 4px; + z-index: 999; + } +} + +.site-logo .custom-logo-link { + border-radius: 100%; + box-sizing: content-box; + box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); + display: block; + width: 50px; + height: 50px; + overflow: hidden; + transition: box-shadow 200ms ease-in-out; +} + +.site-logo .custom-logo-link .custom-logo { + min-height: inherit; +} + +.site-logo .custom-logo-link:hover, .site-logo .custom-logo-link:active, .site-logo .custom-logo-link:focus { + box-shadow: 0 0 0 2px black; +} + +@media only screen and (min-width: 768px) { + .site-logo .custom-logo-link { + width: 64px; + height: 64px; + } +} + +.site-title { + margin: auto; + display: inline; + color: #111; + /* When there is no description set, make sure navigation appears below title. */ +} + +.site-title a { + color: #111; +} + +.site-title a:link, .site-title a:visited { + color: #111; +} + +.site-title a:hover { + color: #4a4a4a; +} + +.featured-image .site-title { + margin: 0; +} + +@media only screen and (min-width: 768px) { + .featured-image .site-title { + display: inline-block; + } +} + +.site-title + .main-navigation { + display: block; +} + +@media only screen and (min-width: 768px) { + .site-title { + display: inline; + } +} + +.site-title:not(:empty) + .site-description:not(:empty):before { + content: "\2014"; + margin: 0 .2em; +} + +.site-description { + display: inline; + color: #767676; + font-weight: normal; + margin: 0; +} + +.site-header.featured-image { + /* Hide overflow for overflowing featured image */ + overflow: hidden; + /* Need relative positioning to properly align layers. */ + position: relative; + /* Add text shadow to text, to increase readability. */ + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + /* Set white text color when featured image is set. */ + /* add focus state to social media icons */ + /* Entry header */ + /* Custom Logo Link */ + /* Make sure important elements are above pseudo elements used for effects. */ + /* Set up image filter layer positioning */ + /* Background & Effects */ + /* Shared background settings between pseudo elements. */ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + /* The intensity of each blend mode is controlled via layer opacity. */ + /* Second layer: screen. */ + /* Third layer: multiply. */ + /* When image filters are inactive, a black overlay is added. */ + /* Fourth layer: overlay. */ + /* Fifth layer: readability overlay */ +} + +.site-header.featured-image .site-branding .site-title, +.site-header.featured-image .site-branding .site-description, +.site-header.featured-image .main-navigation a:after, +.site-header.featured-image .main-navigation .main-menu > li.menu-item-has-children:after, +.site-header.featured-image .main-navigation li, +.site-header.featured-image .social-navigation li, +.site-header.featured-image .entry-meta, +.site-header.featured-image .entry-title { + color: #fff; +} + +.site-header.featured-image .main-navigation a, +.site-header.featured-image .main-navigation a + svg, +.site-header.featured-image .social-navigation a, +.site-header.featured-image .site-title a, +.site-header.featured-image .site-featured-image a { + color: #fff; + transition: opacity 110ms ease-in-out; +} + +.site-header.featured-image .main-navigation a:hover, .site-header.featured-image .main-navigation a:active, +.site-header.featured-image .main-navigation a:hover + svg, +.site-header.featured-image .main-navigation a:active + svg, +.site-header.featured-image .main-navigation a + svg:hover, +.site-header.featured-image .main-navigation a + svg:active, +.site-header.featured-image .main-navigation a + svg:hover + svg, +.site-header.featured-image .main-navigation a + svg:active + svg, +.site-header.featured-image .social-navigation a:hover, +.site-header.featured-image .social-navigation a:active, +.site-header.featured-image .social-navigation a:hover + svg, +.site-header.featured-image .social-navigation a:active + svg, +.site-header.featured-image .site-title a:hover, +.site-header.featured-image .site-title a:active, +.site-header.featured-image .site-title a:hover + svg, +.site-header.featured-image .site-title a:active + svg, +.site-header.featured-image .site-featured-image a:hover, +.site-header.featured-image .site-featured-image a:active, +.site-header.featured-image .site-featured-image a:hover + svg, +.site-header.featured-image .site-featured-image a:active + svg { + color: #fff; + opacity: 0.6; +} + +.site-header.featured-image .main-navigation a:focus, +.site-header.featured-image .main-navigation a:focus + svg, +.site-header.featured-image .main-navigation a + svg:focus, +.site-header.featured-image .main-navigation a + svg:focus + svg, +.site-header.featured-image .social-navigation a:focus, +.site-header.featured-image .social-navigation a:focus + svg, +.site-header.featured-image .site-title a:focus, +.site-header.featured-image .site-title a:focus + svg, +.site-header.featured-image .site-featured-image a:focus, +.site-header.featured-image .site-featured-image a:focus + svg { + color: #fff; +} + +.site-header.featured-image .main-navigation .sub-menu a { + opacity: inherit; +} + +.site-header.featured-image .social-navigation a:focus { + color: #fff; + opacity: 1; + border-bottom: 1px solid #fff; +} + +.site-header.featured-image .social-navigation svg, +.site-header.featured-image .site-featured-image svg { + /* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */ + -webkit-filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); +} + +.site-header.featured-image .site-featured-image { + /* First layer: grayscale. */ +} + +.site-header.featured-image .site-featured-image .post-thumbnail img { + height: auto; + right: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100vw; + position: absolute; + top: 50%; + transform: translateX(50%) translateY(-50%); + width: auto; + z-index: 1; + /* When image filters are active, make it grayscale to colorize it blue. */ +} + +@supports (object-fit: cover) { + .site-header.featured-image .site-featured-image .post-thumbnail img { + height: 100%; + right: 0; + object-fit: cover; + top: 0; + transform: none; + width: 100%; + } +} + +.image-filters-enabled .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: grayscale(100%); +} + +.site-header.featured-image .site-featured-image .entry-header { + margin-top: calc( 4 * 1rem); + margin-bottom: 0; + margin-right: 0; + margin-left: 0; + /* Entry meta */ +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header { + margin-right: calc(10% + 60px); + margin-left: calc(10% + 60px); + } +} + +.site-header.featured-image .site-featured-image .entry-header .entry-title:before { + background: #fff; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta { + font-weight: 500; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span { + margin-left: 1rem; + display: inline-block; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span:last-child { + margin-left: 0; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a:hover { + text-decoration: none; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-left: 0.5em; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .discussion-avatar-list { + display: none; +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta { + display: flex; + position: relative; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-title { + padding-left: calc(1 * (100vw / 12) + 1rem); + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .comment-count { + position: absolute; + left: 0; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .discussion-avatar-list { + display: block; + position: absolute; + bottom: 100%; + } +} + +.site-header.featured-image .custom-logo-link { + background: #fff; + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); +} + +.site-header.featured-image .custom-logo-link:hover, .site-header.featured-image .custom-logo-link:active, .site-header.featured-image .custom-logo-link:focus { + box-shadow: 0 0 0 2px white; +} + +.site-header.featured-image .site-branding { + position: relative; + z-index: 10; +} + +.site-header.featured-image .site-featured-image .entry-header { + position: relative; + z-index: 9; +} + +.site-header.featured-image .site-branding-container:after, +.site-header.featured-image .site-featured-image:before, +.site-header.featured-image .site-featured-image:after, .site-header.featured-image:after { + display: block; + position: absolute; + top: 0; + right: 0; + content: "\020"; + width: 100%; + height: 100%; +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; +} + +.site-header.featured-image .site-featured-image:after { + background: #000; + mix-blend-mode: multiply; + opacity: .7; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:after { + background: #0073aa; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .site-header.featured-image .site-featured-image:after { + opacity: 1; + } +} + +.image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(0, 0, 0, 0.35); + mix-blend-mode: overlay; + opacity: 0.5; + z-index: 4; + /* Browsers supporting mix-blend-mode can have a light overlay */ +} + +@supports (mix-blend-mode: overlay) { + .image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(255, 255, 255, 0.35); + } +} + +.site-header.featured-image:after { + background: #000; + /** + * Add a transition to the readability overlay, to add a subtle + * but smooth effect when resizing the screen. + */ + transition: opacity 1200ms ease-in-out; + opacity: 0.7; + z-index: 5; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image:after { + background: #000e14; + opacity: 0.38; +} + +@media only screen and (min-width: 768px) { + .image-filters-enabled .site-header.featured-image:after { + opacity: 0.18; + } +} + +.site-header.featured-image ::-moz-selection { + background: rgba(255, 255, 255, 0.17); +} + +.site-header.featured-image ::selection { + background: rgba(255, 255, 255, 0.17); +} + +/*-------------------------------------------------------------- +## Posts and pages +--------------------------------------------------------------*/ +.sticky { + display: block; +} + +.sticky-post { + background: #0073aa; + color: #fff; + display: inline-block; + font-weight: bold; + line-height: 1; + padding: .25rem; + position: absolute; + text-transform: uppercase; + top: -1rem; + z-index: 1; +} + +.updated:not(.published) { + display: none; +} + +.page-links { + clear: both; + margin: 0 0 calc(1.5 * 1rem); +} + +.entry { + margin-top: calc(6 * 1rem); +} + +.entry:first-of-type { + margin-top: 0; +} + +.entry .entry-header { + margin: calc(3 * 1rem) 1rem 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) 1rem; + } +} + +.entry .entry-title { + margin: 0; +} + +.entry .entry-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.entry .entry-title a { + color: inherit; +} + +.entry .entry-title a:hover { + color: #4a4a4a; +} + +.entry .entry-meta, +.entry .entry-footer { + color: #767676; + font-weight: 500; +} + +.entry .entry-meta > span, +.entry .entry-footer > span { + margin-left: 1rem; + display: inline-block; +} + +.entry .entry-meta > span:last-child, +.entry .entry-footer > span:last-child { + margin-left: 0; +} + +.entry .entry-meta a, +.entry .entry-footer a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.entry .entry-meta a:hover, +.entry .entry-footer a:hover { + text-decoration: none; + color: #0073aa; +} + +.entry .entry-meta .svg-icon, +.entry .entry-footer .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-left: 0.5em; +} + +.entry .entry-meta { + margin: 1rem 0; +} + +.entry .entry-footer { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + margin: 1rem calc(10% + 60px) calc(3 * 1rem); + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .post-thumbnail { + margin: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .post-thumbnail { + margin: 1rem calc(10% + 60px); + } +} + +.entry .post-thumbnail:focus { + outline: none; +} + +.entry .post-thumbnail .post-thumbnail-inner { + display: block; +} + +.entry .post-thumbnail .post-thumbnail-inner img { + position: relative; + display: block; + width: 100%; +} + +.image-filters-enabled .entry .post-thumbnail { + position: relative; + display: block; +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner { + filter: grayscale(100%); +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + background: rgba(0, 0, 0, 0.35); + content: ""; + display: block; + height: 100%; + opacity: .5; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; + z-index: 4; +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + display: none; + } +} + +.image-filters-enabled .entry .post-thumbnail:before, .image-filters-enabled .entry .post-thumbnail:after { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + right: 0; + content: "\020"; + pointer-events: none; +} + +.image-filters-enabled .entry .post-thumbnail:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; + z-index: 2; +} + +.image-filters-enabled .entry .post-thumbnail:after { + background: #0073aa; + mix-blend-mode: multiply; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail:after { + opacity: 1; + } +} + +.entry .entry-content, +.entry .entry-summary { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content, + .entry .entry-summary { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content p { + word-wrap: break-word; +} + +.entry .entry-content .more-link { + transition: color 110ms ease-in-out; + display: inline; + color: inherit; +} + +.entry .entry-content .more-link:after { + content: "\02192"; + display: inline-block; + margin-right: 0.5em; +} + +.entry .entry-content .more-link:hover { + color: #0073aa; + text-decoration: none; +} + +.entry .entry-content a { + text-decoration: underline; +} + +.entry .entry-content a.button, .entry .entry-content a:hover { + text-decoration: none; +} + +.entry .entry-content a.button { + display: inline-block; +} + +.entry .entry-content a.button:hover { + background: #111; + color: #fff; + cursor: pointer; +} + +.entry .entry-content > iframe[style] { + margin: 32px 0 !important; + max-width: 100% !important; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > iframe[style] { + max-width: calc(8 * (100vw / 12) - 28px) !important; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > iframe[style] { + max-width: calc(6 * (100vw / 12) - 28px) !important; + } +} + +.entry .entry-content .page-links a { + margin: calc(0.5 * 1rem); + text-decoration: none; +} + +.entry .entry-content .wp-audio-shortcode { + max-width: calc(100vw - (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +/* Author description */ +.author-bio { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .author-bio { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.author-bio .author-title { + display: inline; +} + +.author-bio .author-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.author-bio .author-description { + display: inline; + color: #767676; + font-size: 1.125em; + line-height: 1.2; +} + +.author-bio .author-description .author-link { + display: inline-block; +} + +.author-bio .author-description .author-link:hover { + color: #005177; + text-decoration: none; +} + +/*-------------------------------------------------------------- +## Comments +--------------------------------------------------------------*/ +.comment-content a { + word-wrap: break-word; +} + +.bypostauthor { + display: block; +} + +.comments-area { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + margin: calc(2 * 1rem) 1rem; + word-wrap: break-word; + /* Add extra margin when the comments section is located immediately after the + * post itself (this happens on pages). + */ +} + +@media only screen and (min-width: 768px) { + .comments-area { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .comments-area { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .comments-area { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.comments-area > * { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area > * { + margin-top: calc(3 * 1rem); + margin-bottom: calc(3 * 1rem); + } +} + +.entry + .comments-area { + margin-top: calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap { + align-items: baseline; + display: flex; + justify-content: space-between; + } +} + +.comments-area .comments-title-wrap .comments-title { + margin: 0; +} + +.comments-area .comments-title-wrap .comments-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .comments-title { + flex: 1 0 calc(3 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .discussion-meta { + flex: 0 0 calc(2 * (100vw / 12)); + margin-right: 1rem; + } +} + +#comment { + max-width: 100%; + box-sizing: border-box; +} + +#respond { + position: relative; +} + +#respond .comment-user-avatar { + margin: 1rem 0 -1rem; +} + +#respond .comment .comment-form { + padding-right: 0; +} + +#respond > small { + display: block; + font-size: 22px; + position: absolute; + right: calc(1rem + 100%); + top: calc(-3.5 * 1rem); + width: calc(100vw / 12); +} + +#comments > .comments-title:last-child { + display: none; +} + +.comment-form-flex { + display: flex; + flex-direction: column; +} + +.comment-form-flex .comments-title { + display: none; + margin: 0; + order: 1; +} + +.comment-form-flex #respond { + order: 2; +} + +.comment-form-flex #respond + .comments-title { + display: block; +} + +.comment-list { + list-style: none; + padding: 0; +} + +.comment-list .children { + margin: 0; + padding: 0 1rem 0 0; +} + +.comment-list > .comment:first-child { + margin-top: 0; +} + +.comment-list .pingback .comment-body, +.comment-list .trackback .comment-body { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + font-weight: 500; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.comment-list .pingback .comment-body a:not(.comment-edit-link), +.comment-list .trackback .comment-body a:not(.comment-edit-link) { + font-weight: bold; + font-size: 19.55556px; + line-height: 1.5; + padding-left: 0.5rem; + display: block; +} + +.comment-list .pingback .comment-body .comment-edit-link, +.comment-list .trackback .comment-body .comment-edit-link { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 500; +} + +#respond + .comment-reply { + display: none; +} + +.comment-reply .comment-reply-link { + display: inline-block; +} + +.comment { + list-style: none; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment { + padding-right: calc(.5 * (1rem + calc(100vw / 12 ))); + } + .comment.depth-1, + .comment .children { + padding-right: 0; + } + .comment.depth-1 { + margin-right: calc(3.25 * 1rem); + } +} + +.comment .comment-body { + margin: calc(2 * 1rem) 0 0; +} + +.comment .comment-meta { + position: relative; +} + +.comment .comment-author .avatar { + float: right; + margin-left: 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .avatar { + float: inherit; + margin-left: inherit; + position: absolute; + top: 0; + left: calc(100% + 1rem); + } +} + +.comment .comment-author .fn { + position: relative; + display: block; +} + +.comment .comment-author .fn a { + color: inherit; +} + +.comment .comment-author .fn a:hover { + color: #005177; +} + +.comment .comment-author .post-author-badge { + border-radius: 100%; + display: block; + height: 18px; + position: absolute; + background: #008fd3; + left: calc(100% - 2.5rem); + top: -3px; + width: 18px; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .post-author-badge { + left: calc(100% + 0.75rem); + } +} + +.comment .comment-author .post-author-badge svg { + width: inherit; + height: inherit; + display: block; + fill: white; + transform: scale(0.875); +} + +.comment .comment-metadata > a, +.comment .comment-metadata .comment-edit-link { + display: inline; + font-weight: 500; + color: #767676; + vertical-align: baseline; +} + +.comment .comment-metadata > a time, +.comment .comment-metadata .comment-edit-link time { + vertical-align: baseline; +} + +.comment .comment-metadata > a:hover, +.comment .comment-metadata .comment-edit-link:hover { + color: #005177; + text-decoration: none; +} + +.comment .comment-metadata > * { + display: inline-block; +} + +.comment .comment-metadata .edit-link-sep { + color: #767676; + margin: 0 0.2em; + vertical-align: baseline; +} + +.comment .comment-metadata .edit-link { + color: #767676; +} + +.comment .comment-metadata .edit-link svg { + transform: scale(0.8); + vertical-align: baseline; + margin-left: 0.1em; +} + +.comment .comment-metadata .comment-edit-link { + position: relative; + padding-right: 1rem; + margin-right: -1rem; + z-index: 1; +} + +.comment .comment-metadata .comment-edit-link:hover { + color: #0073aa; +} + +.comment .comment-content { + margin: 1rem 0; +} + +@media only screen and (min-width: 1168px) { + .comment .comment-content { + padding-left: 1rem; + } +} + +.comment .comment-content > *:first-child { + margin-top: 0; +} + +.comment .comment-content > *:last-child { + margin-bottom: 0; +} + +.comment .comment-content blockquote { + margin-right: 0; +} + +.comment .comment-content a { + text-decoration: underline; +} + +.comment .comment-content a:hover { + text-decoration: none; +} + +.comment-reply-link, +#cancel-comment-reply-link { + font-weight: 500; +} + +.comment-reply-link:hover, +#cancel-comment-reply-link:hover { + color: #005177; +} + +.discussion-avatar-list { + content: ""; + display: table; + table-layout: fixed; + margin: 0; + padding: 0; +} + +.discussion-avatar-list li { + position: relative; + list-style: none; + margin: 0 0 0 -8px; + padding: 0; + float: right; +} + +.discussion-avatar-list .comment-user-avatar img { + height: calc(1.5 * 1rem); + width: calc(1.5 * 1rem); +} + +.discussion-meta .discussion-meta-info { + margin: 0; +} + +.discussion-meta .discussion-meta-info .svg-icon { + vertical-align: middle; + fill: currentColor; + transform: scale(0.6) scaleX(-1) translateY(-0.1em); + margin-right: -0.25rem; +} + +.comment-form .comment-notes, +.comment-form label { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-author, + .comment-form .comment-form-email { + width: calc(50% - 0.5rem); + float: right; + } +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-email { + margin-right: 1rem; + } +} + +.comment-form input[name="author"], +.comment-form input[name="email"], +.comment-form input[name="url"] { + display: block; + width: 100%; +} + +/*-------------------------------------------------------------- +## Archives +--------------------------------------------------------------*/ +.archive .page-header, +.search .page-header, +.error404 .page-header { + margin: 1rem 1rem calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .archive .page-header, + .search .page-header, + .error404 .page-header { + margin: 0 calc(10% + 60px) calc(3 * 1rem); + } +} + +.archive .page-header .page-title, +.search .page-header .page-title, +.error404 .page-header .page-title { + color: #767676; + display: inline; + letter-spacing: normal; +} + +.archive .page-header .page-title:before, +.search .page-header .page-title:before, +.error404 .page-header .page-title:before { + display: none; +} + +.archive .page-header .search-term, +.archive .page-header .page-description, +.search .page-header .search-term, +.search .page-header .page-description, +.error404 .page-header .search-term, +.error404 .page-header .page-description { + display: inherit; + clear: both; +} + +.archive .page-header .page-description, +.search .page-header .page-description { + display: block; + color: #111; + font-size: 1em; +} + +@media only screen and (min-width: 768px) { + .hfeed .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +/* 404 & Not found */ +.error-404.not-found .page-content, +.no-results.not-found .page-content { + margin: calc(3 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + .error-404.not-found .page-content, + .no-results.not-found .page-content { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +.error-404.not-found .search-submit, +.no-results.not-found .search-submit { + vertical-align: middle; + margin: 1rem 0; +} + +.error-404.not-found .search-field, +.no-results.not-found .search-field { + width: 100%; +} + +/*-------------------------------------------------------------- +## Footer +--------------------------------------------------------------*/ +/* Site footer */ +#colophon .widget-area, +#colophon .site-info { + margin: calc(2 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + #colophon .widget-area, + #colophon .site-info { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +#colophon .widget-column { + display: flex; + flex-wrap: wrap; +} + +#colophon .widget-column .widget { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + width: 100%; + word-wrap: break-word; +} + +@media only screen and (min-width: 1168px) { + #colophon .widget-column .widget { + margin-left: calc(3 * 1rem); + width: calc(50% - (3 * 1rem)); + } +} + +#colophon .site-info { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-wrap: break-word; +} + +#colophon .site-info a { + color: inherit; +} + +#colophon .site-info a:hover { + text-decoration: none; + color: #0073aa; +} + +#colophon .site-info .imprint, +#colophon .site-info .privacy-policy-link { + margin-left: 1rem; +} + +/* Widgets */ +.widget { + margin: 0 0 1rem; + /* Make sure select elements fit in widgets. */ +} + +.widget select { + max-width: 100%; +} + +.widget a { + color: #0073aa; +} + +.widget a:hover { + color: #005177; +} + +.widget_archive ul, +.widget_categories ul, +.widget_meta ul, +.widget_nav_menu ul, +.widget_pages ul, +.widget_recent_comments ul, +.widget_recent_entries ul, +.widget_rss ul { + padding: 0; + list-style: none; +} + +.widget_archive ul li, +.widget_categories ul li, +.widget_meta ul li, +.widget_nav_menu ul li, +.widget_pages ul li, +.widget_recent_comments ul li, +.widget_recent_entries ul li, +.widget_rss ul li { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: 700; + line-height: 1.2; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.widget_archive ul ul, +.widget_categories ul ul, +.widget_meta ul ul, +.widget_nav_menu ul ul, +.widget_pages ul ul, +.widget_recent_comments ul ul, +.widget_recent_entries ul ul, +.widget_rss ul ul { + counter-reset: submenu; +} + +.widget_archive ul ul > li > a::before, +.widget_categories ul ul > li > a::before, +.widget_meta ul ul > li > a::before, +.widget_nav_menu ul ul > li > a::before, +.widget_pages ul ul > li > a::before, +.widget_recent_comments ul ul > li > a::before, +.widget_recent_entries ul ul > li > a::before, +.widget_rss ul ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.widget_tag_cloud .tagcloud { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; +} + +.widget_search .search-field { + width: 100%; +} + +@media only screen and (min-width: 600px) { + .widget_search .search-field { + width: auto; + } +} + +.widget_search .search-submit { + display: block; + margin-top: 1rem; +} + +.widget_calendar .calendar_wrap { + text-align: center; +} + +.widget_calendar .calendar_wrap table td, +.widget_calendar .calendar_wrap table th { + border: none; +} + +.widget_calendar .calendar_wrap a { + text-decoration: underline; +} + +.widget_calendar .calendar_wrap .wp-calendar-table { + margin-bottom: 0; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav { + margin: 0 0 1rem; + display: table; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav span { + display: table-cell; + padding: 0.5em; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav-prev, +.widget_calendar .calendar_wrap .wp-calendar-nav-next { + width: 40%; +} + +/* Blocks */ +/* !Block styles */ +.entry .entry-content > *, +.entry .entry-summary > *, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + } +} + +.entry .entry-content > *.alignwide, +.entry .entry-summary > *.alignwide, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + margin-right: auto; + margin-left: auto; + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignwide, + .entry .entry-summary > *.alignwide, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + width: 100%; + max-width: 100%; + } +} + +.entry .entry-content > *.alignfull, +.entry .entry-summary > *.alignfull, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + position: relative; + right: -1rem; + width: calc( 100% + (2 * 1rem)); + max-width: calc( 100% + (2 * 1rem)); + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignfull, + .entry .entry-summary > *.alignfull, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); + right: calc( -12.5% - 75px); + width: calc( 125% + 150px); + max-width: calc( 125% + 150px); + } +} + +.entry .entry-content > *.alignleft, +.entry .entry-summary > *.alignleft, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + float: left; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-right: 0; + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignleft, + .entry .entry-summary > *.alignleft, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + max-width: calc(4 * (100vw / 12)); + margin-right: calc(2 * 1rem); + } +} + +.entry .entry-content > *.alignright, +.entry .entry-summary > *.alignright, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + float: right; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-left: 0; + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignright, + .entry .entry-summary > *.alignright, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + max-width: calc(4 * (100vw / 12)); + margin-left: 0; + margin-left: calc(2 * 1rem); + } +} + +.entry .entry-content > *.aligncenter, +.entry .entry-summary > *.aligncenter, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-right: auto; + margin-left: auto; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-right: 0; + margin-left: 0; + } +} + +.entry .entry-content > * > *:first-child, +.entry .entry-summary > * > *:first-child { + margin-top: 0; +} + +.entry .entry-content > * > *:last-child, +.entry .entry-summary > * > *:last-child { + margin-bottom: 0; +} + +/* + * Unset nested content selector styles + * - Prevents layout styles from cascading too deeply + * - helps with plugin compatibility + */ +.entry .entry-content .entry-content, +.entry .entry-content .entry-summary, +.entry .entry-content .entry, +.entry .entry-summary .entry-content, +.entry .entry-summary .entry-summary, +.entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .entry-content, + .entry .entry-content .entry-summary, + .entry .entry-content .entry, + .entry .entry-summary .entry-content, + .entry .entry-summary .entry-summary, + .entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; + } +} + +.entry .entry-content p.has-background { + padding: 20px 30px; +} + +.entry .entry-content .wp-block-audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio.alignleft audio, +.entry .entry-content .wp-block-audio.alignright audio { + max-width: 198px; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 384px; + } +} + +@media only screen and (min-width: 1379px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 385.44px; + } +} + +.entry .entry-content .wp-block-video video { + width: 100%; +} + +.entry .entry-content .wp-block-button .wp-block-button__link { + transition: background 150ms ease-in-out; + border: none; + font-size: 0.88889em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + box-sizing: border-box; + font-weight: bold; + text-decoration: none; + padding: 0.76rem 1rem; + outline: none; + outline: none; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-background) { + background-color: #0073aa; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-text-color) { + color: white; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:hover { + color: white; + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:focus { + color: white; + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-button:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active { + transition: all 150ms ease-in-out; + border-width: 2px; + border-style: solid; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-background) { + background: transparent; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-text-color) { + color: #0073aa; + border-color: currentColor; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover { + color: white; + border-color: #111; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover:not(.has-background) { + color: #111; +} + +.entry .entry-content .wp-block-archives, +.entry .entry-content .wp-block-categories, +.entry .entry-content .wp-block-latest-posts { + padding: 0; + list-style: none; +} + +.entry .entry-content .wp-block-archives li > a, +.entry .entry-content .wp-block-categories li > a, +.entry .entry-content .wp-block-latest-posts li > a { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: bold; + line-height: 1.2; + text-decoration: none; +} + +.entry .entry-content .wp-block-archives.aligncenter, +.entry .entry-content .wp-block-categories.aligncenter { + text-align: center; +} + +.entry .entry-content .wp-block-categories ul { + padding-top: 0.75rem; +} + +.entry .entry-content .wp-block-categories li ul { + list-style: none; + padding-right: 0; +} + +.entry .entry-content .wp-block-categories ul { + counter-reset: submenu; +} + +.entry .entry-content .wp-block-categories ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; + line-height: 1.2; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-full-content, +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-excerpt { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.entry .entry-content .wp-block-latest-posts li { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts li.menu-item-has-children, .entry .entry-content .wp-block-latest-posts li:last-child { + padding-bottom: 0; +} + +.entry .entry-content .wp-block-latest-posts li :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li { + border-top: 2px solid #ccc; + padding-top: 1rem; + margin-bottom: 2rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li a:after { + content: ''; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child { + margin-bottom: auto; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child a:after { + content: ''; +} + +.entry .entry-content .wp-block-preformatted { + font-size: 0.71111em; + line-height: 1.8; + padding: 1rem; +} + +.entry .entry-content .wp-block-verse { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-size: 22px; + line-height: 1.8; +} + +.entry .entry-content .has-drop-cap:not(:focus):first-letter { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 3.375em; + line-height: 1; + font-weight: bold; + margin: 0 0 0 0.25em; +} + +.entry .entry-content .wp-block-pullquote { + border-color: transparent; + border-width: 2px; + padding: 1rem; +} + +.entry .entry-content .wp-block-pullquote blockquote { + color: #111; + border: none; + margin-top: calc(4 * 1rem); + margin-bottom: calc(4.33 * 1rem); + margin-left: 0; + padding-right: 0; +} + +.entry .entry-content .wp-block-pullquote p { + font-size: 1.6875em; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +.entry .entry-content .wp-block-pullquote p em { + font-style: normal; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote cite { + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + text-transform: none; + color: #767676; + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-pullquote.alignleft, .entry .entry-content .wp-block-pullquote.alignright { + width: 100%; + padding: 0; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote, .entry .entry-content .wp-block-pullquote.alignright blockquote { + margin: 1rem 0; + padding: 0; + text-align: right; + max-width: 100%; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote p:first-child, .entry .entry-content .wp-block-pullquote.alignright blockquote p:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color { + background-color: #0073aa; + padding-right: 0; + padding-left: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color { + padding-right: 10%; + padding-left: 10%; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 1.6875em; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color a { + color: #fff; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color cite { + color: inherit; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + color: #fff; + padding-right: 0; + margin-right: 1rem; + margin-left: 1rem; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color p, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color a, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + margin-right: 0; + margin-left: 0; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignright, .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignleft { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignfull { + padding-right: calc(10% + 58px + (2 * 1rem)); + padding-left: calc(10% + 58px + (2 * 1rem)); + } +} + +.entry .entry-content .wp-block-quote:not(.is-large), .entry .entry-content .wp-block-quote:not(.is-style-large) { + border-width: 2px; + border-color: #0073aa; + padding-top: 0; + padding-bottom: 0; +} + +.entry .entry-content .wp-block-quote p { + font-size: 1em; + font-style: normal; + line-height: 1.8; +} + +.entry .entry-content .wp-block-quote cite { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 0; + border-right: none; +} + +.entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + line-height: 1.4; + font-style: italic; +} + +.entry .entry-content .wp-block-quote.is-large cite, +.entry .entry-content .wp-block-quote.is-large footer, .entry .entry-content .wp-block-quote.is-style-large cite, +.entry .entry-content .wp-block-quote.is-style-large footer { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 1rem 0; + } + .entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + } +} + +.entry .entry-content .wp-block-image { + max-width: 100%; +} + +.entry .entry-content .wp-block-image img { + display: block; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + margin: 0; + width: calc(8 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + width: calc(6 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +.entry .entry-content .wp-block-image.alignfull img { + width: 100vw; + max-width: calc( 100% + (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image.alignfull img { + max-width: calc( 125% + 150px); + margin-right: auto; + margin-left: auto; + } +} + +.entry .entry-content .wp-block-cover-image, +.entry .entry-content .wp-block-cover { + position: relative; + min-height: 430px; + padding: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image, + .entry .entry-content .wp-block-cover { + padding: 1rem 10%; + } +} + +.entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover-image .wp-block-cover-text, +.entry .entry-content .wp-block-cover-image h2, +.entry .entry-content .wp-block-cover .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover .wp-block-cover-text, +.entry .entry-content .wp-block-cover h2 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 1.6875em; + font-weight: bold; + line-height: 1.25; + padding: 0; + color: #fff; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image h2, + .entry .entry-content .wp-block-cover .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover .wp-block-cover-text, + .entry .entry-content .wp-block-cover h2 { + font-size: 2.25em; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, +.entry .entry-content .wp-block-cover.alignleft, +.entry .entry-content .wp-block-cover.alignright { + width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, + .entry .entry-content .wp-block-cover.alignleft, + .entry .entry-content .wp-block-cover.alignright { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull, + .entry .entry-content .wp-block-cover.alignfull { + padding-right: calc(10% + 58px + (2 * 1rem)); + padding-left: calc(10% + 58px + (2 * 1rem)); + } + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + padding: 0; + } +} + +.entry .entry-content .wp-block-gallery { + list-style-type: none; + padding-right: 0; +} + +.entry .entry-content .wp-block-gallery .blocks-gallery-image:last-child, +.entry .entry-content .wp-block-gallery .blocks-gallery-item:last-child { + margin-bottom: 16px; +} + +.entry .entry-content .wp-block-gallery figcaption a { + color: #fff; +} + +.entry .entry-content .wp-block-audio figcaption, +.entry .entry-content .wp-block-video figcaption, +.entry .entry-content .wp-block-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption { + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +.entry .entry-content .wp-block-separator, +.entry .entry-content hr { + background-color: #767676; + border: 0; + height: 2px; + margin-bottom: 2rem; + margin-top: 2rem; + max-width: 2.25em; + text-align: right; + /* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +} + +.entry .entry-content .wp-block-separator.is-style-wide, +.entry .entry-content hr.is-style-wide { + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots, +.entry .entry-content hr.is-style-dots { + max-width: 100%; + background-color: inherit; + border: inherit; + height: inherit; + text-align: center; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots:not(.has-text-color):not(.has-background), +.entry .entry-content hr.is-style-dots:not(.has-text-color):not(.has-background) { + color: #767676; +} + +.entry .entry-content .wp-block-separator.is-style-dots:before, +.entry .entry-content hr.is-style-dots:before { + font-size: 1.6875em; + letter-spacing: 0.88889em; + padding-right: 0.88889em; +} + +.entry .entry-content .wp-block-separator + h1:before, +.entry .entry-content .wp-block-separator + h2:before, +.entry .entry-content hr + h1:before, +.entry .entry-content hr + h2:before { + display: none; +} + +.entry .entry-content .wp-block-embed-twitter { + word-break: break-word; +} + +.entry .entry-content .wp-block-table th, +.entry .entry-content .wp-block-table td { + border-color: #767676; +} + +.entry .entry-content .wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.entry .entry-content .wp-block-file .wp-block-file__button { + display: table; + transition: background 150ms ease-in-out; + border: none; + border-radius: 5px; + background: #0073aa; + font-size: 22px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + text-decoration: none; + font-weight: bold; + padding: 0.75rem 1rem; + color: #fff; + margin-right: 0; + margin-top: calc(0.75 * 1rem); +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-file .wp-block-file__button { + font-size: 22px; + padding: 0.875rem 1.5rem; + } +} + +.entry .entry-content .wp-block-file .wp-block-file__button:hover { + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-file .wp-block-file__button:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-code { + border-radius: 0; +} + +.entry .entry-content .wp-block-code code { + font-size: 1.125em; + white-space: pre-wrap; + word-break: break-word; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:last-child { + margin-bottom: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns { + flex-wrap: nowrap; + } + .entry .entry-content .wp-block-columns .wp-block-column:not(:first-child) { + margin-right: 32px; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .alignfull, + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .wp-block-image > img { + right: 0; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content .wp-block-group.has-background { + padding: 1rem; + margin-top: 0; + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:last-child { + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background.alignfull { + padding-right: 0; + padding-left: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background.alignfull { + padding-top: 1rem; + padding-bottom: 1rem; + } +} + +.entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: 100%; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: calc( 100% + 2rem); + max-width: calc( 100% + 2rem); + margin-right: -1rem; + } +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta .wp-block-latest-comments__comment-date { + font-weight: normal; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-date, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; +} + +.entry .entry-content .wp-block-latest-comments.has-dates .wp-block-latest-comments__comment-date { + font-size: 0.71111em; +} + +.entry .entry-content .has-small-font-size { + font-size: 0.88889em; +} + +.entry .entry-content .has-normal-font-size { + font-size: 1.125em; +} + +.entry .entry-content .has-large-font-size { + font-size: 1.6875em; +} + +.entry .entry-content .has-huge-font-size { + font-size: 2.25em; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .has-light-gray-background-color { + color: #fff; +} + +.entry .entry-content .has-primary-background-color > p, +.entry .entry-content .has-primary-background-color > h1, +.entry .entry-content .has-primary-background-color > h2, +.entry .entry-content .has-primary-background-color > h3, +.entry .entry-content .has-primary-background-color > h4, +.entry .entry-content .has-primary-background-color > h5, +.entry .entry-content .has-primary-background-color > h6, +.entry .entry-content .has-primary-background-color > a, +.entry .entry-content .has-secondary-background-color > p, +.entry .entry-content .has-secondary-background-color > h1, +.entry .entry-content .has-secondary-background-color > h2, +.entry .entry-content .has-secondary-background-color > h3, +.entry .entry-content .has-secondary-background-color > h4, +.entry .entry-content .has-secondary-background-color > h5, +.entry .entry-content .has-secondary-background-color > h6, +.entry .entry-content .has-secondary-background-color > a, +.entry .entry-content .has-dark-gray-background-color > p, +.entry .entry-content .has-dark-gray-background-color > h1, +.entry .entry-content .has-dark-gray-background-color > h2, +.entry .entry-content .has-dark-gray-background-color > h3, +.entry .entry-content .has-dark-gray-background-color > h4, +.entry .entry-content .has-dark-gray-background-color > h5, +.entry .entry-content .has-dark-gray-background-color > h6, +.entry .entry-content .has-dark-gray-background-color > a, +.entry .entry-content .has-light-gray-background-color > p, +.entry .entry-content .has-light-gray-background-color > h1, +.entry .entry-content .has-light-gray-background-color > h2, +.entry .entry-content .has-light-gray-background-color > h3, +.entry .entry-content .has-light-gray-background-color > h4, +.entry .entry-content .has-light-gray-background-color > h5, +.entry .entry-content .has-light-gray-background-color > h6, +.entry .entry-content .has-light-gray-background-color > a { + color: #fff; +} + +.entry .entry-content .has-white-background-color { + color: #111; +} + +.entry .entry-content .has-white-background-color > p, +.entry .entry-content .has-white-background-color > h1, +.entry .entry-content .has-white-background-color > h2, +.entry .entry-content .has-white-background-color > h3, +.entry .entry-content .has-white-background-color > h4, +.entry .entry-content .has-white-background-color > h5, +.entry .entry-content .has-white-background-color > h6, +.entry .entry-content .has-white-background-color > a { + color: #111; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-primary-background-color { + background-color: #0073aa; +} + +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-secondary-background-color { + background-color: #005177; +} + +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-dark-gray-background-color { + background-color: #111; +} + +.entry .entry-content .has-light-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-light-gray-background-color { + background-color: #767676; +} + +.entry .entry-content .has-white-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-white-background-color { + background-color: #FFF; +} + +.entry .entry-content .has-primary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color > p { + color: #0073aa; +} + +.entry .entry-content .has-secondary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color > p { + color: #005177; +} + +.entry .entry-content .has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color > p { + color: #111; +} + +.entry .entry-content .has-light-gray-color, +.entry .entry-content .wp-block-pullquote blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color > p { + color: #767676; +} + +.entry .entry-content .has-white-color, +.entry .entry-content .wp-block-pullquote blockquote.has-white-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: #FFF; +} + +/* Media */ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +embed, +iframe, +object { + max-width: 100%; +} + +.custom-logo-link { + display: inline-block; +} + +.avatar { + border-radius: 100%; + display: block; + height: calc(2.25 * 1rem); + min-height: inherit; + width: calc(2.25 * 1rem); +} + +svg { + transition: fill 120ms ease-in-out; + fill: currentColor; +} + +/*-------------------------------------------------------------- +## Captions +--------------------------------------------------------------*/ +.wp-caption { + margin-bottom: calc(1.5 * 1rem); +} + +@media only screen and (min-width: 768px) { + .wp-caption.aligncenter { + position: relative; + right: calc( calc(8 * (100vw / 12) - 28px) / 2); + transform: translateX(50%); + } +} + +@media only screen and (min-width: 1168px) { + .wp-caption.aligncenter { + right: calc( calc(6 * (100vw / 12) - 28px) / 2); + } +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-right: auto; + margin-left: auto; +} + +.wp-caption-text { + color: #767676; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +/*-------------------------------------------------------------- +## Galleries +--------------------------------------------------------------*/ +.gallery { + display: flex; + flex-flow: row wrap; + justify-content: center; + margin-bottom: calc(1.5 * 1rem); +} + +.gallery-item { + display: inline-block; + margin-left: 16px; + margin-bottom: 16px; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: calc((100% - 16px * 1) / 2); +} + +.gallery-columns-2 .gallery-item:nth-of-type(2n+2) { + margin-left: 0; +} + +.gallery-columns-3 .gallery-item { + max-width: calc((100% - 16px * 2) / 3); +} + +.gallery-columns-3 .gallery-item:nth-of-type(3n+3) { + margin-left: 0; +} + +.gallery-columns-4 .gallery-item { + max-width: calc((100% - 16px * 3) / 4); +} + +.gallery-columns-4 .gallery-item:nth-of-type(4n+4) { + margin-left: 0; +} + +.gallery-columns-5 .gallery-item { + max-width: calc((100% - 16px * 4) / 5); +} + +.gallery-columns-5 .gallery-item:nth-of-type(5n+5) { + margin-left: 0; +} + +.gallery-columns-6 .gallery-item { + max-width: calc((100% - 16px * 5) / 6); +} + +.gallery-columns-6 .gallery-item:nth-of-type(6n+6) { + margin-left: 0; +} + +.gallery-columns-7 .gallery-item { + max-width: calc((100% - 16px * 6) / 7); +} + +.gallery-columns-7 .gallery-item:nth-of-type(7n+7) { + margin-left: 0; +} + +.gallery-columns-8 .gallery-item { + max-width: calc((100% - 16px * 7) / 8); +} + +.gallery-columns-8 .gallery-item:nth-of-type(8n+8) { + margin-left: 0; +} + +.gallery-columns-9 .gallery-item { + max-width: calc((100% - 16px * 8) / 9); +} + +.gallery-columns-9 .gallery-item:nth-of-type(9n+9) { + margin-left: 0; +} + +.gallery-item:last-of-type { + padding-left: 0; +} + +.gallery-caption { + display: block; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; +} + +.gallery-item > div > a { + display: block; + line-height: 0; + box-shadow: 0 0 0 0 transparent; +} + +.gallery-item > div > a:focus { + box-shadow: 0 0 0 2px #0073aa; +} diff --git a/wp-content/themes/twentynineteen/style.css b/wp-content/themes/twentynineteen/style.css new file mode 100644 index 0000000..6f81778 --- /dev/null +++ b/wp-content/themes/twentynineteen/style.css @@ -0,0 +1,6525 @@ +@charset "UTF-8"; +/* +Theme Name: Twenty Nineteen +Theme URI: https://wordpress.org/themes/twentynineteen/ +Author: the WordPress team +Author URI: https://wordpress.org/ +Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. +Requires at least: 4.9.6 +Requires PHP: 5.2.4 +Version: 1.5 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: twentynineteen +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. + +Twenty Nineteen is based on Underscores https://underscores.me/, (C) 2012-2019 Automattic, Inc. +Underscores is distributed under the terms of the GNU GPL v2 or later. + +Normalizing styles have been helped along thanks to the fine work of +Nicolas Gallagher and Jonathan Neal https://necolas.github.io/normalize.css/ +*/ +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Variables +# Normalize +# Typography + ## Headings + ## Copy +# Elements + ## Lists + ## Tables +# Forms + ## Buttons + ## Fields +# Navigation + ## Links + ## Menus + ## Next & Previous +# Accessibility +# Alignments +# Clearings +# Layout +# Widgets +# Content + ## Archives + ## Posts and pages + ## Comments +# Blocks +# Media + ## Captions + ## Galleries +--------------------------------------------------------------*/ +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually inserting + * a custom font that includes just a Hoefler Text space replacement for that + * character instead. + */ +@font-face { + font-family: 'NonBreakingSpaceOverride'; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* If we add the border using a regular CSS border, it won't look good on non-retina devices, + * since its edges can look jagged due to lack of antialiasing. In this case, we are several + * layers of box-shadow to add the border visually, which will render the border smoother. */ +/* Calculates maximum width for post content */ +/* Nested sub-menu padding: 10 levels deep */ +/* Ensure all font family declarations come with non-latin fallbacks */ +/* Build our non-latin font styles */ +body:lang(ar), button:lang(ar), +input:lang(ar), +select:lang(ar), +optgroup:lang(ar), +textarea:lang(ar), .author-description .author-link:lang(ar), +.comment-metadata:lang(ar), +.comment-reply-link:lang(ar), +.comments-title:lang(ar), +.comment-author .fn:lang(ar), +.discussion-meta-info:lang(ar), +.entry-meta:lang(ar), +.entry-footer:lang(ar), +.main-navigation:lang(ar), +.no-comments:lang(ar), +.not-found .page-title:lang(ar), +.error-404 .page-title:lang(ar), +.post-navigation .post-title:lang(ar), +.page-links:lang(ar), +.page-description:lang(ar), +.pagination .nav-links:lang(ar), +.sticky-post:lang(ar), +.site-title:lang(ar), +.site-info:lang(ar), +#cancel-comment-reply-link:lang(ar), +h1:lang(ar), +h2:lang(ar), +h3:lang(ar), +h4:lang(ar), +h5:lang(ar), +h6:lang(ar), .page-title:lang(ar), blockquote cite:lang(ar), table:lang(ar), .button:lang(ar), +input:lang(ar)[type="button"], +input:lang(ar)[type="reset"], +input:lang(ar)[type="submit"], .comment-navigation .nav-previous:lang(ar), +.comment-navigation .nav-next:lang(ar), .comment-list .pingback .comment-body:lang(ar), +.comment-list .trackback .comment-body:lang(ar), .comment-list .pingback .comment-body .comment-edit-link:lang(ar), +.comment-list .trackback .comment-body .comment-edit-link:lang(ar), .comment-form .comment-notes:lang(ar), +.comment-form label:lang(ar), .widget_archive ul li:lang(ar), +.widget_categories ul li:lang(ar), +.widget_meta ul li:lang(ar), +.widget_nav_menu ul li:lang(ar), +.widget_pages ul li:lang(ar), +.widget_recent_comments ul li:lang(ar), +.widget_recent_entries ul li:lang(ar), +.widget_rss ul li:lang(ar), .widget_tag_cloud .tagcloud:lang(ar), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ar), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ar), .entry .entry-content .wp-block-archives li > a:lang(ar), +.entry .entry-content .wp-block-categories li > a:lang(ar), +.entry .entry-content .wp-block-latest-posts li > a:lang(ar), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ar), .entry .entry-content .wp-block-verse:lang(ar), .entry .entry-content .has-drop-cap:lang(ar):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ar), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover-image h2:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover h2:lang(ar), .entry .entry-content .wp-block-audio figcaption:lang(ar), +.entry .entry-content .wp-block-video figcaption:lang(ar), +.entry .entry-content .wp-block-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ar), .entry .entry-content .wp-block-file:lang(ar), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ar), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ar), .wp-caption-text:lang(ar), .gallery-caption:lang(ar) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ary), button:lang(ary), +input:lang(ary), +select:lang(ary), +optgroup:lang(ary), +textarea:lang(ary), .author-description .author-link:lang(ary), +.comment-metadata:lang(ary), +.comment-reply-link:lang(ary), +.comments-title:lang(ary), +.comment-author .fn:lang(ary), +.discussion-meta-info:lang(ary), +.entry-meta:lang(ary), +.entry-footer:lang(ary), +.main-navigation:lang(ary), +.no-comments:lang(ary), +.not-found .page-title:lang(ary), +.error-404 .page-title:lang(ary), +.post-navigation .post-title:lang(ary), +.page-links:lang(ary), +.page-description:lang(ary), +.pagination .nav-links:lang(ary), +.sticky-post:lang(ary), +.site-title:lang(ary), +.site-info:lang(ary), +#cancel-comment-reply-link:lang(ary), +h1:lang(ary), +h2:lang(ary), +h3:lang(ary), +h4:lang(ary), +h5:lang(ary), +h6:lang(ary), .page-title:lang(ary), blockquote cite:lang(ary), table:lang(ary), .button:lang(ary), +input:lang(ary)[type="button"], +input:lang(ary)[type="reset"], +input:lang(ary)[type="submit"], .comment-navigation .nav-previous:lang(ary), +.comment-navigation .nav-next:lang(ary), .comment-list .pingback .comment-body:lang(ary), +.comment-list .trackback .comment-body:lang(ary), .comment-list .pingback .comment-body .comment-edit-link:lang(ary), +.comment-list .trackback .comment-body .comment-edit-link:lang(ary), .comment-form .comment-notes:lang(ary), +.comment-form label:lang(ary), .widget_archive ul li:lang(ary), +.widget_categories ul li:lang(ary), +.widget_meta ul li:lang(ary), +.widget_nav_menu ul li:lang(ary), +.widget_pages ul li:lang(ary), +.widget_recent_comments ul li:lang(ary), +.widget_recent_entries ul li:lang(ary), +.widget_rss ul li:lang(ary), .widget_tag_cloud .tagcloud:lang(ary), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ary), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ary), .entry .entry-content .wp-block-archives li > a:lang(ary), +.entry .entry-content .wp-block-categories li > a:lang(ary), +.entry .entry-content .wp-block-latest-posts li > a:lang(ary), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ary), .entry .entry-content .wp-block-verse:lang(ary), .entry .entry-content .has-drop-cap:lang(ary):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ary), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover-image h2:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover h2:lang(ary), .entry .entry-content .wp-block-audio figcaption:lang(ary), +.entry .entry-content .wp-block-video figcaption:lang(ary), +.entry .entry-content .wp-block-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ary), .entry .entry-content .wp-block-file:lang(ary), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ary), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ary), .wp-caption-text:lang(ary), .gallery-caption:lang(ary) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(azb), button:lang(azb), +input:lang(azb), +select:lang(azb), +optgroup:lang(azb), +textarea:lang(azb), .author-description .author-link:lang(azb), +.comment-metadata:lang(azb), +.comment-reply-link:lang(azb), +.comments-title:lang(azb), +.comment-author .fn:lang(azb), +.discussion-meta-info:lang(azb), +.entry-meta:lang(azb), +.entry-footer:lang(azb), +.main-navigation:lang(azb), +.no-comments:lang(azb), +.not-found .page-title:lang(azb), +.error-404 .page-title:lang(azb), +.post-navigation .post-title:lang(azb), +.page-links:lang(azb), +.page-description:lang(azb), +.pagination .nav-links:lang(azb), +.sticky-post:lang(azb), +.site-title:lang(azb), +.site-info:lang(azb), +#cancel-comment-reply-link:lang(azb), +h1:lang(azb), +h2:lang(azb), +h3:lang(azb), +h4:lang(azb), +h5:lang(azb), +h6:lang(azb), .page-title:lang(azb), blockquote cite:lang(azb), table:lang(azb), .button:lang(azb), +input:lang(azb)[type="button"], +input:lang(azb)[type="reset"], +input:lang(azb)[type="submit"], .comment-navigation .nav-previous:lang(azb), +.comment-navigation .nav-next:lang(azb), .comment-list .pingback .comment-body:lang(azb), +.comment-list .trackback .comment-body:lang(azb), .comment-list .pingback .comment-body .comment-edit-link:lang(azb), +.comment-list .trackback .comment-body .comment-edit-link:lang(azb), .comment-form .comment-notes:lang(azb), +.comment-form label:lang(azb), .widget_archive ul li:lang(azb), +.widget_categories ul li:lang(azb), +.widget_meta ul li:lang(azb), +.widget_nav_menu ul li:lang(azb), +.widget_pages ul li:lang(azb), +.widget_recent_comments ul li:lang(azb), +.widget_recent_entries ul li:lang(azb), +.widget_rss ul li:lang(azb), .widget_tag_cloud .tagcloud:lang(azb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(azb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(azb), .entry .entry-content .wp-block-archives li > a:lang(azb), +.entry .entry-content .wp-block-categories li > a:lang(azb), +.entry .entry-content .wp-block-latest-posts li > a:lang(azb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(azb), .entry .entry-content .wp-block-verse:lang(azb), .entry .entry-content .has-drop-cap:lang(azb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(azb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover-image h2:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover h2:lang(azb), .entry .entry-content .wp-block-audio figcaption:lang(azb), +.entry .entry-content .wp-block-video figcaption:lang(azb), +.entry .entry-content .wp-block-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(azb), .entry .entry-content .wp-block-file:lang(azb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(azb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(azb), .wp-caption-text:lang(azb), .gallery-caption:lang(azb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ckb), button:lang(ckb), +input:lang(ckb), +select:lang(ckb), +optgroup:lang(ckb), +textarea:lang(ckb), .author-description .author-link:lang(ckb), +.comment-metadata:lang(ckb), +.comment-reply-link:lang(ckb), +.comments-title:lang(ckb), +.comment-author .fn:lang(ckb), +.discussion-meta-info:lang(ckb), +.entry-meta:lang(ckb), +.entry-footer:lang(ckb), +.main-navigation:lang(ckb), +.no-comments:lang(ckb), +.not-found .page-title:lang(ckb), +.error-404 .page-title:lang(ckb), +.post-navigation .post-title:lang(ckb), +.page-links:lang(ckb), +.page-description:lang(ckb), +.pagination .nav-links:lang(ckb), +.sticky-post:lang(ckb), +.site-title:lang(ckb), +.site-info:lang(ckb), +#cancel-comment-reply-link:lang(ckb), +h1:lang(ckb), +h2:lang(ckb), +h3:lang(ckb), +h4:lang(ckb), +h5:lang(ckb), +h6:lang(ckb), .page-title:lang(ckb), blockquote cite:lang(ckb), table:lang(ckb), .button:lang(ckb), +input:lang(ckb)[type="button"], +input:lang(ckb)[type="reset"], +input:lang(ckb)[type="submit"], .comment-navigation .nav-previous:lang(ckb), +.comment-navigation .nav-next:lang(ckb), .comment-list .pingback .comment-body:lang(ckb), +.comment-list .trackback .comment-body:lang(ckb), .comment-list .pingback .comment-body .comment-edit-link:lang(ckb), +.comment-list .trackback .comment-body .comment-edit-link:lang(ckb), .comment-form .comment-notes:lang(ckb), +.comment-form label:lang(ckb), .widget_archive ul li:lang(ckb), +.widget_categories ul li:lang(ckb), +.widget_meta ul li:lang(ckb), +.widget_nav_menu ul li:lang(ckb), +.widget_pages ul li:lang(ckb), +.widget_recent_comments ul li:lang(ckb), +.widget_recent_entries ul li:lang(ckb), +.widget_rss ul li:lang(ckb), .widget_tag_cloud .tagcloud:lang(ckb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ckb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ckb), .entry .entry-content .wp-block-archives li > a:lang(ckb), +.entry .entry-content .wp-block-categories li > a:lang(ckb), +.entry .entry-content .wp-block-latest-posts li > a:lang(ckb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ckb), .entry .entry-content .wp-block-verse:lang(ckb), .entry .entry-content .has-drop-cap:lang(ckb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ckb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover-image h2:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover h2:lang(ckb), .entry .entry-content .wp-block-audio figcaption:lang(ckb), +.entry .entry-content .wp-block-video figcaption:lang(ckb), +.entry .entry-content .wp-block-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ckb), .entry .entry-content .wp-block-file:lang(ckb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ckb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ckb), .wp-caption-text:lang(ckb), .gallery-caption:lang(ckb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(fa-IR), button:lang(fa-IR), +input:lang(fa-IR), +select:lang(fa-IR), +optgroup:lang(fa-IR), +textarea:lang(fa-IR), .author-description .author-link:lang(fa-IR), +.comment-metadata:lang(fa-IR), +.comment-reply-link:lang(fa-IR), +.comments-title:lang(fa-IR), +.comment-author .fn:lang(fa-IR), +.discussion-meta-info:lang(fa-IR), +.entry-meta:lang(fa-IR), +.entry-footer:lang(fa-IR), +.main-navigation:lang(fa-IR), +.no-comments:lang(fa-IR), +.not-found .page-title:lang(fa-IR), +.error-404 .page-title:lang(fa-IR), +.post-navigation .post-title:lang(fa-IR), +.page-links:lang(fa-IR), +.page-description:lang(fa-IR), +.pagination .nav-links:lang(fa-IR), +.sticky-post:lang(fa-IR), +.site-title:lang(fa-IR), +.site-info:lang(fa-IR), +#cancel-comment-reply-link:lang(fa-IR), +h1:lang(fa-IR), +h2:lang(fa-IR), +h3:lang(fa-IR), +h4:lang(fa-IR), +h5:lang(fa-IR), +h6:lang(fa-IR), .page-title:lang(fa-IR), blockquote cite:lang(fa-IR), table:lang(fa-IR), .button:lang(fa-IR), +input:lang(fa-IR)[type="button"], +input:lang(fa-IR)[type="reset"], +input:lang(fa-IR)[type="submit"], .comment-navigation .nav-previous:lang(fa-IR), +.comment-navigation .nav-next:lang(fa-IR), .comment-list .pingback .comment-body:lang(fa-IR), +.comment-list .trackback .comment-body:lang(fa-IR), .comment-list .pingback .comment-body .comment-edit-link:lang(fa-IR), +.comment-list .trackback .comment-body .comment-edit-link:lang(fa-IR), .comment-form .comment-notes:lang(fa-IR), +.comment-form label:lang(fa-IR), .widget_archive ul li:lang(fa-IR), +.widget_categories ul li:lang(fa-IR), +.widget_meta ul li:lang(fa-IR), +.widget_nav_menu ul li:lang(fa-IR), +.widget_pages ul li:lang(fa-IR), +.widget_recent_comments ul li:lang(fa-IR), +.widget_recent_entries ul li:lang(fa-IR), +.widget_rss ul li:lang(fa-IR), .widget_tag_cloud .tagcloud:lang(fa-IR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(fa-IR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(fa-IR), .entry .entry-content .wp-block-archives li > a:lang(fa-IR), +.entry .entry-content .wp-block-categories li > a:lang(fa-IR), +.entry .entry-content .wp-block-latest-posts li > a:lang(fa-IR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(fa-IR), .entry .entry-content .wp-block-verse:lang(fa-IR), .entry .entry-content .has-drop-cap:lang(fa-IR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(fa-IR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image h2:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover h2:lang(fa-IR), .entry .entry-content .wp-block-audio figcaption:lang(fa-IR), +.entry .entry-content .wp-block-video figcaption:lang(fa-IR), +.entry .entry-content .wp-block-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(fa-IR), .entry .entry-content .wp-block-file:lang(fa-IR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(fa-IR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(fa-IR), .wp-caption-text:lang(fa-IR), .gallery-caption:lang(fa-IR) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(haz), button:lang(haz), +input:lang(haz), +select:lang(haz), +optgroup:lang(haz), +textarea:lang(haz), .author-description .author-link:lang(haz), +.comment-metadata:lang(haz), +.comment-reply-link:lang(haz), +.comments-title:lang(haz), +.comment-author .fn:lang(haz), +.discussion-meta-info:lang(haz), +.entry-meta:lang(haz), +.entry-footer:lang(haz), +.main-navigation:lang(haz), +.no-comments:lang(haz), +.not-found .page-title:lang(haz), +.error-404 .page-title:lang(haz), +.post-navigation .post-title:lang(haz), +.page-links:lang(haz), +.page-description:lang(haz), +.pagination .nav-links:lang(haz), +.sticky-post:lang(haz), +.site-title:lang(haz), +.site-info:lang(haz), +#cancel-comment-reply-link:lang(haz), +h1:lang(haz), +h2:lang(haz), +h3:lang(haz), +h4:lang(haz), +h5:lang(haz), +h6:lang(haz), .page-title:lang(haz), blockquote cite:lang(haz), table:lang(haz), .button:lang(haz), +input:lang(haz)[type="button"], +input:lang(haz)[type="reset"], +input:lang(haz)[type="submit"], .comment-navigation .nav-previous:lang(haz), +.comment-navigation .nav-next:lang(haz), .comment-list .pingback .comment-body:lang(haz), +.comment-list .trackback .comment-body:lang(haz), .comment-list .pingback .comment-body .comment-edit-link:lang(haz), +.comment-list .trackback .comment-body .comment-edit-link:lang(haz), .comment-form .comment-notes:lang(haz), +.comment-form label:lang(haz), .widget_archive ul li:lang(haz), +.widget_categories ul li:lang(haz), +.widget_meta ul li:lang(haz), +.widget_nav_menu ul li:lang(haz), +.widget_pages ul li:lang(haz), +.widget_recent_comments ul li:lang(haz), +.widget_recent_entries ul li:lang(haz), +.widget_rss ul li:lang(haz), .widget_tag_cloud .tagcloud:lang(haz), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(haz), .entry .entry-content .wp-block-button .wp-block-button__link:lang(haz), .entry .entry-content .wp-block-archives li > a:lang(haz), +.entry .entry-content .wp-block-categories li > a:lang(haz), +.entry .entry-content .wp-block-latest-posts li > a:lang(haz), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(haz), .entry .entry-content .wp-block-verse:lang(haz), .entry .entry-content .has-drop-cap:lang(haz):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(haz), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover-image h2:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover h2:lang(haz), .entry .entry-content .wp-block-audio figcaption:lang(haz), +.entry .entry-content .wp-block-video figcaption:lang(haz), +.entry .entry-content .wp-block-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(haz), .entry .entry-content .wp-block-file:lang(haz), .entry .entry-content .wp-block-file .wp-block-file__button:lang(haz), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(haz), .wp-caption-text:lang(haz), .gallery-caption:lang(haz) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ps), button:lang(ps), +input:lang(ps), +select:lang(ps), +optgroup:lang(ps), +textarea:lang(ps), .author-description .author-link:lang(ps), +.comment-metadata:lang(ps), +.comment-reply-link:lang(ps), +.comments-title:lang(ps), +.comment-author .fn:lang(ps), +.discussion-meta-info:lang(ps), +.entry-meta:lang(ps), +.entry-footer:lang(ps), +.main-navigation:lang(ps), +.no-comments:lang(ps), +.not-found .page-title:lang(ps), +.error-404 .page-title:lang(ps), +.post-navigation .post-title:lang(ps), +.page-links:lang(ps), +.page-description:lang(ps), +.pagination .nav-links:lang(ps), +.sticky-post:lang(ps), +.site-title:lang(ps), +.site-info:lang(ps), +#cancel-comment-reply-link:lang(ps), +h1:lang(ps), +h2:lang(ps), +h3:lang(ps), +h4:lang(ps), +h5:lang(ps), +h6:lang(ps), .page-title:lang(ps), blockquote cite:lang(ps), table:lang(ps), .button:lang(ps), +input:lang(ps)[type="button"], +input:lang(ps)[type="reset"], +input:lang(ps)[type="submit"], .comment-navigation .nav-previous:lang(ps), +.comment-navigation .nav-next:lang(ps), .comment-list .pingback .comment-body:lang(ps), +.comment-list .trackback .comment-body:lang(ps), .comment-list .pingback .comment-body .comment-edit-link:lang(ps), +.comment-list .trackback .comment-body .comment-edit-link:lang(ps), .comment-form .comment-notes:lang(ps), +.comment-form label:lang(ps), .widget_archive ul li:lang(ps), +.widget_categories ul li:lang(ps), +.widget_meta ul li:lang(ps), +.widget_nav_menu ul li:lang(ps), +.widget_pages ul li:lang(ps), +.widget_recent_comments ul li:lang(ps), +.widget_recent_entries ul li:lang(ps), +.widget_rss ul li:lang(ps), .widget_tag_cloud .tagcloud:lang(ps), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ps), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ps), .entry .entry-content .wp-block-archives li > a:lang(ps), +.entry .entry-content .wp-block-categories li > a:lang(ps), +.entry .entry-content .wp-block-latest-posts li > a:lang(ps), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ps), .entry .entry-content .wp-block-verse:lang(ps), .entry .entry-content .has-drop-cap:lang(ps):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ps), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover-image h2:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover h2:lang(ps), .entry .entry-content .wp-block-audio figcaption:lang(ps), +.entry .entry-content .wp-block-video figcaption:lang(ps), +.entry .entry-content .wp-block-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ps), .entry .entry-content .wp-block-file:lang(ps), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ps), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ps), .wp-caption-text:lang(ps), .gallery-caption:lang(ps) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(be), button:lang(be), +input:lang(be), +select:lang(be), +optgroup:lang(be), +textarea:lang(be), .author-description .author-link:lang(be), +.comment-metadata:lang(be), +.comment-reply-link:lang(be), +.comments-title:lang(be), +.comment-author .fn:lang(be), +.discussion-meta-info:lang(be), +.entry-meta:lang(be), +.entry-footer:lang(be), +.main-navigation:lang(be), +.no-comments:lang(be), +.not-found .page-title:lang(be), +.error-404 .page-title:lang(be), +.post-navigation .post-title:lang(be), +.page-links:lang(be), +.page-description:lang(be), +.pagination .nav-links:lang(be), +.sticky-post:lang(be), +.site-title:lang(be), +.site-info:lang(be), +#cancel-comment-reply-link:lang(be), +h1:lang(be), +h2:lang(be), +h3:lang(be), +h4:lang(be), +h5:lang(be), +h6:lang(be), .page-title:lang(be), blockquote cite:lang(be), table:lang(be), .button:lang(be), +input:lang(be)[type="button"], +input:lang(be)[type="reset"], +input:lang(be)[type="submit"], .comment-navigation .nav-previous:lang(be), +.comment-navigation .nav-next:lang(be), .comment-list .pingback .comment-body:lang(be), +.comment-list .trackback .comment-body:lang(be), .comment-list .pingback .comment-body .comment-edit-link:lang(be), +.comment-list .trackback .comment-body .comment-edit-link:lang(be), .comment-form .comment-notes:lang(be), +.comment-form label:lang(be), .widget_archive ul li:lang(be), +.widget_categories ul li:lang(be), +.widget_meta ul li:lang(be), +.widget_nav_menu ul li:lang(be), +.widget_pages ul li:lang(be), +.widget_recent_comments ul li:lang(be), +.widget_recent_entries ul li:lang(be), +.widget_rss ul li:lang(be), .widget_tag_cloud .tagcloud:lang(be), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(be), .entry .entry-content .wp-block-button .wp-block-button__link:lang(be), .entry .entry-content .wp-block-archives li > a:lang(be), +.entry .entry-content .wp-block-categories li > a:lang(be), +.entry .entry-content .wp-block-latest-posts li > a:lang(be), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(be), .entry .entry-content .wp-block-verse:lang(be), .entry .entry-content .has-drop-cap:lang(be):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(be), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover-image h2:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover h2:lang(be), .entry .entry-content .wp-block-audio figcaption:lang(be), +.entry .entry-content .wp-block-video figcaption:lang(be), +.entry .entry-content .wp-block-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(be), .entry .entry-content .wp-block-file:lang(be), .entry .entry-content .wp-block-file .wp-block-file__button:lang(be), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(be), .wp-caption-text:lang(be), .gallery-caption:lang(be) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(bg-BG), button:lang(bg-BG), +input:lang(bg-BG), +select:lang(bg-BG), +optgroup:lang(bg-BG), +textarea:lang(bg-BG), .author-description .author-link:lang(bg-BG), +.comment-metadata:lang(bg-BG), +.comment-reply-link:lang(bg-BG), +.comments-title:lang(bg-BG), +.comment-author .fn:lang(bg-BG), +.discussion-meta-info:lang(bg-BG), +.entry-meta:lang(bg-BG), +.entry-footer:lang(bg-BG), +.main-navigation:lang(bg-BG), +.no-comments:lang(bg-BG), +.not-found .page-title:lang(bg-BG), +.error-404 .page-title:lang(bg-BG), +.post-navigation .post-title:lang(bg-BG), +.page-links:lang(bg-BG), +.page-description:lang(bg-BG), +.pagination .nav-links:lang(bg-BG), +.sticky-post:lang(bg-BG), +.site-title:lang(bg-BG), +.site-info:lang(bg-BG), +#cancel-comment-reply-link:lang(bg-BG), +h1:lang(bg-BG), +h2:lang(bg-BG), +h3:lang(bg-BG), +h4:lang(bg-BG), +h5:lang(bg-BG), +h6:lang(bg-BG), .page-title:lang(bg-BG), blockquote cite:lang(bg-BG), table:lang(bg-BG), .button:lang(bg-BG), +input:lang(bg-BG)[type="button"], +input:lang(bg-BG)[type="reset"], +input:lang(bg-BG)[type="submit"], .comment-navigation .nav-previous:lang(bg-BG), +.comment-navigation .nav-next:lang(bg-BG), .comment-list .pingback .comment-body:lang(bg-BG), +.comment-list .trackback .comment-body:lang(bg-BG), .comment-list .pingback .comment-body .comment-edit-link:lang(bg-BG), +.comment-list .trackback .comment-body .comment-edit-link:lang(bg-BG), .comment-form .comment-notes:lang(bg-BG), +.comment-form label:lang(bg-BG), .widget_archive ul li:lang(bg-BG), +.widget_categories ul li:lang(bg-BG), +.widget_meta ul li:lang(bg-BG), +.widget_nav_menu ul li:lang(bg-BG), +.widget_pages ul li:lang(bg-BG), +.widget_recent_comments ul li:lang(bg-BG), +.widget_recent_entries ul li:lang(bg-BG), +.widget_rss ul li:lang(bg-BG), .widget_tag_cloud .tagcloud:lang(bg-BG), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bg-BG), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bg-BG), .entry .entry-content .wp-block-archives li > a:lang(bg-BG), +.entry .entry-content .wp-block-categories li > a:lang(bg-BG), +.entry .entry-content .wp-block-latest-posts li > a:lang(bg-BG), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bg-BG), .entry .entry-content .wp-block-verse:lang(bg-BG), .entry .entry-content .has-drop-cap:lang(bg-BG):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bg-BG), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image h2:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover h2:lang(bg-BG), .entry .entry-content .wp-block-audio figcaption:lang(bg-BG), +.entry .entry-content .wp-block-video figcaption:lang(bg-BG), +.entry .entry-content .wp-block-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bg-BG), .entry .entry-content .wp-block-file:lang(bg-BG), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bg-BG), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bg-BG), .wp-caption-text:lang(bg-BG), .gallery-caption:lang(bg-BG) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(kk), button:lang(kk), +input:lang(kk), +select:lang(kk), +optgroup:lang(kk), +textarea:lang(kk), .author-description .author-link:lang(kk), +.comment-metadata:lang(kk), +.comment-reply-link:lang(kk), +.comments-title:lang(kk), +.comment-author .fn:lang(kk), +.discussion-meta-info:lang(kk), +.entry-meta:lang(kk), +.entry-footer:lang(kk), +.main-navigation:lang(kk), +.no-comments:lang(kk), +.not-found .page-title:lang(kk), +.error-404 .page-title:lang(kk), +.post-navigation .post-title:lang(kk), +.page-links:lang(kk), +.page-description:lang(kk), +.pagination .nav-links:lang(kk), +.sticky-post:lang(kk), +.site-title:lang(kk), +.site-info:lang(kk), +#cancel-comment-reply-link:lang(kk), +h1:lang(kk), +h2:lang(kk), +h3:lang(kk), +h4:lang(kk), +h5:lang(kk), +h6:lang(kk), .page-title:lang(kk), blockquote cite:lang(kk), table:lang(kk), .button:lang(kk), +input:lang(kk)[type="button"], +input:lang(kk)[type="reset"], +input:lang(kk)[type="submit"], .comment-navigation .nav-previous:lang(kk), +.comment-navigation .nav-next:lang(kk), .comment-list .pingback .comment-body:lang(kk), +.comment-list .trackback .comment-body:lang(kk), .comment-list .pingback .comment-body .comment-edit-link:lang(kk), +.comment-list .trackback .comment-body .comment-edit-link:lang(kk), .comment-form .comment-notes:lang(kk), +.comment-form label:lang(kk), .widget_archive ul li:lang(kk), +.widget_categories ul li:lang(kk), +.widget_meta ul li:lang(kk), +.widget_nav_menu ul li:lang(kk), +.widget_pages ul li:lang(kk), +.widget_recent_comments ul li:lang(kk), +.widget_recent_entries ul li:lang(kk), +.widget_rss ul li:lang(kk), .widget_tag_cloud .tagcloud:lang(kk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(kk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(kk), .entry .entry-content .wp-block-archives li > a:lang(kk), +.entry .entry-content .wp-block-categories li > a:lang(kk), +.entry .entry-content .wp-block-latest-posts li > a:lang(kk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(kk), .entry .entry-content .wp-block-verse:lang(kk), .entry .entry-content .has-drop-cap:lang(kk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(kk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover-image h2:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover h2:lang(kk), .entry .entry-content .wp-block-audio figcaption:lang(kk), +.entry .entry-content .wp-block-video figcaption:lang(kk), +.entry .entry-content .wp-block-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(kk), .entry .entry-content .wp-block-file:lang(kk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(kk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(kk), .wp-caption-text:lang(kk), .gallery-caption:lang(kk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mk-MK), button:lang(mk-MK), +input:lang(mk-MK), +select:lang(mk-MK), +optgroup:lang(mk-MK), +textarea:lang(mk-MK), .author-description .author-link:lang(mk-MK), +.comment-metadata:lang(mk-MK), +.comment-reply-link:lang(mk-MK), +.comments-title:lang(mk-MK), +.comment-author .fn:lang(mk-MK), +.discussion-meta-info:lang(mk-MK), +.entry-meta:lang(mk-MK), +.entry-footer:lang(mk-MK), +.main-navigation:lang(mk-MK), +.no-comments:lang(mk-MK), +.not-found .page-title:lang(mk-MK), +.error-404 .page-title:lang(mk-MK), +.post-navigation .post-title:lang(mk-MK), +.page-links:lang(mk-MK), +.page-description:lang(mk-MK), +.pagination .nav-links:lang(mk-MK), +.sticky-post:lang(mk-MK), +.site-title:lang(mk-MK), +.site-info:lang(mk-MK), +#cancel-comment-reply-link:lang(mk-MK), +h1:lang(mk-MK), +h2:lang(mk-MK), +h3:lang(mk-MK), +h4:lang(mk-MK), +h5:lang(mk-MK), +h6:lang(mk-MK), .page-title:lang(mk-MK), blockquote cite:lang(mk-MK), table:lang(mk-MK), .button:lang(mk-MK), +input:lang(mk-MK)[type="button"], +input:lang(mk-MK)[type="reset"], +input:lang(mk-MK)[type="submit"], .comment-navigation .nav-previous:lang(mk-MK), +.comment-navigation .nav-next:lang(mk-MK), .comment-list .pingback .comment-body:lang(mk-MK), +.comment-list .trackback .comment-body:lang(mk-MK), .comment-list .pingback .comment-body .comment-edit-link:lang(mk-MK), +.comment-list .trackback .comment-body .comment-edit-link:lang(mk-MK), .comment-form .comment-notes:lang(mk-MK), +.comment-form label:lang(mk-MK), .widget_archive ul li:lang(mk-MK), +.widget_categories ul li:lang(mk-MK), +.widget_meta ul li:lang(mk-MK), +.widget_nav_menu ul li:lang(mk-MK), +.widget_pages ul li:lang(mk-MK), +.widget_recent_comments ul li:lang(mk-MK), +.widget_recent_entries ul li:lang(mk-MK), +.widget_rss ul li:lang(mk-MK), .widget_tag_cloud .tagcloud:lang(mk-MK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mk-MK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mk-MK), .entry .entry-content .wp-block-archives li > a:lang(mk-MK), +.entry .entry-content .wp-block-categories li > a:lang(mk-MK), +.entry .entry-content .wp-block-latest-posts li > a:lang(mk-MK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mk-MK), .entry .entry-content .wp-block-verse:lang(mk-MK), .entry .entry-content .has-drop-cap:lang(mk-MK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mk-MK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image h2:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover h2:lang(mk-MK), .entry .entry-content .wp-block-audio figcaption:lang(mk-MK), +.entry .entry-content .wp-block-video figcaption:lang(mk-MK), +.entry .entry-content .wp-block-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mk-MK), .entry .entry-content .wp-block-file:lang(mk-MK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mk-MK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mk-MK), .wp-caption-text:lang(mk-MK), .gallery-caption:lang(mk-MK) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mn), button:lang(mn), +input:lang(mn), +select:lang(mn), +optgroup:lang(mn), +textarea:lang(mn), .author-description .author-link:lang(mn), +.comment-metadata:lang(mn), +.comment-reply-link:lang(mn), +.comments-title:lang(mn), +.comment-author .fn:lang(mn), +.discussion-meta-info:lang(mn), +.entry-meta:lang(mn), +.entry-footer:lang(mn), +.main-navigation:lang(mn), +.no-comments:lang(mn), +.not-found .page-title:lang(mn), +.error-404 .page-title:lang(mn), +.post-navigation .post-title:lang(mn), +.page-links:lang(mn), +.page-description:lang(mn), +.pagination .nav-links:lang(mn), +.sticky-post:lang(mn), +.site-title:lang(mn), +.site-info:lang(mn), +#cancel-comment-reply-link:lang(mn), +h1:lang(mn), +h2:lang(mn), +h3:lang(mn), +h4:lang(mn), +h5:lang(mn), +h6:lang(mn), .page-title:lang(mn), blockquote cite:lang(mn), table:lang(mn), .button:lang(mn), +input:lang(mn)[type="button"], +input:lang(mn)[type="reset"], +input:lang(mn)[type="submit"], .comment-navigation .nav-previous:lang(mn), +.comment-navigation .nav-next:lang(mn), .comment-list .pingback .comment-body:lang(mn), +.comment-list .trackback .comment-body:lang(mn), .comment-list .pingback .comment-body .comment-edit-link:lang(mn), +.comment-list .trackback .comment-body .comment-edit-link:lang(mn), .comment-form .comment-notes:lang(mn), +.comment-form label:lang(mn), .widget_archive ul li:lang(mn), +.widget_categories ul li:lang(mn), +.widget_meta ul li:lang(mn), +.widget_nav_menu ul li:lang(mn), +.widget_pages ul li:lang(mn), +.widget_recent_comments ul li:lang(mn), +.widget_recent_entries ul li:lang(mn), +.widget_rss ul li:lang(mn), .widget_tag_cloud .tagcloud:lang(mn), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mn), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mn), .entry .entry-content .wp-block-archives li > a:lang(mn), +.entry .entry-content .wp-block-categories li > a:lang(mn), +.entry .entry-content .wp-block-latest-posts li > a:lang(mn), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mn), .entry .entry-content .wp-block-verse:lang(mn), .entry .entry-content .has-drop-cap:lang(mn):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mn), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover-image h2:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover h2:lang(mn), .entry .entry-content .wp-block-audio figcaption:lang(mn), +.entry .entry-content .wp-block-video figcaption:lang(mn), +.entry .entry-content .wp-block-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mn), .entry .entry-content .wp-block-file:lang(mn), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mn), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mn), .wp-caption-text:lang(mn), .gallery-caption:lang(mn) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(ru-RU), button:lang(ru-RU), +input:lang(ru-RU), +select:lang(ru-RU), +optgroup:lang(ru-RU), +textarea:lang(ru-RU), .author-description .author-link:lang(ru-RU), +.comment-metadata:lang(ru-RU), +.comment-reply-link:lang(ru-RU), +.comments-title:lang(ru-RU), +.comment-author .fn:lang(ru-RU), +.discussion-meta-info:lang(ru-RU), +.entry-meta:lang(ru-RU), +.entry-footer:lang(ru-RU), +.main-navigation:lang(ru-RU), +.no-comments:lang(ru-RU), +.not-found .page-title:lang(ru-RU), +.error-404 .page-title:lang(ru-RU), +.post-navigation .post-title:lang(ru-RU), +.page-links:lang(ru-RU), +.page-description:lang(ru-RU), +.pagination .nav-links:lang(ru-RU), +.sticky-post:lang(ru-RU), +.site-title:lang(ru-RU), +.site-info:lang(ru-RU), +#cancel-comment-reply-link:lang(ru-RU), +h1:lang(ru-RU), +h2:lang(ru-RU), +h3:lang(ru-RU), +h4:lang(ru-RU), +h5:lang(ru-RU), +h6:lang(ru-RU), .page-title:lang(ru-RU), blockquote cite:lang(ru-RU), table:lang(ru-RU), .button:lang(ru-RU), +input:lang(ru-RU)[type="button"], +input:lang(ru-RU)[type="reset"], +input:lang(ru-RU)[type="submit"], .comment-navigation .nav-previous:lang(ru-RU), +.comment-navigation .nav-next:lang(ru-RU), .comment-list .pingback .comment-body:lang(ru-RU), +.comment-list .trackback .comment-body:lang(ru-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(ru-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(ru-RU), .comment-form .comment-notes:lang(ru-RU), +.comment-form label:lang(ru-RU), .widget_archive ul li:lang(ru-RU), +.widget_categories ul li:lang(ru-RU), +.widget_meta ul li:lang(ru-RU), +.widget_nav_menu ul li:lang(ru-RU), +.widget_pages ul li:lang(ru-RU), +.widget_recent_comments ul li:lang(ru-RU), +.widget_recent_entries ul li:lang(ru-RU), +.widget_rss ul li:lang(ru-RU), .widget_tag_cloud .tagcloud:lang(ru-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ru-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ru-RU), .entry .entry-content .wp-block-archives li > a:lang(ru-RU), +.entry .entry-content .wp-block-categories li > a:lang(ru-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(ru-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ru-RU), .entry .entry-content .wp-block-verse:lang(ru-RU), .entry .entry-content .has-drop-cap:lang(ru-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ru-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image h2:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover h2:lang(ru-RU), .entry .entry-content .wp-block-audio figcaption:lang(ru-RU), +.entry .entry-content .wp-block-video figcaption:lang(ru-RU), +.entry .entry-content .wp-block-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ru-RU), .entry .entry-content .wp-block-file:lang(ru-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ru-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ru-RU), .wp-caption-text:lang(ru-RU), .gallery-caption:lang(ru-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sah), button:lang(sah), +input:lang(sah), +select:lang(sah), +optgroup:lang(sah), +textarea:lang(sah), .author-description .author-link:lang(sah), +.comment-metadata:lang(sah), +.comment-reply-link:lang(sah), +.comments-title:lang(sah), +.comment-author .fn:lang(sah), +.discussion-meta-info:lang(sah), +.entry-meta:lang(sah), +.entry-footer:lang(sah), +.main-navigation:lang(sah), +.no-comments:lang(sah), +.not-found .page-title:lang(sah), +.error-404 .page-title:lang(sah), +.post-navigation .post-title:lang(sah), +.page-links:lang(sah), +.page-description:lang(sah), +.pagination .nav-links:lang(sah), +.sticky-post:lang(sah), +.site-title:lang(sah), +.site-info:lang(sah), +#cancel-comment-reply-link:lang(sah), +h1:lang(sah), +h2:lang(sah), +h3:lang(sah), +h4:lang(sah), +h5:lang(sah), +h6:lang(sah), .page-title:lang(sah), blockquote cite:lang(sah), table:lang(sah), .button:lang(sah), +input:lang(sah)[type="button"], +input:lang(sah)[type="reset"], +input:lang(sah)[type="submit"], .comment-navigation .nav-previous:lang(sah), +.comment-navigation .nav-next:lang(sah), .comment-list .pingback .comment-body:lang(sah), +.comment-list .trackback .comment-body:lang(sah), .comment-list .pingback .comment-body .comment-edit-link:lang(sah), +.comment-list .trackback .comment-body .comment-edit-link:lang(sah), .comment-form .comment-notes:lang(sah), +.comment-form label:lang(sah), .widget_archive ul li:lang(sah), +.widget_categories ul li:lang(sah), +.widget_meta ul li:lang(sah), +.widget_nav_menu ul li:lang(sah), +.widget_pages ul li:lang(sah), +.widget_recent_comments ul li:lang(sah), +.widget_recent_entries ul li:lang(sah), +.widget_rss ul li:lang(sah), .widget_tag_cloud .tagcloud:lang(sah), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sah), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sah), .entry .entry-content .wp-block-archives li > a:lang(sah), +.entry .entry-content .wp-block-categories li > a:lang(sah), +.entry .entry-content .wp-block-latest-posts li > a:lang(sah), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sah), .entry .entry-content .wp-block-verse:lang(sah), .entry .entry-content .has-drop-cap:lang(sah):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sah), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover-image h2:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover h2:lang(sah), .entry .entry-content .wp-block-audio figcaption:lang(sah), +.entry .entry-content .wp-block-video figcaption:lang(sah), +.entry .entry-content .wp-block-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sah), .entry .entry-content .wp-block-file:lang(sah), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sah), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sah), .wp-caption-text:lang(sah), .gallery-caption:lang(sah) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sr-RS), button:lang(sr-RS), +input:lang(sr-RS), +select:lang(sr-RS), +optgroup:lang(sr-RS), +textarea:lang(sr-RS), .author-description .author-link:lang(sr-RS), +.comment-metadata:lang(sr-RS), +.comment-reply-link:lang(sr-RS), +.comments-title:lang(sr-RS), +.comment-author .fn:lang(sr-RS), +.discussion-meta-info:lang(sr-RS), +.entry-meta:lang(sr-RS), +.entry-footer:lang(sr-RS), +.main-navigation:lang(sr-RS), +.no-comments:lang(sr-RS), +.not-found .page-title:lang(sr-RS), +.error-404 .page-title:lang(sr-RS), +.post-navigation .post-title:lang(sr-RS), +.page-links:lang(sr-RS), +.page-description:lang(sr-RS), +.pagination .nav-links:lang(sr-RS), +.sticky-post:lang(sr-RS), +.site-title:lang(sr-RS), +.site-info:lang(sr-RS), +#cancel-comment-reply-link:lang(sr-RS), +h1:lang(sr-RS), +h2:lang(sr-RS), +h3:lang(sr-RS), +h4:lang(sr-RS), +h5:lang(sr-RS), +h6:lang(sr-RS), .page-title:lang(sr-RS), blockquote cite:lang(sr-RS), table:lang(sr-RS), .button:lang(sr-RS), +input:lang(sr-RS)[type="button"], +input:lang(sr-RS)[type="reset"], +input:lang(sr-RS)[type="submit"], .comment-navigation .nav-previous:lang(sr-RS), +.comment-navigation .nav-next:lang(sr-RS), .comment-list .pingback .comment-body:lang(sr-RS), +.comment-list .trackback .comment-body:lang(sr-RS), .comment-list .pingback .comment-body .comment-edit-link:lang(sr-RS), +.comment-list .trackback .comment-body .comment-edit-link:lang(sr-RS), .comment-form .comment-notes:lang(sr-RS), +.comment-form label:lang(sr-RS), .widget_archive ul li:lang(sr-RS), +.widget_categories ul li:lang(sr-RS), +.widget_meta ul li:lang(sr-RS), +.widget_nav_menu ul li:lang(sr-RS), +.widget_pages ul li:lang(sr-RS), +.widget_recent_comments ul li:lang(sr-RS), +.widget_recent_entries ul li:lang(sr-RS), +.widget_rss ul li:lang(sr-RS), .widget_tag_cloud .tagcloud:lang(sr-RS), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sr-RS), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sr-RS), .entry .entry-content .wp-block-archives li > a:lang(sr-RS), +.entry .entry-content .wp-block-categories li > a:lang(sr-RS), +.entry .entry-content .wp-block-latest-posts li > a:lang(sr-RS), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sr-RS), .entry .entry-content .wp-block-verse:lang(sr-RS), .entry .entry-content .has-drop-cap:lang(sr-RS):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sr-RS), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image h2:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover h2:lang(sr-RS), .entry .entry-content .wp-block-audio figcaption:lang(sr-RS), +.entry .entry-content .wp-block-video figcaption:lang(sr-RS), +.entry .entry-content .wp-block-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sr-RS), .entry .entry-content .wp-block-file:lang(sr-RS), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sr-RS), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sr-RS), .wp-caption-text:lang(sr-RS), .gallery-caption:lang(sr-RS) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(tt-RU), button:lang(tt-RU), +input:lang(tt-RU), +select:lang(tt-RU), +optgroup:lang(tt-RU), +textarea:lang(tt-RU), .author-description .author-link:lang(tt-RU), +.comment-metadata:lang(tt-RU), +.comment-reply-link:lang(tt-RU), +.comments-title:lang(tt-RU), +.comment-author .fn:lang(tt-RU), +.discussion-meta-info:lang(tt-RU), +.entry-meta:lang(tt-RU), +.entry-footer:lang(tt-RU), +.main-navigation:lang(tt-RU), +.no-comments:lang(tt-RU), +.not-found .page-title:lang(tt-RU), +.error-404 .page-title:lang(tt-RU), +.post-navigation .post-title:lang(tt-RU), +.page-links:lang(tt-RU), +.page-description:lang(tt-RU), +.pagination .nav-links:lang(tt-RU), +.sticky-post:lang(tt-RU), +.site-title:lang(tt-RU), +.site-info:lang(tt-RU), +#cancel-comment-reply-link:lang(tt-RU), +h1:lang(tt-RU), +h2:lang(tt-RU), +h3:lang(tt-RU), +h4:lang(tt-RU), +h5:lang(tt-RU), +h6:lang(tt-RU), .page-title:lang(tt-RU), blockquote cite:lang(tt-RU), table:lang(tt-RU), .button:lang(tt-RU), +input:lang(tt-RU)[type="button"], +input:lang(tt-RU)[type="reset"], +input:lang(tt-RU)[type="submit"], .comment-navigation .nav-previous:lang(tt-RU), +.comment-navigation .nav-next:lang(tt-RU), .comment-list .pingback .comment-body:lang(tt-RU), +.comment-list .trackback .comment-body:lang(tt-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(tt-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(tt-RU), .comment-form .comment-notes:lang(tt-RU), +.comment-form label:lang(tt-RU), .widget_archive ul li:lang(tt-RU), +.widget_categories ul li:lang(tt-RU), +.widget_meta ul li:lang(tt-RU), +.widget_nav_menu ul li:lang(tt-RU), +.widget_pages ul li:lang(tt-RU), +.widget_recent_comments ul li:lang(tt-RU), +.widget_recent_entries ul li:lang(tt-RU), +.widget_rss ul li:lang(tt-RU), .widget_tag_cloud .tagcloud:lang(tt-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(tt-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(tt-RU), .entry .entry-content .wp-block-archives li > a:lang(tt-RU), +.entry .entry-content .wp-block-categories li > a:lang(tt-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(tt-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(tt-RU), .entry .entry-content .wp-block-verse:lang(tt-RU), .entry .entry-content .has-drop-cap:lang(tt-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(tt-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image h2:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover h2:lang(tt-RU), .entry .entry-content .wp-block-audio figcaption:lang(tt-RU), +.entry .entry-content .wp-block-video figcaption:lang(tt-RU), +.entry .entry-content .wp-block-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(tt-RU), .entry .entry-content .wp-block-file:lang(tt-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(tt-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(tt-RU), .wp-caption-text:lang(tt-RU), .gallery-caption:lang(tt-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(uk), button:lang(uk), +input:lang(uk), +select:lang(uk), +optgroup:lang(uk), +textarea:lang(uk), .author-description .author-link:lang(uk), +.comment-metadata:lang(uk), +.comment-reply-link:lang(uk), +.comments-title:lang(uk), +.comment-author .fn:lang(uk), +.discussion-meta-info:lang(uk), +.entry-meta:lang(uk), +.entry-footer:lang(uk), +.main-navigation:lang(uk), +.no-comments:lang(uk), +.not-found .page-title:lang(uk), +.error-404 .page-title:lang(uk), +.post-navigation .post-title:lang(uk), +.page-links:lang(uk), +.page-description:lang(uk), +.pagination .nav-links:lang(uk), +.sticky-post:lang(uk), +.site-title:lang(uk), +.site-info:lang(uk), +#cancel-comment-reply-link:lang(uk), +h1:lang(uk), +h2:lang(uk), +h3:lang(uk), +h4:lang(uk), +h5:lang(uk), +h6:lang(uk), .page-title:lang(uk), blockquote cite:lang(uk), table:lang(uk), .button:lang(uk), +input:lang(uk)[type="button"], +input:lang(uk)[type="reset"], +input:lang(uk)[type="submit"], .comment-navigation .nav-previous:lang(uk), +.comment-navigation .nav-next:lang(uk), .comment-list .pingback .comment-body:lang(uk), +.comment-list .trackback .comment-body:lang(uk), .comment-list .pingback .comment-body .comment-edit-link:lang(uk), +.comment-list .trackback .comment-body .comment-edit-link:lang(uk), .comment-form .comment-notes:lang(uk), +.comment-form label:lang(uk), .widget_archive ul li:lang(uk), +.widget_categories ul li:lang(uk), +.widget_meta ul li:lang(uk), +.widget_nav_menu ul li:lang(uk), +.widget_pages ul li:lang(uk), +.widget_recent_comments ul li:lang(uk), +.widget_recent_entries ul li:lang(uk), +.widget_rss ul li:lang(uk), .widget_tag_cloud .tagcloud:lang(uk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(uk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(uk), .entry .entry-content .wp-block-archives li > a:lang(uk), +.entry .entry-content .wp-block-categories li > a:lang(uk), +.entry .entry-content .wp-block-latest-posts li > a:lang(uk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(uk), .entry .entry-content .wp-block-verse:lang(uk), .entry .entry-content .has-drop-cap:lang(uk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(uk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover-image h2:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover h2:lang(uk), .entry .entry-content .wp-block-audio figcaption:lang(uk), +.entry .entry-content .wp-block-video figcaption:lang(uk), +.entry .entry-content .wp-block-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(uk), .entry .entry-content .wp-block-file:lang(uk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(uk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(uk), .wp-caption-text:lang(uk), .gallery-caption:lang(uk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(zh-HK), button:lang(zh-HK), +input:lang(zh-HK), +select:lang(zh-HK), +optgroup:lang(zh-HK), +textarea:lang(zh-HK), .author-description .author-link:lang(zh-HK), +.comment-metadata:lang(zh-HK), +.comment-reply-link:lang(zh-HK), +.comments-title:lang(zh-HK), +.comment-author .fn:lang(zh-HK), +.discussion-meta-info:lang(zh-HK), +.entry-meta:lang(zh-HK), +.entry-footer:lang(zh-HK), +.main-navigation:lang(zh-HK), +.no-comments:lang(zh-HK), +.not-found .page-title:lang(zh-HK), +.error-404 .page-title:lang(zh-HK), +.post-navigation .post-title:lang(zh-HK), +.page-links:lang(zh-HK), +.page-description:lang(zh-HK), +.pagination .nav-links:lang(zh-HK), +.sticky-post:lang(zh-HK), +.site-title:lang(zh-HK), +.site-info:lang(zh-HK), +#cancel-comment-reply-link:lang(zh-HK), +h1:lang(zh-HK), +h2:lang(zh-HK), +h3:lang(zh-HK), +h4:lang(zh-HK), +h5:lang(zh-HK), +h6:lang(zh-HK), .page-title:lang(zh-HK), blockquote cite:lang(zh-HK), table:lang(zh-HK), .button:lang(zh-HK), +input:lang(zh-HK)[type="button"], +input:lang(zh-HK)[type="reset"], +input:lang(zh-HK)[type="submit"], .comment-navigation .nav-previous:lang(zh-HK), +.comment-navigation .nav-next:lang(zh-HK), .comment-list .pingback .comment-body:lang(zh-HK), +.comment-list .trackback .comment-body:lang(zh-HK), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-HK), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-HK), .comment-form .comment-notes:lang(zh-HK), +.comment-form label:lang(zh-HK), .widget_archive ul li:lang(zh-HK), +.widget_categories ul li:lang(zh-HK), +.widget_meta ul li:lang(zh-HK), +.widget_nav_menu ul li:lang(zh-HK), +.widget_pages ul li:lang(zh-HK), +.widget_recent_comments ul li:lang(zh-HK), +.widget_recent_entries ul li:lang(zh-HK), +.widget_rss ul li:lang(zh-HK), .widget_tag_cloud .tagcloud:lang(zh-HK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-HK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-HK), .entry .entry-content .wp-block-archives li > a:lang(zh-HK), +.entry .entry-content .wp-block-categories li > a:lang(zh-HK), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-HK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-HK), .entry .entry-content .wp-block-verse:lang(zh-HK), .entry .entry-content .has-drop-cap:lang(zh-HK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-HK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image h2:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover h2:lang(zh-HK), .entry .entry-content .wp-block-audio figcaption:lang(zh-HK), +.entry .entry-content .wp-block-video figcaption:lang(zh-HK), +.entry .entry-content .wp-block-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-HK), .entry .entry-content .wp-block-file:lang(zh-HK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-HK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-HK), .wp-caption-text:lang(zh-HK), .gallery-caption:lang(zh-HK) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-TW), button:lang(zh-TW), +input:lang(zh-TW), +select:lang(zh-TW), +optgroup:lang(zh-TW), +textarea:lang(zh-TW), .author-description .author-link:lang(zh-TW), +.comment-metadata:lang(zh-TW), +.comment-reply-link:lang(zh-TW), +.comments-title:lang(zh-TW), +.comment-author .fn:lang(zh-TW), +.discussion-meta-info:lang(zh-TW), +.entry-meta:lang(zh-TW), +.entry-footer:lang(zh-TW), +.main-navigation:lang(zh-TW), +.no-comments:lang(zh-TW), +.not-found .page-title:lang(zh-TW), +.error-404 .page-title:lang(zh-TW), +.post-navigation .post-title:lang(zh-TW), +.page-links:lang(zh-TW), +.page-description:lang(zh-TW), +.pagination .nav-links:lang(zh-TW), +.sticky-post:lang(zh-TW), +.site-title:lang(zh-TW), +.site-info:lang(zh-TW), +#cancel-comment-reply-link:lang(zh-TW), +h1:lang(zh-TW), +h2:lang(zh-TW), +h3:lang(zh-TW), +h4:lang(zh-TW), +h5:lang(zh-TW), +h6:lang(zh-TW), .page-title:lang(zh-TW), blockquote cite:lang(zh-TW), table:lang(zh-TW), .button:lang(zh-TW), +input:lang(zh-TW)[type="button"], +input:lang(zh-TW)[type="reset"], +input:lang(zh-TW)[type="submit"], .comment-navigation .nav-previous:lang(zh-TW), +.comment-navigation .nav-next:lang(zh-TW), .comment-list .pingback .comment-body:lang(zh-TW), +.comment-list .trackback .comment-body:lang(zh-TW), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-TW), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-TW), .comment-form .comment-notes:lang(zh-TW), +.comment-form label:lang(zh-TW), .widget_archive ul li:lang(zh-TW), +.widget_categories ul li:lang(zh-TW), +.widget_meta ul li:lang(zh-TW), +.widget_nav_menu ul li:lang(zh-TW), +.widget_pages ul li:lang(zh-TW), +.widget_recent_comments ul li:lang(zh-TW), +.widget_recent_entries ul li:lang(zh-TW), +.widget_rss ul li:lang(zh-TW), .widget_tag_cloud .tagcloud:lang(zh-TW), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-TW), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-TW), .entry .entry-content .wp-block-archives li > a:lang(zh-TW), +.entry .entry-content .wp-block-categories li > a:lang(zh-TW), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-TW), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-TW), .entry .entry-content .wp-block-verse:lang(zh-TW), .entry .entry-content .has-drop-cap:lang(zh-TW):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-TW), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image h2:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover h2:lang(zh-TW), .entry .entry-content .wp-block-audio figcaption:lang(zh-TW), +.entry .entry-content .wp-block-video figcaption:lang(zh-TW), +.entry .entry-content .wp-block-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-TW), .entry .entry-content .wp-block-file:lang(zh-TW), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-TW), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-TW), .wp-caption-text:lang(zh-TW), .gallery-caption:lang(zh-TW) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-CN), button:lang(zh-CN), +input:lang(zh-CN), +select:lang(zh-CN), +optgroup:lang(zh-CN), +textarea:lang(zh-CN), .author-description .author-link:lang(zh-CN), +.comment-metadata:lang(zh-CN), +.comment-reply-link:lang(zh-CN), +.comments-title:lang(zh-CN), +.comment-author .fn:lang(zh-CN), +.discussion-meta-info:lang(zh-CN), +.entry-meta:lang(zh-CN), +.entry-footer:lang(zh-CN), +.main-navigation:lang(zh-CN), +.no-comments:lang(zh-CN), +.not-found .page-title:lang(zh-CN), +.error-404 .page-title:lang(zh-CN), +.post-navigation .post-title:lang(zh-CN), +.page-links:lang(zh-CN), +.page-description:lang(zh-CN), +.pagination .nav-links:lang(zh-CN), +.sticky-post:lang(zh-CN), +.site-title:lang(zh-CN), +.site-info:lang(zh-CN), +#cancel-comment-reply-link:lang(zh-CN), +h1:lang(zh-CN), +h2:lang(zh-CN), +h3:lang(zh-CN), +h4:lang(zh-CN), +h5:lang(zh-CN), +h6:lang(zh-CN), .page-title:lang(zh-CN), blockquote cite:lang(zh-CN), table:lang(zh-CN), .button:lang(zh-CN), +input:lang(zh-CN)[type="button"], +input:lang(zh-CN)[type="reset"], +input:lang(zh-CN)[type="submit"], .comment-navigation .nav-previous:lang(zh-CN), +.comment-navigation .nav-next:lang(zh-CN), .comment-list .pingback .comment-body:lang(zh-CN), +.comment-list .trackback .comment-body:lang(zh-CN), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-CN), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-CN), .comment-form .comment-notes:lang(zh-CN), +.comment-form label:lang(zh-CN), .widget_archive ul li:lang(zh-CN), +.widget_categories ul li:lang(zh-CN), +.widget_meta ul li:lang(zh-CN), +.widget_nav_menu ul li:lang(zh-CN), +.widget_pages ul li:lang(zh-CN), +.widget_recent_comments ul li:lang(zh-CN), +.widget_recent_entries ul li:lang(zh-CN), +.widget_rss ul li:lang(zh-CN), .widget_tag_cloud .tagcloud:lang(zh-CN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-CN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-CN), .entry .entry-content .wp-block-archives li > a:lang(zh-CN), +.entry .entry-content .wp-block-categories li > a:lang(zh-CN), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-CN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-CN), .entry .entry-content .wp-block-verse:lang(zh-CN), .entry .entry-content .has-drop-cap:lang(zh-CN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-CN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image h2:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover h2:lang(zh-CN), .entry .entry-content .wp-block-audio figcaption:lang(zh-CN), +.entry .entry-content .wp-block-video figcaption:lang(zh-CN), +.entry .entry-content .wp-block-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-CN), .entry .entry-content .wp-block-file:lang(zh-CN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-CN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-CN), .wp-caption-text:lang(zh-CN), .gallery-caption:lang(zh-CN) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(bn-BD), button:lang(bn-BD), +input:lang(bn-BD), +select:lang(bn-BD), +optgroup:lang(bn-BD), +textarea:lang(bn-BD), .author-description .author-link:lang(bn-BD), +.comment-metadata:lang(bn-BD), +.comment-reply-link:lang(bn-BD), +.comments-title:lang(bn-BD), +.comment-author .fn:lang(bn-BD), +.discussion-meta-info:lang(bn-BD), +.entry-meta:lang(bn-BD), +.entry-footer:lang(bn-BD), +.main-navigation:lang(bn-BD), +.no-comments:lang(bn-BD), +.not-found .page-title:lang(bn-BD), +.error-404 .page-title:lang(bn-BD), +.post-navigation .post-title:lang(bn-BD), +.page-links:lang(bn-BD), +.page-description:lang(bn-BD), +.pagination .nav-links:lang(bn-BD), +.sticky-post:lang(bn-BD), +.site-title:lang(bn-BD), +.site-info:lang(bn-BD), +#cancel-comment-reply-link:lang(bn-BD), +h1:lang(bn-BD), +h2:lang(bn-BD), +h3:lang(bn-BD), +h4:lang(bn-BD), +h5:lang(bn-BD), +h6:lang(bn-BD), .page-title:lang(bn-BD), blockquote cite:lang(bn-BD), table:lang(bn-BD), .button:lang(bn-BD), +input:lang(bn-BD)[type="button"], +input:lang(bn-BD)[type="reset"], +input:lang(bn-BD)[type="submit"], .comment-navigation .nav-previous:lang(bn-BD), +.comment-navigation .nav-next:lang(bn-BD), .comment-list .pingback .comment-body:lang(bn-BD), +.comment-list .trackback .comment-body:lang(bn-BD), .comment-list .pingback .comment-body .comment-edit-link:lang(bn-BD), +.comment-list .trackback .comment-body .comment-edit-link:lang(bn-BD), .comment-form .comment-notes:lang(bn-BD), +.comment-form label:lang(bn-BD), .widget_archive ul li:lang(bn-BD), +.widget_categories ul li:lang(bn-BD), +.widget_meta ul li:lang(bn-BD), +.widget_nav_menu ul li:lang(bn-BD), +.widget_pages ul li:lang(bn-BD), +.widget_recent_comments ul li:lang(bn-BD), +.widget_recent_entries ul li:lang(bn-BD), +.widget_rss ul li:lang(bn-BD), .widget_tag_cloud .tagcloud:lang(bn-BD), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bn-BD), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bn-BD), .entry .entry-content .wp-block-archives li > a:lang(bn-BD), +.entry .entry-content .wp-block-categories li > a:lang(bn-BD), +.entry .entry-content .wp-block-latest-posts li > a:lang(bn-BD), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bn-BD), .entry .entry-content .wp-block-verse:lang(bn-BD), .entry .entry-content .has-drop-cap:lang(bn-BD):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bn-BD), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image h2:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover h2:lang(bn-BD), .entry .entry-content .wp-block-audio figcaption:lang(bn-BD), +.entry .entry-content .wp-block-video figcaption:lang(bn-BD), +.entry .entry-content .wp-block-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bn-BD), .entry .entry-content .wp-block-file:lang(bn-BD), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bn-BD), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bn-BD), .wp-caption-text:lang(bn-BD), .gallery-caption:lang(bn-BD) { + font-family: Arial, sans-serif; +} + +body:lang(hi-IN), button:lang(hi-IN), +input:lang(hi-IN), +select:lang(hi-IN), +optgroup:lang(hi-IN), +textarea:lang(hi-IN), .author-description .author-link:lang(hi-IN), +.comment-metadata:lang(hi-IN), +.comment-reply-link:lang(hi-IN), +.comments-title:lang(hi-IN), +.comment-author .fn:lang(hi-IN), +.discussion-meta-info:lang(hi-IN), +.entry-meta:lang(hi-IN), +.entry-footer:lang(hi-IN), +.main-navigation:lang(hi-IN), +.no-comments:lang(hi-IN), +.not-found .page-title:lang(hi-IN), +.error-404 .page-title:lang(hi-IN), +.post-navigation .post-title:lang(hi-IN), +.page-links:lang(hi-IN), +.page-description:lang(hi-IN), +.pagination .nav-links:lang(hi-IN), +.sticky-post:lang(hi-IN), +.site-title:lang(hi-IN), +.site-info:lang(hi-IN), +#cancel-comment-reply-link:lang(hi-IN), +h1:lang(hi-IN), +h2:lang(hi-IN), +h3:lang(hi-IN), +h4:lang(hi-IN), +h5:lang(hi-IN), +h6:lang(hi-IN), .page-title:lang(hi-IN), blockquote cite:lang(hi-IN), table:lang(hi-IN), .button:lang(hi-IN), +input:lang(hi-IN)[type="button"], +input:lang(hi-IN)[type="reset"], +input:lang(hi-IN)[type="submit"], .comment-navigation .nav-previous:lang(hi-IN), +.comment-navigation .nav-next:lang(hi-IN), .comment-list .pingback .comment-body:lang(hi-IN), +.comment-list .trackback .comment-body:lang(hi-IN), .comment-list .pingback .comment-body .comment-edit-link:lang(hi-IN), +.comment-list .trackback .comment-body .comment-edit-link:lang(hi-IN), .comment-form .comment-notes:lang(hi-IN), +.comment-form label:lang(hi-IN), .widget_archive ul li:lang(hi-IN), +.widget_categories ul li:lang(hi-IN), +.widget_meta ul li:lang(hi-IN), +.widget_nav_menu ul li:lang(hi-IN), +.widget_pages ul li:lang(hi-IN), +.widget_recent_comments ul li:lang(hi-IN), +.widget_recent_entries ul li:lang(hi-IN), +.widget_rss ul li:lang(hi-IN), .widget_tag_cloud .tagcloud:lang(hi-IN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(hi-IN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(hi-IN), .entry .entry-content .wp-block-archives li > a:lang(hi-IN), +.entry .entry-content .wp-block-categories li > a:lang(hi-IN), +.entry .entry-content .wp-block-latest-posts li > a:lang(hi-IN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(hi-IN), .entry .entry-content .wp-block-verse:lang(hi-IN), .entry .entry-content .has-drop-cap:lang(hi-IN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(hi-IN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image h2:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover h2:lang(hi-IN), .entry .entry-content .wp-block-audio figcaption:lang(hi-IN), +.entry .entry-content .wp-block-video figcaption:lang(hi-IN), +.entry .entry-content .wp-block-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(hi-IN), .entry .entry-content .wp-block-file:lang(hi-IN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(hi-IN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(hi-IN), .wp-caption-text:lang(hi-IN), .gallery-caption:lang(hi-IN) { + font-family: Arial, sans-serif; +} + +body:lang(mr), button:lang(mr), +input:lang(mr), +select:lang(mr), +optgroup:lang(mr), +textarea:lang(mr), .author-description .author-link:lang(mr), +.comment-metadata:lang(mr), +.comment-reply-link:lang(mr), +.comments-title:lang(mr), +.comment-author .fn:lang(mr), +.discussion-meta-info:lang(mr), +.entry-meta:lang(mr), +.entry-footer:lang(mr), +.main-navigation:lang(mr), +.no-comments:lang(mr), +.not-found .page-title:lang(mr), +.error-404 .page-title:lang(mr), +.post-navigation .post-title:lang(mr), +.page-links:lang(mr), +.page-description:lang(mr), +.pagination .nav-links:lang(mr), +.sticky-post:lang(mr), +.site-title:lang(mr), +.site-info:lang(mr), +#cancel-comment-reply-link:lang(mr), +h1:lang(mr), +h2:lang(mr), +h3:lang(mr), +h4:lang(mr), +h5:lang(mr), +h6:lang(mr), .page-title:lang(mr), blockquote cite:lang(mr), table:lang(mr), .button:lang(mr), +input:lang(mr)[type="button"], +input:lang(mr)[type="reset"], +input:lang(mr)[type="submit"], .comment-navigation .nav-previous:lang(mr), +.comment-navigation .nav-next:lang(mr), .comment-list .pingback .comment-body:lang(mr), +.comment-list .trackback .comment-body:lang(mr), .comment-list .pingback .comment-body .comment-edit-link:lang(mr), +.comment-list .trackback .comment-body .comment-edit-link:lang(mr), .comment-form .comment-notes:lang(mr), +.comment-form label:lang(mr), .widget_archive ul li:lang(mr), +.widget_categories ul li:lang(mr), +.widget_meta ul li:lang(mr), +.widget_nav_menu ul li:lang(mr), +.widget_pages ul li:lang(mr), +.widget_recent_comments ul li:lang(mr), +.widget_recent_entries ul li:lang(mr), +.widget_rss ul li:lang(mr), .widget_tag_cloud .tagcloud:lang(mr), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mr), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mr), .entry .entry-content .wp-block-archives li > a:lang(mr), +.entry .entry-content .wp-block-categories li > a:lang(mr), +.entry .entry-content .wp-block-latest-posts li > a:lang(mr), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mr), .entry .entry-content .wp-block-verse:lang(mr), .entry .entry-content .has-drop-cap:lang(mr):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mr), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover-image h2:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover h2:lang(mr), .entry .entry-content .wp-block-audio figcaption:lang(mr), +.entry .entry-content .wp-block-video figcaption:lang(mr), +.entry .entry-content .wp-block-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mr), .entry .entry-content .wp-block-file:lang(mr), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mr), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mr), .wp-caption-text:lang(mr), .gallery-caption:lang(mr) { + font-family: Arial, sans-serif; +} + +body:lang(ne-NP), button:lang(ne-NP), +input:lang(ne-NP), +select:lang(ne-NP), +optgroup:lang(ne-NP), +textarea:lang(ne-NP), .author-description .author-link:lang(ne-NP), +.comment-metadata:lang(ne-NP), +.comment-reply-link:lang(ne-NP), +.comments-title:lang(ne-NP), +.comment-author .fn:lang(ne-NP), +.discussion-meta-info:lang(ne-NP), +.entry-meta:lang(ne-NP), +.entry-footer:lang(ne-NP), +.main-navigation:lang(ne-NP), +.no-comments:lang(ne-NP), +.not-found .page-title:lang(ne-NP), +.error-404 .page-title:lang(ne-NP), +.post-navigation .post-title:lang(ne-NP), +.page-links:lang(ne-NP), +.page-description:lang(ne-NP), +.pagination .nav-links:lang(ne-NP), +.sticky-post:lang(ne-NP), +.site-title:lang(ne-NP), +.site-info:lang(ne-NP), +#cancel-comment-reply-link:lang(ne-NP), +h1:lang(ne-NP), +h2:lang(ne-NP), +h3:lang(ne-NP), +h4:lang(ne-NP), +h5:lang(ne-NP), +h6:lang(ne-NP), .page-title:lang(ne-NP), blockquote cite:lang(ne-NP), table:lang(ne-NP), .button:lang(ne-NP), +input:lang(ne-NP)[type="button"], +input:lang(ne-NP)[type="reset"], +input:lang(ne-NP)[type="submit"], .comment-navigation .nav-previous:lang(ne-NP), +.comment-navigation .nav-next:lang(ne-NP), .comment-list .pingback .comment-body:lang(ne-NP), +.comment-list .trackback .comment-body:lang(ne-NP), .comment-list .pingback .comment-body .comment-edit-link:lang(ne-NP), +.comment-list .trackback .comment-body .comment-edit-link:lang(ne-NP), .comment-form .comment-notes:lang(ne-NP), +.comment-form label:lang(ne-NP), .widget_archive ul li:lang(ne-NP), +.widget_categories ul li:lang(ne-NP), +.widget_meta ul li:lang(ne-NP), +.widget_nav_menu ul li:lang(ne-NP), +.widget_pages ul li:lang(ne-NP), +.widget_recent_comments ul li:lang(ne-NP), +.widget_recent_entries ul li:lang(ne-NP), +.widget_rss ul li:lang(ne-NP), .widget_tag_cloud .tagcloud:lang(ne-NP), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ne-NP), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ne-NP), .entry .entry-content .wp-block-archives li > a:lang(ne-NP), +.entry .entry-content .wp-block-categories li > a:lang(ne-NP), +.entry .entry-content .wp-block-latest-posts li > a:lang(ne-NP), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ne-NP), .entry .entry-content .wp-block-verse:lang(ne-NP), .entry .entry-content .has-drop-cap:lang(ne-NP):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ne-NP), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image h2:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover h2:lang(ne-NP), .entry .entry-content .wp-block-audio figcaption:lang(ne-NP), +.entry .entry-content .wp-block-video figcaption:lang(ne-NP), +.entry .entry-content .wp-block-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ne-NP), .entry .entry-content .wp-block-file:lang(ne-NP), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ne-NP), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ne-NP), .wp-caption-text:lang(ne-NP), .gallery-caption:lang(ne-NP) { + font-family: Arial, sans-serif; +} + +body:lang(el), button:lang(el), +input:lang(el), +select:lang(el), +optgroup:lang(el), +textarea:lang(el), .author-description .author-link:lang(el), +.comment-metadata:lang(el), +.comment-reply-link:lang(el), +.comments-title:lang(el), +.comment-author .fn:lang(el), +.discussion-meta-info:lang(el), +.entry-meta:lang(el), +.entry-footer:lang(el), +.main-navigation:lang(el), +.no-comments:lang(el), +.not-found .page-title:lang(el), +.error-404 .page-title:lang(el), +.post-navigation .post-title:lang(el), +.page-links:lang(el), +.page-description:lang(el), +.pagination .nav-links:lang(el), +.sticky-post:lang(el), +.site-title:lang(el), +.site-info:lang(el), +#cancel-comment-reply-link:lang(el), +h1:lang(el), +h2:lang(el), +h3:lang(el), +h4:lang(el), +h5:lang(el), +h6:lang(el), .page-title:lang(el), blockquote cite:lang(el), table:lang(el), .button:lang(el), +input:lang(el)[type="button"], +input:lang(el)[type="reset"], +input:lang(el)[type="submit"], .comment-navigation .nav-previous:lang(el), +.comment-navigation .nav-next:lang(el), .comment-list .pingback .comment-body:lang(el), +.comment-list .trackback .comment-body:lang(el), .comment-list .pingback .comment-body .comment-edit-link:lang(el), +.comment-list .trackback .comment-body .comment-edit-link:lang(el), .comment-form .comment-notes:lang(el), +.comment-form label:lang(el), .widget_archive ul li:lang(el), +.widget_categories ul li:lang(el), +.widget_meta ul li:lang(el), +.widget_nav_menu ul li:lang(el), +.widget_pages ul li:lang(el), +.widget_recent_comments ul li:lang(el), +.widget_recent_entries ul li:lang(el), +.widget_rss ul li:lang(el), .widget_tag_cloud .tagcloud:lang(el), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(el), .entry .entry-content .wp-block-button .wp-block-button__link:lang(el), .entry .entry-content .wp-block-archives li > a:lang(el), +.entry .entry-content .wp-block-categories li > a:lang(el), +.entry .entry-content .wp-block-latest-posts li > a:lang(el), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(el), .entry .entry-content .wp-block-verse:lang(el), .entry .entry-content .has-drop-cap:lang(el):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(el), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover-image h2:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover h2:lang(el), .entry .entry-content .wp-block-audio figcaption:lang(el), +.entry .entry-content .wp-block-video figcaption:lang(el), +.entry .entry-content .wp-block-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(el), .entry .entry-content .wp-block-file:lang(el), .entry .entry-content .wp-block-file .wp-block-file__button:lang(el), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(el), .wp-caption-text:lang(el), .gallery-caption:lang(el) { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +body:lang(gu), button:lang(gu), +input:lang(gu), +select:lang(gu), +optgroup:lang(gu), +textarea:lang(gu), .author-description .author-link:lang(gu), +.comment-metadata:lang(gu), +.comment-reply-link:lang(gu), +.comments-title:lang(gu), +.comment-author .fn:lang(gu), +.discussion-meta-info:lang(gu), +.entry-meta:lang(gu), +.entry-footer:lang(gu), +.main-navigation:lang(gu), +.no-comments:lang(gu), +.not-found .page-title:lang(gu), +.error-404 .page-title:lang(gu), +.post-navigation .post-title:lang(gu), +.page-links:lang(gu), +.page-description:lang(gu), +.pagination .nav-links:lang(gu), +.sticky-post:lang(gu), +.site-title:lang(gu), +.site-info:lang(gu), +#cancel-comment-reply-link:lang(gu), +h1:lang(gu), +h2:lang(gu), +h3:lang(gu), +h4:lang(gu), +h5:lang(gu), +h6:lang(gu), .page-title:lang(gu), blockquote cite:lang(gu), table:lang(gu), .button:lang(gu), +input:lang(gu)[type="button"], +input:lang(gu)[type="reset"], +input:lang(gu)[type="submit"], .comment-navigation .nav-previous:lang(gu), +.comment-navigation .nav-next:lang(gu), .comment-list .pingback .comment-body:lang(gu), +.comment-list .trackback .comment-body:lang(gu), .comment-list .pingback .comment-body .comment-edit-link:lang(gu), +.comment-list .trackback .comment-body .comment-edit-link:lang(gu), .comment-form .comment-notes:lang(gu), +.comment-form label:lang(gu), .widget_archive ul li:lang(gu), +.widget_categories ul li:lang(gu), +.widget_meta ul li:lang(gu), +.widget_nav_menu ul li:lang(gu), +.widget_pages ul li:lang(gu), +.widget_recent_comments ul li:lang(gu), +.widget_recent_entries ul li:lang(gu), +.widget_rss ul li:lang(gu), .widget_tag_cloud .tagcloud:lang(gu), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(gu), .entry .entry-content .wp-block-button .wp-block-button__link:lang(gu), .entry .entry-content .wp-block-archives li > a:lang(gu), +.entry .entry-content .wp-block-categories li > a:lang(gu), +.entry .entry-content .wp-block-latest-posts li > a:lang(gu), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(gu), .entry .entry-content .wp-block-verse:lang(gu), .entry .entry-content .has-drop-cap:lang(gu):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(gu), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover-image h2:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover h2:lang(gu), .entry .entry-content .wp-block-audio figcaption:lang(gu), +.entry .entry-content .wp-block-video figcaption:lang(gu), +.entry .entry-content .wp-block-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(gu), .entry .entry-content .wp-block-file:lang(gu), .entry .entry-content .wp-block-file .wp-block-file__button:lang(gu), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(gu), .wp-caption-text:lang(gu), .gallery-caption:lang(gu) { + font-family: Arial, sans-serif; +} + +body:lang(he-IL), button:lang(he-IL), +input:lang(he-IL), +select:lang(he-IL), +optgroup:lang(he-IL), +textarea:lang(he-IL), .author-description .author-link:lang(he-IL), +.comment-metadata:lang(he-IL), +.comment-reply-link:lang(he-IL), +.comments-title:lang(he-IL), +.comment-author .fn:lang(he-IL), +.discussion-meta-info:lang(he-IL), +.entry-meta:lang(he-IL), +.entry-footer:lang(he-IL), +.main-navigation:lang(he-IL), +.no-comments:lang(he-IL), +.not-found .page-title:lang(he-IL), +.error-404 .page-title:lang(he-IL), +.post-navigation .post-title:lang(he-IL), +.page-links:lang(he-IL), +.page-description:lang(he-IL), +.pagination .nav-links:lang(he-IL), +.sticky-post:lang(he-IL), +.site-title:lang(he-IL), +.site-info:lang(he-IL), +#cancel-comment-reply-link:lang(he-IL), +h1:lang(he-IL), +h2:lang(he-IL), +h3:lang(he-IL), +h4:lang(he-IL), +h5:lang(he-IL), +h6:lang(he-IL), .page-title:lang(he-IL), blockquote cite:lang(he-IL), table:lang(he-IL), .button:lang(he-IL), +input:lang(he-IL)[type="button"], +input:lang(he-IL)[type="reset"], +input:lang(he-IL)[type="submit"], .comment-navigation .nav-previous:lang(he-IL), +.comment-navigation .nav-next:lang(he-IL), .comment-list .pingback .comment-body:lang(he-IL), +.comment-list .trackback .comment-body:lang(he-IL), .comment-list .pingback .comment-body .comment-edit-link:lang(he-IL), +.comment-list .trackback .comment-body .comment-edit-link:lang(he-IL), .comment-form .comment-notes:lang(he-IL), +.comment-form label:lang(he-IL), .widget_archive ul li:lang(he-IL), +.widget_categories ul li:lang(he-IL), +.widget_meta ul li:lang(he-IL), +.widget_nav_menu ul li:lang(he-IL), +.widget_pages ul li:lang(he-IL), +.widget_recent_comments ul li:lang(he-IL), +.widget_recent_entries ul li:lang(he-IL), +.widget_rss ul li:lang(he-IL), .widget_tag_cloud .tagcloud:lang(he-IL), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(he-IL), .entry .entry-content .wp-block-button .wp-block-button__link:lang(he-IL), .entry .entry-content .wp-block-archives li > a:lang(he-IL), +.entry .entry-content .wp-block-categories li > a:lang(he-IL), +.entry .entry-content .wp-block-latest-posts li > a:lang(he-IL), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(he-IL), .entry .entry-content .wp-block-verse:lang(he-IL), .entry .entry-content .has-drop-cap:lang(he-IL):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(he-IL), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image h2:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover h2:lang(he-IL), .entry .entry-content .wp-block-audio figcaption:lang(he-IL), +.entry .entry-content .wp-block-video figcaption:lang(he-IL), +.entry .entry-content .wp-block-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(he-IL), .entry .entry-content .wp-block-file:lang(he-IL), .entry .entry-content .wp-block-file .wp-block-file__button:lang(he-IL), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(he-IL), .wp-caption-text:lang(he-IL), .gallery-caption:lang(he-IL) { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +body:lang(ja), button:lang(ja), +input:lang(ja), +select:lang(ja), +optgroup:lang(ja), +textarea:lang(ja), .author-description .author-link:lang(ja), +.comment-metadata:lang(ja), +.comment-reply-link:lang(ja), +.comments-title:lang(ja), +.comment-author .fn:lang(ja), +.discussion-meta-info:lang(ja), +.entry-meta:lang(ja), +.entry-footer:lang(ja), +.main-navigation:lang(ja), +.no-comments:lang(ja), +.not-found .page-title:lang(ja), +.error-404 .page-title:lang(ja), +.post-navigation .post-title:lang(ja), +.page-links:lang(ja), +.page-description:lang(ja), +.pagination .nav-links:lang(ja), +.sticky-post:lang(ja), +.site-title:lang(ja), +.site-info:lang(ja), +#cancel-comment-reply-link:lang(ja), +h1:lang(ja), +h2:lang(ja), +h3:lang(ja), +h4:lang(ja), +h5:lang(ja), +h6:lang(ja), .page-title:lang(ja), blockquote cite:lang(ja), table:lang(ja), .button:lang(ja), +input:lang(ja)[type="button"], +input:lang(ja)[type="reset"], +input:lang(ja)[type="submit"], .comment-navigation .nav-previous:lang(ja), +.comment-navigation .nav-next:lang(ja), .comment-list .pingback .comment-body:lang(ja), +.comment-list .trackback .comment-body:lang(ja), .comment-list .pingback .comment-body .comment-edit-link:lang(ja), +.comment-list .trackback .comment-body .comment-edit-link:lang(ja), .comment-form .comment-notes:lang(ja), +.comment-form label:lang(ja), .widget_archive ul li:lang(ja), +.widget_categories ul li:lang(ja), +.widget_meta ul li:lang(ja), +.widget_nav_menu ul li:lang(ja), +.widget_pages ul li:lang(ja), +.widget_recent_comments ul li:lang(ja), +.widget_recent_entries ul li:lang(ja), +.widget_rss ul li:lang(ja), .widget_tag_cloud .tagcloud:lang(ja), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ja), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ja), .entry .entry-content .wp-block-archives li > a:lang(ja), +.entry .entry-content .wp-block-categories li > a:lang(ja), +.entry .entry-content .wp-block-latest-posts li > a:lang(ja), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ja), .entry .entry-content .wp-block-verse:lang(ja), .entry .entry-content .has-drop-cap:lang(ja):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ja), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover-image h2:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover h2:lang(ja), .entry .entry-content .wp-block-audio figcaption:lang(ja), +.entry .entry-content .wp-block-video figcaption:lang(ja), +.entry .entry-content .wp-block-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ja), .entry .entry-content .wp-block-file:lang(ja), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ja), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ja), .wp-caption-text:lang(ja), .gallery-caption:lang(ja) { + font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif; +} + +body:lang(ko-KR), button:lang(ko-KR), +input:lang(ko-KR), +select:lang(ko-KR), +optgroup:lang(ko-KR), +textarea:lang(ko-KR), .author-description .author-link:lang(ko-KR), +.comment-metadata:lang(ko-KR), +.comment-reply-link:lang(ko-KR), +.comments-title:lang(ko-KR), +.comment-author .fn:lang(ko-KR), +.discussion-meta-info:lang(ko-KR), +.entry-meta:lang(ko-KR), +.entry-footer:lang(ko-KR), +.main-navigation:lang(ko-KR), +.no-comments:lang(ko-KR), +.not-found .page-title:lang(ko-KR), +.error-404 .page-title:lang(ko-KR), +.post-navigation .post-title:lang(ko-KR), +.page-links:lang(ko-KR), +.page-description:lang(ko-KR), +.pagination .nav-links:lang(ko-KR), +.sticky-post:lang(ko-KR), +.site-title:lang(ko-KR), +.site-info:lang(ko-KR), +#cancel-comment-reply-link:lang(ko-KR), +h1:lang(ko-KR), +h2:lang(ko-KR), +h3:lang(ko-KR), +h4:lang(ko-KR), +h5:lang(ko-KR), +h6:lang(ko-KR), .page-title:lang(ko-KR), blockquote cite:lang(ko-KR), table:lang(ko-KR), .button:lang(ko-KR), +input:lang(ko-KR)[type="button"], +input:lang(ko-KR)[type="reset"], +input:lang(ko-KR)[type="submit"], .comment-navigation .nav-previous:lang(ko-KR), +.comment-navigation .nav-next:lang(ko-KR), .comment-list .pingback .comment-body:lang(ko-KR), +.comment-list .trackback .comment-body:lang(ko-KR), .comment-list .pingback .comment-body .comment-edit-link:lang(ko-KR), +.comment-list .trackback .comment-body .comment-edit-link:lang(ko-KR), .comment-form .comment-notes:lang(ko-KR), +.comment-form label:lang(ko-KR), .widget_archive ul li:lang(ko-KR), +.widget_categories ul li:lang(ko-KR), +.widget_meta ul li:lang(ko-KR), +.widget_nav_menu ul li:lang(ko-KR), +.widget_pages ul li:lang(ko-KR), +.widget_recent_comments ul li:lang(ko-KR), +.widget_recent_entries ul li:lang(ko-KR), +.widget_rss ul li:lang(ko-KR), .widget_tag_cloud .tagcloud:lang(ko-KR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ko-KR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ko-KR), .entry .entry-content .wp-block-archives li > a:lang(ko-KR), +.entry .entry-content .wp-block-categories li > a:lang(ko-KR), +.entry .entry-content .wp-block-latest-posts li > a:lang(ko-KR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ko-KR), .entry .entry-content .wp-block-verse:lang(ko-KR), .entry .entry-content .has-drop-cap:lang(ko-KR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ko-KR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image h2:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover h2:lang(ko-KR), .entry .entry-content .wp-block-audio figcaption:lang(ko-KR), +.entry .entry-content .wp-block-video figcaption:lang(ko-KR), +.entry .entry-content .wp-block-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ko-KR), .entry .entry-content .wp-block-file:lang(ko-KR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ko-KR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ko-KR), .wp-caption-text:lang(ko-KR), .gallery-caption:lang(ko-KR) { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +body:lang(th), button:lang(th), +input:lang(th), +select:lang(th), +optgroup:lang(th), +textarea:lang(th), .author-description .author-link:lang(th), +.comment-metadata:lang(th), +.comment-reply-link:lang(th), +.comments-title:lang(th), +.comment-author .fn:lang(th), +.discussion-meta-info:lang(th), +.entry-meta:lang(th), +.entry-footer:lang(th), +.main-navigation:lang(th), +.no-comments:lang(th), +.not-found .page-title:lang(th), +.error-404 .page-title:lang(th), +.post-navigation .post-title:lang(th), +.page-links:lang(th), +.page-description:lang(th), +.pagination .nav-links:lang(th), +.sticky-post:lang(th), +.site-title:lang(th), +.site-info:lang(th), +#cancel-comment-reply-link:lang(th), +h1:lang(th), +h2:lang(th), +h3:lang(th), +h4:lang(th), +h5:lang(th), +h6:lang(th), .page-title:lang(th), blockquote cite:lang(th), table:lang(th), .button:lang(th), +input:lang(th)[type="button"], +input:lang(th)[type="reset"], +input:lang(th)[type="submit"], .comment-navigation .nav-previous:lang(th), +.comment-navigation .nav-next:lang(th), .comment-list .pingback .comment-body:lang(th), +.comment-list .trackback .comment-body:lang(th), .comment-list .pingback .comment-body .comment-edit-link:lang(th), +.comment-list .trackback .comment-body .comment-edit-link:lang(th), .comment-form .comment-notes:lang(th), +.comment-form label:lang(th), .widget_archive ul li:lang(th), +.widget_categories ul li:lang(th), +.widget_meta ul li:lang(th), +.widget_nav_menu ul li:lang(th), +.widget_pages ul li:lang(th), +.widget_recent_comments ul li:lang(th), +.widget_recent_entries ul li:lang(th), +.widget_rss ul li:lang(th), .widget_tag_cloud .tagcloud:lang(th), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(th), .entry .entry-content .wp-block-button .wp-block-button__link:lang(th), .entry .entry-content .wp-block-archives li > a:lang(th), +.entry .entry-content .wp-block-categories li > a:lang(th), +.entry .entry-content .wp-block-latest-posts li > a:lang(th), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(th), .entry .entry-content .wp-block-verse:lang(th), .entry .entry-content .has-drop-cap:lang(th):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(th), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover-image h2:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover h2:lang(th), .entry .entry-content .wp-block-audio figcaption:lang(th), +.entry .entry-content .wp-block-video figcaption:lang(th), +.entry .entry-content .wp-block-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(th), .entry .entry-content .wp-block-file:lang(th), .entry .entry-content .wp-block-file .wp-block-file__button:lang(th), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(th), .wp-caption-text:lang(th), .gallery-caption:lang(th) { + font-family: "Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif; +} + +body:lang(vi), button:lang(vi), +input:lang(vi), +select:lang(vi), +optgroup:lang(vi), +textarea:lang(vi), .author-description .author-link:lang(vi), +.comment-metadata:lang(vi), +.comment-reply-link:lang(vi), +.comments-title:lang(vi), +.comment-author .fn:lang(vi), +.discussion-meta-info:lang(vi), +.entry-meta:lang(vi), +.entry-footer:lang(vi), +.main-navigation:lang(vi), +.no-comments:lang(vi), +.not-found .page-title:lang(vi), +.error-404 .page-title:lang(vi), +.post-navigation .post-title:lang(vi), +.page-links:lang(vi), +.page-description:lang(vi), +.pagination .nav-links:lang(vi), +.sticky-post:lang(vi), +.site-title:lang(vi), +.site-info:lang(vi), +#cancel-comment-reply-link:lang(vi), +h1:lang(vi), +h2:lang(vi), +h3:lang(vi), +h4:lang(vi), +h5:lang(vi), +h6:lang(vi), .page-title:lang(vi), blockquote cite:lang(vi), table:lang(vi), .button:lang(vi), +input:lang(vi)[type="button"], +input:lang(vi)[type="reset"], +input:lang(vi)[type="submit"], .comment-navigation .nav-previous:lang(vi), +.comment-navigation .nav-next:lang(vi), .comment-list .pingback .comment-body:lang(vi), +.comment-list .trackback .comment-body:lang(vi), .comment-list .pingback .comment-body .comment-edit-link:lang(vi), +.comment-list .trackback .comment-body .comment-edit-link:lang(vi), .comment-form .comment-notes:lang(vi), +.comment-form label:lang(vi), .widget_archive ul li:lang(vi), +.widget_categories ul li:lang(vi), +.widget_meta ul li:lang(vi), +.widget_nav_menu ul li:lang(vi), +.widget_pages ul li:lang(vi), +.widget_recent_comments ul li:lang(vi), +.widget_recent_entries ul li:lang(vi), +.widget_rss ul li:lang(vi), .widget_tag_cloud .tagcloud:lang(vi), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(vi), .entry .entry-content .wp-block-button .wp-block-button__link:lang(vi), .entry .entry-content .wp-block-archives li > a:lang(vi), +.entry .entry-content .wp-block-categories li > a:lang(vi), +.entry .entry-content .wp-block-latest-posts li > a:lang(vi), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(vi), .entry .entry-content .wp-block-verse:lang(vi), .entry .entry-content .has-drop-cap:lang(vi):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(vi), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover-image h2:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover h2:lang(vi), .entry .entry-content .wp-block-audio figcaption:lang(vi), +.entry .entry-content .wp-block-video figcaption:lang(vi), +.entry .entry-content .wp-block-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(vi), .entry .entry-content .wp-block-file:lang(vi), .entry .entry-content .wp-block-file .wp-block-file__button:lang(vi), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(vi), .wp-caption-text:lang(vi), .gallery-caption:lang(vi) { + font-family: "Libre Franklin", sans-serif; +} + +/* Normalize */ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} + +/* Typography */ +html { + font-size: 22px; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + font-size: 1em; + line-height: 1.8; + margin: 0; + text-rendering: optimizeLegibility; +} + +button, +input, +select, +optgroup, +textarea { + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + line-height: 1.8; + text-rendering: optimizeLegibility; +} + +.author-description .author-link, +.comment-metadata, +.comment-reply-link, +.comments-title, +.comment-author .fn, +.discussion-meta-info, +.entry-meta, +.entry-footer, +.main-navigation, +.no-comments, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.page-links, +.page-description, +.pagination .nav-links, +.sticky-post, +.site-title, +.site-info, +#cancel-comment-reply-link, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.main-navigation, +.page-description, +.author-description .author-link, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.pagination .nav-links, +.comments-title, +.comment-author .fn, +.no-comments, +.site-title, +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.2; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.page-title { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; +} + +.site-branding, +.main-navigation ul.main-menu > li, +.social-navigation, +.author-description .author-bio, +.nav-links { + line-height: 1.25; +} + +h1 { + font-size: 2.25em; +} + +@media only screen and (min-width: 768px) { + h1 { + font-size: 2.8125em; + } +} + +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.has-larger-font-size, +h2 { + font-size: 1.6875em; +} + +@media only screen and (min-width: 768px) { + .entry-title, + .not-found .page-title, + .error-404 .page-title, + .has-larger-font-size, + h2 { + font-size: 2.25em; + } +} + +.has-regular-font-size, +.has-large-font-size, +.comments-title, +h3 { + font-size: 1.6875em; +} + +.site-title, +.site-description, +.main-navigation, +.nav-links, +.page-title, +.page-description, +.comment-author .fn, +.no-comments, +h2.author-title, +p.author-bio, +h4 { + font-size: 1.125em; +} + +.pagination .nav-links, +.comment-content, +h5 { + font-size: 0.88889em; +} + +.entry-meta, +.entry-footer, +.discussion-meta-info, +.site-info, +.has-small-font-size, +.comment-reply-link, +.comment-metadata, +.comment-notes, +.sticky-post, +#cancel-comment-reply-link, +img:after, +h6 { + font-size: 0.71111em; +} + +.site-title, +.page-title { + font-weight: normal; +} + +.page-description, +.page-links a { + font-weight: bold; +} + +.site-description { + letter-spacing: -0.01em; +} + +.post-navigation .post-title, +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.comments-title, +blockquote { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; + word-wrap: break-word; +} + +/* Do not hyphenate entry title on tablet view and bigger. */ +@media only screen and (min-width: 768px) { + .entry-title { + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + } +} + +p { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote cite { + font-size: 0.71111em; + font-style: normal; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +pre { + font-size: 0.88889em; + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 1.8; + overflow: auto; +} + +code, +kbd, +tt, +var { + font-size: 0.88889em; + font-family: Menlo, monaco, Consolas, Lucida Console, monospace; +} + +abbr, acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: none; +} + +a:focus { + text-decoration: underline; +} + +/* Elements */ +html { + box-sizing: border-box; +} + +::-moz-selection { + background-color: #bfdcea; +} + +::selection { + background-color: #bfdcea; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + background-color: #fff; +} + +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin; + outline-style: dotted; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + margin: 1rem 0; +} + +h1:not(.site-title):before, +h2:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +hr { + background-color: #767676; + border: 0; + height: 2px; +} + +ul, +ol { + padding-left: 1rem; +} + +ul { + list-style: disc; +} + +ul ul { + list-style-type: circle; +} + +ol { + list-style: decimal; +} + +li { + line-height: 1.8; +} + +li > ul, +li > ol { + padding-left: 2rem; +} + +dt { + font-weight: bold; +} + +dd { + margin: 0 1rem 1rem; +} + +img { + height: auto; + max-width: 100%; + position: relative; +} + +figure { + margin: 0; +} + +blockquote { + border-left: 2px solid #0073aa; + margin-left: 0; + padding: 0 0 0 1rem; +} + +blockquote > p { + margin: 0 0 1rem; +} + +blockquote cite { + color: #767676; +} + +table { + margin: 0 0 1rem; + border-collapse: collapse; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +table td, +table th { + padding: 0.5em; + border: 1px solid #767676; + word-break: break-all; +} + +/* Forms */ +.button, +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + transition: background 150ms ease-in-out; + background: #0073aa; + border: none; + border-radius: 5px; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.88889em; + font-weight: 700; + line-height: 1.2; + outline: none; + padding: 0.76rem 1rem; + text-decoration: none; + vertical-align: bottom; +} + +.button:hover, +button:hover, +input[type="button"]:hover, +input[type="reset"]:hover, +input[type="submit"]:hover { + background: #111; + cursor: pointer; +} + +.button:visited, +button:visited, +input[type="button"]:visited, +input[type="reset"]:visited, +input[type="submit"]:visited { + color: #fff; + text-decoration: none; +} + +.button:focus, +button:focus, +input[type="button"]:focus, +input[type="reset"]:focus, +input[type="submit"]:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"], +textarea { + -webkit-backface-visibility: hidden; + background: #fff; + border: solid 1px #ccc; + box-sizing: border-box; + outline: none; + padding: 0.36rem 0.66rem; + -webkit-appearance: none; + outline-offset: 0; + border-radius: 0; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +input[type="search"]:focus, +input[type="number"]:focus, +input[type="tel"]:focus, +input[type="range"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="week"]:focus, +input[type="time"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="color"]:focus, +textarea:focus { + border-color: #0073aa; + outline: thin solid rgba(0, 115, 170, 0.15); + outline-offset: -4px; +} + +input[type="search"]::-webkit-search-decoration { + display: none; +} + +textarea { + box-sizing: border-box; + display: block; + width: 100%; + max-width: 100%; + resize: vertical; +} + +form p { + margin: 1rem 0; +} + +/* Navigation */ +/*-------------------------------------------------------------- +## Links +--------------------------------------------------------------*/ +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:visited { + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin dotted; + text-decoration: underline; +} + +/*-------------------------------------------------------------- +## Menus +--------------------------------------------------------------*/ +/** === Main menu === */ +.main-navigation { + display: block; + margin-top: 0.25rem; + /* Un-style buttons */ + /* + * Sub-menu styles + * + * :focus-within needs its own selector so other similar + * selectors don’t get ignored if a browser doesn’t recognize it + */ + /** + * Fade-in animation for top-level submenus + */ + /** + * Off-canvas touch device styles + */ +} + +body.page .main-navigation { + display: block; +} + +.main-navigation > div { + display: inline; +} + +.main-navigation button { + display: inline-block; + border: none; + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; + line-height: 1.2; + text-decoration: none; + background: transparent; + color: inherit; + cursor: pointer; + transition: background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; +} + +.main-navigation button:hover, .main-navigation button:focus { + background: transparent; +} + +.main-navigation button:focus { + outline: 1px solid transparent; + outline-offset: -4px; +} + +.main-navigation button:active { + transform: scale(0.99); +} + +.main-navigation .main-menu { + display: inline-block; + margin: 0; + padding: 0; +} + +.main-navigation .main-menu > li { + color: #0073aa; + display: inline; + position: relative; +} + +.main-navigation .main-menu > li > a { + font-weight: 700; + color: #0073aa; + margin-right: 0.5rem; +} + +.main-navigation .main-menu > li > a + svg { + margin-right: 0.5rem; +} + +.main-navigation .main-menu > li > a:hover, +.main-navigation .main-menu > li > a:hover + svg { + color: #005177; +} + +.main-navigation .main-menu > li.menu-item-has-children { + display: inline-block; + position: inherit; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu > li.menu-item-has-children { + position: relative; + } +} + +.main-navigation .main-menu > li.menu-item-has-children > a { + margin-right: 0.125rem; +} + +.main-navigation .main-menu > li.menu-item-has-children > a:after, +.main-navigation .main-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: ""; + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + margin-right: 0.25rem; + /* Priority+ Menu */ +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle { + position: relative; + height: 24px; + line-height: 1.2; + width: 24px; + padding: 0; + margin-left: 0.5rem; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle svg { + height: 24px; + width: 24px; + top: -0.125rem; + vertical-align: text-bottom; +} + +.wp-customizer-unloading .main-navigation .main-menu > li.menu-item-has-children .submenu-expand, .main-navigation .main-menu > li.menu-item-has-children .submenu-expand.is-empty { + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand svg { + position: relative; + top: 0.2rem; +} + +.main-navigation .main-menu > li:last-child > a, +.main-navigation .main-menu > li:last-child.menu-item-has-children .submenu-expand { + margin-right: 0; +} + +.main-navigation .sub-menu { + background-color: #0073aa; + color: #fff; + list-style: none; + padding-left: 0; + position: absolute; + opacity: 0; + left: -9999px; + z-index: 99999; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu { + width: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + } +} + +.main-navigation .sub-menu > li { + display: block; + float: none; + position: relative; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + position: absolute; + width: calc( 24px + 1rem); + right: 0; + top: calc( .125 * 1rem); + bottom: 0; + color: white; + line-height: 1; + padding: calc( .5 * 1rem); +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand svg { + top: 0; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + margin-right: 0; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: "\203a"; + } +} + +.main-navigation .sub-menu > li > a, +.main-navigation .sub-menu > li > .menu-item-link-return { + color: #fff; + display: block; + line-height: 1.2; + text-shadow: none; + padding: calc( .5 * 1rem) calc( 24px + 1rem) calc( .5 * 1rem) 1rem; + white-space: nowrap; +} + +.main-navigation .sub-menu > li > a:hover, .main-navigation .sub-menu > li > a:focus, +.main-navigation .sub-menu > li > .menu-item-link-return:hover, +.main-navigation .sub-menu > li > .menu-item-link-return:focus { + background: #005177; +} + +.main-navigation .sub-menu > li > a:hover:after, .main-navigation .sub-menu > li > a:focus:after, +.main-navigation .sub-menu > li > .menu-item-link-return:hover:after, +.main-navigation .sub-menu > li > .menu-item-link-return:focus:after { + background: #005177; +} + +.main-navigation .sub-menu > li > .menu-item-link-return { + width: 100%; + font-size: 22px; + font-weight: normal; + text-align: left; +} + +.main-navigation .sub-menu > li > a:empty { + display: none; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item { + display: none; + font-size: 0.88889em; + font-weight: normal; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item svg { + position: relative; + top: 0.2rem; + margin-right: calc( .25 * 1rem); +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + right: 0; + left: auto; + display: block; + width: max-content; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + right: 0; + left: auto; + display: block; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + /* Non-mobile position */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + float: none; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + right: 0; + left: auto; + display: table; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu > .menu-item-has-children:not(.off-canvas):hover > .sub-menu { + animation: fade_in 0.1s forwards; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .submenu-expand .svg-icon { + transform: rotate(270deg); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .sub-menu { + opacity: 0; + position: absolute; + z-index: 0; + transform: translateX(-100%); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:focus, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:focus { + background-color: transparent; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > a, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > .menu-item-link-return { + white-space: inherit; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + display: table; + margin-top: 0; + opacity: 1; + padding-left: 0; + /* Mobile position */ + left: 0; + top: 0; + right: 0; + bottom: 0; + position: fixed; + z-index: 100000; + /* Make sure appears above mobile admin bar */ + width: 100vw; + height: 100vh; + max-width: 100vw; + transform: translateX(100%); + animation: slide_in_right 0.3s forwards; + /* Prevent menu from being blocked by admin bar */ +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true > .mobile-parent-nav-menu-item { + display: block; +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 46px; + height: calc( 100vh - 46px); + /* WP core breakpoint */ +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; +} + +@media only screen and (min-width: 782px) { + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 32px; + height: calc( 100vh - 32px); + } + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; + } +} + +.main-navigation .main-menu-more:nth-child(n+3) { + display: none; +} + +/* Menu animation */ +@keyframes slide_in_right { + 100% { + transform: translateX(0%); + } +} + +@keyframes fade_in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Social menu */ +.social-navigation { + margin-top: calc(1rem / 2); + text-align: left; +} + +.social-navigation ul.social-links-menu { + content: ""; + display: table; + table-layout: fixed; + display: inline-block; + margin: 0; + padding: 0; +} + +.social-navigation ul.social-links-menu li { + display: inline-block; + vertical-align: bottom; + vertical-align: -webkit-baseline-middle; + list-style: none; +} + +.social-navigation ul.social-links-menu li:nth-child(n+2) { + margin-left: 0.1em; +} + +.social-navigation ul.social-links-menu li a { + border-bottom: 1px solid transparent; + display: block; + color: #111; + margin-bottom: -1px; + transition: opacity 110ms ease-in-out; +} + +.social-navigation ul.social-links-menu li a:hover, .social-navigation ul.social-links-menu li a:active { + color: #111; + opacity: 0.6; +} + +.social-navigation ul.social-links-menu li a:focus { + color: #111; + opacity: 1; + border-bottom: 1px solid #111; +} + +.social-navigation ul.social-links-menu li a svg { + display: block; + width: 32px; + height: 32px; + transform: translateZ(0); +} + +.social-navigation ul.social-links-menu li a svg#ui-icon-link { + transform: rotate(-45deg); +} + +@media only screen and (min-width: 768px) { + .site-title + .social-navigation, + .site-description + .social-navigation { + margin-top: calc(1rem / 5); + } +} + +/** === Footer menu === */ +.footer-navigation { + display: inline; +} + +.footer-navigation > div { + display: inline; +} + +.footer-navigation .footer-menu { + display: inline; + padding-left: 0; +} + +.footer-navigation .footer-menu li { + display: inline; + margin-right: 1rem; +} + +/*-------------------------------------------------------------- +## Next / Previous +--------------------------------------------------------------*/ +/* Next/Previous navigation */ +.post-navigation { + margin: calc(3 * 1rem) 0; +} + +@media only screen and (min-width: 768px) { + .post-navigation { + margin: calc(3 * 1rem) calc(10% + 60px); + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation { + margin: calc(3 * 1rem) 0; + max-width: 100%; + } +} + +.post-navigation .nav-links { + margin: 0 1rem; + max-width: 100%; + display: flex; + flex-direction: column; +} + +@media only screen and (min-width: 768px) { + .post-navigation .nav-links { + margin: 0; + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links { + flex-direction: row; + margin: 0 calc(10% + 60px); + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.post-navigation .nav-links a .meta-nav { + color: #767676; + user-select: none; +} + +.post-navigation .nav-links a .meta-nav:before, .post-navigation .nav-links a .meta-nav:after { + display: none; + content: "—"; + width: 2em; + color: #767676; + height: 1em; +} + +.post-navigation .nav-links a .post-title { + hyphens: auto; +} + +.post-navigation .nav-links a:hover { + color: #005177; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous, + .post-navigation .nav-links .nav-next { + min-width: calc(50% - 2 * 1rem); + } +} + +.post-navigation .nav-links .nav-previous { + order: 2; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous { + order: 1; + } +} + +.post-navigation .nav-links .nav-previous + .nav-next { + margin-bottom: 1rem; +} + +.post-navigation .nav-links .nav-previous .meta-nav:before { + display: inline; +} + +.post-navigation .nav-links .nav-next { + order: 1; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-next { + order: 2; + padding-left: 1rem; + } +} + +.post-navigation .nav-links .nav-next .meta-nav:after { + display: inline; +} + +.pagination .nav-links { + display: flex; + flex-wrap: wrap; + padding: 0 calc(.5 * 1rem); +} + +.pagination .nav-links > * { + padding: calc(.5 * 1rem); +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.prev { + padding-left: 0; +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.next { + padding-right: 0; +} + +.pagination .nav-links a:focus { + text-decoration: underline; + outline-offset: -1px; +} + +.pagination .nav-links a:focus.prev, .pagination .nav-links a:focus.next { + text-decoration: none; +} + +.pagination .nav-links a:focus.prev .nav-prev-text, +.pagination .nav-links a:focus.prev .nav-next-text, .pagination .nav-links a:focus.next .nav-prev-text, +.pagination .nav-links a:focus.next .nav-next-text { + text-decoration: underline; +} + +.pagination .nav-links .nav-next-text, +.pagination .nav-links .nav-prev-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .pagination .nav-links { + margin-left: calc(10% + 60px); + padding: 0; + } + .pagination .nav-links .prev > *, + .pagination .nav-links .next > * { + display: inline-block; + vertical-align: text-bottom; + } + .pagination .nav-links > * { + padding: 1rem; + } +} + +.comment-navigation .nav-links { + display: flex; + flex-direction: row; +} + +.comment-navigation .nav-previous, +.comment-navigation .nav-next { + min-width: 50%; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.comment-navigation .nav-previous .secondary-text, +.comment-navigation .nav-next .secondary-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .comment-navigation .nav-previous .secondary-text, + .comment-navigation .nav-next .secondary-text { + display: inline; + } +} + +.comment-navigation .nav-previous svg, +.comment-navigation .nav-next svg { + vertical-align: middle; + position: relative; + margin: 0 -0.35em; + top: -1px; +} + +.comment-navigation .nav-next { + text-align: right; +} + +/* Accessibility */ +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; + /* Many screen reader and browser combinations announce broken words as they would appear visually. */ +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + clip-path: none; + color: #21759b; + display: block; + font-size: 0.875rem; + font-weight: bold; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; + /* Above WP toolbar. */ +} + +/* Do not show the outline on the skip link target. */ +#content[tabindex="-1"]:focus { + outline: 0; +} + +/* Alignments */ +.alignleft { + /*rtl:ignore*/ + float: left; + /*rtl:ignore*/ + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignleft { + /*rtl:ignore*/ + margin-right: calc(2 * 1rem); + } +} + +.alignright { + /*rtl:ignore*/ + float: right; + /*rtl:ignore*/ + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignright { + /*rtl:ignore*/ + margin-left: calc(2 * 1rem); + } +} + +.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} + +/* Clearings */ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after { + clear: both; +} + +/* Layout */ +/** === Layout === */ +#page { + width: 100%; +} + +.site-content { + overflow: hidden; +} + +/* Content */ +/*-------------------------------------------------------------- +## Header +--------------------------------------------------------------*/ +.site-header { + padding: 1em; +} + +.site-header.featured-image { + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 90vh; +} + +.site-header.featured-image .site-branding-container { + margin-bottom: auto; +} + +@media only screen and (min-width: 768px) { + .site-header { + margin: 0; + padding: 3rem 0; + } + .site-header.featured-image { + min-height: 100vh; + margin-bottom: 3rem; + } +} + +.site-branding { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + position: relative; + word-wrap: break-word; +} + +@media only screen and (min-width: 768px) { + .site-branding { + margin: 0 calc(10% + 60px); + } +} + +.site-logo { + position: relative; + z-index: 999; + margin-bottom: calc(.66 * 1rem); +} + +@media only screen and (min-width: 768px) { + .site-logo { + margin-bottom: 0; + position: absolute; + right: calc(100% + (1.25 * 1rem)); + top: 4px; + z-index: 999; + } +} + +.site-logo .custom-logo-link { + border-radius: 100%; + box-sizing: content-box; + box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); + display: block; + width: 50px; + height: 50px; + overflow: hidden; + transition: box-shadow 200ms ease-in-out; +} + +.site-logo .custom-logo-link .custom-logo { + min-height: inherit; +} + +.site-logo .custom-logo-link:hover, .site-logo .custom-logo-link:active, .site-logo .custom-logo-link:focus { + box-shadow: 0 0 0 2px black; +} + +@media only screen and (min-width: 768px) { + .site-logo .custom-logo-link { + width: 64px; + height: 64px; + } +} + +.site-title { + margin: auto; + display: inline; + color: #111; + /* When there is no description set, make sure navigation appears below title. */ +} + +.site-title a { + color: #111; +} + +.site-title a:link, .site-title a:visited { + color: #111; +} + +.site-title a:hover { + color: #4a4a4a; +} + +.featured-image .site-title { + margin: 0; +} + +@media only screen and (min-width: 768px) { + .featured-image .site-title { + display: inline-block; + } +} + +.site-title + .main-navigation { + display: block; +} + +@media only screen and (min-width: 768px) { + .site-title { + display: inline; + } +} + +.site-title:not(:empty) + .site-description:not(:empty):before { + content: "\2014"; + margin: 0 .2em; +} + +.site-description { + display: inline; + color: #767676; + font-weight: normal; + margin: 0; +} + +.site-header.featured-image { + /* Hide overflow for overflowing featured image */ + overflow: hidden; + /* Need relative positioning to properly align layers. */ + position: relative; + /* Add text shadow to text, to increase readability. */ + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + /* Set white text color when featured image is set. */ + /* add focus state to social media icons */ + /* Entry header */ + /* Custom Logo Link */ + /* Make sure important elements are above pseudo elements used for effects. */ + /* Set up image filter layer positioning */ + /* Background & Effects */ + /* Shared background settings between pseudo elements. */ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + /* The intensity of each blend mode is controlled via layer opacity. */ + /* Second layer: screen. */ + /* Third layer: multiply. */ + /* When image filters are inactive, a black overlay is added. */ + /* Fourth layer: overlay. */ + /* Fifth layer: readability overlay */ +} + +.site-header.featured-image .site-branding .site-title, +.site-header.featured-image .site-branding .site-description, +.site-header.featured-image .main-navigation a:after, +.site-header.featured-image .main-navigation .main-menu > li.menu-item-has-children:after, +.site-header.featured-image .main-navigation li, +.site-header.featured-image .social-navigation li, +.site-header.featured-image .entry-meta, +.site-header.featured-image .entry-title { + color: #fff; +} + +.site-header.featured-image .main-navigation a, +.site-header.featured-image .main-navigation a + svg, +.site-header.featured-image .social-navigation a, +.site-header.featured-image .site-title a, +.site-header.featured-image .site-featured-image a { + color: #fff; + transition: opacity 110ms ease-in-out; +} + +.site-header.featured-image .main-navigation a:hover, .site-header.featured-image .main-navigation a:active, +.site-header.featured-image .main-navigation a:hover + svg, +.site-header.featured-image .main-navigation a:active + svg, +.site-header.featured-image .main-navigation a + svg:hover, +.site-header.featured-image .main-navigation a + svg:active, +.site-header.featured-image .main-navigation a + svg:hover + svg, +.site-header.featured-image .main-navigation a + svg:active + svg, +.site-header.featured-image .social-navigation a:hover, +.site-header.featured-image .social-navigation a:active, +.site-header.featured-image .social-navigation a:hover + svg, +.site-header.featured-image .social-navigation a:active + svg, +.site-header.featured-image .site-title a:hover, +.site-header.featured-image .site-title a:active, +.site-header.featured-image .site-title a:hover + svg, +.site-header.featured-image .site-title a:active + svg, +.site-header.featured-image .site-featured-image a:hover, +.site-header.featured-image .site-featured-image a:active, +.site-header.featured-image .site-featured-image a:hover + svg, +.site-header.featured-image .site-featured-image a:active + svg { + color: #fff; + opacity: 0.6; +} + +.site-header.featured-image .main-navigation a:focus, +.site-header.featured-image .main-navigation a:focus + svg, +.site-header.featured-image .main-navigation a + svg:focus, +.site-header.featured-image .main-navigation a + svg:focus + svg, +.site-header.featured-image .social-navigation a:focus, +.site-header.featured-image .social-navigation a:focus + svg, +.site-header.featured-image .site-title a:focus, +.site-header.featured-image .site-title a:focus + svg, +.site-header.featured-image .site-featured-image a:focus, +.site-header.featured-image .site-featured-image a:focus + svg { + color: #fff; +} + +.site-header.featured-image .main-navigation .sub-menu a { + opacity: inherit; +} + +.site-header.featured-image .social-navigation a:focus { + color: #fff; + opacity: 1; + border-bottom: 1px solid #fff; +} + +.site-header.featured-image .social-navigation svg, +.site-header.featured-image .site-featured-image svg { + /* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */ + -webkit-filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); +} + +.site-header.featured-image .site-featured-image { + /* First layer: grayscale. */ +} + +.site-header.featured-image .site-featured-image .post-thumbnail img { + height: auto; + left: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100vw; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: auto; + z-index: 1; + /* When image filters are active, make it grayscale to colorize it blue. */ +} + +@supports (object-fit: cover) { + .site-header.featured-image .site-featured-image .post-thumbnail img { + height: 100%; + left: 0; + object-fit: cover; + top: 0; + transform: none; + width: 100%; + } +} + +.image-filters-enabled .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: grayscale(100%); +} + +.site-header.featured-image .site-featured-image .entry-header { + margin-top: calc( 4 * 1rem); + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + /* Entry meta */ +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header { + margin-left: calc(10% + 60px); + margin-right: calc(10% + 60px); + } +} + +.site-header.featured-image .site-featured-image .entry-header .entry-title:before { + background: #fff; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta { + font-weight: 500; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span { + margin-right: 1rem; + display: inline-block; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span:last-child { + margin-right: 0; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a:hover { + text-decoration: none; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .discussion-avatar-list { + display: none; +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta { + display: flex; + position: relative; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-title { + padding-right: calc(1 * (100vw / 12) + 1rem); + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .comment-count { + position: absolute; + right: 0; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .discussion-avatar-list { + display: block; + position: absolute; + bottom: 100%; + } +} + +.site-header.featured-image .custom-logo-link { + background: #fff; + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); +} + +.site-header.featured-image .custom-logo-link:hover, .site-header.featured-image .custom-logo-link:active, .site-header.featured-image .custom-logo-link:focus { + box-shadow: 0 0 0 2px white; +} + +.site-header.featured-image .site-branding { + position: relative; + z-index: 10; +} + +.site-header.featured-image .site-featured-image .entry-header { + position: relative; + z-index: 9; +} + +.site-header.featured-image .site-branding-container:after, +.site-header.featured-image .site-featured-image:before, +.site-header.featured-image .site-featured-image:after, .site-header.featured-image:after { + display: block; + position: absolute; + top: 0; + left: 0; + content: "\020"; + width: 100%; + height: 100%; +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; +} + +.site-header.featured-image .site-featured-image:after { + background: #000; + mix-blend-mode: multiply; + opacity: .7; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:after { + background: #0073aa; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .site-header.featured-image .site-featured-image:after { + opacity: 1; + } +} + +.image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(0, 0, 0, 0.35); + mix-blend-mode: overlay; + opacity: 0.5; + z-index: 4; + /* Browsers supporting mix-blend-mode can have a light overlay */ +} + +@supports (mix-blend-mode: overlay) { + .image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(255, 255, 255, 0.35); + } +} + +.site-header.featured-image:after { + background: #000; + /** + * Add a transition to the readability overlay, to add a subtle + * but smooth effect when resizing the screen. + */ + transition: opacity 1200ms ease-in-out; + opacity: 0.7; + z-index: 5; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image:after { + background: #000e14; + opacity: 0.38; +} + +@media only screen and (min-width: 768px) { + .image-filters-enabled .site-header.featured-image:after { + opacity: 0.18; + } +} + +.site-header.featured-image ::-moz-selection { + background: rgba(255, 255, 255, 0.17); +} + +.site-header.featured-image ::selection { + background: rgba(255, 255, 255, 0.17); +} + +/*-------------------------------------------------------------- +## Posts and pages +--------------------------------------------------------------*/ +.sticky { + display: block; +} + +.sticky-post { + background: #0073aa; + color: #fff; + display: inline-block; + font-weight: bold; + line-height: 1; + padding: .25rem; + position: absolute; + text-transform: uppercase; + top: -1rem; + z-index: 1; +} + +.updated:not(.published) { + display: none; +} + +.page-links { + clear: both; + margin: 0 0 calc(1.5 * 1rem); +} + +.entry { + margin-top: calc(6 * 1rem); +} + +.entry:first-of-type { + margin-top: 0; +} + +.entry .entry-header { + margin: calc(3 * 1rem) 1rem 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) 1rem; + } +} + +.entry .entry-title { + margin: 0; +} + +.entry .entry-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.entry .entry-title a { + color: inherit; +} + +.entry .entry-title a:hover { + color: #4a4a4a; +} + +.entry .entry-meta, +.entry .entry-footer { + color: #767676; + font-weight: 500; +} + +.entry .entry-meta > span, +.entry .entry-footer > span { + margin-right: 1rem; + display: inline-block; +} + +.entry .entry-meta > span:last-child, +.entry .entry-footer > span:last-child { + margin-right: 0; +} + +.entry .entry-meta a, +.entry .entry-footer a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.entry .entry-meta a:hover, +.entry .entry-footer a:hover { + text-decoration: none; + color: #0073aa; +} + +.entry .entry-meta .svg-icon, +.entry .entry-footer .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; +} + +.entry .entry-meta { + margin: 1rem 0; +} + +.entry .entry-footer { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + margin: 1rem calc(10% + 60px) calc(3 * 1rem); + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .post-thumbnail { + margin: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .post-thumbnail { + margin: 1rem calc(10% + 60px); + } +} + +.entry .post-thumbnail:focus { + outline: none; +} + +.entry .post-thumbnail .post-thumbnail-inner { + display: block; +} + +.entry .post-thumbnail .post-thumbnail-inner img { + position: relative; + display: block; + width: 100%; +} + +.image-filters-enabled .entry .post-thumbnail { + position: relative; + display: block; +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner { + filter: grayscale(100%); +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + background: rgba(0, 0, 0, 0.35); + content: ""; + display: block; + height: 100%; + opacity: .5; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; + z-index: 4; +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + display: none; + } +} + +.image-filters-enabled .entry .post-thumbnail:before, .image-filters-enabled .entry .post-thumbnail:after { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + left: 0; + content: "\020"; + pointer-events: none; +} + +.image-filters-enabled .entry .post-thumbnail:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; + z-index: 2; +} + +.image-filters-enabled .entry .post-thumbnail:after { + background: #0073aa; + mix-blend-mode: multiply; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail:after { + opacity: 1; + } +} + +.entry .entry-content, +.entry .entry-summary { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content, + .entry .entry-summary { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content p { + word-wrap: break-word; +} + +.entry .entry-content .more-link { + transition: color 110ms ease-in-out; + display: inline; + color: inherit; +} + +.entry .entry-content .more-link:after { + content: "\02192"; + display: inline-block; + margin-left: 0.5em; +} + +.entry .entry-content .more-link:hover { + color: #0073aa; + text-decoration: none; +} + +.entry .entry-content a { + text-decoration: underline; +} + +.entry .entry-content a.button, .entry .entry-content a:hover { + text-decoration: none; +} + +.entry .entry-content a.button { + display: inline-block; +} + +.entry .entry-content a.button:hover { + background: #111; + color: #fff; + cursor: pointer; +} + +.entry .entry-content > iframe[style] { + margin: 32px 0 !important; + max-width: 100% !important; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > iframe[style] { + max-width: calc(8 * (100vw / 12) - 28px) !important; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > iframe[style] { + max-width: calc(6 * (100vw / 12) - 28px) !important; + } +} + +.entry .entry-content .page-links a { + margin: calc(0.5 * 1rem); + text-decoration: none; +} + +.entry .entry-content .wp-audio-shortcode { + max-width: calc(100vw - (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +/* Author description */ +.author-bio { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .author-bio { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.author-bio .author-title { + display: inline; +} + +.author-bio .author-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.author-bio .author-description { + display: inline; + color: #767676; + font-size: 1.125em; + line-height: 1.2; +} + +.author-bio .author-description .author-link { + display: inline-block; +} + +.author-bio .author-description .author-link:hover { + color: #005177; + text-decoration: none; +} + +/*-------------------------------------------------------------- +## Comments +--------------------------------------------------------------*/ +.comment-content a { + word-wrap: break-word; +} + +.bypostauthor { + display: block; +} + +.comments-area { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + margin: calc(2 * 1rem) 1rem; + word-wrap: break-word; + /* Add extra margin when the comments section is located immediately after the + * post itself (this happens on pages). + */ +} + +@media only screen and (min-width: 768px) { + .comments-area { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .comments-area { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .comments-area { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.comments-area > * { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area > * { + margin-top: calc(3 * 1rem); + margin-bottom: calc(3 * 1rem); + } +} + +.entry + .comments-area { + margin-top: calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap { + align-items: baseline; + display: flex; + justify-content: space-between; + } +} + +.comments-area .comments-title-wrap .comments-title { + margin: 0; +} + +.comments-area .comments-title-wrap .comments-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .comments-title { + flex: 1 0 calc(3 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .discussion-meta { + flex: 0 0 calc(2 * (100vw / 12)); + margin-left: 1rem; + } +} + +#comment { + max-width: 100%; + box-sizing: border-box; +} + +#respond { + position: relative; +} + +#respond .comment-user-avatar { + margin: 1rem 0 -1rem; +} + +#respond .comment .comment-form { + padding-left: 0; +} + +#respond > small { + display: block; + font-size: 22px; + position: absolute; + left: calc(1rem + 100%); + top: calc(-3.5 * 1rem); + width: calc(100vw / 12); +} + +#comments > .comments-title:last-child { + display: none; +} + +.comment-form-flex { + display: flex; + flex-direction: column; +} + +.comment-form-flex .comments-title { + display: none; + margin: 0; + order: 1; +} + +.comment-form-flex #respond { + order: 2; +} + +.comment-form-flex #respond + .comments-title { + display: block; +} + +.comment-list { + list-style: none; + padding: 0; +} + +.comment-list .children { + margin: 0; + padding: 0 0 0 1rem; +} + +.comment-list > .comment:first-child { + margin-top: 0; +} + +.comment-list .pingback .comment-body, +.comment-list .trackback .comment-body { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + font-weight: 500; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.comment-list .pingback .comment-body a:not(.comment-edit-link), +.comment-list .trackback .comment-body a:not(.comment-edit-link) { + font-weight: bold; + font-size: 19.55556px; + line-height: 1.5; + padding-right: 0.5rem; + display: block; +} + +.comment-list .pingback .comment-body .comment-edit-link, +.comment-list .trackback .comment-body .comment-edit-link { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 500; +} + +#respond + .comment-reply { + display: none; +} + +.comment-reply .comment-reply-link { + display: inline-block; +} + +.comment { + list-style: none; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment { + padding-left: calc(.5 * (1rem + calc(100vw / 12 ))); + } + .comment.depth-1, + .comment .children { + padding-left: 0; + } + .comment.depth-1 { + margin-left: calc(3.25 * 1rem); + } +} + +.comment .comment-body { + margin: calc(2 * 1rem) 0 0; +} + +.comment .comment-meta { + position: relative; +} + +.comment .comment-author .avatar { + float: left; + margin-right: 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .avatar { + float: inherit; + margin-right: inherit; + position: absolute; + top: 0; + right: calc(100% + 1rem); + } +} + +.comment .comment-author .fn { + position: relative; + display: block; +} + +.comment .comment-author .fn a { + color: inherit; +} + +.comment .comment-author .fn a:hover { + color: #005177; +} + +.comment .comment-author .post-author-badge { + border-radius: 100%; + display: block; + height: 18px; + position: absolute; + background: #008fd3; + right: calc(100% - 2.5rem); + top: -3px; + width: 18px; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .post-author-badge { + right: calc(100% + 0.75rem); + } +} + +.comment .comment-author .post-author-badge svg { + width: inherit; + height: inherit; + display: block; + fill: white; + transform: scale(0.875); +} + +.comment .comment-metadata > a, +.comment .comment-metadata .comment-edit-link { + display: inline; + font-weight: 500; + color: #767676; + vertical-align: baseline; +} + +.comment .comment-metadata > a time, +.comment .comment-metadata .comment-edit-link time { + vertical-align: baseline; +} + +.comment .comment-metadata > a:hover, +.comment .comment-metadata .comment-edit-link:hover { + color: #005177; + text-decoration: none; +} + +.comment .comment-metadata > * { + display: inline-block; +} + +.comment .comment-metadata .edit-link-sep { + color: #767676; + margin: 0 0.2em; + vertical-align: baseline; +} + +.comment .comment-metadata .edit-link { + color: #767676; +} + +.comment .comment-metadata .edit-link svg { + transform: scale(0.8); + vertical-align: baseline; + margin-right: 0.1em; +} + +.comment .comment-metadata .comment-edit-link { + position: relative; + padding-left: 1rem; + margin-left: -1rem; + z-index: 1; +} + +.comment .comment-metadata .comment-edit-link:hover { + color: #0073aa; +} + +.comment .comment-content { + margin: 1rem 0; +} + +@media only screen and (min-width: 1168px) { + .comment .comment-content { + padding-right: 1rem; + } +} + +.comment .comment-content > *:first-child { + margin-top: 0; +} + +.comment .comment-content > *:last-child { + margin-bottom: 0; +} + +.comment .comment-content blockquote { + margin-left: 0; +} + +.comment .comment-content a { + text-decoration: underline; +} + +.comment .comment-content a:hover { + text-decoration: none; +} + +.comment-reply-link, +#cancel-comment-reply-link { + font-weight: 500; +} + +.comment-reply-link:hover, +#cancel-comment-reply-link:hover { + color: #005177; +} + +.discussion-avatar-list { + content: ""; + display: table; + table-layout: fixed; + margin: 0; + padding: 0; +} + +.discussion-avatar-list li { + position: relative; + list-style: none; + margin: 0 -8px 0 0; + padding: 0; + float: left; +} + +.discussion-avatar-list .comment-user-avatar img { + height: calc(1.5 * 1rem); + width: calc(1.5 * 1rem); +} + +.discussion-meta .discussion-meta-info { + margin: 0; +} + +.discussion-meta .discussion-meta-info .svg-icon { + vertical-align: middle; + fill: currentColor; + transform: scale(0.6) scaleX(-1) translateY(-0.1em); + margin-left: -0.25rem; +} + +.comment-form .comment-notes, +.comment-form label { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-author, + .comment-form .comment-form-email { + width: calc(50% - 0.5rem); + float: left; + } +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-email { + margin-left: 1rem; + } +} + +.comment-form input[name="author"], +.comment-form input[name="email"], +.comment-form input[name="url"] { + display: block; + width: 100%; +} + +/*-------------------------------------------------------------- +## Archives +--------------------------------------------------------------*/ +.archive .page-header, +.search .page-header, +.error404 .page-header { + margin: 1rem 1rem calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .archive .page-header, + .search .page-header, + .error404 .page-header { + margin: 0 calc(10% + 60px) calc(3 * 1rem); + } +} + +.archive .page-header .page-title, +.search .page-header .page-title, +.error404 .page-header .page-title { + color: #767676; + display: inline; + letter-spacing: normal; +} + +.archive .page-header .page-title:before, +.search .page-header .page-title:before, +.error404 .page-header .page-title:before { + display: none; +} + +.archive .page-header .search-term, +.archive .page-header .page-description, +.search .page-header .search-term, +.search .page-header .page-description, +.error404 .page-header .search-term, +.error404 .page-header .page-description { + display: inherit; + clear: both; +} + +.archive .page-header .page-description, +.search .page-header .page-description { + display: block; + color: #111; + font-size: 1em; +} + +@media only screen and (min-width: 768px) { + .hfeed .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +/* 404 & Not found */ +.error-404.not-found .page-content, +.no-results.not-found .page-content { + margin: calc(3 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + .error-404.not-found .page-content, + .no-results.not-found .page-content { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +.error-404.not-found .search-submit, +.no-results.not-found .search-submit { + vertical-align: middle; + margin: 1rem 0; +} + +.error-404.not-found .search-field, +.no-results.not-found .search-field { + width: 100%; +} + +/*-------------------------------------------------------------- +## Footer +--------------------------------------------------------------*/ +/* Site footer */ +#colophon .widget-area, +#colophon .site-info { + margin: calc(2 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + #colophon .widget-area, + #colophon .site-info { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +#colophon .widget-column { + display: flex; + flex-wrap: wrap; +} + +#colophon .widget-column .widget { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + width: 100%; + word-wrap: break-word; +} + +@media only screen and (min-width: 1168px) { + #colophon .widget-column .widget { + margin-right: calc(3 * 1rem); + width: calc(50% - (3 * 1rem)); + } +} + +#colophon .site-info { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-wrap: break-word; +} + +#colophon .site-info a { + color: inherit; +} + +#colophon .site-info a:hover { + text-decoration: none; + color: #0073aa; +} + +#colophon .site-info .imprint, +#colophon .site-info .privacy-policy-link { + margin-right: 1rem; +} + +/* Widgets */ +.widget { + margin: 0 0 1rem; + /* Make sure select elements fit in widgets. */ +} + +.widget select { + max-width: 100%; +} + +.widget a { + color: #0073aa; +} + +.widget a:hover { + color: #005177; +} + +.widget_archive ul, +.widget_categories ul, +.widget_meta ul, +.widget_nav_menu ul, +.widget_pages ul, +.widget_recent_comments ul, +.widget_recent_entries ul, +.widget_rss ul { + padding: 0; + list-style: none; +} + +.widget_archive ul li, +.widget_categories ul li, +.widget_meta ul li, +.widget_nav_menu ul li, +.widget_pages ul li, +.widget_recent_comments ul li, +.widget_recent_entries ul li, +.widget_rss ul li { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: 700; + line-height: 1.2; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.widget_archive ul ul, +.widget_categories ul ul, +.widget_meta ul ul, +.widget_nav_menu ul ul, +.widget_pages ul ul, +.widget_recent_comments ul ul, +.widget_recent_entries ul ul, +.widget_rss ul ul { + counter-reset: submenu; +} + +.widget_archive ul ul > li > a::before, +.widget_categories ul ul > li > a::before, +.widget_meta ul ul > li > a::before, +.widget_nav_menu ul ul > li > a::before, +.widget_pages ul ul > li > a::before, +.widget_recent_comments ul ul > li > a::before, +.widget_recent_entries ul ul > li > a::before, +.widget_rss ul ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.widget_tag_cloud .tagcloud { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; +} + +.widget_search .search-field { + width: 100%; +} + +@media only screen and (min-width: 600px) { + .widget_search .search-field { + width: auto; + } +} + +.widget_search .search-submit { + display: block; + margin-top: 1rem; +} + +.widget_calendar .calendar_wrap { + text-align: center; +} + +.widget_calendar .calendar_wrap table td, +.widget_calendar .calendar_wrap table th { + border: none; +} + +.widget_calendar .calendar_wrap a { + text-decoration: underline; +} + +.widget_calendar .calendar_wrap .wp-calendar-table { + margin-bottom: 0; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav { + margin: 0 0 1rem; + display: table; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav span { + display: table-cell; + padding: 0.5em; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav-prev, +.widget_calendar .calendar_wrap .wp-calendar-nav-next { + width: 40%; +} + +/* Blocks */ +/* !Block styles */ +.entry .entry-content > *, +.entry .entry-summary > *, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + } +} + +.entry .entry-content > *.alignwide, +.entry .entry-summary > *.alignwide, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + margin-left: auto; + margin-right: auto; + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignwide, + .entry .entry-summary > *.alignwide, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + width: 100%; + max-width: 100%; + } +} + +.entry .entry-content > *.alignfull, +.entry .entry-summary > *.alignfull, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + position: relative; + left: -1rem; + width: calc( 100% + (2 * 1rem)); + max-width: calc( 100% + (2 * 1rem)); + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignfull, + .entry .entry-summary > *.alignfull, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); + left: calc( -12.5% - 75px); + width: calc( 125% + 150px); + max-width: calc( 125% + 150px); + } +} + +.entry .entry-content > *.alignleft, +.entry .entry-summary > *.alignleft, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + /*rtl:ignore*/ + float: left; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-left: 0; + /*rtl:ignore*/ + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignleft, + .entry .entry-summary > *.alignleft, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + max-width: calc(4 * (100vw / 12)); + /*rtl:ignore*/ + margin-right: calc(2 * 1rem); + } +} + +.entry .entry-content > *.alignright, +.entry .entry-summary > *.alignright, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + /*rtl:ignore*/ + float: right; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-right: 0; + /*rtl:ignore*/ + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignright, + .entry .entry-summary > *.alignright, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + max-width: calc(4 * (100vw / 12)); + margin-right: 0; + /*rtl:ignore*/ + margin-left: calc(2 * 1rem); + } +} + +.entry .entry-content > *.aligncenter, +.entry .entry-summary > *.aligncenter, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-left: auto; + margin-right: auto; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-left: 0; + margin-right: 0; + } +} + +.entry .entry-content > * > *:first-child, +.entry .entry-summary > * > *:first-child { + margin-top: 0; +} + +.entry .entry-content > * > *:last-child, +.entry .entry-summary > * > *:last-child { + margin-bottom: 0; +} + +/* + * Unset nested content selector styles + * - Prevents layout styles from cascading too deeply + * - helps with plugin compatibility + */ +.entry .entry-content .entry-content, +.entry .entry-content .entry-summary, +.entry .entry-content .entry, +.entry .entry-summary .entry-content, +.entry .entry-summary .entry-summary, +.entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .entry-content, + .entry .entry-content .entry-summary, + .entry .entry-content .entry, + .entry .entry-summary .entry-content, + .entry .entry-summary .entry-summary, + .entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; + } +} + +.entry .entry-content p.has-background { + padding: 20px 30px; +} + +.entry .entry-content .wp-block-audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio.alignleft audio, +.entry .entry-content .wp-block-audio.alignright audio { + max-width: 198px; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 384px; + } +} + +@media only screen and (min-width: 1379px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 385.44px; + } +} + +.entry .entry-content .wp-block-video video { + width: 100%; +} + +.entry .entry-content .wp-block-button .wp-block-button__link { + transition: background 150ms ease-in-out; + border: none; + font-size: 0.88889em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + box-sizing: border-box; + font-weight: bold; + text-decoration: none; + padding: 0.76rem 1rem; + outline: none; + outline: none; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-background) { + background-color: #0073aa; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-text-color) { + color: white; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:hover { + color: white; + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:focus { + color: white; + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-button:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active { + transition: all 150ms ease-in-out; + border-width: 2px; + border-style: solid; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-background) { + background: transparent; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-text-color) { + color: #0073aa; + border-color: currentColor; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover { + color: white; + border-color: #111; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover:not(.has-background) { + color: #111; +} + +.entry .entry-content .wp-block-archives, +.entry .entry-content .wp-block-categories, +.entry .entry-content .wp-block-latest-posts { + padding: 0; + list-style: none; +} + +.entry .entry-content .wp-block-archives li > a, +.entry .entry-content .wp-block-categories li > a, +.entry .entry-content .wp-block-latest-posts li > a { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: bold; + line-height: 1.2; + text-decoration: none; +} + +.entry .entry-content .wp-block-archives.aligncenter, +.entry .entry-content .wp-block-categories.aligncenter { + text-align: center; +} + +.entry .entry-content .wp-block-categories ul { + padding-top: 0.75rem; +} + +.entry .entry-content .wp-block-categories li ul { + list-style: none; + padding-left: 0; +} + +.entry .entry-content .wp-block-categories ul { + counter-reset: submenu; +} + +.entry .entry-content .wp-block-categories ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; + line-height: 1.2; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-full-content, +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-excerpt { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.entry .entry-content .wp-block-latest-posts li { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts li.menu-item-has-children, .entry .entry-content .wp-block-latest-posts li:last-child { + padding-bottom: 0; +} + +.entry .entry-content .wp-block-latest-posts li :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li { + border-top: 2px solid #ccc; + padding-top: 1rem; + margin-bottom: 2rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li a:after { + content: ''; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child { + margin-bottom: auto; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child a:after { + content: ''; +} + +.entry .entry-content .wp-block-preformatted { + font-size: 0.71111em; + line-height: 1.8; + padding: 1rem; +} + +.entry .entry-content .wp-block-verse { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-size: 22px; + line-height: 1.8; +} + +.entry .entry-content .has-drop-cap:not(:focus):first-letter { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 3.375em; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; +} + +.entry .entry-content .wp-block-pullquote { + border-color: transparent; + border-width: 2px; + padding: 1rem; +} + +.entry .entry-content .wp-block-pullquote blockquote { + color: #111; + border: none; + margin-top: calc(4 * 1rem); + margin-bottom: calc(4.33 * 1rem); + margin-right: 0; + padding-left: 0; +} + +.entry .entry-content .wp-block-pullquote p { + font-size: 1.6875em; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +.entry .entry-content .wp-block-pullquote p em { + font-style: normal; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote cite { + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + text-transform: none; + color: #767676; + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-pullquote.alignleft, .entry .entry-content .wp-block-pullquote.alignright { + width: 100%; + padding: 0; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote, .entry .entry-content .wp-block-pullquote.alignright blockquote { + margin: 1rem 0; + padding: 0; + text-align: left; + max-width: 100%; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote p:first-child, .entry .entry-content .wp-block-pullquote.alignright blockquote p:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color { + background-color: #0073aa; + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color { + padding-left: 10%; + padding-right: 10%; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 1.6875em; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color a { + color: #fff; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color cite { + color: inherit; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + color: #fff; + padding-left: 0; + margin-left: 1rem; + margin-right: 1rem; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color p, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color a, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + margin-left: 0; + margin-right: 0; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignright, .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignleft { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignfull { + padding-left: calc(10% + 58px + (2 * 1rem)); + padding-right: calc(10% + 58px + (2 * 1rem)); + } +} + +.entry .entry-content .wp-block-quote:not(.is-large), .entry .entry-content .wp-block-quote:not(.is-style-large) { + border-width: 2px; + border-color: #0073aa; + padding-top: 0; + padding-bottom: 0; +} + +.entry .entry-content .wp-block-quote p { + font-size: 1em; + font-style: normal; + line-height: 1.8; +} + +.entry .entry-content .wp-block-quote cite { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 0; + border-left: none; +} + +.entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + line-height: 1.4; + font-style: italic; +} + +.entry .entry-content .wp-block-quote.is-large cite, +.entry .entry-content .wp-block-quote.is-large footer, .entry .entry-content .wp-block-quote.is-style-large cite, +.entry .entry-content .wp-block-quote.is-style-large footer { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 1rem 0; + } + .entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + } +} + +.entry .entry-content .wp-block-image { + max-width: 100%; +} + +.entry .entry-content .wp-block-image img { + display: block; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + margin: 0; + width: calc(8 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + width: calc(6 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +.entry .entry-content .wp-block-image.alignfull img { + width: 100vw; + max-width: calc( 100% + (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image.alignfull img { + max-width: calc( 125% + 150px); + margin-left: auto; + margin-right: auto; + } +} + +.entry .entry-content .wp-block-cover-image, +.entry .entry-content .wp-block-cover { + position: relative; + min-height: 430px; + padding: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image, + .entry .entry-content .wp-block-cover { + padding: 1rem 10%; + } +} + +.entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover-image .wp-block-cover-text, +.entry .entry-content .wp-block-cover-image h2, +.entry .entry-content .wp-block-cover .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover .wp-block-cover-text, +.entry .entry-content .wp-block-cover h2 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 1.6875em; + font-weight: bold; + line-height: 1.25; + padding: 0; + color: #fff; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image h2, + .entry .entry-content .wp-block-cover .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover .wp-block-cover-text, + .entry .entry-content .wp-block-cover h2 { + font-size: 2.25em; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, +.entry .entry-content .wp-block-cover.alignleft, +.entry .entry-content .wp-block-cover.alignright { + width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, + .entry .entry-content .wp-block-cover.alignleft, + .entry .entry-content .wp-block-cover.alignright { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull, + .entry .entry-content .wp-block-cover.alignfull { + padding-left: calc(10% + 58px + (2 * 1rem)); + padding-right: calc(10% + 58px + (2 * 1rem)); + } + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + padding: 0; + } +} + +.entry .entry-content .wp-block-gallery { + list-style-type: none; + padding-left: 0; +} + +.entry .entry-content .wp-block-gallery .blocks-gallery-image:last-child, +.entry .entry-content .wp-block-gallery .blocks-gallery-item:last-child { + margin-bottom: 16px; +} + +.entry .entry-content .wp-block-gallery figcaption a { + color: #fff; +} + +.entry .entry-content .wp-block-audio figcaption, +.entry .entry-content .wp-block-video figcaption, +.entry .entry-content .wp-block-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption { + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +.entry .entry-content .wp-block-separator, +.entry .entry-content hr { + background-color: #767676; + border: 0; + height: 2px; + margin-bottom: 2rem; + margin-top: 2rem; + max-width: 2.25em; + text-align: left; + /* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +} + +.entry .entry-content .wp-block-separator.is-style-wide, +.entry .entry-content hr.is-style-wide { + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots, +.entry .entry-content hr.is-style-dots { + max-width: 100%; + background-color: inherit; + border: inherit; + height: inherit; + text-align: center; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots:not(.has-text-color):not(.has-background), +.entry .entry-content hr.is-style-dots:not(.has-text-color):not(.has-background) { + color: #767676; +} + +.entry .entry-content .wp-block-separator.is-style-dots:before, +.entry .entry-content hr.is-style-dots:before { + font-size: 1.6875em; + letter-spacing: 0.88889em; + padding-left: 0.88889em; +} + +.entry .entry-content .wp-block-separator + h1:before, +.entry .entry-content .wp-block-separator + h2:before, +.entry .entry-content hr + h1:before, +.entry .entry-content hr + h2:before { + display: none; +} + +.entry .entry-content .wp-block-embed-twitter { + word-break: break-word; +} + +.entry .entry-content .wp-block-table th, +.entry .entry-content .wp-block-table td { + border-color: #767676; +} + +.entry .entry-content .wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.entry .entry-content .wp-block-file .wp-block-file__button { + display: table; + transition: background 150ms ease-in-out; + border: none; + border-radius: 5px; + background: #0073aa; + font-size: 22px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + text-decoration: none; + font-weight: bold; + padding: 0.75rem 1rem; + color: #fff; + margin-left: 0; + margin-top: calc(0.75 * 1rem); +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-file .wp-block-file__button { + font-size: 22px; + padding: 0.875rem 1.5rem; + } +} + +.entry .entry-content .wp-block-file .wp-block-file__button:hover { + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-file .wp-block-file__button:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-code { + border-radius: 0; +} + +.entry .entry-content .wp-block-code code { + font-size: 1.125em; + white-space: pre-wrap; + word-break: break-word; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:last-child { + margin-bottom: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns { + flex-wrap: nowrap; + } + .entry .entry-content .wp-block-columns .wp-block-column:not(:first-child) { + margin-left: 32px; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .alignfull, + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .wp-block-image > img { + left: 0; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content .wp-block-group.has-background { + padding: 1rem; + margin-top: 0; + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:last-child { + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background.alignfull { + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background.alignfull { + padding-top: 1rem; + padding-bottom: 1rem; + } +} + +.entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: 100%; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: calc( 100% + 2rem); + max-width: calc( 100% + 2rem); + margin-left: -1rem; + } +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta .wp-block-latest-comments__comment-date { + font-weight: normal; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-date, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; +} + +.entry .entry-content .wp-block-latest-comments.has-dates .wp-block-latest-comments__comment-date { + font-size: 0.71111em; +} + +.entry .entry-content .has-small-font-size { + font-size: 0.88889em; +} + +.entry .entry-content .has-normal-font-size { + font-size: 1.125em; +} + +.entry .entry-content .has-large-font-size { + font-size: 1.6875em; +} + +.entry .entry-content .has-huge-font-size { + font-size: 2.25em; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .has-light-gray-background-color { + color: #fff; +} + +.entry .entry-content .has-primary-background-color > p, +.entry .entry-content .has-primary-background-color > h1, +.entry .entry-content .has-primary-background-color > h2, +.entry .entry-content .has-primary-background-color > h3, +.entry .entry-content .has-primary-background-color > h4, +.entry .entry-content .has-primary-background-color > h5, +.entry .entry-content .has-primary-background-color > h6, +.entry .entry-content .has-primary-background-color > a, +.entry .entry-content .has-secondary-background-color > p, +.entry .entry-content .has-secondary-background-color > h1, +.entry .entry-content .has-secondary-background-color > h2, +.entry .entry-content .has-secondary-background-color > h3, +.entry .entry-content .has-secondary-background-color > h4, +.entry .entry-content .has-secondary-background-color > h5, +.entry .entry-content .has-secondary-background-color > h6, +.entry .entry-content .has-secondary-background-color > a, +.entry .entry-content .has-dark-gray-background-color > p, +.entry .entry-content .has-dark-gray-background-color > h1, +.entry .entry-content .has-dark-gray-background-color > h2, +.entry .entry-content .has-dark-gray-background-color > h3, +.entry .entry-content .has-dark-gray-background-color > h4, +.entry .entry-content .has-dark-gray-background-color > h5, +.entry .entry-content .has-dark-gray-background-color > h6, +.entry .entry-content .has-dark-gray-background-color > a, +.entry .entry-content .has-light-gray-background-color > p, +.entry .entry-content .has-light-gray-background-color > h1, +.entry .entry-content .has-light-gray-background-color > h2, +.entry .entry-content .has-light-gray-background-color > h3, +.entry .entry-content .has-light-gray-background-color > h4, +.entry .entry-content .has-light-gray-background-color > h5, +.entry .entry-content .has-light-gray-background-color > h6, +.entry .entry-content .has-light-gray-background-color > a { + color: #fff; +} + +.entry .entry-content .has-white-background-color { + color: #111; +} + +.entry .entry-content .has-white-background-color > p, +.entry .entry-content .has-white-background-color > h1, +.entry .entry-content .has-white-background-color > h2, +.entry .entry-content .has-white-background-color > h3, +.entry .entry-content .has-white-background-color > h4, +.entry .entry-content .has-white-background-color > h5, +.entry .entry-content .has-white-background-color > h6, +.entry .entry-content .has-white-background-color > a { + color: #111; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-primary-background-color { + background-color: #0073aa; +} + +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-secondary-background-color { + background-color: #005177; +} + +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-dark-gray-background-color { + background-color: #111; +} + +.entry .entry-content .has-light-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-light-gray-background-color { + background-color: #767676; +} + +.entry .entry-content .has-white-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-white-background-color { + background-color: #FFF; +} + +.entry .entry-content .has-primary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color > p { + color: #0073aa; +} + +.entry .entry-content .has-secondary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color > p { + color: #005177; +} + +.entry .entry-content .has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color > p { + color: #111; +} + +.entry .entry-content .has-light-gray-color, +.entry .entry-content .wp-block-pullquote blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color > p { + color: #767676; +} + +.entry .entry-content .has-white-color, +.entry .entry-content .wp-block-pullquote blockquote.has-white-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: #FFF; +} + +/* Media */ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +embed, +iframe, +object { + max-width: 100%; +} + +.custom-logo-link { + display: inline-block; +} + +.avatar { + border-radius: 100%; + display: block; + height: calc(2.25 * 1rem); + min-height: inherit; + width: calc(2.25 * 1rem); +} + +svg { + transition: fill 120ms ease-in-out; + fill: currentColor; +} + +/*-------------------------------------------------------------- +## Captions +--------------------------------------------------------------*/ +.wp-caption { + margin-bottom: calc(1.5 * 1rem); +} + +@media only screen and (min-width: 768px) { + .wp-caption.aligncenter { + position: relative; + left: calc( calc(8 * (100vw / 12) - 28px) / 2); + transform: translateX(-50%); + } +} + +@media only screen and (min-width: 1168px) { + .wp-caption.aligncenter { + left: calc( calc(6 * (100vw / 12) - 28px) / 2); + } +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.wp-caption-text { + color: #767676; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +/*-------------------------------------------------------------- +## Galleries +--------------------------------------------------------------*/ +.gallery { + display: flex; + flex-flow: row wrap; + justify-content: center; + margin-bottom: calc(1.5 * 1rem); +} + +.gallery-item { + display: inline-block; + margin-right: 16px; + margin-bottom: 16px; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: calc((100% - 16px * 1) / 2); +} + +.gallery-columns-2 .gallery-item:nth-of-type(2n+2) { + margin-right: 0; +} + +.gallery-columns-3 .gallery-item { + max-width: calc((100% - 16px * 2) / 3); +} + +.gallery-columns-3 .gallery-item:nth-of-type(3n+3) { + margin-right: 0; +} + +.gallery-columns-4 .gallery-item { + max-width: calc((100% - 16px * 3) / 4); +} + +.gallery-columns-4 .gallery-item:nth-of-type(4n+4) { + margin-right: 0; +} + +.gallery-columns-5 .gallery-item { + max-width: calc((100% - 16px * 4) / 5); +} + +.gallery-columns-5 .gallery-item:nth-of-type(5n+5) { + margin-right: 0; +} + +.gallery-columns-6 .gallery-item { + max-width: calc((100% - 16px * 5) / 6); +} + +.gallery-columns-6 .gallery-item:nth-of-type(6n+6) { + margin-right: 0; +} + +.gallery-columns-7 .gallery-item { + max-width: calc((100% - 16px * 6) / 7); +} + +.gallery-columns-7 .gallery-item:nth-of-type(7n+7) { + margin-right: 0; +} + +.gallery-columns-8 .gallery-item { + max-width: calc((100% - 16px * 7) / 8); +} + +.gallery-columns-8 .gallery-item:nth-of-type(8n+8) { + margin-right: 0; +} + +.gallery-columns-9 .gallery-item { + max-width: calc((100% - 16px * 8) / 9); +} + +.gallery-columns-9 .gallery-item:nth-of-type(9n+9) { + margin-right: 0; +} + +.gallery-item:last-of-type { + padding-right: 0; +} + +.gallery-caption { + display: block; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; +} + +.gallery-item > div > a { + display: block; + line-height: 0; + box-shadow: 0 0 0 0 transparent; +} + +.gallery-item > div > a:focus { + box-shadow: 0 0 0 2px #0073aa; +} diff --git a/wp-content/themes/twentynineteen/style.scss b/wp-content/themes/twentynineteen/style.scss new file mode 100644 index 0000000..960469d --- /dev/null +++ b/wp-content/themes/twentynineteen/style.scss @@ -0,0 +1,110 @@ +/* +Theme Name: Twenty Nineteen +Theme URI: https://wordpress.org/themes/twentynineteen/ +Author: the WordPress team +Author URI: https://wordpress.org/ +Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. +Requires at least: 4.9.6 +Requires PHP: 5.2.4 +Version: 1.5 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: twentynineteen +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. + +Twenty Nineteen is based on Underscores https://underscores.me/, (C) 2012-2019 Automattic, Inc. +Underscores is distributed under the terms of the GNU GPL v2 or later. + +Normalizing styles have been helped along thanks to the fine work of +Nicolas Gallagher and Jonathan Neal https://necolas.github.io/normalize.css/ +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Variables +# Normalize +# Typography + ## Headings + ## Copy +# Elements + ## Lists + ## Tables +# Forms + ## Buttons + ## Fields +# Navigation + ## Links + ## Menus + ## Next & Previous +# Accessibility +# Alignments +# Clearings +# Layout +# Widgets +# Content + ## Archives + ## Posts and pages + ## Comments +# Blocks +# Media + ## Captions + ## Galleries +--------------------------------------------------------------*/ +@import "sass/variables-site/variables-site"; +@import "sass/mixins/mixins-master"; + +/* Normalize */ + +@import "sass/normalize"; + +/* Typography */ + +@import "sass/typography/typography"; + +/* Elements */ + +@import "sass/elements/elements"; + +/* Forms */ + +@import "sass/forms/forms"; + +/* Navigation */ + +@import "sass/navigation/navigation"; + +/* Accessibility */ + +@import "sass/modules/accessibility"; + +/* Alignments */ + +@import "sass/modules/alignments"; + +/* Clearings */ + +@import "sass/modules/clearings"; + +/* Layout */ + +@import "sass/layout/layout"; + +/* Content */ + +@import "sass/site/site"; + +/* Widgets */ + +@import "sass/site/secondary/widgets"; + +/* Blocks */ + +@import "sass/blocks/blocks"; + +/* Media */ + +@import "sass/media/media"; diff --git a/wp-content/themes/twentynineteen/template-parts/content/content-excerpt.php b/wp-content/themes/twentynineteen/template-parts/content/content-excerpt.php new file mode 100644 index 0000000..f3d12c9 --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/content/content-excerpt.php @@ -0,0 +1,33 @@ + + +
            diff --git a/wp-content/themes/twentynineteen/template-parts/content/content-none.php b/wp-content/themes/twentynineteen/template-parts/content/content-none.php new file mode 100644 index 0000000..9a30c00 --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/content/content-none.php @@ -0,0 +1,53 @@ + + +
            + + +
            + ' . wp_kses( + /* translators: 1: Link to WP admin new post page. */ + __( 'Ready to publish your first post? Get started here.', 'twentynineteen' ), + array( + 'a' => array( + 'href' => array(), + ), + ) + ) . '

            ', + esc_url( admin_url( 'post-new.php' ) ) + ); + + elseif ( is_search() ) : + ?> + +

            + + +

            + +
            +
            diff --git a/wp-content/themes/twentynineteen/template-parts/content/content-page.php b/wp-content/themes/twentynineteen/template-parts/content/content-page.php new file mode 100644 index 0000000..de59cc4 --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/content/content-page.php @@ -0,0 +1,56 @@ + + +
            > + +
            + +
            + + +
            + '', + ) + ); + ?> +
            + + +
            + %s', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ), + '' . twentynineteen_get_icon_svg( 'edit', 16 ), + '' + ); + ?> +
            + +
            diff --git a/wp-content/themes/twentynineteen/template-parts/content/content-single.php b/wp-content/themes/twentynineteen/template-parts/content/content-single.php new file mode 100644 index 0000000..c4a8d1e --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/content/content-single.php @@ -0,0 +1,55 @@ + + +
            > + +
            + +
            + + +
            + "%s"', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + ) + ); + ?> +
            + +
            + +
            + + + + + +
            diff --git a/wp-content/themes/twentynineteen/template-parts/content/content.php b/wp-content/themes/twentynineteen/template-parts/content/content.php new file mode 100644 index 0000000..6657815 --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/content/content.php @@ -0,0 +1,59 @@ + + +
            > +
            + %s', _x( 'Featured', 'post', 'twentynineteen' ) ); + } + if ( is_singular() ) : + the_title( '

            ', '

            ' ); + else : + the_title( sprintf( '

            ', esc_url( get_permalink() ) ), '

            ' ); + endif; + ?> +
            + + + +
            + "%s"', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + ) + ); + ?> +
            + +
            + +
            +
            diff --git a/wp-content/themes/twentynineteen/template-parts/footer/footer-widgets.php b/wp-content/themes/twentynineteen/template-parts/footer/footer-widgets.php new file mode 100644 index 0000000..da7baa3 --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/footer/footer-widgets.php @@ -0,0 +1,24 @@ + + + + + diff --git a/wp-content/themes/twentynineteen/template-parts/header/entry-header.php b/wp-content/themes/twentynineteen/template-parts/header/entry-header.php new file mode 100644 index 0000000..774f0b3 --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/header/entry-header.php @@ -0,0 +1,46 @@ + + +', '' ); ?> + + + + diff --git a/wp-content/themes/twentynineteen/template-parts/header/site-branding.php b/wp-content/themes/twentynineteen/template-parts/header/site-branding.php new file mode 100644 index 0000000..e4519ba --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/header/site-branding.php @@ -0,0 +1,60 @@ + +
            + + + + + + + +

            + +

            + + + + +

            + +

            + + + + + + + +
            diff --git a/wp-content/themes/twentynineteen/template-parts/post/author-bio.php b/wp-content/themes/twentynineteen/template-parts/post/author-bio.php new file mode 100644 index 0000000..b7792ef --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/post/author-bio.php @@ -0,0 +1,30 @@ + +
            +

            + + + +

            +

            + + +

            +
            + diff --git a/wp-content/themes/twentynineteen/template-parts/post/discussion-meta.php b/wp-content/themes/twentynineteen/template-parts/post/discussion-meta.php new file mode 100644 index 0000000..e5b70d4 --- /dev/null +++ b/wp-content/themes/twentynineteen/template-parts/post/discussion-meta.php @@ -0,0 +1,32 @@ +responses > 0; + +if ( $has_responses ) { + /* translators: %d: Number of comments. */ + $meta_label = sprintf( _n( '%d Comment', '%d Comments', $discussion->responses, 'twentynineteen' ), $discussion->responses ); +} else { + $meta_label = __( 'No comments', 'twentynineteen' ); +} +?> + +
            + authors ); + } + ?> +

            + + +

            +
            diff --git a/wp-content/themes/twentyseventeen/404.php b/wp-content/themes/twentyseventeen/404.php new file mode 100644 index 0000000..883f918 --- /dev/null +++ b/wp-content/themes/twentyseventeen/404.php @@ -0,0 +1,35 @@ + + +
            +
            +
            + +
            + +
            +

            + + + +
            +
            +
            +
            +
            + + + +
            + + + + + +
            +
            + + + twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '' . __( 'Previous page', 'twentyseventeen' ) . '', + 'next_text' => '' . __( 'Next page', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ), + 'before_page_number' => '' . __( 'Page', 'twentyseventeen' ) . ' ', + ) + ); + + else : + + get_template_part( 'template-parts/post/content', 'none' ); + + endif; + ?> + +
            +
            + +
            + +>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 General Block Styles +2.0 Blocks - Common Blocks +3.0 Blocks - Formatting +4.0 Blocks - Layout Elements +5.0 Blocks - Widgets +6.0 Blocks - Colors +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 General Block Styles +--------------------------------------------------------------*/ + +/* Captions */ + +[class^="wp-block-"]:not(.wp-block-gallery) figcaption { + font-style: italic; + margin-bottom: 1.5em; + text-align: left; +} + +.rtl [class^="wp-block-"]:not(.wp-block-gallery) figcaption { + text-align: right; +} + +/*-------------------------------------------------------------- +2.0 Blocks - Common Blocks +--------------------------------------------------------------*/ + +/* Paragraph */ + +p.has-drop-cap:not(:focus)::first-letter { + font-size: 5em; + margin-top: 0.075em; +} + +/* Image */ + +.wp-block-image { + margin-bottom: 1.5em; +} + +.wp-block-image figure { + margin-bottom: 0; + margin-top: 0; +} + +.wp-block-image figure.alignleft { + margin-right: 1.5em; +} + +.wp-block-image figure.alignright { + margin-left: 1.5em; +} + +/* Gallery */ + +.wp-block-gallery { + margin-bottom: 1.5em; +} + +.wp-block-gallery figcaption { + font-style: italic; +} + +.wp-block-gallery.aligncenter { + display: flex; + margin: 0 -8px; +} + +/* Quote */ + +.wp-block-quote:not(.is-large):not(.is-style-large) { + border: 0; + padding: 0; +} + +.wp-block-quote.alignleft p:last-of-type, +.wp-block-quote.alignright p:last-of-type { + margin-bottom: 0; +} + +.wp-block-quote cite { + color: inherit; + font-size: inherit; +} + +/* Audio */ + +.wp-block-audio audio { + display: block; + width: 100%; +} + +/* Cover */ + +.wp-block-cover-image.alignright, +.wp-block-cover.alignright, +.wp-block-cover-image.alignleft, +.wp-block-cover.alignleft, +.wp-block-cover-image.aligncenter, +.wp-block-cover.aligncenter { + display: flex; +} + +/* File */ + +.wp-block-file .wp-block-file__button { + background-color: #222; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.wp-block-file .wp-block-file__button:hover, +.wp-block-file .wp-block-file__button:focus { + background-color: #767676; + -webkit-box-shadow: none; + box-shadow: none; +} + +/*-------------------------------------------------------------- +3.0 Blocks - Formatting +--------------------------------------------------------------*/ + +/* Code */ + +.wp-block-code { + background: transparent; + border: 0; + padding: 0; +} + +/* Pullquote */ + +.wp-block-pullquote { + border: 0; +} + +.wp-block-pullquote__citation, +.wp-block-pullquote cite { + font-size: inherit; + text-transform: none; +} + +/* Table */ + +.wp-block-table thead th { + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +.wp-block-table tr { + border-bottom: 1px solid #eee; +} + +.wp-block-table th, +.wp-block-table td { + border: 0; +} + +.rtl .wp-block-table th, +.rtl .wp-block-table td { + text-align: right; +} + +/*-------------------------------------------------------------- +4.0 Blocks - Layout Elements +--------------------------------------------------------------*/ + +/* Buttons */ + +.wp-block-button .wp-block-button__link { + -webkit-box-shadow: none; + box-shadow: none; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1.66; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.entry-content .wp-block-button__link { + background-color: #222; + color: #fff; +} + +.entry-content .is-style-outline .wp-block-button__link:not(.has-background) { + background-color: transparent; +} + +.entry-content .is-style-outline .wp-block-button__link:not(.has-text-color) { + color: #222; +} + +.colors-dark .wp-block-button__link { + background-color: #fff; + color: #000; +} + +.entry-content .wp-block-button__link:hover, +.entry-content .wp-block-button__link:focus, +.entry-content .is-style-outline .wp-block-button__link:not(.has-background):hover, +.entry-content .is-style-outline .wp-block-button__link:not(.has-background):focus { + background-color: #767676; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +.colors-dark .entry-content .wp-block-button__link:hover, +.colors-dark .entry-content .wp-block-button__link:focus, +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-background):hover, +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-background):focus { + background-color: #bbb; + color: #000; +} + +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-text-color) { + color: #fff; +} + +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-text-color):hover, +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-text-color):focus { + color: #222; +} + +.colors-custom .entry-content .wp-block-button__link, +.colors-custom .entry-content .wp-block-button__link:hover, +.colors-custom .entry-content .wp-block-button__link:focus, +.colors-dark .entry-content .wp-block-button__link, +.colors-dark .entry-content .wp-block-button__link:hover, +.colors-dark .entry-content .wp-block-button__link:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.colors-custom .entry-content .wp-block-button__link:hover, +.colors-custom .entry-content .wp-block-button__link:focus { + color: #fff; +} + +/* Separator */ + +.wp-block-separator { + border: 0; +} + +.wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + max-width: 100px; +} + +/* Media & Text */ + +.wp-block-media-text { + margin-bottom: 1.5em; +} + +.wp-block-media-text *:last-child { + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +5.0 Blocks - Widgets +--------------------------------------------------------------*/ + +/* Archives, Categories & Latest Posts */ + +.wp-block-archives.aligncenter, +.wp-block-categories.aligncenter, +.wp-block-latest-posts.aligncenter { + list-style-position: inside; + text-align: center; +} + +/* Comments */ + +.wp-block-latest-comments article { + margin-bottom: 4em; +} + +.blog:not(.has-sidebar) #primary .wp-block-latest-comments article, +.archive:not(.page-one-column):not(.has-sidebar) #primary .wp-block-latest-comments article, +.search:not(.has-sidebar) #primary .wp-block-latest-comments article { + float: none; + width: 100%; +} + +.wp-block-latest-comments .avatar, +.wp-block-latest-comments__comment-avatar { + border-radius: 0; +} + +.wp-block-latest-comments a { + -webkit-box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + +} + +.wp-block-latest-comments__comment-meta { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0.4em; +} + +.wp-block-latest-comments__comment-author, +.wp-block-latest-comments__comment-link { + font-weight: 700; + text-decoration: none; +} + +.wp-block-latest-comments__comment-date { + color: #767676; + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + margin-top: 0.4em; + text-transform: uppercase; +} + +.editor-block-list__block .wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + font-size: 0.875rem; +} + +/*-------------------------------------------------------------- +6.0 Blocks - Colors +--------------------------------------------------------------*/ + +.entry-content .has-pale-pink-color { + color: #f78da7; +} + +.entry-content .has-pale-pink-background-color, +.wp-block-button.is-style-outline .has-pale-pink-background-color:link { + background-color: #f78da7; +} + +.entry-content .has-vivid-red-color { + color: #cf2e2e; +} + +.entry-content .has-vivid-red-background-color, +.wp-block-button.is-style-outline .has-vivid-red-background-color:link { + background-color: #cf2e2e; +} + +.entry-content .has-luminous-vivid-orange-color { + color: #ff6900; +} + +.entry-content .has-luminous-vivid-orange-background-color, +.wp-block-button.is-style-outline .has-luminous-vivid-orange-background-color:link { + background-color: #ff6900; +} + +.entry-content .has-luminous-vivid-amber-color { + color: #fcb900; +} + +.entry-content .has-luminous-vivid-amber-background-color, +.wp-block-button.is-style-outline .has-luminous-vivid-amber-background-color:link { + background-color: #fcb900; +} + +.entry-content .has-light-green-cyan-color { + color: #7bdcb5; +} + +.entry-content .has-light-green-cyan-background-color, +.wp-block-button.is-style-outline .has-light-green-cyan-background-color:link { + background-color: #7bdcb5; +} + +.entry-content .has-vivid-green-cyan-color { + color: #00d084; +} + +.entry-content .has-vivid-green-cyan-background-color, +.wp-block-button.is-style-outline .has-vivid-green-cyan-background-color:link { + background-color: #00d084; +} + +.entry-content .has-pale-cyan-blue-color { + color: #8ed1fc; +} + +.entry-content .has-pale-cyan-blue-background-color, +.wp-block-button.is-style-outline .has-pale-cyan-blue-background-color:link { + background-color: #8ed1fc; +} + +.entry-content .has-vivid-cyan-blue-color { + color: #0693e3; +} + +.entry-content .has-vivid-cyan-blue-background-color, +.wp-block-button.is-style-outline .has-vivid-cyan-blue-background-color:link { + background-color: #0693e3; +} + +.entry-content .has-very-light-gray-color { + color: #eee; +} + +.entry-content .has-very-light-gray-background-color, +.wp-block-button.is-style-outline .has-very-light-gray-background-color:link { + background-color: #eee; +} + +.entry-content .has-cyan-bluish-gray-color { + color: #abb8c3; +} + +.entry-content .has-cyan-bluish-gray-background-color, +.wp-block-button.is-style-outline .has-cyan-bluish-gray-background-color:link { + background-color: #abb8c3; +} + +.entry-content .has-very-dark-gray-color { + color: #313131; +} + +.entry-content .has-very-dark-gray-background-color, +.wp-block-button.is-style-outline .has-very-dark-gray-background-color:link { + background-color: #313131; +} diff --git a/wp-content/themes/twentyseventeen/assets/css/colors-dark.css b/wp-content/themes/twentyseventeen/assets/css/colors-dark.css new file mode 100644 index 0000000..b1ed95a --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/css/colors-dark.css @@ -0,0 +1,566 @@ +/** + * Twenty Seventeen: Dark Color Scheme + * + * See inc/color-patterns.php for dynamic color overrides for the theme. + * + * Colors are ordered from light to dark. + */ + +.colors-dark button, +.colors-dark input[type="button"], +.colors-dark input[type="submit"], +.colors-dark .entry-footer .edit-link a.post-edit-link { + background-color: #fff; +} + +.colors-dark a:hover, +.colors-dark a:active, +.colors-dark .entry-content a:focus, +.colors-dark .entry-content a:hover, +.colors-dark .entry-summary a:focus, +.colors-dark .entry-summary a:hover, +.colors-dark .comment-content a:focus, +.colors-dark .comment-content a:hover, +.colors-dark .widget a:focus, +.colors-dark .widget a:hover, +.colors-dark .site-footer .widget-area a:focus, +.colors-dark .site-footer .widget-area a:hover, +.colors-dark .posts-navigation a:focus, +.colors-dark .posts-navigation a:hover, +.colors-dark .comment-metadata a:focus, +.colors-dark .comment-metadata a:hover, +.colors-dark .comment-metadata a.comment-edit-link:focus, +.colors-dark .comment-metadata a.comment-edit-link:hover, +.colors-dark .comment-reply-link:focus, +.colors-dark .comment-reply-link:hover, +.colors-dark .widget_authors a:focus strong, +.colors-dark .widget_authors a:hover strong, +.colors-dark .entry-title a:focus, +.colors-dark .entry-title a:hover, +.colors-dark .entry-meta a:focus, +.colors-dark .entry-meta a:hover, +.colors-dark.blog .entry-meta a.post-edit-link:focus, +.colors-dark.blog .entry-meta a.post-edit-link:hover, +.colors-dark.archive .entry-meta a.post-edit-link:focus, +.colors-dark.archive .entry-meta a.post-edit-link:hover, +.colors-dark.search .entry-meta a.post-edit-link:focus, +.colors-dark.search .entry-meta a.post-edit-link:hover, +.colors-dark .page-links a:focus .page-number, +.colors-dark .page-links a:hover .page-number, +.colors-dark .entry-footer .cat-links a:focus, +.colors-dark .entry-footer .cat-links a:hover, +.colors-dark .entry-footer .tags-links a:focus, +.colors-dark .entry-footer .tags-links a:hover, +.colors-dark .post-navigation a:focus, +.colors-dark .post-navigation a:hover, +.colors-dark .pagination a:not(.prev):not(.next):focus, +.colors-dark .pagination a:not(.prev):not(.next):hover, +.colors-dark .comments-pagination a:not(.prev):not(.next):focus, +.colors-dark .comments-pagination a:not(.prev):not(.next):hover, +.colors-dark .logged-in-as a:focus, +.colors-dark .logged-in-as a:hover, +.colors-dark a:focus .nav-title, +.colors-dark a:hover .nav-title, +.colors-dark .edit-link a:focus, +.colors-dark .edit-link a:hover, +.colors-dark .site-info a:focus, +.colors-dark .site-info a:hover, +.colors-dark .widget .widget-title a:focus, +.colors-dark .widget .widget-title a:hover, +.colors-dark .widget ul li a:focus, +.colors-dark .widget ul li a:hover { + color: #fff; +} + +.colors-dark .entry-content a:focus, +.colors-dark .entry-content a:hover, +.colors-dark .entry-summary a:focus, +.colors-dark .entry-summary a:hover, +.colors-dark .comment-content a:focus, +.colors-dark .comment-content a:hover, +.colors-dark .widget a:focus, +.colors-dark .widget a:hover, +.colors-dark .site-footer .widget-area a:focus, +.colors-dark .site-footer .widget-area a:hover, +.colors-dark .posts-navigation a:focus, +.colors-dark .posts-navigation a:hover, +.colors-dark .comment-metadata a:focus, +.colors-dark .comment-metadata a:hover, +.colors-dark .comment-metadata a.comment-edit-link:focus, +.colors-dark .comment-metadata a.comment-edit-link:hover, +.colors-dark .comment-reply-link:focus, +.colors-dark .comment-reply-link:hover, +.colors-dark .widget_authors a:focus strong, +.colors-dark .widget_authors a:hover strong, +.colors-dark .entry-title a:focus, +.colors-dark .entry-title a:hover, +.colors-dark .entry-meta a:focus, +.colors-dark .entry-meta a:hover, +.colors-dark.blog .entry-meta a.post-edit-link:focus, +.colors-dark.blog .entry-meta a.post-edit-link:hover, +.colors-dark.archive .entry-meta a.post-edit-link:focus, +.colors-dark.archive .entry-meta a.post-edit-link:hover, +.colors-dark.search .entry-meta a.post-edit-link:focus, +.colors-dark.search .entry-meta a.post-edit-link:hover, +.colors-dark .page-links a:focus .page-number, +.colors-dark .page-links a:hover .page-number, +.colors-dark .entry-footer .cat-links a:focus, +.colors-dark .entry-footer .cat-links a:hover, +.colors-dark .entry-footer .tags-links a:focus, +.colors-dark .entry-footer .tags-links a:hover, +.colors-dark .post-navigation a:focus, +.colors-dark .post-navigation a:hover, +.colors-dark .pagination a:not(.prev):not(.next):focus, +.colors-dark .pagination a:not(.prev):not(.next):hover, +.colors-dark .comments-pagination a:not(.prev):not(.next):focus, +.colors-dark .comments-pagination a:not(.prev):not(.next):hover, +.colors-dark .logged-in-as a:focus, +.colors-dark .logged-in-as a:hover, +.colors-dark a:focus .nav-title, +.colors-dark a:hover .nav-title, +.colors-dark .edit-link a:focus, +.colors-dark .edit-link a:hover, +.colors-dark .site-info a:focus, +.colors-dark .site-info a:hover, +.colors-dark .widget .widget-title a:focus, +.colors-dark .widget .widget-title a:hover, +.colors-dark .widget ul li a:focus, +.colors-dark .widget ul li a:hover { + -webkit-box-shadow: inset 0 0 0 rgba(255, 255, 255, 0), 0 3px 0 rgba(255, 255, 255, 1); /* Equivalant to #fff */ + box-shadow: inset 0 0 0 rgba(255, 255, 255, 0), 0 3px 0 rgba(255, 255, 255, 1); /* Equivalant to #fff */ +} + +.colors-dark .entry-content a, +.colors-dark .entry-summary a, +.colors-dark .comment-content a, +.colors-dark .widget a, +.colors-dark .site-footer .widget-area a, +.colors-dark .posts-navigation a, +.colors-dark .widget_authors a strong { + -webkit-box-shadow: inset 0 -1px 0 rgba(240, 240, 240, 1); /* Equivalant to #f0f0f0 */ + box-shadow: inset 0 -1px 0 rgba(240, 240, 240, 1); /* Equivalant to #f0f0f0 */ +} + +body.colors-dark, +.colors-dark button, +.colors-dark input, +.colors-dark select, +.colors-dark textarea, +.colors-dark h3, +.colors-dark h4, +.colors-dark h6, +.colors-dark label, +.colors-dark .entry-title a, +.colors-dark.twentyseventeen-front-page .panel-content .recent-posts article, +.colors-dark .entry-footer .cat-links a, +.colors-dark .entry-footer .tags-links a, +.colors-dark .format-quote blockquote, +.colors-dark .nav-title, +.colors-dark .comment-body { + color: #eee; +} + +/* Placeholder text color -- selectors need to be separate to work. */ +.colors-dark ::-webkit-input-placeholder { + color: #ddd; +} + +.colors-dark :-moz-placeholder { + color: #ddd; +} + +.colors-dark ::-moz-placeholder { + color: #ddd; +} + +.colors-dark :-ms-input-placeholder { + color: #ddd; +} + +.colors-dark input[type="text"]:focus, +.colors-dark input[type="email"]:focus, +.colors-dark input[type="url"]:focus, +.colors-dark input[type="password"]:focus, +.colors-dark input[type="search"]:focus, +.colors-dark input[type="number"]:focus, +.colors-dark input[type="tel"]:focus, +.colors-dark input[type="range"]:focus, +.colors-dark input[type="date"]:focus, +.colors-dark input[type="month"]:focus, +.colors-dark input[type="week"]:focus, +.colors-dark input[type="time"]:focus, +.colors-dark input[type="datetime"]:focus, +.colors-dark input[type="datetime-local"]:focus, +.colors-dark input[type="color"]:focus, +.colors-dark textarea:focus, +.bypostauthor > .comment-body > .comment-meta > .comment-author .avatar { + border-color: #eee; +} + +.colors-dark input[type="text"]:focus, +.colors-dark input[type="email"]:focus, +.colors-dark input[type="url"]:focus, +.colors-dark input[type="password"]:focus, +.colors-dark input[type="search"]:focus, +.colors-dark input[type="number"]:focus, +.colors-dark input[type="tel"]:focus, +.colors-dark input[type="range"]:focus, +.colors-dark input[type="date"]:focus, +.colors-dark input[type="month"]:focus, +.colors-dark input[type="week"]:focus, +.colors-dark input[type="time"]:focus, +.colors-dark input[type="datetime"]:focus, +.colors-dark input[type="datetime-local"]:focus, +.colors-dark input[type="color"]:focus, +.colors-dark textarea:focus, +.colors-dark button.secondary, +.colors-dark input[type="reset"], +.colors-dark input[type="button"].secondary, +.colors-dark input[type="reset"].secondary, +.colors-dark input[type="submit"].secondary, +.colors-dark a, +.colors-dark .site-title, +.colors-dark .site-title a, +.colors-dark .navigation-top a, +.colors-dark .dropdown-toggle, +.colors-dark .menu-toggle, +.colors-dark .page .panel-content .entry-title, +.colors-dark .page-title, +.colors-dark.page:not(.twentyseventeen-front-page) .entry-title, +.colors-dark .page-links a .page-number, +.colors-dark .comment-metadata a.comment-edit-link, +.colors-dark .comment-reply-link .icon, +.colors-dark h2.widget-title, +.colors-dark mark, +.colors-dark .post-navigation a:focus .icon, +.colors-dark .post-navigation a:hover .icon, +.colors-dark.blog .entry-meta a.post-edit-link, +.colors-dark.archive .entry-meta a.post-edit-link, +.colors-dark.search .entry-meta a.post-edit-link, +.colors-custom .twentyseventeen-panel .recent-posts .entry-header .edit-link { + color: #ddd; +} + +.colors-dark h2, +.colors-dark blockquote, +.colors-dark input[type="text"], +.colors-dark input[type="email"], +.colors-dark input[type="url"], +.colors-dark input[type="password"], +.colors-dark input[type="search"], +.colors-dark input[type="number"], +.colors-dark input[type="tel"], +.colors-dark input[type="range"], +.colors-dark input[type="date"], +.colors-dark input[type="month"], +.colors-dark input[type="week"], +.colors-dark input[type="time"], +.colors-dark input[type="datetime"], +.colors-dark input[type="datetime-local"], +.colors-dark input[type="color"], +.colors-dark textarea, +.colors-dark .navigation-top .current-menu-item > a, +.colors-dark .navigation-top .current_page_item > a, +.colors-dark .entry-content blockquote.alignleft, +.colors-dark .entry-content blockquote.alignright, +.colors-dark .taxonomy-description, +.colors-dark .site-info a, +.colors-dark .wp-caption { + color: #ccc; +} + +.colors-dark abbr, +.colors-dark acronym { + border-bottom-color: #ccc; +} + +.colors-dark h5, +.main-navigation a:hover, +.colors-dark .entry-meta, +.colors-dark .entry-meta a, +.colors-dark .nav-subtitle, +.colors-dark .comment-metadata, +.colors-dark .comment-metadata a, +.colors-dark .no-comments, +.colors-dark .comment-awaiting-moderation, +.colors-dark .page-numbers.current, +.colors-dark .page-links .page-number, +.colors-dark .site-description { + color: #bbb; +} + +.colors-dark :not( .mejs-button ) > button:hover, +.colors-dark :not( .mejs-button ) > button:focus, +.colors-dark input[type="button"]:hover, +.colors-dark input[type="button"]:focus, +.colors-dark input[type="submit"]:hover, +.colors-dark input[type="submit"]:focus, +.colors-dark .prev.page-numbers:focus, +.colors-dark .prev.page-numbers:hover, +.colors-dark .next.page-numbers:focus, +.colors-dark .next.page-numbers:hover, +.colors-dark .entry-footer .edit-link a.post-edit-link:focus, +.colors-dark .entry-footer .edit-link a.post-edit-link:hover { + background: #bbb; +} + +.colors-dark .social-navigation a:hover, +.colors-dark .social-navigation a:focus { + background: #999; + color: #222; +} + +.colors-dark .entry-footer .cat-links .icon, +.colors-dark .entry-footer .tags-links .icon { + color: #666; +} + +.colors-dark button.secondary:hover, +.colors-dark button.secondary:focus, +.colors-dark input[type="reset"]:hover, +.colors-dark input[type="reset"]:focus, +.colors-dark input[type="button"].secondary:hover, +.colors-dark input[type="button"].secondary:focus, +.colors-dark input[type="reset"].secondary:hover, +.colors-dark input[type="reset"].secondary:focus, +.colors-dark input[type="submit"].secondary:hover, +.colors-dark input[type="submit"].secondary:focus, +.colors-dark .social-navigation a, +.colors-dark hr { + background: #555; +} + +.colors-dark input[type="text"], +.colors-dark input[type="email"], +.colors-dark input[type="url"], +.colors-dark input[type="password"], +.colors-dark input[type="search"], +.colors-dark input[type="number"], +.colors-dark input[type="tel"], +.colors-dark input[type="range"], +.colors-dark input[type="date"], +.colors-dark input[type="month"], +.colors-dark input[type="week"], +.colors-dark input[type="time"], +.colors-dark input[type="datetime"], +.colors-dark input[type="datetime-local"], +.colors-dark input[type="color"], +.colors-dark textarea, +.colors-dark select, +.colors-dark fieldset, +.colors-dark .widget .tagcloud a:hover, +.colors-dark .widget .tagcloud a:focus, +.colors-dark .widget.widget_tag_cloud a:hover, +.colors-dark .widget.widget_tag_cloud a:focus, +.colors-dark .wp_widget_tag_cloud a:hover, +.colors-dark .wp_widget_tag_cloud a:focus { + border-color: #555; +} + +.colors-dark button.secondary, +.colors-dark input[type="reset"], +.colors-dark input[type="button"].secondary, +.colors-dark input[type="reset"].secondary, +.colors-dark input[type="submit"].secondary, +.colors-dark .prev.page-numbers, +.colors-dark .next.page-numbers { + background-color: #444; +} + +.colors-dark .widget .tagcloud a, +.colors-dark .widget.widget_tag_cloud a, +.colors-dark .wp_widget_tag_cloud a { + border-color: #444; +} + +.colors-dark.twentyseventeen-front-page article:not(.has-post-thumbnail):not(:first-child), +.colors-dark .widget ul li { + border-top-color: #444; +} + +.colors-dark .widget ul li { + border-bottom-color: #444; +} + +.colors-dark pre, +.colors-dark mark, +.colors-dark ins, +.colors-dark input[type="text"], +.colors-dark input[type="email"], +.colors-dark input[type="url"], +.colors-dark input[type="password"], +.colors-dark input[type="search"], +.colors-dark input[type="number"], +.colors-dark input[type="tel"], +.colors-dark input[type="range"], +.colors-dark input[type="date"], +.colors-dark input[type="month"], +.colors-dark input[type="week"], +.colors-dark input[type="time"], +.colors-dark input[type="datetime"], +.colors-dark input[type="datetime-local"], +.colors-dark input[type="color"], +.colors-dark textarea, +.colors-dark select, +.colors-dark fieldset { + background: #333; +} + +.colors-dark tr, +.colors-dark thead th { + border-color: #333; +} + +.colors-dark .navigation-top, +.colors-dark .main-navigation > div > ul, +.colors-dark .pagination, +.colors-dark .comment-navigation, +.colors-dark .entry-footer, +.colors-dark .site-footer { + border-top-color: #333; +} + +.colors-dark .single-featured-image-header, +.colors-dark .navigation-top, +.colors-dark .main-navigation li, +.colors-dark .entry-footer, +.colors-dark #comments { + border-bottom-color: #333; +} + +.colors-dark .site-header, +.colors-dark .single-featured-image-header { + background-color: #262626; +} + +.colors-dark button, +.colors-dark input[type="button"], +.colors-dark input[type="submit"], +.colors-dark .prev.page-numbers:focus, +.colors-dark .prev.page-numbers:hover, +.colors-dark .next.page-numbers:focus, +.colors-dark .next.page-numbers:hover { + color: #222; +} + +body.colors-dark, +.colors-dark .site-content-contain, +.colors-dark .navigation-top, +.colors-dark .main-navigation ul { + background: #222; +} + +.colors-dark .entry-title a, +.colors-dark .entry-meta a, +.colors-dark.blog .entry-meta a.post-edit-link, +.colors-dark.archive .entry-meta a.post-edit-link, +.colors-dark.search .entry-meta a.post-edit-link, +.colors-dark .page-links a, +.colors-dark .page-links a .page-number, +.colors-dark .entry-footer a, +.colors-dark .entry-footer .cat-links a, +.colors-dark .entry-footer .tags-links a, +.colors-dark .edit-link a, +.colors-dark .post-navigation a, +.colors-dark .logged-in-as a, +.colors-dark .comment-navigation a, +.colors-dark .comment-metadata a, +.colors-dark .comment-metadata a.comment-edit-link, +.colors-dark .comment-reply-link, +.colors-dark a .nav-title, +.colors-dark .pagination a, +.colors-dark .comments-pagination a, +.colors-dark .widget .widget-title a, +.colors-dark .widget ul li a, +.colors-dark .site-footer .widget-area ul li a, +.colors-dark .site-info a { + -webkit-box-shadow: inset 0 -1px 0 rgba(34, 34, 34, 1); /* Equivalant to #222 */ + box-shadow: inset 0 -1px 0 rgba(34, 34, 34, 1); /* Equivalant to #222 */ +} + +/* Fixes linked images */ +.colors-dark .entry-content a img, +.colors-dark .comment-content a img, +.colors-dark .widget a img { + -webkit-box-shadow: 0 0 0 8px #222; + box-shadow: 0 0 0 8px #222; +} + +.colors-dark .entry-footer .edit-link a.post-edit-link { + color: #000; +} + +.colors-dark .menu-toggle, +.colors-dark .menu-toggle:hover, +.colors-dark .menu-toggle:focus, +.colors-dark .dropdown-toggle, +.colors-dark .dropdown-toggle:hover, +.colors-dark .dropdown-toggle:focus, +.colors-dark .menu-scroll-down, +.colors-dark .menu-scroll-down:hover, +.colors-dark .menu-scroll-down:focus { + background-color: transparent; +} + +.colors-dark .gallery-item a, +.colors-dark .gallery-item a:hover, +.colors-dark .gallery-item a:focus, +.colors-dark .widget .tagcloud a, +.colors-dark .widget .tagcloud a:focus, +.colors-dark .widget .tagcloud a:hover, +.colors-dark .widget.widget_tag_cloud a, +.colors-dark .widget.widget_tag_cloud a:focus, +.colors-dark .widget.widget_tag_cloud a:hover, +.colors-dark .wp_widget_tag_cloud a, +.colors-dark .wp_widget_tag_cloud a:focus, +.colors-dark .wp_widget_tag_cloud a:hover, +.colors-dark .entry-footer .edit-link a.post-edit-link:focus, +.colors-dark .entry-footer .edit-link a.post-edit-link:hover { + -webkit-box-shadow: none; + box-shadow: none; +} + +@media screen and (min-width: 48em) { + + .colors-dark .nav-links .nav-previous .nav-title .icon, + .colors-dark .nav-links .nav-next .nav-title .icon { + color: #eee; + } + + .colors-dark .main-navigation li li:hover, + .colors-dark .main-navigation li li.focus { + background: #999; + } + + .colors-dark .menu-scroll-down { + color: #999; + } + + .colors-dark .main-navigation ul ul { + border-color: #333; + background: #222; + } + + .colors-dark .main-navigation ul li.menu-item-has-children:before, + .colors-dark .main-navigation ul li.page_item_has_children:before { + border-bottom-color: #333; + } + + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:after { + border-bottom-color: #222; + } + + .colors-dark .main-navigation li li.focus > a, + .colors-dark .main-navigation li li:focus > a, + .colors-dark .main-navigation li li:hover > a, + .colors-dark .main-navigation li li a:hover, + .colors-dark .main-navigation li li a:focus, + .colors-dark .main-navigation li li.current_page_item a:hover, + .colors-dark .main-navigation li li.current-menu-item a:hover, + .colors-dark .main-navigation li li.current_page_item a:focus, + .colors-dark .main-navigation li li.current-menu-item a:focus { + color: #222; + } + +} diff --git a/wp-content/themes/twentyseventeen/assets/css/editor-blocks.css b/wp-content/themes/twentyseventeen/assets/css/editor-blocks.css new file mode 100644 index 0000000..35c34bc --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/css/editor-blocks.css @@ -0,0 +1,808 @@ +/* +Theme Name: Twenty Seventeen +Description: Used to style blocks in the editor. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 General Typography +2.0 General Block Settings +3.0 Blocks - Common Blocks +4.0 Blocks - Formatting +5.0 Blocks - Layout Elements +6.0 Blocks - Widgets + +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 General Typography +--------------------------------------------------------------*/ + +.edit-post-visual-editor .editor-block-list__block, +.editor-default-block-appender textarea.editor-default-block-appender__content { + font-size: 15px; + font-size: 0.9375rem; +} + +.editor-default-block-appender textarea.editor-default-block-appender__content { + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +.edit-post-visual-editor .editor-block-list__block { + color: #333; +} + +.editor-post-title__block .editor-post-title__input { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; +} + +@media screen and (min-width: 30em) { + + .edit-post-visual-editor .editor-block-list__block { + font-size: 18px; + font-size: 1.125rem; + } + + .editor-post-title__block .editor-post-title__input { + font-size: 26px; + font-size: 1.625rem; + } + + .edit-post-visual-editor .editor-block-list__block h1 { + font-size: 30px; + font-size: 1.875rem; + } + + .edit-post-visual-editor .editor-block-list__block h2 { + font-size: 26px; + font-size: 1.625rem; + } + + .edit-post-visual-editor .editor-block-list__block h3 { + font-size: 22px; + font-size: 1.375rem; + } + + .edit-post-visual-editor .editor-block-list__block h4 { + font-size: 18px; + font-size: 1.125rem; + } + + .edit-post-visual-editor .editor-block-list__block h5 { + font-size: 13px; + font-size: 0.8125rem; + } + + .edit-post-visual-editor .editor-block-list__block h6 { + font-size: 16px; + font-size: 1rem; + } +} + +@media screen and (min-width: 48em) { + + .edit-post-visual-editor .editor-block-list__block { + font-size: 16px; + font-size: 1rem; + } + + .editor-rich-text__tinymce.mce-content-body { + line-height: 1.5; + } +} + +/* Typography for Arabic Font */ + +html[lang="ar"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ary"] .edit-post-visual-editor .editor-block-list__block, +html[lang="azb"] .edit-post-visual-editor .editor-block-list__block, +html[lang="fa-IR"] .edit-post-visual-editor .editor-block-list__block, +html[lang="haz"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ps"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ur"] .edit-post-visual-editor .editor-block-list__block { + font-family: Tahoma, Arial, sans-serif; +} + +html[lang="ar"] .edit-post-visual-editor h1, +html[lang="ar"] .edit-post-visual-editor h2, +html[lang="ar"] .edit-post-visual-editor h3, +html[lang="ar"] .edit-post-visual-editor h4, +html[lang="ar"] .edit-post-visual-editor h5, +html[lang="ar"] .edit-post-visual-editor h6, +html[lang="ary"] .edit-post-visual-editor h1, +html[lang="ary"] .edit-post-visual-editor h2, +html[lang="ary"] .edit-post-visual-editor h3, +html[lang="ary"] .edit-post-visual-editor h4, +html[lang="ary"] .edit-post-visual-editor h5, +html[lang="ary"] .edit-post-visual-editor h6, +html[lang="azb"] .edit-post-visual-editor h1, +html[lang="azb"] .edit-post-visual-editor h2, +html[lang="azb"] .edit-post-visual-editor h3, +html[lang="azb"] .edit-post-visual-editor h4, +html[lang="azb"] .edit-post-visual-editor h5, +html[lang="azb"] .edit-post-visual-editor h6, +html[lang="fa-IR"] .edit-post-visual-editor h1, +html[lang="fa-IR"] .edit-post-visual-editor h2, +html[lang="fa-IR"] .edit-post-visual-editor h3, +html[lang="fa-IR"] .edit-post-visual-editor h4, +html[lang="fa-IR"] .edit-post-visual-editor h5, +html[lang="fa-IR"] .edit-post-visual-editor h6, +html[lang="haz"] .edit-post-visual-editor h1, +html[lang="haz"] .edit-post-visual-editor h2, +html[lang="haz"] .edit-post-visual-editor h3, +html[lang="haz"] .edit-post-visual-editor h4, +html[lang="haz"] .edit-post-visual-editor h5, +html[lang="haz"] .edit-post-visual-editor h6, +html[lang="ps"] .edit-post-visual-editor h1, +html[lang="ps"] .edit-post-visual-editor h2, +html[lang="ps"] .edit-post-visual-editor h3, +html[lang="ps"] .edit-post-visual-editor h4, +html[lang="ps"] .edit-post-visual-editor h5, +html[lang="ps"] .edit-post-visual-editor h6, +html[lang="ur"] .edit-post-visual-editor h1, +html[lang="ur"] .edit-post-visual-editor h2, +html[lang="ur"] .edit-post-visual-editor h3, +html[lang="ur"] .edit-post-visual-editor h4, +html[lang="ur"] .edit-post-visual-editor h5, +html[lang="ur"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Chinese Font */ + +html[lang^="zh-"] .edit-post-visual-editor .editor-block-list__block { + font-family: "PingFang TC", "Helvetica Neue", Helvetica, STHeitiTC-Light, Arial, sans-serif; +} + +html[lang="zh-CN"] .edit-post-visual-editor .editor-block-list__block { + font-family: "PingFang SC", "Helvetica Neue", Helvetica, STHeitiSC-Light, Arial, sans-serif; +} + +html[lang^="zh-"] .edit-post-visual-editor h1, +html[lang^="zh-"] .edit-post-visual-editor h2, +html[lang^="zh-"] .edit-post-visual-editor h3, +html[lang^="zh-"] .edit-post-visual-editor h4, +html[lang^="zh-"] .edit-post-visual-editor h5, +html[lang^="zh-"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Cyrillic Font */ + +html[lang="bg-BG"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ru-RU"] .edit-post-visual-editor .editor-block-list__block, +html[lang="uk"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +html[lang="bg-BG"] .edit-post-visual-editor h1, +html[lang="bg-BG"] .edit-post-visual-editor h2, +html[lang="bg-BG"] .edit-post-visual-editor h3, +html[lang="bg-BG"] .edit-post-visual-editor h4, +html[lang="bg-BG"] .edit-post-visual-editor h5, +html[lang="bg-BG"] .edit-post-visual-editor h6, +html[lang="ru-RU"] .edit-post-visual-editor h1, +html[lang="ru-RU"] .edit-post-visual-editor h2, +html[lang="ru-RU"] .edit-post-visual-editor h3, +html[lang="ru-RU"] .edit-post-visual-editor h4, +html[lang="ru-RU"] .edit-post-visual-editor h5, +html[lang="ru-RU"] .edit-post-visual-editor h6, +html[lang="uk"] .edit-post-visual-editor h1, +html[lang="uk"] .edit-post-visual-editor h2, +html[lang="uk"] .edit-post-visual-editor h3, +html[lang="uk"] .edit-post-visual-editor h4, +html[lang="uk"] .edit-post-visual-editor h5, +html[lang="uk"] .edit-post-visual-editor h6 { + font-weight: 700; + line-height: 1.2; +} + +/* Typography for Devanagari Font */ + +html[lang="bn-BD"] .edit-post-visual-editor .editor-block-list__block, +html[lang="hi-IN"] .edit-post-visual-editor .editor-block-list__block, +html[lang="mr-IN"] .edit-post-visual-editor .editor-block-list__block { + font-family: Arial, sans-serif; +} + +html[lang="bn-BD"] .edit-post-visual-editor h1, +html[lang="bn-BD"] .edit-post-visual-editor h2, +html[lang="bn-BD"] .edit-post-visual-editor h3, +html[lang="bn-BD"] .edit-post-visual-editor h4, +html[lang="bn-BD"] .edit-post-visual-editor h5, +html[lang="bn-BD"] .edit-post-visual-editor h6, +html[lang="hi-IN"] .edit-post-visual-editor h1, +html[lang="hi-IN"] .edit-post-visual-editor h2, +html[lang="hi-IN"] .edit-post-visual-editor h3, +html[lang="hi-IN"] .edit-post-visual-editor h4, +html[lang="hi-IN"] .edit-post-visual-editor h5, +html[lang="hi-IN"] .edit-post-visual-editor h6, +html[lang="mr-IN"] .edit-post-visual-editor h1, +html[lang="mr-IN"] .edit-post-visual-editor h2, +html[lang="mr-IN"] .edit-post-visual-editor h3, +html[lang="mr-IN"] .edit-post-visual-editor h4, +html[lang="mr-IN"] .edit-post-visual-editor h5, +html[lang="mr-IN"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Greek Font */ + +html[lang="el"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="el"] .edit-post-visual-editor h1, +html[lang="el"] .edit-post-visual-editor h2, +html[lang="el"] .edit-post-visual-editor h3, +html[lang="el"] .edit-post-visual-editor h4, +html[lang="el"] .edit-post-visual-editor h5, +html[lang="el"] .edit-post-visual-editor h6 { + font-weight: 700; + line-height: 1.3; +} + +/* Typography for Gujarati Font */ + +html[lang="gu-IN"] .edit-post-visual-editor .editor-block-list__block { + font-family: Arial, sans-serif; +} + +html[lang="gu-IN"] .edit-post-visual-editor h1, +html[lang="gu-IN"] .edit-post-visual-editor h2, +html[lang="gu-IN"] .edit-post-visual-editor h3, +html[lang="gu-IN"] .edit-post-visual-editor h4, +html[lang="gu-IN"] .edit-post-visual-editor h5, +html[lang="gu-IN"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Hebrew Font */ + +html[lang="he-IL"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +html[lang="he-IL"] .edit-post-visual-editor h1, +html[lang="he-IL"] .edit-post-visual-editor h2, +html[lang="he-IL"] .edit-post-visual-editor h3, +html[lang="he-IL"] .edit-post-visual-editor h4, +html[lang="he-IL"] .edit-post-visual-editor h5, +html[lang="he-IL"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Japanese Font */ + +html[lang="ja"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Hiragino Kaku Gothic Pro", Meiryo, sans-serif; +} + +html[lang="ja"] .edit-post-visual-editor h1, +html[lang="ja"] .edit-post-visual-editor h2, +html[lang="ja"] .edit-post-visual-editor h3, +html[lang="ja"] .edit-post-visual-editor h4, +html[lang="ja"] .edit-post-visual-editor h5, +html[lang="ja"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Korean font */ + +html[lang="ko-KR"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +html[lang="ko-KR"] .edit-post-visual-editor h1, +html[lang="ko-KR"] .edit-post-visual-editor h2, +html[lang="ko-KR"] .edit-post-visual-editor h3, +html[lang="ko-KR"] .edit-post-visual-editor h4, +html[lang="ko-KR"] .edit-post-visual-editor h5, +html[lang="ko-KR"] .edit-post-visual-editor h6 { + font-weight: 600; +} + +/* Typography for Thai Font */ + +html[lang="th"] .edit-post-visual-editor .editor-block-list__block { + line-height: 1.8; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="th"] .edit-post-visual-editor h1, +html[lang="th"] .edit-post-visual-editor h2, +html[lang="th"] .edit-post-visual-editor h3, +html[lang="th"] .edit-post-visual-editor h4, +html[lang="th"] .edit-post-visual-editor h5, +html[lang="th"] .edit-post-visual-editor h6 { + line-height: 1.65; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +/* Remove letter-spacing for all non-latin alphabets */ + +html[lang="ar"] .edit-post-visual-editor *, +html[lang="ary"] .edit-post-visual-editor *, +html[lang="azb"] .edit-post-visual-editor *, +html[lang="haz"] .edit-post-visual-editor *, +html[lang="ps"] .edit-post-visual-editor *, +html[lang^="zh-"] .edit-post-visual-editor *, +html[lang="bg-BG"] .edit-post-visual-editor *, +html[lang="ru-RU"] .edit-post-visual-editor *, +html[lang="uk"] .edit-post-visual-editor *, +html[lang="bn-BD"] .edit-post-visual-editor *, +html[lang="hi-IN"] .edit-post-visual-editor *, +html[lang="mr-IN"] .edit-post-visual-editor *, +html[lang="el"] .edit-post-visual-editor *, +html[lang="gu-IN"] .edit-post-visual-editor *, +html[lang="he-IL"] .edit-post-visual-editor *, +html[lang="ja"] .edit-post-visual-editor *, +html[lang="ko-KR"] .edit-post-visual-editor *, +html[lang="th"] .edit-post-visual-editor * { + letter-spacing: 0 !important; +} + +/*-------------------------------------------------------------- +2.0 General Block Settings +--------------------------------------------------------------*/ + +/* Main column width */ + +.editor-styles-wrapper { + max-width: 100% !important; /* Override where editor-style.css is affecting this. */ +} + +.wp-block { + max-width: 674px; /* Based on one-column post width; 644px + 30px to account for padding. */ +} + +/* Alignments */ + +.edit-post-visual-editor .alignleft { + margin-right: 1.5em; +} + +.edit-post-visual-editor .alignright { + margin-left: 1.5em; +} + +/* Link styles */ + +.edit-post-visual-editor a, +.editor-block-list__block a, +.wp-block-freeform.block-library-rich-text__tinymce a { + color: #222; +} + +/* List styles */ + +.edit-post-visual-editor ul:not(.wp-block-gallery), +.editor-block-list__block ul:not(.wp-block-gallery), +.block-library-list ul, +.edit-post-visual-editor ol, +.editor-block-list__block ol, +.block-library-list ol, +.block-library-list .editor-rich-text__tinymce { + margin: 0 0 1.5em 1.5em; + padding: 0; +} + +.edit-post-visual-editor ul:not(.wp-block-gallery), +.editor-block-list__block ul:not(.wp-block-gallery), +.block-library-list ul { + list-style: disc; +} + +.edit-post-visual-editor ol, +.editor-block-list__block ol, +.block-library-list ol { + list-style: decimal; +} + +.edit-post-visual-editor li > ul:not(.wp-block-gallery), +.editor-block-list__block li > ul:not(.wp-block-gallery), +.block-library-list li > ul:not(.wp-block-gallery), +.edit-post-visual-editor li > ol, +.editor-block-list__block li > ol, +.block-library-list li > ol { + margin-bottom: 0; + margin-left: 1.5em; +} + +.edit-post-visual-editor li, +.editor-block-list__block li, +.block-library-list li { + margin: 0; +} + +.rtl .edit-post-visual-editor ul:not(.wp-block-gallery), +.rtl .editor-block-list__block ul:not(.wp-block-gallery), +.rtl .block-library-list ul, +.rtl .edit-post-visual-editor ol, +.rtl .editor-block-list__block ol, +.rtl .block-library-list ol, +.rtl .block-library-list .editor-rich-text__tinymce, +.rtl .edit-post-visual-editor li > ul:not(.wp-block-gallery), +.rtl .editor-block-list__block li > ul:not(.wp-block-gallery), +.rtl .block-library-list li > ul:not(.wp-block-gallery), +.rtl .edit-post-visual-editor li > ol, +.rtl .editor-block-list__block li > ol, +.rtl .block-library-list li > ol { + margin-left: 1.5em; + margin-right: 1.5em; +} + +/* Quote styles */ + +.editor-block-list__block blockquote p { + font-size: 18px; + font-size: 1.125rem; +} + +.editor-block-list__block blockquote.alignright p, +.editor-block-list__block blockquote.alignleft p { + font-size: 13px; + font-size: 0.8125rem; +} + +.editor-block-list__block blockquote cite { + display: block; + font-style: normal; + font-weight: 600; + margin-top: 0.5em; +} + +/* Caption styles*/ + +[class^="wp-block-"]:not(.wp-block-gallery) figcaption { + font-style: italic; + margin-bottom: 1.5em; + text-align: left; +} + +.rtl [class^="wp-block-"]:not(.wp-block-gallery) figcaption { + text-align: right; +} + +/* Code styles */ + +.wp-block-freeform.block-library-rich-text__tinymce code { + background: transparent; +} + +/* Table styles */ + +.rtl .editor-block-list__block th { + text-align: right; +} + +/*-------------------------------------------------------------- +3.0 Blocks - Common Blocks +--------------------------------------------------------------*/ + +/* Paragraph */ + +.wp-block-paragraph.has-drop-cap:not(:focus)::first-letter { + font-size: 5em; + margin-top: 0.075em; +} + +.wp-block-paragraph.has-background { + padding: 20px 30px; +} + +/* Gallery */ + +.wp-block-gallery figcaption { + font-style: italic; +} + +/* Quote */ + +.wp-block-quote { + color: #666; + font-size: 18px; + font-size: 1.125rem; + font-style: italic; + line-height: 1.7; +} + +.wp-block-quote:not(.is-large):not(.is-style-large) { + border: 0; + padding: 0; +} + +.editor-block-list__block .wp-block-quote .wp-block-quote__citation { + color: inherit; + display: block; + font-size: inherit; + font-style: normal; + font-weight: 600; + margin-top: 0.5em; +} + +.wp-block-quote.alignleft, +.wp-block-quote.alignright { + color: #666; + width: 48%; +} + +.editor-block-list__block .wp-block-quote.alignleft p, +.editor-block-list__block .wp-block-quote.alignright p, +.editor-block-list__block .wp-block-quote.alignleft .wp-block-quote__citation, +.editor-block-list__block .wp-block-quote.alignright .wp-block-quote__citation { + font-size: 13px; + font-size: 0.8125rem; +} + +.editor-block-list__block .wp-block-quote.alignleft p:last-of-type, +.editor-block-list__block .wp-block-quote.alignright p:last-of-type { + margin-bottom: 0; +} + +.wp-block-quote.is-large .wp-block-quote__citation, +.wp-block-quote.is-style-large .wp-block-quote__citation { + text-align: right; +} + +.rtl .wp-block-quote.is-large .wp-block-quote__citation, +.rtl .wp-block-quote.is-style-large .wp-block-quote__citation { + text-align: left; +} + +@media screen and (min-width: 30em) { + .editor-block-list__block .wp-block-quote.alignleft p, + .editor-block-list__block .wp-block-quote.alignright p, + .editor-block-list__block .wp-block-quote.alignleft .wp-block-quote__citation, + .editor-block-list__block .wp-block-quote.alignright .wp-block-quote__citation, + .editor-block-list__block .wp-block-quote footer { + font-size: 14px; + font-size: 0.875rem; + } +} + +@media screen and (min-width: 48em) { + .editor-block-list__block .wp-block-quote.alignleft p, + .editor-block-list__block .wp-block-quote.alignright p, + .editor-block-list__block .wp-block-quote.alignleft .wp-block-quote__citation, + .editor-block-list__block .wp-block-quote.alignright .wp-block-quote__citation { + font-size: 13px; + font-size: 0.8125rem; + } + + .editor-block-list__block .wp-block-quote.alignleft { + margin-left: -17.5%; + width: 48%; + } + + .editor-block-list__block .wp-block-quote.alignright { + margin-right: -17.5%; + width: 48%; + } +} + +/* File */ + +.wp-block-file .wp-block-file__textlink { + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 1px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 1px 0 rgba(0, 0, 0, 1); +} + +.wp-block-file .wp-block-file__button { + background-color: #222; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +/*-------------------------------------------------------------- +4.0 Blocks - Formatting +--------------------------------------------------------------*/ + +/* Code */ + +.wp-block-code { + border: 0; + padding: 0; +} + +/* Classic */ + +.wp-block-freeform.block-library-rich-text__tinymce li, +.wp-block-freeform.block-library-rich-text__tinymce p { + line-height: 1.5; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote { + border: 0; + padding: 0; +} + +/* Pullquote */ + +.wp-block-pullquote { + border: 0; +} + +.wp-block-pullquote.alignleft blockquote > .editor-rich-text p, +.wp-block-pullquote.alignright blockquote > .editor-rich-text p { + font-size: 20px; +} + + +.wp-block-pullquote .wp-block-pullquote__citation { + font-size: inherit; + font-weight: 600; + text-transform: none; +} + +/* Table */ + +table.wp-block-table { + border-collapse: collapse; + margin: 0 0 1.5em; + width: 100%; +} + +table.wp-block-table thead th { + border: 0; + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +table.wp-block-table th { + padding: 0.4em; + text-align: left; +} + +table.wp-block-table tr { + border-bottom: 1px solid #eee; +} + +table.wp-block-table th, +table.wp-block-table td { + border: 0; + padding: 0.4em; +} + +table.wp-block-table th:first-child, +table.wp-block-table td:first-child { + padding-left: 0; +} + +table.wp-block-table th:last-child, +table.wp-block-table td:last-child { + padding-right: 0; +} + +.wp-block-table__cell-content { + padding: 0; +} + +.rtl table.wp-block-table th, +.rtl table.wp-block-table td { + text-align: right; +} + +/*-------------------------------------------------------------- +5.0 Blocks - Layout Elements +--------------------------------------------------------------*/ + +/* Separator */ + +.edit-post-visual-editor .wp-block-separator { + border: 0; +} + +/* Buttons */ + +.wp-block-button .wp-block-button__link { + -webkit-box-shadow: none; + box-shadow: none; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1.66; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.wp-block-button .wp-block-button__link[data-is-placeholder-visible="true"] { + height: auto; +} + +.wp-block-button__link { + background-color: #222; + color: #fff; +} + +.is-style-outline .wp-block-button__link { + color: #222; +} + +/* Media & Text */ + +.wp-block-media-text *:last-child { + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +6.0 Blocks - Widgets +--------------------------------------------------------------*/ + +/* Archives, Categories & Latest Posts */ + +[data-align="center"] .wp-block-archives ul, +[data-align="center"] .wp-block-categories ul, +[data-align="center"] .wp-block-latest-posts ul { + list-style-position: inside; +} + +/* Latest Comments */ + +.editor-block-list__block ol.wp-block-latest-comments > li:before { + content: ''; +} + +.wp-block-latest-comments article { + margin-bottom: 4em; +} + +.wp-block-latest-comments .avatar, +.wp-block-latest-comments__comment-avatar { + border-radius: 0; +} + +.wp-block-latest-comments__comment-meta { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0.4em; +} + +.editor-block-list__block .wp-block-latest-comments__comment-meta a { + -webkit-box-shadow: none; + box-shadow: none; + font-weight: 700; +} + +.wp-block-latest-comments__comment-date { + color: #767676; + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + margin-top: 0.4em; + text-transform: uppercase; +} + +.editor-block-list__block .wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + font-size: 0.875rem; +} + +/* Latest Posts */ + +.edit-post-visual-editor .wp-block-latest-posts.is-grid { + list-style: none; + margin-left: 0; + margin-right: 0; +} diff --git a/wp-content/themes/twentyseventeen/assets/css/editor-style.css b/wp-content/themes/twentyseventeen/assets/css/editor-style.css new file mode 100644 index 0000000..52e08f8 --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/css/editor-style.css @@ -0,0 +1,582 @@ +/* +Theme Name: Twenty Seventeen +Description: Used to style the TinyMCE editor. +*/ + + +/** + * Table of Contents: + * + * 1.0 - Body + * 2.0 - Typography + * 3.0 - Elements + * 4.0 - Alignment + * 5.0 - Caption + * 6.0 - Galleries + * 7.0 - Media Elements + * 8.0 - RTL + */ + +/** + * 1.0 - Body + */ + +body { + background-color: #fff; + color: #333; + margin: 20px 40px; + max-width: 580px; +} + +/** + * 2.0 - Typography + */ + +body, +button, +input, +select, +textarea { + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + font-size: 16px; + font-size: 1rem; + font-weight: 400; + line-height: 1.66; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + line-height: 1.4; + margin: 0 0 0.75em; + padding: 1.5em 0 0; +} + +h1:first-child, +h2:first-child, +h3:first-child, +h4:first-child, +h5:first-child, +h6:first-child { + padding-top: 0; +} + +h1 { + font-size: 24px; + font-size: 1.5rem; + font-weight: 300; +} + +h2 { + color: #666; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; +} + +h3 { + color: #333; + font-size: 18px; + font-size: 1.125rem; + font-weight: 300; +} + +h4 { + color: #333; + font-size: 16px; + font-size: 1rem; + font-weight: 800; +} + +h5 { + color: #767676; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 800; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +h6 { + color: #333; + font-size: 15px; + font-size: 0.9375rem; + font-weight: 800; +} + +p { + margin: 0 0 1.5em; + padding: 0; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + color: #666; + font-size: 18px; + font-size: 1.125rem; + font-style: italic; + line-height: 1.7; + margin: 0; + overflow: hidden; + padding: 0; +} + +blockquote.alignleft, +blockquote.alignright { + font-size: 14px; + font-size: 0.875rem; + width: 34%; +} + +address { + margin: 0 0 1.5em; +} + +pre { + background: #eee; + font-family: "Courier 10 Pitch", Courier, monospace; + font-size: 15px; + font-size: 0.9375rem; + line-height: 1.6; + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 1.6em; +} + +code, +kbd, +tt, +var { + font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; + font-size: 15px; + font-size: 0.9375rem; +} + +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #eee; + text-decoration: none; +} + +big { + font-size: 125%; +} + +blockquote, +q { + quotes: "" ""; +} + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; +} + +/* Typography for Thai Font */ + +html[lang="th"] h1, +html[lang="th"] h2, +html[lang="th"] h3, +html[lang="th"] h4, +html[lang="th"] h5, +html[lang="th"] h6 { + letter-spacing: 0; + line-height: 1.65; +} + +html[lang="th"] body, +html[lang="th"] button, +html[lang="th"] input, +html[lang="th"] select, +html[lang="th"] textarea { + line-height: 1.8; +} + +/** + * 3.0 - Elements + */ + +hr { + background-color: #bbb; + border: 0; + height: 1px; + margin-bottom: 1.5em; +} + +ul, +ol { + margin: 0 0 1.5em; + padding: 0; +} + +ul { + list-style: disc; +} + +ol > li { + position: relative; +} + +li > ul, +li > ol { + margin-bottom: 0; + margin-left: 1.5em; +} + +dt { + font-weight: 700; +} + +dd { + margin: 0 1.5em 1.5em; +} + +table { + border-collapse: collapse; + margin: 0 0 1.5em; + width: 100%; +} + +thead th { + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +th { + padding: 0.4em; + text-align: left; +} + +tr { + border-bottom: 1px solid #eee; +} + +td { + padding: 0.4em; +} + +th:first-child, +td:first-child { + padding-left: 0; +} + +th:last-child, +td:last-child { + padding-right: 0; +} + +a { + -webkit-box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + color: #222; + text-decoration: none; + -webkit-transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out, -webkit-box-shadow 130ms ease-in-out; +} + +a:focus { + outline: thin dotted; +} + +a:hover, +a:focus { + color: #000; + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); +} + +/* Fixes linked images */ + +a img { + background: #fff; + -webkit-box-shadow: 0 0 0 6px #fff; + box-shadow: 0 0 0 6px #fff; +} + +/** + * 4.0 - Alignment + */ + +img { + height: auto; /* Make sure images are scaled correctly. */ + max-width: 100%; /* Adhere to container width. */ +} + +embed, +iframe, +object { + margin-bottom: 1.5em; + max-width: 100%; +} + +/** + * 5.0 - Caption + */ + +.wp-caption { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + font-style: italic; + margin-bottom: 1.5em; + max-width: 100%; +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.wp-caption .wp-caption-text { + margin: 0.8075em 0; +} + +/** + * 6.0 - Galleries + */ + +.gallery { + margin-bottom: 1.5em; +} + +.gallery-item { + display: inline-block; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-item a, +.gallery-item a:hover, +.gallery-item a:focus { + -webkit-box-shadow: none; + box-shadow: none; + background: none; + display: inline-block; +} + +.gallery-columns-2 .gallery-item { + max-width: 50%; +} + +.gallery-columns-3 .gallery-item { + max-width: 33.33%; +} + +.gallery-columns-4 .gallery-item { + max-width: 25%; +} + +.gallery-columns-5 .gallery-item { + max-width: 20%; +} + +.gallery-columns-6 .gallery-item { + max-width: 16.66%; +} + +.gallery-columns-7 .gallery-item { + max-width: 14.28%; +} + +.gallery-columns-8 .gallery-item { + max-width: 12.5%; +} + +.gallery-columns-9 .gallery-item { + max-width: 11.11%; +} + +.gallery-caption { + display: block; +} + +/** + * 7.0 - Media Elements + */ + +.mejs-container { + margin-bottom: 1.5em; +} + +/* Audio Player */ + +.mejs-controls a.mejs-horizontal-volume-slider, +.mejs-controls a.mejs-horizontal-volume-slider:focus, +.mejs-controls a.mejs-horizontal-volume-slider:hover { + background: transparent; + border: 0; +} + +/* Playlist Color Overrides: Light */ + +.wp-playlist-light { + border-color: #eee; + color: #222; +} + +.wp-playlist-light .wp-playlist-current-item .wp-playlist-item-album { + color: #333; +} + +.wp-playlist-light .wp-playlist-current-item .wp-playlist-item-artist { + color: #767676; +} + +.wp-playlist-light .wp-playlist-item { + border-bottom: 1px dotted #eee; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.wp-playlist-light .wp-playlist-item:hover, +.wp-playlist-light .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #767676; + color: #fff; +} + +.wp-playlist-light a.wp-playlist-caption:hover, +.wp-playlist-light .wp-playlist-item:hover a, +.wp-playlist-light .wp-playlist-item:focus a { + color: #fff; +} + +/* Playlist Color Overrides: Dark */ + +.wp-playlist-dark { + background: #222; + border-color: #333; +} + +.wp-playlist-dark .mejs-container .mejs-controls { + background-color: #333; +} + +.wp-playlist-dark .wp-playlist-caption { + color: #fff; +} + +.wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-album { + color: #eee; +} + +.wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-artist { + color: #aaa; +} + +.wp-playlist-dark .wp-playlist-playing { + background-color: #333; +} + +.wp-playlist-dark .wp-playlist-item { + border-bottom: 1px dotted #555; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.wp-playlist-dark .wp-playlist-item:hover, +.wp-playlist-dark .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #aaa; + color: #222; +} + +.wp-playlist-dark a.wp-playlist-caption:hover, +.wp-playlist-dark .wp-playlist-item:hover a, +.wp-playlist-dark .wp-playlist-item:focus a { + color: #222; +} + +/* Playlist Style Overrides */ + +.wp-playlist { + padding: 0.625em 0.625em 0.3125em; +} + +.wp-playlist-current-item .wp-playlist-item-title { + font-weight: 700; +} + +.wp-playlist-current-item .wp-playlist-item-album { + font-style: normal; +} + +.wp-playlist-current-item .wp-playlist-item-artist { + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + text-transform: uppercase; +} + +.wp-playlist-item { + padding: 0 0.3125em; + cursor: pointer; +} + +.wp-playlist-item:last-of-type { + border-bottom: none; +} + +.wp-playlist-item a { + padding: 0.3125em 0; + border-bottom: none; +} + +.wp-playlist-item a, +.wp-playlist-item a:focus, +.wp-playlist-item a:hover { + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; +} + +.wp-playlist-item-length { + top: 5px; +} + +/** + * 8.0 - RTL + */ + +.rtl th { + text-align: right; +} + +.rtl ol > li:before { + left: auto; + right: -1.5em; +} + +.rtl li > ul, +.rtl li > ol { + margin-left: 0; + margin-right: 1.5em; +} + +.rtl .mejs-offscreen { + right: -10000px; +} diff --git a/wp-content/themes/twentyseventeen/assets/css/ie8.css b/wp-content/themes/twentyseventeen/assets/css/ie8.css new file mode 100644 index 0000000..18a8643 --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/css/ie8.css @@ -0,0 +1,225 @@ +/* +Theme Name: Twenty Seventeen +Description: IE8 specific style. +*/ + +body { + font-size: 16px; +} + +h1 { + font-size: 30px; + font-size: 1.875rem; +} + +h2, +.page .panel-content .recent-posts .entry-title { + font-size: 26px; + font-size: 1.625rem; +} + +h3 { + font-size: 22px; + font-size: 1.375rem; +} + +h4 { + font-size: 18px; + font-size: 1.125rem; +} + +h5 { + font-size: 13px; + font-size: 0.8125rem; +} + +h6 { + font-size: 16px; + font-size: 1rem; +} + +img { + width: inherit; /* Make images fill their parent's space. */ +} + +/* Fixes linked images */ +.entry-content a img, +.widget a img { + filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=5, Color=#ffffff); +} + +/* Layout */ + +.site-content { + padding: 6.5em 0 0; +} + +/* Site Branding */ + +.custom-header { + overflow: hidden; +} + +.has-header-image.twentyseventeen-front-page .custom-header, +.has-header-image.home.blog .custom-header { + display: block; +} + +.custom-header-media { + background-position: bottom center; +} + +.site-branding { + padding: 45px 0; +} + +.has-header-image.twentyseventeen-front-page .site-branding, +.has-header-image.home.blog .site-branding { + bottom: 0; + display: block; + left: 0; + height: auto; + padding-top: 0; + position: absolute; + width: 100%; +} + +.has-header-image .custom-header-media img { + left: 0; + top: 0; +} + +.site-title { + font-size: 36px; + font-weight: 700; +} + +.site-description { + font-size: 16px; +} + +/* Main Navigation */ + +.navigation-top { + background: #fff; + position: relative; + z-index: 10; +} + +.menu-toggle { + width: 150px; +} + +.main-navigation ul#top-menu { + margin-bottom: -1px; + padding: 0; +} + +.no-svg .dropdown-toggle { + padding: 0.25em 0 0; +} + +.no-svg .dropdown-toggle.toggled-on { + padding: 0.75em 0 0; +} + +.dropdown-toggle .svg-fallback.icon-angle-down { + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=-1, M12=1.2246467991473532e-16, M21=-1.2246467991473532e-16, M22=-1, SizingMethod='auto expand')"; +} + +.dropdown-toggle.toggled-on .svg-fallback.icon-angle-down { + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=1, M12=0, M21=0, M22=1, SizingMethod='auto expand')"; +} + +/* Front Page */ + +.twentyseventeen-front-page.has-header-image .custom-header, +.blog.home.has-header-image .custom-header, +.panel-image { + height: 800px; + max-height: 800px; + padding-top: 0; +} + +.twentyseventeen-front-page .custom-header-media, +.blog.home .custom-header-media { + background-position: center center; +} + +.twentyseventeen-front-page.has-header-image .site-branding, +.home.blog.has-header-image .site-branding { + bottom: 20px; + position: absolute; + width: 100%; +} + +.page .panel-content .entry-title, +.page-title, +.page .entry-title { + font-size: 14px; + font-size: 0.875rem; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +/* Posts */ + +.blog .site-main > article, +.archive .site-main > article, +.search .site-main > article { + padding-bottom: 4em; +} + +time.updated { + display: none; +} + +time.published { + display: inline-block; +} + +.blog .entry-title { + padding-top: 0; +} + +.single-post .entry-title, +.page .entry-title, +.entry-meta + .entry-title { + font-size: 26px; + font-weight: 400; + letter-spacing: normal; + padding-top: 0; + text-transform: none; +} + +.entry-footer .cat-links, +.entry-footer .tags-links { + padding-left: 0; +} + +.comment-author .avatar { + z-index: -1; +} + +ol.children .children { + padding-left: 2em; +} + +/* RTL Styles */ + +.rtl .has-header-image.twentyseventeen-front-page .site-branding, +.rtl .has-header-image.home.blog .site-branding { + left: auto; + right: 0; +} + +.rtl .entry-footer .cat-links, +.rtl .entry-footer .tags-links { + padding-right: 0; +} + +.rtl ol.children .children { + padding-left: 0; + padding-right: 2em; +} diff --git a/wp-content/themes/twentyseventeen/assets/css/ie9.css b/wp-content/themes/twentyseventeen/assets/css/ie9.css new file mode 100644 index 0000000..af9574e --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/css/ie9.css @@ -0,0 +1,43 @@ +/* +Theme Name: Twenty Seventeen +Description: IE9 specific styles. +*/ + +.has-header-image.twentyseventeen-front-page .custom-header, +.has-header-video.twentyseventeen-front-page .custom-header, +.has-header-image.home.blog .custom-header, +.has-header-video.home.blog .custom-header { + height: 300px; +} + +.has-header-image .custom-header-media img, +.has-header-video .custom-header-media video, +.has-header-video .custom-header-media iframe { + min-width: 100%; +} + +@media screen and (min-width: 30em) { + + .has-header-image.twentyseventeen-front-page .custom-header, + .has-header-video.twentyseventeen-front-page .custom-header, + .has-header-image.home.blog .custom-header, + .has-header-video.home.blog .custom-header, + .twentyseventeen-front-page.has-header-image .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .panel-image { + height: 700px; + } +} + +@media screen and (min-width: 48em) { + + .has-header-image.twentyseventeen-front-page .custom-header, + .has-header-video.twentyseventeen-front-page .custom-header, + .has-header-image.home.blog .custom-header, + .has-header-video.home.blog .custom-header, + .twentyseventeen-front-page.has-header-image .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .panel-image { + height: 1000px; + } +} diff --git a/wp-content/themes/twentyseventeen/assets/images/coffee.jpg b/wp-content/themes/twentyseventeen/assets/images/coffee.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13847cde7c16ba0f8bd31e5251de88f1ef627219 GIT binary patch literal 117713 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

            hB^iuJ5k$=@ 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 literal 0 HcmV?d00001 diff --git a/wp-content/themes/twentyseventeen/assets/images/espresso.jpg b/wp-content/themes/twentyseventeen/assets/images/espresso.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7514c96bdfaf991d817670d4a20c432e1b21a8e0 GIT binary patch literal 93540 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 CYkhP8 literal 0 HcmV?d00001 diff --git a/wp-content/themes/twentyseventeen/assets/images/header.jpg b/wp-content/themes/twentyseventeen/assets/images/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3fd3e7122cbc1866e5971a82d0b65e13ccb8e20 GIT binary patch literal 114854 zcmb5VcT^Ma)&@EWEnv`4B{V}%XaWJG8%TiAt0)Lc4^8PH2pEcy4xxwMqzh715Jiw) zLlsc`DbkCm6cubYo^!r$edn(G&)sV!Gn02^X3snCe)fL$-t%YS&wBu7sAr%DfIuMN zU-IV-fCV6oj7*FS5GE!jW@ZQrl}H<*cHTRX|K^MrL`-2ij?P|9yr3nUlX0 z^Y4q$#-!Q)b#dBd=;;6u9mC%-HZZ#ooxCf$lfMpwWtm7cdFu0@*8r3bMAMy) z4Y&w=nexa=)GykMX?MZW1ML7kK!QjT9l3hx<oLzs>Nx8;KJnK?1__ zgBL#Z@M%iJG%uc;8K0Sst-KLGA=fVMo5&rKsx(9AHi90cyVW~in4`+m?=MXuU{Ju|G#<99>)hFrV3gxQHisgS;CLl`4yjJq zfu79(gsdc1#^W+<&$n|5l_J?_cZtuo9G1kVH)l;m+_O#%tB_GyTOHAxws8{;d~n`y zM?veJnYxzmsfK$Um6VbZP26~MYrgFGmsZ0qdL3z0Sq6y?z;Jfs9cj<{@7({FfUd{^ zumz$?hBAg{O=IcT;+9(kdYt+;e)OJ%d%)QC=;~_T13ixQ37?v6@@VdO@tuOLH}^7Y zFQF+#YN_slt?Pqbk?7;IISM8yh;yk}VrSYa#z0KL5UdB_6WMSF!(!~_?3cZr?T;a_ zd)9#D4L~@?xiqr6^4$qjzkbKpuIxKoyemH|s0V+5q`ikBY8Io_yTKxx`(N_X2UjmN49H#TJ+0jqwFv3p9#SqJ4 zRuSyFfO-2x{7_$Ocm$jc?4rE@dIGdlS zeu4kE+8|F;SE@Blxt?U~h4X6trXgb!I{c=F>RBw_D)W}V{)v1Y7Sw1lJPWV_q*J2; z<`^Qo3ji1n0AySa^i&qeI$9Ws4-$^az{r81NOl0z!NZ{S(iqlFuU-o5o+3{+5&;iz zoYEo@mJYDe1>JMlRTr*%`K#>gJ|}aim{}oNc z=?Xy}UL4yvGEx_rt28vth;I zsiz5i#*OGiN?mxa$LIw|!`v<=8shQBr_wzMx!O*?`betrL4DOS~a%VH`aD_GnjUxw{| z*&?Kr7sXDBuL2l=J_w^c0Hyyw%kke!6o5fU7SPiXU8YcK$Gfb9gD`2g{>ht;L;UUrXx{Sam`2k9I$V@}sz#l->g2w4GY>tXB3nWTH?hrep&M4T;Y zU;b-WpV~gf*7Dnh_AI1TjP{kqdn`Eq+m!z68_Ywbfo}pU4Gu~FHSn(kAt=Tzv$-de zM8yjAWFDdIo9*qg57B+Ip@b*3zofrB(lSwaPucLA>#qt|*bh5tnjC&NO?}dL^iE>D zV(aO48#TX9!)pKN;Luo?-6oz<@*&84fU|~nZcivk>Z0}`lY1I9<09s#*1?bX<%3`P zJ5MkDro2gBnK^$rF-Gv%;44dD<+J*aVlV)J-~n)rWRJh28j3xUg#$2ZNAU7op*h`p;!_q_ z4*F%a`%EE?IjFv)yPvO1OOBrK6 zzjy$%(Gq8BB_2LRkItxTN=sCHI0?J`S{*anN-|c6tUVkO(sX7T{ru_!2SMejNcQq$*AkQJKh&6yi)z zpJX@i$su~u9HUSr#L3l|%;_;yE(M3_1C#T z{Nd&s=0cO^QZ?8lt}?!wJpo^iDy5g>rTHC@7=q_tD2Ro1|L5V+|J{PQpcn(_V+{W> zTTjuY;v8Jq@y{IewJ2-`;TkSrC`C_UKj5!kP9agHm(4&PNf3^cJ3Yh_2LK2xaF1^((zmMGT+2{k@$h$H zZdym!5C7xpFHy1gLpi!M)70_5<3hVn_@Bv`Po_^zLY#U2qvQYCK%4;(6u|pnN1E}5>C$=kItO^JBSKrT_FKY`O z9qy^!9ey`s_3=w&U>r4HtD-TG`J613^XGH>$g}?DFKZqw-*Vy|4{K|EO46p#rS@r2VA1?uqrntk^M|5oO&7v#tmy>xn;w9i3xI`*GP8m(N<-=M zA`CzVZ>Xykz>E4CnI7AIshkl=-ywo7r9BkW*16j2$%W0vIcq8ExjQ|1VAVK4HtR?q0r)%~S?E$8$ZGdhiD z(8GtVQ(q!AUP!!o)BOjS*2lqzW6WMF#cjkdsE3F;beEAOBhPU20_RE^61ps~Ml(NJT0kWSYcM4g5VoykPN@ogCw(`^8Tr5B3f)ykYH zG$^^iu@$M(^g}w}_(lJ>*B1^erlU7J{s4xWJm;`!)zRg=?7V7>^8d2{|5sU>y7F=~ ztOfuYGXB3uF#rOflP*gAYdkY50Z~=nIa0Y6C-4v35ycY~hpqjy`EEU;eqNpEu82b3 z)Ul#pN?Pv(=FdWpUACW2w~rmC4kkv<*QZs|F+v`sUxqq`=q8-uyl11vlKl;Q&{PwBRFTixn0tL{vc&2?daMpvjmD!}1WInFri1>b z$NqlUh0zjYb%YQ7jdUlff7FuD{bzfiJ*W6e6Tiv z!0^gxFL|1Su`wHQ3ymXb(AXDenWDJE+9_{Hgo+Pc#n(2TJc$X8f5oBlkorr+!+1xk zSQBFW3auiNKIeKtid#K2#dyU^#*`9V7~)zoiF0?#l&NcRQSe%6y)`>=NxtFk?4Tv3 zQas@H-Cl|F>CIEBajtsBaZkurQWnqu5xti-))NgjRnNG@ge-m}45 zzARgo5}|=gT5$CtB}>JnKvecK)^Du%4Xc){?)h7V$)Tjr7c2$xYGWvRTUnGCikIV6 z*PFtYBK};KxqD5gi@8(DtGg!Sx5ft$Hghl6#sqO+9O| zRy=TLl6ubk#=R2sJ&O@S&{S{jzG+uMiElb>E$WY+yY%WfIV~rbwV3(awMH#6=1Pj1 zC;)K;Cv-k6r4e%(Nkp42)BK5WaIw)|MD&qhYVljoupfTM8(*U4%0ll7riu(sx;=v& ze(qEsERIySz~S0%RM52ij|ki1zJrDtP zE31?w89fJxj5L2E%fh~P>Y?ssuA#|jKhF7dymwkOQ78eL#2UaYsz?XxPM5Qf zFH6J_!Mv-0WPBN`5EOs`oT5Ta2zdmS#gPcGh)GEjX`vrzuKuCnKs0z2;1Evjmt{tQ zW>WP{Rj2xy^uE7w|K7f~6u#j8wP1k2U1a+f8WNIvR^-ZR>m|83w%cq?KGwBqOJ#aY9yZ$@)pX#C=QGwrK=E%gLcC`XM|#$TRc;<6`uD}PXAt;n%QG@RkbEn z4y2~MUk~h{LCLn&`LN-3uMh`;L^o8SKgG+HZ^ZqkdjO?)xx&^oHEhhXK&~*^Zi%!m zGjO&4*+8SBrFzi5#v^nm{dc`bh2alN7{818EXRGn(4%GITN&=3EmRda;8vS)I)12A zwL;i#l@yZo|fk-1-Gy&6M zvJ856<)M}y)zi=ocLRRa62Ec3RaLQ`DRN;(2yZ-jJh%0N&-%#3b%~kk^Jp7CK~lp3 zHJ9eE%ALzHY!c#qqdA3-O!Q+qO^=}+Ao1?U|hkWvpC zFw)SHNTUr{ZAT0@6v>OB=Xy^rHSBCj)DMC1FUWr)G*$QLwdb$B^^ApYxeR&~X|bsL zf2f$Do>$tE>$}_*gk`JicV7*hFH*6HtI)rn%Ql?Jv6}4`z{>r_?~OLpSy9-l+}?l6 zOI**3&iuTmHCHBaTImh`?hq%5h-B2-WJe*;r`PZp#4Zs+52TMq3uUyU=;?F-Mmi&s z5x9|-#k2hT3@}!rSGMr|EpG$|o`f+Z6nK z@12(@NE4b#v@dvP>@r8P(nY5-4uy%UiDYJ)1x$@3@iu0sdkc*fG46ZpS_vMcxK>&Y zyUhmG<_{2fmE-4vQQVb*;&$nLwg!1OdGn^8$G98nqF8yOxw$PI4V@g#IsW~T6Mxz5 zs%%6qpfDKfT}{Xu3Y0EeErA{!P&>NppP{ManJ>ij;9^UwSt$f{)eYIzS7oX^Cf_8D zHwqip_9N8-`ST|RL5p<+wu9o|TJabuaYY>-;x$_Y0|a|E2()j6g+XLVQ(};eA&8FG zfN;#FF2`cr#bSoneRB8C%|=R8yZx@$x}jwjT4vg+Kz(vP=g!&96V*uMp(B+8n=`fZ zp{Qar@bL3f3;Zy5N+K49L7q#yDZ>!7C(}>=F zBq6VLb*-21>gcW?dEau6TJi_T4sSofv&PR<3WcHqxNy_-=MW$a4KnI!;IR4a`T0M< z)<#Su)BXB`2K|c#Kd(Osn*W`l`9O8~@ZHbK+u?!F!mg3fK~Bk2d^V*JmePNbRw4k9 zY@yIfBmM+eS7CC7qVcFjIR`y!G<3kdVZbqPlr*MbrIcH2tngINYv9J`iHKBkg>Zwe z-+BmT#ak#O^7Iuys+3jgn>KGL?yj4+-Zo3?SLA|X`X3eX7mmU-nCu3fTGAh;Nok#i zuXxKxLQj0AOwhw~PMs<=M}JPL06v_-N!i`@n<3=p^4%z`pX&8=ow72+W+2TB)vNiWYJAMXkv zI%$BpOVUQ(@1;Q|5ymRFCmg+tVCS*I;ua>a52wbRB1Y1i-!r%iWZ!eO4hte94;61c z5P37RtkQO+E9>?x`Oo1|f|1^X`@tU@q4o{}=>r-(uV$)X6;r8dc`k}q#)VT{V5$=F ztHUI!oq214C`3P3T8SGcU$iLHs}P4IS9#Gb_>^15U)JhraR0%Q%zUU?eHzXdJ)a?} z2Zn}#qo*EnYBz*%JzT^*i0k*C0Gq41u_2)*fxE2tOuH8>#!C52vq36Q{@Y&mgyhO|qA z@){7Q0c|M)2DoTFAJ>P%rpXeLisa<(1mgi)4+%+Cv>9m>X&dNwtkSaD60rKo{j}TU znh3M}V>gs-{t`izVrs35hGwWn_>m#oVX0;TU} zzyLx}9eSa}2d|OVCR`&v1#OmzFbM6*#=xN3tZIbX>6YCQDsp?8>TWr3yWm{u;YWSQ zx6f{E5xzzvYx;AZ0)1coXL@Ew4p*cUjRzQ~)LPmsknXV{hAcVp?igZvOCku2aDj~g z>^uxa1|kFin0X!L8RBEoce4~o3g+EBz!fNln-)n3+>HmEY4;3(uY#1>vL;lE0tlxs z8_&9T9K0wiR<0P{S-)eXVZZ-)Tw#SWSY$`AUt3zCjtE35os)kR7OSP>y-ipQcJs^7 zQuE&SIQ|11Uv5gPG|woHyR5Uzbz^}J05C*Y{~`cP)_5d(oSZRId)2xzFY$cqX7Jiy zMt$0E@~PQXoU8^?Za` zaIEb0)+l))d<>uJ{?K$lMXoYNA?ui+Y+n`DdO0&!HbCl5)ZpH<#!uc@<$4bbTcA2B2wQKwCkCeAs>oZ^3jpzl=-Tbam>xJqv z`1aAxUCL5ZKO3E?XubPV)i+5hm=-Xrq+PTiedLD+&4tu_U4MYSr-4G>yR`E`L%RLg zRfjXgZE#fHqJnL17mBZ#{u~EJ67i1F{*D0TDGOGN6Cycc6Q>B~#VB%uL8UBZ@ue^( zCo0rwcz~E3X{cwO6njF3 zv`5{)#&gbWX4yYs&-t#%@YZPDZTSyOt?&N;Jf9ZPRwaf9H)sG3}3EHnlWU7++`0b5OZzQCe7%AYwD1r9!TCv6 zp<09b9ylqDxzO+CofR^SgD^G{G z0RYiaNRDTSham<2(3n+Prv=k_iWbxbh;`yxZj#MSilf4Q>Dw4g6ADTsX1yYtEpqN) zHH`OZ>6w;D=`VrQj;3Lr34*fi=iLAbH9taretIxr?%X6by<~?LY@?QJ_bC^zK3V;j zp|`G_;7JTAxoN^YArINHAO#R0+{q~kO6nCZD*jX@X1DTE|G}gJ(rc8z>w3hC>syOb z%sY-nt?MTtw_m0ajB+#EniPwR_ar?2kzVOl*T;$a>RZAy+!pVfga6V3ny^D@NlP~2 zRf0sfp0;~Hx`expvT45%PW%CAG>5=le%tvC;o2pA%7Yu_m;BsDpX$rnKVlo6Auu*c z;d9D=ZTn{GW*hNogb}<~E#}5Q-xQe~*4oId&z3aa%CY$nX4misurkO`e>9wxchz;o zW?baT`!$h};oB&treOr$zoj^caEAGVtB$!Px* zonzH{_v_IYHkHM=GQF=R$-Y~!64~L4%PfM|JJfMaKu+Z| zx)Hi#oASYfLSwFQ?=4G$#=Ag+v5l+;4@Vk5=;%uHAQdY~LW`UO@y%7%_CL^y)|5h= zQaOsl#W)sck)7)(ZpbLw{ZRbnh*!FTIhf7e4Ux!;s05~DIQ!o-{cyRE zR&A(GU&)f~6TDf+#W70d)qhfVU3+Dljr+0y+=Oqca7y~d*c`=F{3G0WdEdq2;$QeSZTIM0AWWFHicUIRm=|D|~ob$sMji=BMmi zdQl~muljtPGa`klijArTUTHX3tE5UPer&C_$|Z#@iiPTm;?|ZvP%~5Ej}7?M5@rR| z-cv74>u1ge*bydHuUlyr1%21>?6O^Xv3mH09iSf=I=_~D$q_;$1$ZnAa29|$RJ2yD zem#;W2vsrJW@;B#4Q^|SDF2lAEYZKOrC#d#%wMb5_=kXMSn;cp=6Qy1Ds6k@*{a~= zr|&&dZyC>oU8=Fopj;(Rx*KG>aY_ll?5-j>q2MEq9OUHc?rOERK&p&5ZaVAOC3!-F zau>Qvs|$?XB+x5NZj_K@E_sP(+-U8a+c2HW_kI+iMxgE}by~S|bwz9oEUtMeNt$M= zw0cXZ2Lz>^SAJ}0+R1I0c2)LPPr%gBQ9_u0Lc#SLZwoWGSw$?ZBe}0tm{-mfDo|4k z0v=OKh9BJMP!1feRSe37Kik>juI3a8C7f=m`Ibnyn_1gdhboRT@p%*Kx>J9-_}c2D z`!a-4Eib!{>ecK9a)Eb%R+U=st)1EcYIbUi-uHtJC7-odonN*Nn`eKdzIi{hq)(33 zEHaX*5Im1-e3EUUK5^Zz#Lwm0wRaezQ4%lVa{S~bwvz=wYGK%LQ{Kc=4*`2%ax(oV z400Aw1Qdm;IA0QFU*@HYVIcsF0f>D#^Y9dkfkWFGv;d(!CJf@3eu3_@qYzmK1G+AI zEJ<%6Vw?m8!1?=%LZzBTjCPt!s<*VR8svIwj%&HR=y??$7IiK1`A3c2?KrBGN!DH} zcE(=*b(Q9Z4sC(LF!#@8naow>tYUGM*KdUhe3_Y<$XSU2x$ zJ$wheG$nlsQpq4phP3G#N6V2>S#kA3gq~>QVYQl-Q?iN%fKm>8e>jIMy zS94lg7zNOhM}Rr4DErqT{9A|stx7ST?n36Drj<#lo$O-%Ub#%RE~ znX~2t%PQbfToathsi=TglnGhImzwB25@zxC~Nwl3eRg=uWeC4R^*wUA~$7PI)VaE5|lzd)s&@(?icH=G->Cw^6X^ookZQ6QLsOA zo7G}J^1SBM5wGWxnLgKQ2p5Oq?kfok4-Xm)g8tIse+dm9{t5`_qn{L-oT8sh5+}0Z zX{9lM6U+k>vd}3N1%eoFfU)$%vbz8TNEgd$FU_Abv1J-dXz`Z{ENXT%mI4mripD& z&9N3UT@khSxV7}F3jj@BrZ*7ab`>FX}Az{b4(2p6N1o2y+-<;3*uF>%D@sGmR=*_k0 zL6vW-OIsTDaK}I+f#R&?-qxa*qpP=`Eq(}cl9s4e5jmT3M(j&iK;L=SL$MUN3hf|Z zP(XlZ1-szMpeJ)PV5@I)J2@4}hqB1^*jy6b9P}&fKA9qlje1QyJ>cclfzuW{NT)dg zgoy?&T`_MYVPp+)Ur}IMqO_go)>;2@B$ms3B({YfjJuQ&#v?Jxm~R87{fWJjOB(}( z>X3+%eesfg5GNfQpor-ZCY-=4oCgMYCP`=Qv_FOts$(s~{1uaH`BpyCV!N8Djn*zz zv%;<8tC}iqKA+T@l-9PTm-iNX;foEnwZR$=hHka|Q$b#pHw651r=4Eps9Y=^R?B2( z^=WfWGCpU*=C7dJ&GVLmt5x6-vMVR&%g|e*U`g7BW+YMe2=+WlBF4rhuYjGgn?=v9 z6iKVv#Rmx^jGc8kA+N;o)1sHyt;ERq5xpu)F&lQFTt%$Bjj&#xIt6VE5-gVR*osm8 z+;}=ZRQEEDMTk4TipYkc8GstS0t(EiNC$w4jH+28)0?-0lVu>ySVsWI(hXG7Cu@6%2773O%sX#OM;_<{g(?b=G&e z49OllR9OLsAZH1Q496`#L*>+cmx7#R_tXRt<~pDD{Phy(OZQ^|<)qY#mW1kk8GjnXqcx(6kcKC`Y50A=chR$o9^ud@~n`DSVVChf9ps|=G!^!ksxm6#$sifx^UHm0Pcoh zF@9<|pC2ut7V!B9wp^_7JyY|SaTMv6YPKsOcmMF9P^O zz4)B_eY;uGz2XG{%V)ise{L1bzP>p;T%Ms&%sj|pa^;0VswTmfRCEC)l60=7Ox0iO zO!1MTphlpUl9$Bk@e1ns%lkW8nrZVZ+x#f2vG~X+_9DHID1+m|Cnu|(tWo6xt%~+L zKd!%y>OcL2z9V1Q!A&))ElTGkr}hu31%+{mTCp8H}r-bsb)QaCvfYRe%4d0uO z!mm}nsiOKCJZL>=_gZ6iD9$N(aNGI8%DGZa=VXD_vDqWd@k(kz?$u(f$_{@~2R!3l zi{H0v_aEKJGcr#T4_}dJIChb`azv|@cEGQpcU?gOG-_q$g~z)wGpJ(%}@_C zE-AbB?JpJ#IcQ*o8X4D((!aJR;D-C=TEHKabIO63fdoqd_$Th)tNpLy$j`2hcz?_V zI&`pV&#F2D2C@@a&y<6{vLh26YvaNB0K*_esO;wgiRk&7onEV3PJ0m?#5uE;oINyj zTMiR9B5(yTKhxfwA$iwX7Z}E}H10AI0iwXE_7Epy*SiZn+883StQvzrdf?eOCwGm; zSwZ-gv!`OFy0jLzHa+;3W(c)s_0vl4Y!^4!zSh{QLAy@iCsJJ0^p4%1W+fT_t%GmD zL$!ZNkNmEZ4t$?N<6xo!$jZP0_e3|np>{3P$TfXLe`?i`8QB+YCFB5^;;GH5f-G_- z+vv>hMvu0NaiB7)*lOUutn1CZeLf=!GDFc>$@WQ>$SGF%9!i15`4smDMv9)7?oDKy zCkN-a@XI!_8Gg;JTkm{?1$VhBLHzxIo|mLogxc`sQ$L^)mnQi-$m zNGwmlFwp93cX!*o5xn#!83G5_Zt_-WxK$j(^cqw@E! z&~j$!`L!yqgMOkL$SF3sz*W6BpJ+WxyvZG|ffGurTNJ96%wtB&peEvU&-$#MxK+-^ zSG5x**KPAe)zAQoZ)#Aj2}s5K%xWchFiAk0=Ct>OXuzze{w(f_q5!}n3<<$53tK`; z5pGI5xrimkeGy3FitQhSD1A7nW_c>-^}1qmI5G7`(Rg#DxZHi?Lp68mL{Gp3^Ou+U zW=3~@`RJ*BJN!kcRQVyV`I8yF9xmO)Z&o!EaMOhUX9v1| z=G{J!r&ktN{N~g%yPL5WAerP^osLugkrZcg9cO^cwPJvTn500p+piLl z+U-R>QhUU+BI+6g=?KGUnxBbzz+egXD5Y2IjF;_$dca^@H%U_Exnd_^Of& z^S_jw__v`xnw16!1`ERRPEaiH)M=l~13)qo6Opo+>^!V~L=bQ(D*@Yue+bpm1~{{Y z4RK(_R>g+a>T^CpJ5yh>jyTgK^mb5N58vwDROv_$R*Q>>3+ZSJYdPc{qA6 z1XuEEkf|5lnF+fA=SA^U;4I2%6~Llwn3~VHmfl-oVf=*z14=oWtxi^!oT%hLv<#u- zOB%;rNs*>!&@Fqc6A_CjD`zp*##id5fXWby7jRa3Bz&bsxh$hcdwNRpLZ4f?ur3+V z;HphS0#3@~!gZg`nHE~t_76T0sBf%Cy|Yxgc>DyzT}2CIDVU5bN0pTuVt}}TL|V7x zU$0B!?*B*F&GXnqos>q^;8Z1J?eUuHSPh?Fl#lC|6N<&7#+nm9cqO~1P?E>zUa{{7 ztVXob(y-XHJEn#0k7#|9-kQ?Cii*7tew3&;J?Z>#f?;xk2O$6!9Z&@ErQBncmy1oz zmh9fj?~{GwQYm8o9HBo6YlnD5s zt1%;Z)2Yj=`{K2&i*sQb39`1+X#PxnakpOe>ec1h5O*Ih4HK{BlJhlxfQgVuz1HFV zlf-YfA9j8gzewB4YwY&4kp3eke7DR*$((n<{G+k&J9287nZQsgd0I zkKzs2-pzar=k?|^tDCOaI5CxsGb`(nRMUqXeyO;`A+7L!-v3bwI}gH#*=KmXNqUMh zZ0A~0AeH>lMDS*liT_QFiph~$G{x+xYOvVl!6OreDk^zf?UD-mP^&pwMOEZOpv<0y z#&6l5hu>MRU8E7jYuKqBzpwlF&&Aj#v`bS#?P~cotIW4&f^O0F-2@NFt|(XOHI27? z6xka*KWa=v-n4voj#}~c_O+GYzZZw|i%nRJdJqv)aR+ zK54#v@8VO-yf0?T+a`C1hTSUdCI%B$n`)nyhn?$m4*OoG`=#MH$s=WT6cyKUwm+ia zS$P<8EyqrQmaJLd`{rXL)VnuNzTMle@vdf0D6zA-(d1W0K7au%#DFvH5*SXXjU1@# z(v@jWI#3yqeR>y@0D3nnKuev_T4X@)T4<5+OMqUzIYW_%tfSuoyPDH~)1{TVSRCVk z%beidb{7O}GJP+e9f@f-W>iGL>&nT%5r1FJa*&r|?;cINnf9qL{F_l3x4-a>@@#(!t*! zW(*V;GhwIHj9Z3SKvL1DgJy%$LQHI+!M2m-JA#9#x6roNQW*c zD_6syo48k0v2&U`AHkDbcZPd~do?8UzZ|FMRr4Ll-Ytvctz&~~YD=rp6I8E@Z(arno* z+`tE%#`^>8ajw&Ww_Uykz5B^~j$vD?{SWYS<;11jF;w$_N{M`IAoA%{@qOBhUPeN4 zPGt2QO0RXZ*7rofgz!!Zj@l^BA}vVxmIkv z7COASedDd5^~~d&Xf|=mXpscBub8+~4r`ql+3i;NY;9GaiRQcMv${~rPsZ;AnO{I}4IE;*>h*1;HPTM2*;jOOtIJAcR+y1Kgu`Zp zgBEH98~GXiid2{Hw|TRQ701cFR!RjguO7Tgzmrojms)&RLm0PztK)E<+s|>vrsjly zp-uuS?=zbbSsnWQ`8Z3BAPN49P*Qc1KY)3g0~{eC-dmpxnGuf8~0`~yh54(5Nvq(88FNp-l;=SO|} z_v@BsuImx?BjNv4y^?-<{K2es^>{<1X^{Hm)z6|cC@Iv~s!3~^I|QQ^ zX2+~rGVx9ivNla!Z56WPCf8k1sd@oUH;l5$jzexHw9pzMuXOTZ|5Q3ln_DZEoxY~J zm6x49K^KZ;Vaz`Du-h?C5!1iGf-hw$N5hDnKb<;Xapx733 zE8tuJ?PVNkz(aeVQ~oOeB1$YtN5`-uvzYCG{g<0Ok|UVJ3)I&^^WYPzDN{jpXtrSC zC4nWWTls^rDk2{F$&%vnc@@?vRf0;+`6nszgB|GWwh*>*T%||4d7|L}*+QGQCi9Yr zb^JcgQddaSZWXAMM1d6a@UQid&6%ZAJ>o<;{L|8S6o;rKn>9&Pf$6=q90GrTAu9>b zn1V>2YA_ekUBK$N+X;)>N=q?|pl#t9$(45*j<`g5<|b-l=VpFqHcBWLMM@Y3xzqF# zLFP-)UbDmhodX7tkn1IODe>+_u!1E@PD#Aqk=D)3fdY1&A0lbd>3;<5h!EEox3ze- z*jqDfOqN7Xd{K<}8uqrh%l^fda>RPYd4<(?((fJzP_owD_u;1QDfU%Ps-K5x?egMS zu396-AI09e=QATZQ0fFe^4da2%^cIjJBR_nR&G7W+={HtkCQ>jlLGCg zY2QK#l9a5(O6XfbJ)h{x?XWf@3n)jHSTSE{|4h;z#kJsL@$F~2 zGTih$j7?!AP$RA*M=yUQL~liLcV#A6^SpU~foz(>D2Ze7d057t7uvxVJ?%B7d2r97 zw(4VH{pFht@8pxNjRjs+vaPjU!CKfqwwn7jF8+KsJS)g~PLxVXeOv)W&TTR5Ejeo{8SL^X{3F^bFM z&_R7>^eX)e`8wZ--@~61#`b?--j<*H_TiV6poW}hFF!}3g^BFw``2M*Nt`VchH^1) z#ea$|9r$l&kq<7$cUARIMxvCr180Y|v12Q%TMu@YHP6iko^*ccw0I>KSlwOu2k;4Q zKKE?#d+z&JnbIfU?6;}snxkuUU5?)k|4`MOxSSlY_kp~yO@MaI_?WbJn}c{ zNPZe8vUUdPJ@?Kz@cz>Nym`u1kJ0niaS;_4+Mgb-r5j#e{Y-d;cw>{i_Nt6wj9jvG zdD2J{KfEn7S0Yt&q|D&Co-p*>tlEB5!&3f7=0};dr&cC#Q^JtTQAmzGR?&9ubZ6Rm z&x*>YV|$uA;#L*Ie*hWAb~4Gd{_MbNP_EI;+-Qx3@%tQyX%)doYeAH*3xtYd`$tu} zgtL!E)$flem_N3+wO8nK%RCD`{6_@k+?;s)%d{YXK-~_KStGn&>j??#2+CQU`0}X3 z|G-GssJS61`P;SR>)BOikS;S}HLF{mX}X>nN~wi|_6-d|?fIIKF^phdd0R@8ZU_`_e;#L^fP8j-E&qsamE5aUThxL)smfQWk#1$t|VLNv-R3SlJ438zmYKq;plDXN!(%0iGJIRG^8he;Pz zl%uEH1zB_Ex&x4MLoQ46^dTLrm>eeQ<4drm=1fQ8+oCz!AycxD-SJ!()lgc2Tt~OOESpVK5mV`$vY4CE zS7m@zf@Pq}gcEFV@_jth>}93ASZxe61H?;95a53}5 zu1A$uRe-o1naO59G;dGXs?1`x%7?O{kD6n?8zfZDA&}(|jdWCpBP=j@U{~99k%0|G zN2X?q347QESQ0WzWXAKiA1P8+)@Em%(U%)$k;`7x;_>1)irc)OAYZC$o){E`rP}R& z^BD;<)h|xIpZEW8bl%ZyzkeIotu3XsYPYp&msklwtHf4&)7FSR6C+kjQM>kz5_`6` zSYOl@LG0Dq5_=Q0PkzsT_qosKBxTDbrsfK=-Cm`U1)HrB!82)Msp)gk+-qs5CNi6&+5fROZ zR!pQ612Nsq2S5r)d01@0)S0D#uzPCFceOoew%bN87K!qD#_n=)S-!&F& z{_$kz41vtcv{U_JU9Tg9whO1>0)wJn2*R)1%kD{ z?$#2^d>6cy!+X&iFtc^Cy+49bk{0&TWqmXC>%@Ns{o80z5=_9e=Mh~k&{`_E&8()+ z7eNr`EzT=;$VCaNU}I8=bEazYnAO=f%Zjlq5p^is%~n=S2nhP^eIdmYrM5rr*S?0F z(wG`V*{w~9pR<{>(9gd^duDD=&9DO}PJW;F-UeK{;bZ^>cQ9`~d;eOFxwce|%Tb6p zfDDW1QO3!xlRY%=&Lj2WTEh*0HTScBeSf0VpceM@xu(=|USxPNqP{`2JDiZInG`sm zb^+Qea}nnv_U>RymmDKdnZmkSHF8uI-wC`2#qqUZ-3deI*E#I*UcK8-2oG0}#1|}{ zexF~DzX;UQIWbE`l&}Rl+ZIW?3fW`NZ1#7rk-v2(Ti?`}y=tS%NU8U)9d@4Ts)q{c zLN$G|y4czhE7rSz#aZ4fMy>1ldngvzw7l*8{ozDiXG za%i6~f@W#WeXm{Lf&Vxwy;Y@hAVT>l7@?7cECNIOBG?ZT6!kIvEZYI}IVA*}E)2)`7y&BjqLCwVEk|U~Qp-U<`MjgSkm?Z-?afAJ2z9Hwv{Qzilm=2w=LU-(R3362&VT^*l7; z^^2#U623($lLQrN6PP^%6r5p|EvuS5LHBm}?PWiTSM@4JnYnu6#ft_e0q>d5S;^@& zzOVC`9&~>*`}*4QM=)LRD?)zorZQRC?TX;n)4?6&de6Q;_+ge84iljy>q&kRX*NUq zJohHK7h-Xv8P^DvgR`=fIL3#L=xnpL3rCXbHV{tWa7; z4@8Wy+_*TlxEd$&B}#|Ss)(6o^~3!yg>=>NDp>@*C|&Xy)hP82b=rZnZQVbq9CWgG zS~6loMU#rxb@_c*nMYNjLI)+EM|sm-0G)>Z9t9Dt zsOQ_R+X#HuTZgs`_^Kmy^kKk^_kF%t!MH~VTZguAdbNlaTVEr<>@K{Q_t|kSKoNlL zOJ0L zk|JzKv>A+c(n)bx^ECmgDfoIh(5ca3lZmKoE1_HKKaPm)GCFBdI}zEQ8ri!eEn@`F zmerimE+tSOh-nE(fZ@+)Rx1m_hek^YQkK_tNO$<=bOQ^&dBkbPy|Pf#{wEh*=FMM| zHjk>|0*3@%nFWhBYR#D=1XdqEQEVF}LupvNlCa13 zWVU-(Hco%MK_XGc8LDT5+eqA~IhoUtKRn#BiErSBZ=?vDoB|vh>gQfv^{)k5=L}6H z)~X}obh6Xc2Hpr}03O2u|5nwvH;6gJoOg;7z8p}1Senm6~ zI-twNeqf%;#3tofZMivm;%m_u37~guFy1X>*#)V6o0djotnb$4I&}=O&DPf9}pv3<+87Od3vY&alQMB{< zc&^p))2XFBc#P}Y@B*T@rb%)kV!HQH?nR`|0uZo@PR*C@R~x z?J7m4_bleHeBj$3_mye|_NoQ>N4ImncTuo?FgkQK&7 zV;PN*xS1SNJcSUGpb~21Yt2!dfqmWMEk-uGBS|kSDAGWv4o{TA=i!T>un)W#rTYUq z_MEW+k0j&NXfI%Xt^BuZji6IUdazkZw}pRX7K*bk@q~c72DYHel)%LA_yumC45ROd znwEgXoh$a|qwZLVc7(^f;3nO_ajk>^Lxyq$XSH=P6rJU_9skD;;ensE@2=xj4fy-6 z<=jjYP*SnGP-9b^qlJS=uwdDWWUkBoETw}8LHkx3@#AnNrv<1=9&Y|08E@RRvA-H7 zNT64De{8qo)~$E+Hy^E02#^wEpM&-8oZi;5*5Ts?F+H;%)%X6m->)vf7CqeYZRW87 zzj{i4b=Z)temsx0f%B-_pb`MEpcp;%Gru28L9{^bpjKeMfi+tQ>&n=FWXy3vu4N-N zbN^wf6sJ$!nDVQ%sCZnYvWy;GiP<&`+AzPFwWqbfQ8v{--Z=w#896P5u!#QpAOQ9M z{y}O4LV;2q`Yn7vYf3qiF*BKl*Dw)j?ASk8h^hn%jM|`vj4xaU&NkOf80!0lbdvjnvm*ir$j^x;|W=eHhkv zh?SNmrd9M%D2j1@t(sEeXL?1r`-z(37MhyU?cFyar~i>e($#kR%b0G&kl!rb(fM)v zHYG{0z47Rif;<`9Q*zRC!Jnv!H{O1_w0sSM{U=@ehaB}|B=W_LJVTBL%DI$oG>Rk7 z9!=8rDBlqiyKhqY`i8rhlJc0q+n;Sb{hMzL;zR|uN$!1nvof@(m=5rRw0JZI5L+NR zzQa;#!<(uO@3Ha(1`Mz_ioto~eEZwN3e6!p>1xmWTLM>@V!K85q*ju^qlMDo&W0@h zm)9d!4FSP@?tTS+-Q&Hc=?|cQ0bw`0twr$0ivc+|d(sEDc174!w~iKq8iLaYNEvUY zw5{J~Ptpf>e}6l>5sO(~^c48KODQs5O{uVSfFz37)yGqLvo$GQ<1h znyh*P@3RU6F8BbzJPgefF?@8#P`9!ROs~5s>?Rx}@5OTIro6qfy@veilV5B^K>k()Ir zS1h|8O1D@*5=RPkz8S=%_j%ieuad`O;xh*bvoO!0k1{dp4q73x4$GsPTMPn6t4|C$ zAX9-ai8cCQiKsj~mi-S`EnFFnm~&ZGhs-wwW55aBea(#&YNK{o^Ft@1srW&fM=O0L zqv0cgYn~G9>(XNi&*hNc9o?hgd*cRGT9pJQz7dSH?k;yt7Yg3WO&iy2fBc^>0N;$9F|XwDW2w zlT~UVYPhAsNOVm<0qC(p088jZ=Y|NSFI)NwY369#H5?D;$TZM#q!4pXuvJBUcJLZ= zol7OHpJ%N1WLem9@iRwd-IQ;cm#=cDGBqezRr%TU#=HW0<;Mc8WX<1Ze;i%%U7bp4 zwA{rUc{qB`BiKq#T#L|3{*ADw^lb*#cLT& zuuv{3b#o8@^5Z)2ko_jQef^}yWUBQv3ObJ%V1)Zxq_Rjl$Naj&sud;?Q)ap=suE@3 zpfj^8*VL;3B^E7NGaq;T)r2puYiO|Cuc5tyuGgc_)hI-Ery=sV4}%kKSebfz*hHpG z8wZ;fWHN&-n?TWo4$jD$_gcv!SxlE|rk2Xa=c@)@Il@6s*uy59`&wbCiCbd(NU)57 zeG|4N^Fn4Zb)=|hyquU(To!qGh3r~QnOyC4Rr^(VVmuG-4Y`%Xu{2oyk8Jz`85hyg z1lMQ)nnBOJ5UrlY4rocWu|M5LM;oc=zh(}}Szu-aK0axoslRXNZ2PLYpO<{(hTF{> z(YO8+BbgOmepCFV&Ht_XP3dJK`oH8(@`}}I^Sn1v9B{t7{WpL#+@jWZMXk+~MRlrC zMT$gh3BIOO`67nJK1cC;hV+#S_`0o25io~SzG%I@Y{uP9=6C(CX`hl~p|agF0;yTYr~R zTG{!9@V(nV(G+FneU$Q$!Ot;Ir4nDwPtl(G} z9Z~v??7{0d!YnRtAHBMFtIUQ2C?8R&&7`4gO{Z+9Ag{wjtG&5-oVie|=I)y^A4?aj zRcm@LR;|VOj8!-{&?f(TfGt(mHgG?{L;28~IPBB5ve3Kfx9igW6yy%li~D(U?|U7q z#71lp)z2f#1SA)l-+gZ7;{1a9$Ra57`1;Ba^fhLJPJp*JReh1NPJ{NK8&!j?;`S+p zrN4{(Jb65N<^#jn6l(9ObN~3F7qb-Msn8q4svWBEg|Slqe!WSz@ZEmVQ_T_%%aDM^ znvNdIHsf_`Lmp^ZX-FJ{)6vE~+BviIy5iMu3A~|qbIOxAi{aiK;R?6;b5-B#*gx5@ z1{zC`3DMVU4rs>0zZHmGMNw8nnWgj6e-)&B5~e67a#QbJPjc|>&8K#D@u4E#aH}_D z3Up+z^~gkD-r%t!BUvfP80;f+-N-(BS-*?qA`@5G?|&l?dU?Y`{^rB)n*Y6jCa(jV zvBS^@*DEz{Kt$v7Yzsd2!fYK1-MYA#1Pbd|ksI#iMeJy{om5>`S6=siyCq{)V|yyj zUXOkS<41I9TD<r?z*O4KZNZA`{2p*vE$dRUNg!28n83xC}?TU80O3@yol5a^)4 zI%_J@(hj_|nzmzXB4}On*@kIACbfHESBGZEO-=hPSbn_MyZvn|r0ai&c-o+@h1#ms z^i>}+e}AJq-}+=NS!4&RuS7F}l&L$LLEYbS?Q2kB>(MaoO*QcKoH)FAg)AK+^rFDp z>}fK+B|N|P`cn!JgNC+g#E{R+et&AB4aXG9rLrGZ6hT_D0bj89EGn!)=b?yt#jkGNZ^qeIxyE=zgS^>l)8`aa5k?*Y_Ue2Hr^+#ouZlwX7KyBkG*h6_F-*mWvL-66(xwQ%LVtX+YlLnbAlKD)-b z@7NExt9~aF()|zV4>h#9#u`9VP5^ONBVqt0TFk%xPOavglwR{pS)ex;=+;M?TF~fa z>is~PG4x^q+*yBcbIN3pJuwg!>^Yd>TRkXb-<&j8Kf}s{GbSRVj4Q%iT@On~e)Gmh zcwG9{OqA=U2qvw_Qk8V1F5o&1{KHVR)z-i14}tv79C(o4__0Wlvs?e5?o{zE!>6B; z+WySCC$?1v=w65kNj63W)AXR01=-rG>h}MUvEpit`~^4eEz_>#fX8vm3c3;*B zx%SC&4tgu2O)%#uau9beo{&5<10*4@sO(~bdqgPkpjDW>E7#rw z&y@kRcm1CVEF9$QA7p`?4t;NfQeEI65M_}89J-~+uBs1nma!S5U4fO2{6!_Iitxh$TD;&H=P1%KE|#q&YV_PB9bJ`z6)v$kTPwyy z3VukcpxcaQCjQNli`Lb3-C@(r>Q6UXnVcqC>MsXoZpIZ^ClgNKyp5-`?ReRTkO??g zn#0Gu)3TJRMo#_Yl#9TYSv0=s;J+Jk$(|MzHCgedOGeaCu)*v(*Lnk>q$(Fr+%eQ{ zxp>kW!xwFsh^`o0pFs*x<37YvIG|`9s{I}#(#4-Hdu47A_9ZVJ2~q(zxH@5r>H(J^ zJ-3dayBTH{J#mkOMS^8qPy{yAgy$PjMCXbui{bp4A75Ml3u9!S2KN1Je!etvp-=g@ zgJD!^H=PU~+dXDbP%q6>{P+`3k>LH%9cIeacHe{Un>PJTGSPTzWt0T9!3}oKkfK|K zekQygaa7E!r(&*2@bkTT>9}(IVQm0g0(8I*N>XFEttK*-i5fE4H#7xy2e26}B}SLK z!h))^#`vrmxSmapAh!>C0nwS6sJu2+QqXu@H1372UK*#_#$w?}RPYeNj2Vw0rrNXk zUf4j-*uVFhp79d?ZuEZG;!|y4)h0No;-ob*vmG}@9dtEkx^s9ajx67)51WiH4`xiF zjB{GW{CjmKyuskWKxXv|&D@gu;Q)1ufKroEvziczy0`rU~j1quJYjr*{T{3=-Y43A5KTkB|MzFet-;*HS{5Ri7e4JzfWm#x}RO74+;)MB7 zqILW?D3oS7{JFUs7j9Qh4Dc?^F*_MqeJJg3`0}x-(YDFfX(WO}W8jl~2VLRxb2N1P zIGd+QDn~juX6Q0b^H0l9ncs50YB*Ni?pdlc9di4{M2$TUg-hx^HJq*s%qCf?3YDaG zPt4SnP-Co8JFcw3O8H=6)d6LE>9HB{Zu(cFjp41Gd@~u`|iC8t6X=~6209}d2 z7jD?=neJFK)^}b?8A)G4Rv(ysf_%F9?KuTCCHedNH>o>Fqzh|WLpS+nk-41D;}xfW zy}Hv^EO0aJzK3L=eDJR@b<6j8e)l}00l4oFv2?`f@@(@1vb!D#Awl9_7vHw=+79|$M$PeNqL5~E6Uc2LsE}71{*>@3rOm(D`CR&M%O%56J}HA zNr`c=c9ywf!42EU6mhFB48%qd9EN=fep%_FS-1fsOyvy0WoWT*v_oLkZ_Q@*C~=QP zSTJhgZZpz>X27i_g>B_-bL+^N)1O80$SZw)~4SCn>$Vq2A@W zyEPFucal)ei|j3Kq}QxB(v$Lw9s&gdq2n-BYZt(8>pcM`pmAolv1lqqg!(u`OOI!* zT71@qayhrBsIOi6P^XSKBdn!fJdu=&{Z(Y}w%4*rbK8-3u*E(J1G`KS=Lh1%bcDD; zv@tZKm3m==4r#Q56I2bOJbTyhw1htYvHfS}PibX8^JuD9Iz`2!@{*#R92DrP(^Vm$ zWQImGq9Q50r9-`9p(o}nv88`FV)1qTfvcz|z_a>MXhQl_oH(1ok)6#S{)sR|z;I~V zL5fu&urKYnb;Q@Tf5WfqEVwm5R#2!$qjJK&H zv;3Q(3pxk0C}6#3GDh(5Bp)uilw~}$D4zH;c7iO!9l!cQ3~E_qZ&+X)DuExz@vE=* z%bEi)coVz>5yq9sebG%C*{>V?^egX1JJU2{BKn{|iIOPr<6Oe^EnywPUbyPbwBS#64j@z0Ml}~R56@2&}m=uw5c=)*J1kqDFFNN;Gc=^vN z`X;ce?#Z=FkcvG*RxB44Z2H$0Cu^9$Dejqyck4(mo-^OvxbExzN5;UNYoTzu_!)0> z;@Xv?iT`uTt7?4IzEE>0+l-Uz+4y2M-oS1+28K@(*-!ImsP;BH@ zbH)AIC{Cn4jDoC>{(SifHjob66=LV1(!?pq>EJWWKYHS@+IQlGMcTBQu2e1lk*Q?4 zEr)it=fn46GICh2bq)Gr->oXIEw&@!;m>S1a|=Eo@q5$RQsGEi6L^p#Z8Gn1h37kXI<_6~#1wa=xfw z+93v7`UmEc8epYniX_wEQ~_d{)V_n*em^CBJYVnvFRQg3`5pNC8}Aj!y>#N~pOsdZ z4;kETj+j@B?EH8})0jye+4^hdnf4oM+NL=y-Jg;woX>1t0ZDfsndnB!y40q?Uo_bB@n8@ zHjFa1FO&5whL$kdOo(M@VtMqFhcOpho~aT=-~~VmUw3lr_+XE@+NKoEOIDGX+`-3j zoXMSe1Hr@?o(E3vu9fO4rU|`*#S81jS$zU4Qw^Xlv5J}p;sd)%N*6@<2L9Pi@e1i$ zUtYE>?)rV7MyfYdAvu}>;#jVq^}ayXdM`qeqjQ$%DwaoJ`VMXUm_(w#l2YSDq@fwK zp5>{{T1LK2Vxq|4A?5{Vj8G_tqu_@ZY6;aZAQmk1iLSOzAokE zL0};wKx^bA8?wlGUCrT-GLr7hPVjHMT(rno39(s?=}5hIOq0ITGbet$;xe^iQQo2D z-6f+T8*qM_kB}{&>=pX?L8}4g3sNVryetd|!dd>!JPN8LSZ1t@scjacj6S^m;A%7F zWlwu)ytOW)Ae5oul4zJa*Zv1!);zGc;Kx6{or*d;B!pXLA-(2;gO z^gTEJ9iC(}CaF2VC3<pLLz4!jjV|8lsyJYl~WT6W`bCpTDIK#7S3NoKnvfy9JB>c4eyXF^PoxVSL znOR16*e7sXMX_>7`uT&tmt@FA`2y96=r1}p&x64EWB&Dmj?P!i%a1~&0-m<$w&R^ynVT25l< zM)21`xV3nn_FQ-l8_ZyU9*&Y-z-qOyyFh4{)S*_GV~U~EO8<)*UEn?mS0a6Ap>hU! zWIvG+3)krrcH7XXG0G!|E#9xcPoEr?sKEQYKwi~=R-fX2uJ(HxY6itSH>8VcH(!QR z^UqVcb!tYR9X_5fv@7c9V$2lyY*k=QfAn<7Me!@nUFa?Ew^fIS9->*nL#vk=Hc1O< zDx>)eEJq(QD*nrd!ZeaaM)FPKhw^pOKZ24Xbx`TbqspV^d^ROnrHUnVtg4D6_n!^# z7gz~hYA%zfhXk_oW^or`>E$?Ja4 zSBq+CO1svsyB`l9@5Y-m_fph)$OIePQ7PI;gt_oxMS&V3>(7o;Oxc_5{uuiuRfl?A zrjYtI@IvVo$GcQImzUsZcm^9wo_`P;<_JQfh>#ME-^$7iB>CJ^ex zjPBg1?kK(nUOrXJyJOkx!mJWbST6xU(#H!2a9sZQ>p%TJ&)=$eeQZcrw`!EMOsG8u zxlqhv0x5;)(7v|c<9-l=LP5nHYrd0bvpmB@$uc~er?fUe!Kmske|sHjD*$qiUThVl zQvY3ak+q3g_f^xmHY7dKNR-Pp0KR$P)=kHE#Br!uA_J^Z&@OT*VonHT+(pz(n*1Zv z!8-llBrl3y;g+Wo%cWmU^ynTy|oGnWs1156hY~d_H)PrQNggl;u}GVr?e|X zKhk3`W}xA9;{j(N7njUT{zcZB@XpVPgX4{%)H27-qgFXn0)cnnfxXhhb#-E#0m2v7 z-<7}VuIV@)1{24_nVFI` zg-FGFa#12fryGH-=)B`|5bWeiNrxY>tHhnq zF{#`#;~LGUD4*|T-h;A|v^)ZXw5A&9rJN5Tv~C|_Usk>dMdOdlYm5#wHR`mTE+{TI z*LUiF`vqWY%;mJl-PIo58A8s4Gh+~Ug*Dt&v4nBko+MW2DBYP;#D~&6gJ{rmvsd)JiTc4klz8k0*?J6BD z%!CN7qmMY20rt&VjBeu42?ET1fnyL;q|yvYY>z}MUtDxoZernVv8X%TV=_afnKG^J zF-o3^cB_Lf!-dpbk6p`*ug?;vVEHEYF4k`YS7dYUN5{;$K_R+B#7eSQTxLNU)-IY>mfN}8w9Ly97^lOA)hRVz zU||mV;em8!&3IQ#o${rBKelLXcd@>8LDpD>Ra9#bl3duolb`n&H5%O(nW(-sC|*n3 zK=DqUP&`lQh7Zy z=s111Zh$rmSF2tvmT4!}C9}O6-=;EWOVOn@QoXv@-<2w8>Vy**rkIh=h|*4#^o-)R zFtQmOl=4{H>o3MwsE^BtN;T|4HJ_L$pX`GmC7%o9*fp`1S_2{#y}6%`-PrUsMX z=HVI{nb9xGTk7)ixczVBWbbdjR==}Gf|}p|{HAT^t8_F4^*14b2h?}QUZipJH&fGn zI8Kes+XU?XW#H34!=B&VhiaMRvQWH}(4tp## zWd_O#@%=eJqgXkjI3R2m*u*jczbs$FNBtpjfF)F4)ntbj%cp1!e;^?K9#d zhq(`6LyyZ<<4bu(Y5v%yRZu?(`()?!{L{AlCo=gv@kOVYMZBt^+nC36*6_^W)H=HZL~&{697L*-uD z=y;VhUTsySgkIHn2M8$MK`9;`ud4JwvE(*sM-@ui(W7B~pcF|`X;ck9;dLo{9w^K! zP7b`bHT|+-YiR1q7BfB2>XS6w8$m{(fO$%j1lyA&6 z7GjPI;=&;U%N9Kmjljk!>h)Av6{jeUWc9kl0VvLq8OhHO#Ml;epe^9pl|;Xg84p^8%M_=j-)Voavsf#8u#(duEXQ9)|Shwj_Ey4qaL z3BV(O)1c19<}m~m zRrgT0xGM^T+p0 z!Dm=hR1lcV&4g%hJ3)@nxbyEPvn=NC?uk zN4taqdDry*K3UiK`?#uP|9!ab@b|=$HZ910m1z-v!L)QEizn4wkm9FZ?j67NVGJ}6 zG+b&wr~$r^MzI`t^^FSW%+KQwh~arhg`iHdb4YfcQY!Dzi%jgZg&IQw7E1L1`WB z#wjO0!O&D}cB`>>R{uDussVYbVTwNKsNo;E%RCxK=!xD^M*&n

            #}h4ElNoxCe5`)^`3oF1nLG(zU_@T}fdncrAS1OT+L4iw z36SYg-uyNyx_0Asb*89wh5YnVs&k?3OlC6UykRay;lUvE8;NRc86(3^FHS*v%U9*g0H!QREt#M2SPNr2!aX@B4#q@N= zyK%EO9DyQNQFS_gCD<~$w##fbBNoF!SaJFMA3BCS6zJHY>% zt0jFsRkz4;_Px;VO=fE|Gf3Z9?RL&?++6Qvv9ey(?}U8pR^I4q&bFB{o@^@Z)rj-^&Pa?P$%b=3A=r z{B$YL>&X*xnI9fcKENcs6zNH3ief=*sqno_DtEExdut=A=ZT3E(rX4VSED^C>>g{c zjZr#|bnx{m<65(RWHYrSKLHHE-fxj4wD?xBi};mwl5yWAmER*NyMAEkY}Gk^6zQ9A zp|UeIaDKj*8$;sO2g>{BiW7rC8i_mw5PzbkIFpf$;_vq$bbpUCo(Milm(~ zrN;8(lU%7`Ntf^hzX@G!B_^j~ha`;+8H`&g4^((C!zEb}8JL@Wp|e(l8P{*1hq7{H z!s27qLx*9Ws(v}-7?=C1mo-9rUmS7+x||u!1C*SKa&m+PrX&>pzfr&hE1?_aSzWEU zJ%mo+CdQq z6Yo>xdH?BVaPyPTWIf6w6c)E%-8gq9o!Gn6VYFoBLL;x&azB;x7BYPNfmXQnFqe!% z_AS{hG~LLjTyygGub$lLqcEKJ;*`hTpb$S5pnf7k`=7$kW3o37pT4}0X8Kq)O?KlQ z2~=Yw#?wEZ-BD{pVE|wGFH22!hR||>c1qLQ0yEk_9#miFj{)X@g#X${~DG_%dGAZbXz_27}`s@ z&vJ-UTT0IM;B-o5yEScB5E*HoZ}+`Z1Z9UNp)bDuz??I6bCAsMy`d66W;g|lv|tKv zTPlB+%ExPHbIg7t`&^uQS4T+6i311%#OFt^-cb8mbz?Q*6d?7PfwLTmfQHhVt-1hdl}vFNsmVol_Gdr;R5lN+M}Ah6Dnm)6apC!{c^dTL{)gak+;8jEg52-zK6~30>Oz?*w*I+xhrtR zBzncLASL6kaR2s6yXi^#u{ncsmx*G2Wb|RjQA#t@MhOPJa_H`g!)(pG!d9KI3QX0> zc(!P5#10*xIKmKF7sL>3NmfyUO940hh*4}p7YH#vUIa*Xr&=d9sX#-G2rTclN@@|zDd67Sr-M{AEGn;O zWf{0@z8^CbPq^Yb^_LEZ{N-2=tADF|6C96Zn?_*QR0Rr(Iig7QlE$k}Pl(er+*<-7dWqce7=k$tkZYfWHF8&qW&=>=2(@uA*Lql}?O@UPyz9NRv%=W=`LpA- ziQ%;X_B?Sg^H`-ZJdO3Q!K5N31~5MPR|w%n9XL$sv~jS*7TEBXNVSxsIqo=yY_}wD zs&D$@*Tb{Mlvc9t@Uo_A&4W!8>so4VsXcl9rq#3xzjtMjxVe%_6@FHTr71>a6VT|v zu%&$6HQxl;e`Mu$3<_6#2w0^qZZBsKaL9tzP@>RAs_RBuH##$32${JqpULESevbwa zPy=rMg|U{p*z2eE2b~(P&C=&aYCSOFzs;<=?>J>$o2n$}j;W^jr_<^}AMRB>&9-!9 z$AMVI9mR>;rUxH!{mT}Trv?FR;p4Bi5IniVWwKIwEqhfwh83W~TVy-Ho^I@FF(0OiAy~b2N6^C! za@sjW<_ZB8^Q$p%#S7e45S93Xl|Ow!yS-K0hokG9XRRWoA(&Ks?dT6^nKQxke`GUW z77ga{NXGZUoo7mXm6s8i6-{lG#xibdqulBT@yJpaCga*BhX^ppvf*dcWB`wB2!%Kr zfqm+4q9bE;Qkl*@`)hd|xk!~h_-ocSgXC~*pm@?8Ur9V{n>jzvx|S{VwJ>qkfAOYR z$-Qbg?UQ=R1<6YODV6>ilh?CtGKSahp9L^{NFe`CMn^6FAGsoh#mkS+?#I9F%O^SG z04h)WlHbiF<(t~-dVQ=N*3APisrS6$FK}Q|?A2FZViFhpc*K?@?gjriuD!AX$qnWl z^Eh#L(ELg$Uhaw!gZbUb)+cHE?gnp$ZD@Uh#n5N48(72#Cggp z(MOur$((}IRI|B#d<=RD_OXU6J0?)J^?c-FtfcL1M$!uptG;9^Avlln;n`r0hFf8; zfEnoRpKR7F6_#zRE7;fAO8rj)5o@adfCQ-Y`hEAJ!jo}529?Stcwx^fu5Rl4&3PV> zzUII)DD5#EzhUiMuVxzSE6pX={35?Ev4*Z4+Bm$e@Y-q;15!Wo)Ev$_lH%ci8MaOK z+VED*jowF^Ll62OC52#fkv02sNJ){cX&h8_xYn2G%X&apK>36`cw{?CyiY;!G3*(jf)JD3u8UEuYBUSHFRa28uymq3de7H&`L}H=`bi;1Q)05u_ zCI2XYYnSyKDc43OEkSH-ZiIt$)}G1Z7^9^)Xi2kxBWDXciuB z&q1y)9)LIvPqs>Wuh&T1`@3KYzESLgv&UNe4)e0E>$97pQ2b!UgobiZ`-=;H*aJQYgK; zm^u#*>r-ygF}+_e9+7zO(E!hf`Tbgj9(pOlXAp=@8V0Er*GV(FE@iLP2w@bZY>oF* zf?GX&-iJR`IW4wZb?FB!@=;l5NLfQU>W$QSV#~*Xqj_sLKdWd{kBLQcF}-HW%9s=p zi&lx0RE<$iTDd);Z8663xLWCeKgH;AQtjrh8^`;spJq|YX{3A&O@;iZ{8W?>`vA8% z3gYou_0B#E|Jz6taj((Mmp4CG-T1FoZTsO{1mCS`%iF%c6Xk2|j#EHXPBklENxjzG z;`w08kaui%8|jk@{5T4cS5?k$v_>fo z+~5R#*X%vKw+PGTE*t-w?Z`8=(_c~?*mSP5G4PMfbLFHJpo?R*4ME-qg~1wwh;lX3 z0pQB1kCVMB`9lZgd-kVo1tV%G`{zPs;!@Dqsp80ue`M>z#MIwtnd?1CE3*^f(yPvQ zb}HJ(VAH&ElPpOk2EX>}UeXkv^c5Wmg*bhP1t=Q}F`LGqBx1uIS53 z5egbpKX~L^`EfSEmtN35z^Q9zwk;*kcVZS1sjQ&D>Y(a*VP^qHRzlW5nh_OKTM1pk zu8vLD@!Ld{8aW&&^H~3B#RfiGOMevfC`6)}&7WEHFpG8fI<5zv?GON|)Y7Nh>Eand zonFSSCgO5>rwn$8FZn?tokIt`i8Zto&EUUrh2wAx6MlLn!S@vp=lBAr|8JvBL&FdFKFikT%J?>g8p-F|k);4D=DdAPjANxnnB*nmzGjA|eKxGMngp20BSl z?qzPUgcf*?5%vksDveh2<3_~Tzh2YGGKA;?@t#6V87r5v!YV8#F*2eZg&DH0C3w+Q zLeyOrP0w)^0e7`@34Bl!4qGV-onz-rojcLTJGE5>Psrv1kB5Ll`Mx5MO|lsjkav{669znHjOj@?N;4KE}dJ$M%At zWwSgrhe#~5N3>V`fT^SFLW-7q=En*cH9Viz`+(I-j?0Y~k;Y30=2$=pg2D9v053t% zzNGZzI=j#A&Tv_>VtvwQ$I;8X?<{xXOxa(gX!F*Vanm&5qg5Wv_^kNnt?F(HFPU@p zJ-&~sdOm@IP-;7}xWC%Zv3)KYKSOG@STLuo>Mq>;s4mGIIOlEZei-Ylt}K3~(Q9yN z^topzsE#!m`-_P+$8+R*-$lx`k1mrFoM!7}7dCl1hUGThrkV9#l=U=lbzKMMVDe?h zmNn;j-=3$*_MB{wJFRJRbbTJ5rDu!BpA>gxhs2*eoO&I8yIHKogEprm@Zafg;QcSJ z>-{V0O-^SV@LHVR_wgg+mOh~H%d}vmi_OdIzsh6iI^U+cTpaaq%$6xDTVDsCgQaOSnvcw4 z__*6XMdhEjv)!AA{{VM)2dU}RJl$Ii8Dn!z$2YVN2S&kdpfK1@!=q@ngBW{a*l$9lLm2E9 z!+2xgDqM0yRN5N2%V2EoXd$LE+8av`159O98%-M}v8jlwCP=p`Gn9&~WQ--`+Dyt} zShFc3Ss1orswEpn5{a~#lOnTdagB_qqK&b{>%^$%f}^4XQyusvPnLIMYPn~bjnUbT zW!lt^&54a-kCQm$E>g5+^k%vB7~>_wJZ(-nMD_CWnZuSB0}`chsWhsMac6MitrK1W zB@)`hx_X$$1>Zjh6m^Zx*_KAx&$_r~ClaNPp~0xMt(|etN6%?>6sfbdXSkd?<12?; zy*!ze@$%0jQ<9rQ%c!JrWy@opJ)CogzL}&mRh;SA(bmZ6)N3)kiyRwW=*>=(FqGV^ z)SrS%=)ohUoH%7iN|mB@7J71OKT|nQtnS^TlkgMi?^{8#?eR zGV6^Zty4v$q0QNQmcyEIZI&};w^);c0EP0Xdqdl78c04$*)N7I zw15x-UBbBK001bqZm>7pYWrY<&Y#NPl=w523JI)6l?~%)RMO-CL$2VU!jK`*Y_bFc z+e1*GBn$TJHUT1{_6EVC3QEe@Yl;>HVu{rREO^eCK=g4LrwE$tE)Xh6@5*L4=8Pno zJEsorj(I@oDp=)c%6P2laJCLS8MTiW1hG?MP-yJf8x9@Rk$QL@mK8|k!3sOEDl(oY^r^=*l)_I9fHR@}-F9$%fNCX=Ai=PZ4y-iJJ+{ zEj_+b?c~CmYL0o}F>bDUc<)VU77A2)UeP|y-vnHFveTGLPe-uu_+~T02_8$qM7$@a z@QLCx_PFxBfOu=c={y2>JS0ONYsK7N(dj${`vz@m9&5xeWc0m(Jvh@If3ifeQRqA- zQ^!^y^JfYCC`E;ElLDAPFO*dw9BtjVIptkN}s34Aiqwi`!-XuB|pq+J?{-aH$` z=Yz9o8lIB06#&s=AtKTgOGeo=i%1bkQ?j5?EkqG(g6d%?hQg6W(-F4DpfQb1N{L%g z54Z_LYCXnLbuiQw1C1fB2QJKNzlHv!(DaK7~Jdx>(T_cHbVul%=P%c#K$!5$!d-%Hl&^jVwJXP!Tr zd_UcGXDr|48so3UYpBv^(@JV^ZZT>*Dg8IQQ9^ zBGR;CCyL670Z>Aku%`=8c;-4=Ys%+tg2a{0@P~uXONd5P({ugN))B8MUSQ5)G z6Q7oNx-UU={+F{+t#_LrE5bwL;@R!TuJhD>eXHsDv{`Ct)pxHUjP3O|S;MIHI>DsQ zvT62hm3DGCu?hE%yxot`e+~NXlcQ>NUi!J^Nkm?<^j5la&D1f%r=9O`hl@T>re&TE zrKZb{JLe3sagWQh_O8F`zMZ1cLS0EbQ*pGa&R;(pooUbAkLK*1Gb`6aPfg^M)NAg3 zfvxnnNA$-+&6}vTmn`E^zY;xcd3`mj>R;sd<8#LMp8@L+QA4ivO|(CeWU9cGUtXO3TZ%K1My^wgdWeB&%q#T>lF zGv1!RtLZ&Sq|vkp1%qFLiG->)IOq~7o}Jhmhn1wZqDyT z{vADJ*HY?a$QFpPm0(2b3&smQHIBLx+lzOvh{A8mOWbw z&yH=n)HTGfzkc>%m#S;?>RzIHnY^bi`j_zS$2s-%_Ii$u=z2_WLQYVO@B2OOiRww{ zx>gRKubtvhtW)zF@XtHa7+0uzj(_r-^Xc@sz0Hv0bi7%?)$-P>DwZ#ApV9Dh-o7t$ z^5yd1F1%;qr>MGP$C_HKD&Z$`JN8w4Siaqy+2Zt`uZDVerPa+X zzopB{KUCfCW{byI2 zZ(9u6BMrG%n924%E~k=MI$onbH&TQ*ADCs9uSJ{PjI&{$PpZ?aH*DOj=Fe5=Ptw|m zYu*{jEH>(Aq0qWET^~`BlTuBpYvA*BUZ~V+G}?5dw^51Qr{8hz`dg^x*XnXlG!#;e zMxT?Mp8Y!SuWzH8<-N+&#^cFG;jc|^^PINGZq=$gARd>Hy_B#92_ zmPNt=SuK}C9xQJo??`aRcyi~P+YC|NBgEHrSDPxsrGG@~zQ#K0{Xy%zvCo!E8&3`; zcD%DPFhO9_!xFozm)(xXGaz;Z?k9PnLL+%Q#*Hk_$=*wtFx;%lQU=WBBI+AvGGlTg zPV9<_7`{<*W=sUk%VIL5k)nu^ads6^RBr4Q2UIyh6Ish3Q8D>=~|s!N7> zDs0jj+9e(GcIhLZKM@70jAP{-xwG$XnabLgi{ea1GMhs8A7;&EWm0r!A@8uX$}_hH zZ4CB|q>M|NmTRh6Y{|^cO2#KCCN#r7T4zOB#~u!aDl^n({hr$~mkjCM!IsVJoUBG8 ztF#R;>6Keyo&xnPKQ1Y|vz+LfqXu-1M6T%dwD4OGE-UIiO+2_W@_jMewh%dW3zl|4 zrj9)GsW#cijn^9Ho7%0MIVZiF=AE3(^hoc=I6#C5(`!YiW@w~DXh;)bWHDO`;@GGm zqLhdkbjG`!idgJ1Le7{%jQ(1YhRQ`oEa>)uDlRUgcGP7#8@QRx2@!{2-%Esnsvy=0 zlecY%VL%8{b}~tdkVv3Np-YlRBA`mmV2t99m?8lqs}BY-iM}O7s~(0Ew;9EN?Z#!d zRwL2VzZTi%V>|E#j^t7zHql{BWQ_zeuF0adfDCFZDTD|Iwvf~;Dpvu0%h_SFuE2q# zMG)8o0jA0>Ft9U>O(P06jwV|%3OjMc!xSj% zf}tukNTh^{MTiiJph(j-4H-%{bXA$M+A!F2&K=p=L^v7M#{}_OF`gsRmNO@hhD%z< zobd_bqrKxN+M_zwI6ado;j3u$o+~q!F{V7XfQ5wgy{ba?d2WW7^PU2Inms3q$aswT z81uc04`lQ`u5a!S5jCuN&k;V!=&TksfN75^c(^%oV&$IBOjL5u7jnv&@iOB$vOxB8 z;ynDY?pad2$)gFQvnn}ejYm4b6R#qfmh+^n*HmX_(UHR$o5p65*BKkaM;e)|W@vS( z6r^)0l%^88qRLF>Q#4a9raDuil#XRGl*=k(sWOy~WjZNL)}}gC=xRqY$UWuM$42np zb8qj+dxK1L?;igEmuD{V`-RgTJLr4PRg;@c7D`0a$6}dId>m^p%VT*hcP^Nz%FHJF zgr;LDa`{F&>A4C|y&ThJ%0@Gh&a}p7Hck!Z&RmbVnlQ+6V-tj!VNm3>x@j(Q0~Z>n@WsQg_}GU8Nt7 zxtlZGblvpvrsF8?h4Q&i!CEa|O%A(HtHn-uGAxn5Ejv0Vq5l9Gs?=fXQJyUDOKd8) zUn~8N7Vg?Q@!5~jGWze-Iq^@a>AId}a(l2oV*}=T*Qz@2T7!nWUpI~a0MQSn9`E6I zrZRe`s%v!e$+Jg~73Do1tN35kFmG5AnuO^Vd2f&5&#e1?VHfRWjN{%dGwM`l6&bk7 zF_KMMK8Hj2WtKZN8tm#E+r)8tm#As~0L(|H>8oxmbt*UGd76{tonKEw(a%W_QEBq) zWR@s$ujKkoUYlF%pHX!jx^6mlhZ=&u(~HR(F5Ar$Tcr{5mQOoA% z%6o12_gVDzt3>i%8OAHSI65CfpH%9&G|^2$a;Z<@c|TL?zPadn`K=1m&N0c}b4P*I zeN)ptH=Xs; z$-)`lfx}4W=54F~X#DF2hI;)EP}jLNEDL|{XSeAc1M3|}QJqHPq|wVG;`ypaqIGuK zyyuQX_1jYG+Km=HZ1ds4J|VrhMZR4le@S`+KU=M4rTaP<%b6axr@sukhO<_)>(jxd zyOsB7^?iBky+1_4`X@(8XM`(`*pEccX4fy}*YV|ttu_4>bgaD#MYArWX3RQ#T)5Hs zgnd8MTpi)2ol|E|rTXSRiPmSX)!}-L@RVEfoAP&SJzIu)xn{wOHA};Ej$P+p%U!-X zdG+`|OHWnM_1W^}gM=owTy6V&QO*_=-DYMDT>Kr-n?2Z|%vg7O;4O-IbrHdrC z&j>*7|mzS<|McP_;)FthHHZpoX1A zEN>;bd31c|r?v6Xbwsmdans~ZGWbu!H+r2<7e5@nPCYkG)oQUzCM7P^S98Xc-G8*e4d$9SB;*Lf~xPGa5> zrr|l5xs$x3S2HBL4bZCUJP&m@0?3E73joggvaFsEOj>nayR%;pBrjBdei-X!{8^=DOZD%`2R;Ag@ zZ=a@8yPk#_QRk#|;++$zv7Y18Q>1WamA)CTyTw_}k@C#(%Z!&;PlGmGnVUO39HeMP zC1q()R&JxVBF6(psTp&%&ew4yRMi>T8;e6Fb}lDGO;9Clay7vX@;S8~I58b@#u#y5 z2_5jmQ8ggpaHK?`XI$~ograZ7HOkDTcFw89%26+gu6C_5Hk-Jamknb?8`YDvo+h#a z=qQ+|p%zInM#jV2lRZz%Sk{=H$DIrkXKo!dnb(U20KhYL4w6%^KRg_pFbM7J75#dAp$vd!d-=v0j9 z3aHy*8*LF-ZRFJ;+sSGo2-{^PNVKSKCXt;56jD|-P~*cgln$CPYREC6Y&O~(OsgdT zP&e8eXbiTGX{`p(GTIv{8tnxTGEt{PP&H63Knyk&7@DYpg#h5G9S|~#HHxFBG_7K4 zm7@e&I&;%F(WGM}kxb4;yo_a$cQKMSlCn0O?@dUg}rz{*fM z31qdWG?5JHaVKFH9OTi^@mGW`gwq_`3E6%Qy?~%0j!$T75!JA21u@F8(0g=sxLT%% zu#%Yba$>WKE-o8N&th;mvp}cY#mx>G=4vBWdwHQ&d0K_tms1`#b==~g2c?~NJk0Km zO6OdeWOFI_Tay-17ojKQZXI@RCGlDryW1SkEqtJxSmP5^1(MwQk%^r%#TF7~; zP*T*7ID2|aDWc2wv&>qOmZc9kW7AnmS!nYXq@}4IaC&PYe(B~dNG(Y69-q1%>E`}r z5A#UANsmX}4|MatGKKk??#Gbyz0i42H}fbzGCYiWUhl&nxOu;tLHUyTrad*3uX5K6 z^A@P3s$7pUJqI%hOvUH3Ib|=FtZ6Bj%6u{!@DrEQT&%En+(A!Qds+(?FtOm;$Jur!8ALR+BepQip5xOFb2sCvF$D4&+u^nQ=) zYoqJ(&vkE&8R|-(POrpF_-E>D>q@FPzLwGQx@T~LH zENMYui+No8CHFGXbsa{FUxQbQb(aoBk`L~kqv`tRsIhg9lRUa@Bs99*)U~e{3nW)6 zNaytHW&AeuU#s6}r}q&lbBwr_bd$aDGFL&vwXL-%+LH z{Xe1lK3=NyZdCD57 zWm}~0pO$@ZRP;wv(dzw|r<|{|inHDH*Pt_K^*^2JaaFeA1FYk&z1J(>Jj{=pmI+~4 z?$XG(wM`$RdYw;M(K-jFG;^n^oD}8p6X5+#)S;iRX2FI@!%s;#{P{J}^$w$`#Pt}Q zvg)*}b~e0G&%g2Z>6-elRC+rWiN+Wkog|t0wzo*3t$0$rw^Yy3v3@1JR)c=Gra9`M zsknBt=6}m{g{q%eo+-U|c;oPymHox z9+1}L)aS>Gs6#uRqkkVqgYwN*uRgb0_4>5szF*(i^>OrU___|GtV;*Aq}9zs1Rs7m zv)RXcyBy|EPpS1M;{LN+4Mvlr=~f6gP}O<qzA1mn8el_B|o^ zc|NI!Pu04MShOv+q2_5F-m3ga(BQ$FrgSWA&l=dL4j}{6>zTbXx365X^+%^VMzf~o zk4}adWW(9O{Fg2%;mIgXH7L4grP2D%ev_|yj&esY8KZT*GufY1=$Z1%ER)?n``~cz zI`gF{{Vya?JuviTKx>P9cxgrW{2p{F4JG|&lg>!=(?z^>&{}7xli7`> zE__7K9ecIcsWIzILDT(1rFvg|EVv~1$I55tU0kv^lS$J8@w^!aCs zbDMV-d--~UO?`R4_wP^l;4M*6(aJLa+ur#u4o3H}V?1Vc+R)a=qmZd;z7e>&T&ZG`u zb=I0_YDpY^;V&a(_KwL-7|Lko-@z_L%4>HtOPPg&VAozar^`B4D9L>+;)IU8DsQnY zO-!*-gz?enN)5xY$C3>hl{L)cK?vIkCJ=RzI`U|)+&IqMc=s9NR*smeYL7Qo*BkA{ ztHrULvBuf$YA~l2C(Wat80_is%VN)OFD@q&9>=qr5@_=C;@M{Aw-t*js=5j0t`W(5 zUkrC;@oF|ww`>ubHAPC!QKI5oR*39p?lbn$NQpZk&V_baF()Zx8h1odsM#fEu*YR% z$7e)gNHN!C7}5zAW0G`6C%VTY<(Up_n=E&e7ZzUXMo48$_M^W`3P+y~=cA>WFn#Tv4M{ICWs>4KS$qZC&97gLE znyhq87)KerF_#=iL@|Ylj4c$Q%QsLS(qXJrEH)eMv7}rzf`NNY6bG;x&tPpdQJ_ee zYE%J4(`aoNY7{{#HQGI+6_SY54HQO@!Is)IiXPIUsA3w4N;dgLMOj-)X~h~ON=B&! zMGC0Ws9nYhf})r%1lqOC<(8N z9To`$2xus27F9G-5Y2fZlF;l!$x%ca)rA?fLPa6c1WiLoq)5i9lz~j1=o2QG({lwg zF%3*!mfZ?){=m1DFG2XLuphD zqYRNp7HHaN?#OXvc9>U}sEt|VYFBgE)gC^pvt^Yl$kZ<9jjCs_seCke`juv!>&eu4 zIGa0l9!?n=j2`iu<%tTyjvoQDBhy-*kOI}8`Eam_@)~$_d*~T%3I~KK} zt!p?&6C=CxtUo%=5U^vv^RMK8ooAjFQyu>Roqr+u(}Kdm;`Bc_(7!rxSXew>iq^JV zb*Gjz%6Pq%tsB+x%RGe3Qf8%Q$ENibX7e0Y#+{U|hmy#X7T+qRpQNFvavE%k<}|^K?8qoDuDu^tu*@ z7gFlFST13fbt4~LdvoepHS@T7MxuBgc`dk)TcP!CozV4;TAd=+Y4YNh9Ju>68Fy*? zqw0SYwAgwqG3*o{ zy(g|Nv8L5Et6WL=oP5QvDEjY6&(YeyN@mmb>`m+RlgT(mUFM5ckD1bHeL0T=^Xjyk ziE2H`Y{7hO@T}Js^Gh@E{VxaO4^PjbQ`P7u^&WkrhLvAUIi(Eb_Hch_E=?>zDRo<~l>pHtK! ziwtF#E=SouS^Ed!_dtC&{GU+QI>U<{RQ~|Bc>ad;wxgx>ZDjh6nZkInr;bK?pHlv7 zt@R#_i!+7{)7dKXNO#AFJ3i8P<BHR4|k{QIf&Y`QzmmmNZH zg1QG>m#4a}O%&V9qnw&}d|BDm`tV!J(gA#iGGk^J<^7g-gVx z#j~r|9SdKf*TV~WGpwKWHRY>=Kp4mQ}yO~(}>(=?YzPa@7iKw0~m5w_;jyIY5 zcktt1uEe!ExA|>6m!9n(L(;t&(tRhZ%oD<|d8mi1raCsFHJ=cmw3>9ie{ zaVewIv!8d}N#)OFmbqrE(^Pfw=Rr>cjAkvSim>ol2kdYRzLs!5ZJE`2t2pA_W` zv3yI(^nd1hX1@$xwh9@Nsao#-#~$qK+;-x4`q#@*`)8v)1n_!K4^f^(wOYImaC7aA zOT{0TWzEu5x8X~LRDOx*uT{@X@N}(qqh^OLFQMh_j(yUEAmYexc}7>DsHu7dX$J4;K!XHhs$;DNAbRk@WceV6_lY*J=6fz9w?(dMtYT zhd8GSZ7(LelYLX2&uqFsPL`J(wONyl>Y|TF^EYRcuIo!Y)NnSjFZVeA06aP9>OI-& zD8^cfJde*=4_03$9<230bDnyW&w7T;-d4$LQQ19Bomvev^|@sf_Nd2mXD3O~PpRwU zr-S>y*&j>le3~wr+;knM6%IUba_ZRB_i>L?$)8cC!wfXxf*T@y)~`jV!;jw0e6uNP z^&P$09r_&8>NqlKa=pzfi!&#T*1qeTrKJqcQ%_@w-8{D^MlxF)itx#8oo7Fmb)(5< za+sNvi+Lp}Ov&U47_%6%p77j2i-S$#+&}?V7DxeBD-Zz0001!n3TI6xbwmN){ywCN8l^*+!5!6qTWQDIz3kR7{ED z!xkc%5*{r=NTh)wqTtdT9T8THB5a*2Y`EuQCg|jwvs|;>V$9=w^N0#6fUS@X0zf$M zc4^thZHpp_410L8?Ts48QGQP%I-53zdoMJvN>0_Io=i~5Xe4%wR&2?dHfB^yB&Nt@ zTtg(XSX40$h{%>9u^DOlior!Z7J4fMjbNi#Jmse}jw8GB_E)h;m^q_{(SFI-9A&Iz zHOK93DPuae0>l?s!x5}uMv4Wf0#<4xqfM5Fu$VGYE{jm1sEiPxDx*Y#sHUQYMwAq& zn6U{BA+8394YnI-V@1HK$G71k!6ZQn0aRbg6$4Hz(lS*{$#61g+Si5(XvW4}9UG80 z6m!@Sajx`BnV4=SrZiHari`pNFuL1?W_yKfRt!EE>WM=lt}>)(rn|Ocg6)+nee04e zfLsAWx$E{E1L^gg1sSbNnI*W|Nf?!OZ=F1PD7rNHlGcAqb(=@_~+B@KL9&)z3* zL)6EsdYcBKeB{ZQHhcd7i&Z|SrNN1F3|7v3-(LRQz0SVhE$JSwqtN=lr)o9OhveQ} znRoV4l5uUHOY4tAbe@gUXVi4vTiw(=yA}#m{t@}AP55m6Pt)F%*M1^;O=}*b1T`8L z4Hh_dxIzk~*{}BM`97`atw%=bi&3f7WB1!j+h23g>A7dW}M^VcWB(UU5xWRXIEdP>;C{0@MY0S z;n2-$Cm-Pa_oe05uC0qzrN;AWV?Fz7@Ao@pqn-~>#p?9ai;V6wu4143A9v`Eou=tN zmelpFOnGh8{>bUh{FeEC9JTvMc>Hbo0M}~TgGK8NE zG<@E_uIhT9Sf5aH<}D^iNjXwQza&cRDK6mPPj-Tqjb7p*c{CV`QP|uGd zc-(uYp9kugzY#iYv=28|f`+$E%7RzD*MsA_EOhJD+D8_iE%IFc#(i(mT~{Aih72)T z)}xrtJ(ta%ztZ_nkJshL<Y)^mp>-pZ8Wyy8HDXd9Lc7 zkIxVBcp(pn&u1Um@SR(xJr1R)Cp>cO%wJ5`ENXw2$fNS&Z>H++`BJ> zmv-N`Uyqs3)9QZ>Js+m^CT^js*2CS$qES%6;&YYNkMRpZ4wcpx3|O2X@xfnyRT^tfu`_rdt>EOPRhsm$vvXTJO|zo+7|&zoY$ z?#)GZTiqeYTdIaPiaMOi7uijpplkgR)9`7l9Gjc+&z%1N!qu7HYl1V>vbV=`sp;Wh zobu~%xynz7hG$GVPO5pKjlr$T?Dl8seKW-^x@jpho*tu7(!%4z zW*kd&+2`WvnP-XRli3C2`W}I+k3`bFL?1agnS7#Ie+bR&`e&-s#D-%Oe({BA+#2M`^fI3fONeULVqbW z;JXF@ZTVTCdTEV=5t@4w7qdTt=z$u0QbfFLnj{L?!($o}DG5cCpvx$w*b3OeMV2CH zMNp`#=hP4YacVWT-JJqgCnY>=aJGh8w=c^Xu>M@-e2 zN+#rHvX)K`d2)0(nYfn?bGQ?*=%EZX&$NxL9W+Bj4P#VGR%%5I88{1JtqO^Y8Kpo~ z3WWu9jd8}2k z7}+e+C6YEv0TNLJs+J+LNmQ7I#ARQ&(pIQq3$Q2zfdOaB7EN6-rbyE=t3@JLBS2k&Ac`mn`3}VP0I;zn zK4bNeuvr?ur-?2^JIrNGgT_Nen}v0i+?I1b_y)AOtY(0s){%01}`C0rCJe zsjvhg*vJqMx)Ur22UHYA9w=Z48Yn}tgdwCNf{?%q00jXNG*G}upa1~MXyeMbXKdFD z$SQU8CqVFg(oI?K5&Y+WE~!4q80v z;ii2KY&T~F@N#Z)=WELLSiP2dzQI1hd`~Bq@U$;!o}<7o%a0Su<-BbRV?8&g6VsE# z@_D-$ZD*nRVt+0?PbUV}6wc?TC-UUQ@^R2n*6<717;Bb*>GnnK3^mLK{?NUlio^|G zIwxTj0E(dihJ-XAv{EG$j-0Vpjbdhzq)kL=6ljP}i$y?8i$a$q7)cXFvKf_0EUFU< z%#w);K)^%*0O1EWNm&*3UxyIEKU!%PX&+VikyG`QFvHFykIb;;)O77+GvjU z-5*%gb*{UHdb^%>(nmY^vCqDK>#wc!Ox~4@9(bv}L@p<}_(iOqeP>$f3s*c7)agC# zEk4;`cK#^ovS)oefByimJ`17e)_QxZ>3Ys2)=ef&@lUk=SMrXW`}C8qSo@xn&^p&u z^|R|8YE3N^cgj=8S6n2#9zR(1-UxLqLeO;hPBFN9v+mE(zYzUjpFzcbl=POP)Y-KaCyNFM+_G1n2)x^UM7;CuUmr9YS98K7JYUT_abj z!K?hnH906f`5OEDll2^P*BKa=?X~n>Nq>&bEa@cRyFWH{X+IEpj*p@(5=$8#i0kl`i(@-W?rlG=S_pb)B0n|qW=I}u1_nib)5ZeVd>o~O*}dXcEt|!`?DQCqPn(d zURW#;`I|j*^*wPD_}_ij`tM%q^ zblfhXhI3u^v|mf~*Hyutbr?dlcACF_z>a=;KJvMxpCE4toU)lHGmGyiyu*uSTu4>ZB{{Zy!pKO0;_Ge#F^j}QX z=a!?Kd-it3Elpd;eCCT-=zejZZ7g@4@ zEb~9WX*BmNnOv8PIrYt-Zru0Hn;sU66V&UW7UkcUXGc-cO>5k6W0a#mswb;0MuS5S zYZ8l}jl8pu2dHx5gN|G(b5DoZ&pBJV!W|D#(%#e@qq!pSbUe=sb9F1>BbQOtwK??* zKK+|`NgsRZ?t!k!hC1$``N;~$i{U>k$I0C05%PHY7ulUq=t(YOee`-K*_{~rH`yM4 zI^I4G9TK}lc{EtGd2zhZ`Yzl19`{+-uAQrnmkeO?z8s%BS@SymOUtNubva&1WAf3{ znV!or?)r!Fx%yOAjuC`=#wWt+vu27|CY*Mz$3|YSIBFo(P8jS$I{WD6W zZ$A1-zfUJkug|8a#!qG4GwS+IhfmeD`12&DqPKr1jnF+Uuk{YK;L}HBApX44?GyFR zgXqm4K*H7;PcB(^oXmWmB>GNgzfTQxry|!z`!npS5Ftke}?&sC;UBl zKIifXPe8mP`Bd?IJLuKM)*s>i$J_ovd@(+rmw|exi{U5I8P7h9{twWfPDXO+iTF9* zt5QEZmq>nKXD*S)=x6A1=}GZKK9s%*- z{{V^m5c*Hp{R{k3s%Xw#Ay;Dgv*P^u^sliW;{H+h(&;JqF?}I(aW9(qz7h1#ghT1I z;QNX6n!XGr(x`c_gW{#rxZ)_zT|4Z3g!*keqY3CM!1HQw`6+bz@MiQMW9sFj`!gA6 z%jZuB`IVue{z{Lc{HNHLq%}Kd!Qee5coWhd`_d5fv~SGtcrQpp(oysulqd3^VdkC> zo|cl)&n+9|`d6bfdNV$2`){AaqH@be)O6h?QI?-WQ?uwaIzw}m`kHiDua*?2?IP5Fv`_ z%~(v4vPo2#2(c2Y_T(^1!hi-U0ilg55*k!Z4vO$d`=Am-NTo=UiUL5DR)(1=(ANah z13*zFK$r-B$rcYRrNSnxq=>3Wq)I6PK!Sh?peSG>N}@==KnegPp@(8B3LRKcL@H&Z zG&DdZMI~U6(x6gEprW`akSG;02`Fg*2q<8HDv%%@0H{UKk^undX#lE(P*4&D01^N` z;7Gv~f{?%v01Q+R0Cxf?7ytqQ8YKv50*Vz30SW*L3J??lK#5=wA&nps0fJUvpe{fP z005zo0zf|Kp$rljp-{mL45V{qS7%#BGL6`f*PWRjW_Wj_*~yQFac0G7nu%+`&yLeP z%($AnN7Cif-JCgeiKl4mBac<{S#aH)bHIHjZ6U=yEgfWYwd4C1AD8%cqp`eMo&sD zHZ?4gT#fp25K)!!FD9pPi`0DDEi>NM`g8J_mRn8-3+awga>s5d58R)X^x;Bi-dblB z!!n*ck&U!nm+4r^Q2@!^KqtWsj%H+15DAj0009&gi!Zg2NPt9Fv7ZXn={Lc16dsq> z;_1Gp(P}f+$mB{x=$W@o;ATBrMfqJz+w*AU&so+lT={da)c*hzwKz3BTct|`?hXgf zej!4AIcOnN9I_!!)Irv}0`jOV%AP{EYf0mURhaz|(B$&i#M4o2i#x zpFny)#E(E|v>Kd{#nk$BVx0cVh|Bp$AFjHuPV^5$he7B(YBe8QpP#(h<^B_3!=v?A zSLs@*?1r-g!;2@K@pr-E_5T1vdWT!;{{YF&X4K@*lWr|U`HZ4;zka_y+L?ae5rbE* z$DVocXUwxreRGTD-^rh`s?Rqk43l@uX`iljSac6S^o%_@)~{3D@V8E0U)diMm)5tI zPX|wiII>wMx?!RA~ zsp?i)uN4@h=ri?QZ%F71L#O&9tAuw?%C7^9p6dLZ+a&zF{;``LeHNeEZO0pN{)_27 z8&}lylgoj^q2f-DF-}v^JQ2d4*>7`8lxL@&RXw=emGQ$d#GHMn$vnCA`i)m!T^=8i z=&|R}T0lw>~W&wt9KP)IN~K(=$#G>Uu0o43_@@3xy

            O1)jdkJTCCdli$|rc^4V?4_(i|Xo1yCIUQIjy0Icxi)cS@jY7p0IAqc99Ssf$qG+w#Ub!-bu*5M3O+g|NlXZ!pz z9$!Z36~*c0Ds|-Pc%O2yJL-D8z7IE0*5|K#Rhoai*_K@Sv!(82oYYcE+4Y{sr!&uV z928=$^G61Lq0+EkEj}eE{h`6jsh^i_df&s#>AGoW)y3BlX|{SVrD2X-x{X#?#u9Ey z36lD>Cs?$YDpPfDgUQM6=E*lFCe!BGiDPx@&(gG+vtrwp zc%vyQ`A6m-g+7hJ>Q1Ss*6Y>jG*tbr+vd;T){!HR%kR?h_W8*4@0g>+^$%Ur`hO1? z)}v7SV~p!>?t8wd^)F8J)(Jx_)7DBCiwDX0M^x55R&7SNK31Mt_xWcz%dgkEC#_la zOIx3rIXTPsXB@NQ>c5y(vpiL%yrZ8}i%{__xN%9~YxUO%>FFIM&#Gyoi!;>a%g?u` zT)(xmyyt%0dhSPuJadNN-xB*Blm;KC>E@*+W$A&Ofp@{+#d0KM%F^e^%(-7okH2e9!YaB=Sxe zpyyxF=}*_4DJs)xHF@XpvX9Ps{{UOi={2yQK%DfK8k{3(^Wl+~tLikJ20D#4X*`*~ z^Cx_xmF9i5K3nQZ_WdJ2uXGr(TzY=1f5iA@;rv19vul1GMkVs;pOf_dvnSKF4jP8F zA1;0aLDgU7bq%E~l~*-rzBBq+^7Z{cbkKF)jnrvi*Wpu>;u#*ve@yk(nEWr(PCZu^ zTu{XfT8vA7yY@%y{*K45eFqEIP2`j8<=%|-&O1vi*LUS?KPq~j(7mGr%X(TR>5o_1 z7q!8hSCjcd9+37PB7KpA$a+Fvk$fJvvM*sGV!Ut4FM=ME?0a6po5NO12Zt>pYq6BH zi1%fH%2)~F)OZuoFN2#Vg;xmrDPS<312!zLo6Dm69JzES)6Y+5H1x(@BjzWdIp?81 zo_a$WX)K;t-acdU1WQHsK9X8rvND#I%jZmd@8pU6mwHFhepM3m)!=^RUk}UYUWt?W zGw8o5b}z~g+&mvR^j~5gi26UtiRj7ui{Ty?4JSR3>uGe<(Y!RtGp`mZI`Pwo$;*8_ zHk#y_3xs8oUC&F*!#wKj^Rmmi)s}a5aOIJ%VpleAF3udR=*sQ0lOsCF!x^)hOx{k8 zd2((uSj@^w(=?OrWh10ZSvA3%G?ylF;HikKAfW|IGi8~wDoLV=U`s?Y$Y{usF_J|D zj6`3`0f300Q~+g4#4!*c7>EIgVM01FGo2daWrA2pJ_ZNY)c1WU>LW z3n0qBaR5M2(5kE`018Bm%AJ(BB^Tg8(IIq;Mv#DLMnu_BBoP`|$wNUf1q~}1Rs@EX z0z*iUG&BebEpmVtkRU8Op^B&|Ar=Gz4Wk+YMpX)d0H|X`Qe2E_0zef*1cs0TiI?eUJ!62n9d`0U#(q0|9`9I-mgV72IM# z00;tsg#bVacd!5e4&wm;#E1ca1rz{K5`eD21fqce0MNS(01yHILj(vRphy6sS(Ku0 zM7V*?I9;6b#CJFn@trx0TJq(mFrJ?6w0kcRjPRX#u65w#(pk$rB_BaN1`@z@iI1P2 zkr>NM-6P(X4*VEPPE8&o(@?#OJy~Hg_DpM1JpTY-k6`sZqCJ}?wU0B{6T?TT?9o2Q za#~}{cu9CqQ`qh&fSS1So)TUI)_5$BVyw=tJilOG#iP~s33`57NY1Z|%6K?tGr)T@ z)6vZ=B-O`{lNB7fF!w#2n2t=CyMg0m$K4zBu9qIAu2^RF#M3T1IaW#O^6$pnWIfhj zOFogH={lKW$m1iQ4^`4>H4VlqXM^T-dd)_mx05WH$0^D8ZIW|b?=P^2T!Pk0O{Et2 zIQ1QO-qrCop%#3-w(YhC=N_|Iyhqn{KEL^#IB-IIMCpfDgt}XVrS+c~6GbQ5*!{oi zrQ@6UeXfIA_1YQW%QVhS4z=m^Pfs}9ZjYPAsmq7-Nu#4puAUs;>*d(-?tN6hA2sjm z@L|yEx5<4u6{K=u>Dl$Tb7~;c#STMJ)Zx`!BbVvh*z`JHPh$ps7WCth8NK`W6UVN8 ztHH^qg4r3;Qu2(ooi18@n`7lECTy=3wm7pZj3xfZ+4_e~r_|`QYXmDSp-~&_Wm)om zEPiu69%#pPS~;3=bkj%F=jpPB2*VVmJw#nf2cMS`_Fds_QQ~I&t8=MdAerc6(8p0a zgwi?k=^i<_w{*vpY0M+88cQ~YfwMQL)RpI@V^D1Mq0^4Ibk_Ss&G{oV9;bvAK(lK;5Jn#9xpEzrsnOO|1 zvwu78ecioDMwx=@qn8WKo&LK~;}o06PjdTt7Ud%L>ibTzSDo1ADcFvJ7Z~m5S?A_I zBRl={;p?Bpvhz4wKXym&i_6Ht`JZ$51BINvd#|v-DA_l9Ce4jS@0{ItlstQ0&)Uxg z#?`@CH3X{lQlsm8Y`Xv6x7^xRO#Qi!YQ-z)!)=`oJekZB!PP24+@3kHRFS$gDQrD` zoDo;4ck;9ysmSFLytIrfNv_{yoca%tsIS+$43zjh)ro4f-x8Rf>E;%(bw6hitYf(S zrU}bpB8h+4YePG&$2ZW7waD?ltkf!!E;D1W`$=&+HEG+aj`W8J$CrF!_a9k4O3XG+ z(fOtg^Col51Aa9Xl;_(mXHdE zOhzL0u8N#{YIJB`>VtRAoq3$pWvp?n!9-yl({84YlW4B{pQ;3JeArB2By|p}X3`9c zS;_;kh74NzfN&cFg04>EmY4HKLI`DN2-amtVKZr6Q`MJ-@|jX{3C^^h1Bp$L1TqDd z$uNsNx8R}}caSW~5G*NsS(YhK*F4{RuV@;=BA)a|Ty3sJqGdn8M>gTGu zJ$p4Pw_6F5FcS-DshsaP(D~c^V3m2g`58=K^8dSH?qo-ihAlf0lA_TM<2x`8kOCSGDHBiOam(+L5a( zTKhh3=9lW}Xgvn66#9HP2lB|+A@1t-1vj==lDEFOV2Z^-{sOu_b|O>e@FAnx6W;$e zQw<)RHOPR?8woO4Oy8*7NTSU>bNU3;K5#|i=FbFf);n@=n(oV{R$sjhNZJdw(Ag6S zW{uJ-HC(H$+byo) zyAhxovR!Z%Q6}voOD7?*6 z-EcBcR?Uk~0w422Xz$CsRL%+h10I~OFaNb%h1?2XLfRFdAl_~>Id!qvrtnFWEVidEpUDU?qy(SbrdO*+0B4B|Q3Y6cW;%>lp?#psBSdx8#Vmofe9N34m? zgw71A8vrT*DGZzH&HpX|WaKbQ^e{y$oL>MRKpo}>0ATWEMGS;lA`=7Db2O&7?dW&_ zXe0Iwv&I`~0ZI0glrpGFAXIt}5_O}%*MO;DBu`igbr?1VVHk3hv0RMN5q5#K4}Ka> z@)zC#dp3LPPokWiB3x_!bs#o`VmGKzX26WX=G16R46T;Uju&+Pq>w!$5o0W8lgA(M zY61VtG1me1uD|BhT!n&*KKiVX=dhW)<{Nz5s?u-oIq>Rrp26EjPKT50hwwhMg2R{% zaa;&mb5@SNLXH@rmrbvIy_kVLg{c`F+fK~1y<&6d#llGZ#f3};y$XfAgWuYPXK%;h z?ia6d7=fzcd6Vo`is%Jx91UBIKJY~?olM(a$?)~sy)4+lZmrJN_2sQ?qVMc>Q2Ey7Po*gX{rm_?)l#O~#!vN0+XZ?fTel*+tII+EaMFus z0|Skk$7)?UY?6=z2%D^#qux0CDNnZNi@wtbbO!sLU$dH-TwiUD&p)o5%Z&E$>)ol<~5Rt1HKblv)vcRooG5!K0i6TBEIZk zp9ef_c8GVKyhW@BroxGRZq1>Y8M;vPJGX}O!2Fz&%Q~{a8sk03z&b{+&*fO0>jnpY zH_*!houBGSWhYaR_2laS+ms9v2?D3PleNd*nV*>A6r|(~7!MczH@3L}J8@?tuxi9e z56RI1ByhI8`eaNPX6C*V7+FUmy0`&q_=3@j?+^C!Yt0nQgr6-;UWR*R-3^v?CYoo? z^4*rIP(Uh1pE%Fn8WbTq*-;~88om6I^Ya-KR*$ytd_kh?mAKBW8N72?`CBi_2!Vc;KfgX&ALL2!>#Z4l5r8C6DVvf*()B_x7Y zbp`GgD_&vaYJ26^<8t5V3HKr9>VmmpUB^#9=qvX+vCeZl)!(4G5w4FsfY8V4xg2UH zhfCIXRo#O*GrG&c3p$=>IFn+-QP6ioSHsog|Mr@+PWJkGKv8~3r3wS1g+<G8DjN&#esJad zed`yM0vxh?Y;)2K<%pzrZrjhhNn$^B;MrwG6^<(-!dbEK-x zbSBzPU%h(&$vVTxM#an1ES;=#=(x*Ezm^R*^A=31jM|Up^mF@%ms7P2LF?R$u#ee&IH-> z;fJAIk&~^HIf?QcGn>?-`!>@@^U;I%O195x)-I;OLKI%UbF1DVjE~}`J zC)30b9Q)PAtJ-tB+;h=X*T*Jijs4cZ6?}rkvRXY$*f4rh<<(s+VKkO)XH0UpuLzO_eMPJXx7Egk7w5K zpZEm5McK2CkJ98lO$BDp?{ZD9&jT6P(Nqye_EmE`H`*6G-v62|4P@rn86wm#{;4JU z7lzo^Ug1_hS>))H8u1&qkDX*-Q5K^=xlQ~Bd^QHpL6zyi;+y-}%F;~&g3X>_9h;8P z#U*$!ZB<}q-TFa(5#n?T(rnU0UwXb2TBoo#W0nHEJD@c>frNdw!BRy5R9?|#7bd6h zG1${A4vodmP5n?6(uVu)SZdlwS}lbaS}|OR3o$;#GyWu8_g=7(RCRABZ(=W_a2p*X-J} zZFz4;d4cO8C0UUPeKjR}1M*GWu44n*qa`}tb}LXt)vOmbywXaxJjlsdD9Wz|mu*ra zr5@13m6&98Q#7+cD>7PHnn+tknb)A%P8a}`@lh9{$&wVs8&$T4y|;-(MtUvxRf{bf zFYGniafSD*WaxW6;8&XB)XTqDN9Z#6vvSpa=3*}D)Z{I7*$Ra7G4@sey zs^)J~k&Df2WF_qC@+yQ0i=l(=GWS>%D<_oMBT%HH&S6pWuE}5qIgBi zPXJCdK5>-pt4JaYEM_dJFvv?oWGYKA0YXOtkfmO{!9pSA0=^$3=>jhlrMRTfk;0@CJZJZ416s;5n)$63f}Q=FzW%0RgFmjCWm5WDL#kfY=KyQlCtC~=@PK;DH$gU~AeJ};&2Sj2Rp8s(8Tt+9^ZXx@D|*eqvd?}9-gk>B zt>}<1kJkIAJug}yn@u}}#7RRygO+S6W+;<9ziDa+N&+!qOw~XW zpdE*Wt0O2i#NXsD@Ui7PB_)rPrLIGh7-H374MXsg-y;%vHczubly5W3+w5@5gOjg4 z5d~HjsxF=}Av)JBXHI23=>N$1A1U=a?fF}>WlEpEoUq+m@Fta!Ya*VyQxVi~oM`Wp zhPVqs*q^(02kgzldbFwD_t%0^;g7^Uyd}5RJL~Z0LD|57OYRAS2%n+{t?|djAoqJX|E<#ovXLk7#?9R!FjaoxR@RDjap%f@NMVZh|O~Y!ZsCCFI8>8*) zhcQZ{{XDNy$c2oSFig2T!a&%A%srDkweDH#;`~4;P(wE(Q+>T=vZQe9v4=wv4X2>e z2PZSzuz4{Cvb?q~{3(O;NQ>T zOOLtSq3gTHMRwH|l9F^W*IRq}Obc-6QgrvDp0>8K)vM-W&L?2EKh`ro@5mf4pUjOf z&7?nvw9PHb)#51sE)#KIP;`Hyw@132nr}ggi)Ul*|ce5#=kNJ96JlQ*n<^Z zbWM(;0s$S>{K5Tga}Y*9@45c_FseXNKPq@+yfXrBevx2Doditaluzn*=Y^oHM4Y zAbSiZ=Pcd|IZwj{MzRS{G}ybx}$&<&uYY&{@F=M}2kxsk^jQ z7I!JDZ^svWSubFGtv}fq84yf;%RMu8uwxPLj{5?G+099Z(}&LZx*~Mi{VP_9h(ZK) zDO@_>dxwTVV8^h*b@%H@gyCg=Qr*D0O?PFc8h^^G==JW2r@gx|n=4Xw-(cQ-T#ao> z0)>K|w)(175)PrJeTrHY-OJ~3XSb}E9sBC3+SSo=)CC99tcOYbx(Yp6aDcYKol~EIQiom-6_jYu6(|m#$J$w@cd|8 zTA?SF{IM>S5!~bUn!U)7qw9VKXjT`9bRAuYMKH;_P zM_W#K=$O0kZRf%4f56j!z}`hJ%q_GY9N0~pLn9^}eGJNbCO_$4P^#W5hZJW|JGD$q zLQ2y=L}a@L(4P^yNh)iUNt1j4HB>2SUNy;@ODj*S$AR4iSL#Jh%^kV#;11g!S||1v zO9f0$riej#Qw0RwFg%&h%rr@Y%uTT|lB?4l^^W`dApp zr|2|lAR1X-=?xnQJ)p1UNlr_!v884Cqc|?#DDO$D6(8*|CGXsyAaBEy#n$ga$CH)A zty`mylHBsbrs%7e-GzNpRgkECLqQXGVFuIazurDqNX^h+$xTgf^|m|r*b-mMm-XuU}^A&|B zCPcXcuTLt5IKC2}2Oy5>lS4`Se~k_j7AVR56Uj%%_r6)Bi7CU8I$D~Pd_D$1LPsxD zlnR&hlcT1Rj{s#Y%AY_RK)y)6mmGkMlq9lZ6$)~-8a6TjV3IPRzLC-Vn(`cl&U2gAPV)1;4r9Q=Nw`j(+`!dogmj&vSww3g zsf?~&f!)bMlvwRLjz22ft=Z^u{@(3BAQJIK-QtB~fP^u*g!4agw)T2)paW0t)2~3mseGZ z&y=&yLn)T>#1!}NvspU@+kT_ZoTecR%}ZfpDW_BWbvEPAivp zSaeBTEF^#FX#8qL?}q*7mip}o@4dOm z%3R*GX}jrfuXVK>O=&km8<_+-;;RbVleWen zg4MDS!S9MGc7d^C%yXqWr!oyI-1E-*E<;dz@#Lj|!PXjj{_j7)?SM6 z{ujlW8l&>!Ik{&OP7(?08?FiO_`9>=fOq{-&m}WPLn#n-^XVIDghizH{blNE+upyt zJ<{%!tIjXkB=@eSKBNU41^9}mfjc>Bcclde&oVln<%`~k4_VliFF-*j`@i;sY+i%e zj)qgprHe_PX6icdWiLmMUKWe}-fzJ-z0X=xW}XK*W2;A7j_axKJceRLoVkOnw6}BB z)tQH$D^KhHh%{RNCYohp*Z*fO$58h?NQogVLAUz4uFsWJohLTv%-e2oxb^V8qJs?b zdU|i4Ei5hALLO}StC|-LmG&}kwvC?U8c2jC}&+j3ts9UYpD_u~UYpb>BN5PBqXzTwph!?ydBdAStzukxKX zGQB3j#g->V3B$dDuJW_9Cko$soy-+C&B7}T1Nb5%>o}(%T&!L$Uu}dna-*s`%40h` zaw!7BVL+2+HM=+5pTN9q0` z@;YWRo1SHA0fvCz2V*wUAmQ>1uW8{Y!&djqW4mQYYn}?!@pN}|U!TFPl+yWmF8{J zoE5upY4_UhxuwQutyz!J?&XtUAMsG-17oa^tbG-gve^gte7-``XIPy4bJ2dm_GP;{ z*|3Q7>k7;83fVJ$5ClJVjF_e>sdrYFea?Pc{~Pu$y)*lI?Vo9C>8NSDh4t)&kHh9* zqfi>n4+^5A$`W0kcCxxTNb+T8l4j3`Kd-l;sTy;(W!trbsf-;f3)!(QOWZ;O_XqdE z-CcEvrakHmW@Z-&vn$o_8GFjg1yPj}->tidZj5q#t&A~ixI}V+asAjBb z*81IK=X`O-cv11|E}z>{!KP-SB}9!YJcIUeO1?0 zv0*6GALG%8R=pQ$VZTSZ9ie}-$I~5jC_L`AJvExN2k^ih-S;m~VNs6$J9X^5Iy8o{ zMKA3p360o>o9uYxr+B{V^T=yN7|{yTvJ9B3mN<`=#J3T5_wg^!WPPip8iP9WI`l)3 z*|K?-72oL6y&ub>kgpW6Z^;(p9iEXrIa_u1p_Hr?@{}OiJ9r}yU_?&w%<)4!xFMA* z^%z3S%-j4SKHhF`R-Q+YxMrz~*DiioKC*|wlf@J&;7Frr%Oj9e34AfgS0q#kAJkRW};&?1%eGuPb1BggY)#s@U}qQdZ|P|#8N zB6$FZ7h6c~6;{MpC|@VQRs;Y{eaDo;h>t{f`sCYC3|NushglM$Ge_eA6H{GylSsPc z;J!>4W-;I(Mfe*49*VFrsEC7N2&1KtiIHXSfgX7x>cYRo7^v}hRKRy)aMK8EZhQrR z7gCYnkR}{d+WfB_!GyMkLjDUNDEzJnFcnMxDwO(01t4n@MZN%&3osKwDyl;Pol#q0 zR@(fUA$Z7qVHpCeO#g_DDvgR!E8k+F$-2KwAOEh@aA8w zF9i5mKdn=*i!Ng=qg+Ae%vs-`3=QGj@s#PNNaOWHme?v^o{y7=Ap zk}NkQD#*g*vJ6|b&2Dn1U)VRF_e!bM8*wYNi#Dv*y22WqxIot0gFAiCYF%SI7fM1E zARNqJ|M~FRle2m6X@rkf;KnkdWRq^rziv07K;g@i-Kn%%9W3czf{VB$S%K0%aTmh= z(bG#sBTurLaPEZQD(I)=3-=m}YJ~nnQv^rc3->q|LD;LOFD;jk=fsVcX*`ujxyC7? zJ|L((_r!#s85TWmKfOJH7t`o&eJ^ z^89=DBv?AVlV7bB@un9?knVZc+*C!kT7WTm?kV(Gj9{$fcdA-h$ShV>qdZ0E){%tT z!ALpf(zsXl9rLzlTF&-Rj-~l@n~m$MVR%!5xM<#d5ZHaZI^JPc9V1*9_bkCw&cGuFm}*kTDMNhCnut z9lfMqZNO^w&1+{4PTOl4a@2Ra{$Smi$>WaM2KbQ1r-lxq*4Ss6o9pK;B_X=m5R?0+ zw!|8IX9I%T;oBBZlf{VnRft+ch&+qZ$+rZf(#p7erV%10m)P3V;Qs(``xNdp>Njsl zHWSoZ|LwRP%8O^t<{ewyV?bIv7?#q~=Np7=Bk)JB`9JF2aQPp*wkz%%``+q!Pbj=p z8|n~<(r*a@8J;%zHSYty?E<{Aj}J6<0XQvRWM z6qvIwq%QKjvcT)J?2*Q^n;oeqtQ|z*JiFJLx75bCohQss8b9eilCK@H4tn+}V#rlzl7or?Ur#k4<+Kz3UiN%$`%r22;ZLpqr??N^x2g#uMD^m@xhdU~-l`YM zp_RiHU0m9vDSoQ?tm5PeBDBG%*CP?Zzslv`b*1GIV28BasvSsL>pY{GNfrkomLwe| zzjE#7vo(ywsuM)45dGi_RSra(;l7eAFA{FK`|$?r@8A%u)-JI9zEPewvusj!Qkth` zkvm1uMlp6bg*)ZgTZwoKzs8!*mevl0fX^2LBlOcp!r>JiG3;@Rp*ef`B3 z9~Ut+Q{6OQV3)+Hn^-`uULag&275=_B|hf-F`vl%oy3=ZUolC#;oao44*r}Hn-%iS zRFZFh7v%{=Jcq%Lmml4NkfaRTWJiyEHKG1QNAw;gMT<%ao9HjNRnRB1Xc$FR^4{jP zB7jv1pocYp1uA+hDgY!NQLqn^y=hvWv~2dg`!7b#43%v3eKTk=a-NVb=e$wO#ym{ z5-EIlyP>6Qee#BAqo6fxX(CGz4gldOd_Z(rR3sNtG)I^>I^HiC=_*pNqD9kx^&OdJ z7(h+d{1aY*{v8X5b@~hbl2k~AC;%49lSXgOH<1D_z5EZmc2%9#{VN27kmjy&7W#G?}k_th?ri5_z)|%wPA`*qL zt-}rz2^2Rt5*U-a&E+AHvq3xFHbncy zLFns|?E_(zb*+&sU6a&iAGOmNxX{Jyz-nYLW5Vx>LG&9J_kg?8vXY#$3*A7GnC5Ip z5VHEQPD^WLV?k?Y|3mt5ii?t*`<%^+uUM_>4m>T*w%>TuWiIrHqE0o{Ezox#`X6xR z9?+2uFH3XG2Y122ZW}YY)A;bUmx}KoXVX)M*pKOk;~^3bmURwT|MT7zeZ!Bsja0SM z2M-wKP;ZOycolwXZ0X`b+{3$MGGT^XyX&&!M$-@rY_gNZ+>?ESeuI$5;I2HKB|5n4 zJ9?*rbx$vmIz7o5mBB+N0@Ez2Ozc(4xw!v;o=bZ+lN48juBJPu-!sYXD}t0nsXZ;< z_}}&}!sU8R1GwF4D$89$DsHIdm`$oWs}H>&lp*pK29z2Mo_#A*Egag;(@`B|?IElu z!w;C69dITT#Zs|Y?%)GHC3%RT)G(aS({u3k_wBO z?|(Hm@B7L}pM`4Ur$+Ck=Vkq4ASETCOi@%0no><=d2-*_(QgQrQz?grb zA1kleRoK}Kt9ul?5(Q~n-#a>|9G!?lZ|w&eZ5dt(NH!4Y#HRRWui?f&a$iy2ohVyJ z83fkSTm1zs5)TUAC3yK#skYkLmNYRqj%E?@g8e|FwD=ZU1~Bs3OlD8p4A~ChTeXm& zw<^U}@Y*G0jYP0ZlmKo^9|gvcN|eQEzpShohtN4$}}2znBiEZ<$4 zip2kdE;6o-zI^YCMX%_OOgk) z!ZnK3D5oJY+LO0bbbP^I28@xgkUaTVio&pgm;ApbqNK3VZIOw;0?*Q2;aliTpzs|) z#{6zciu4(HA&Y_AiHD?wjI$<(?o9`90Z4`KSC9dwlrT#=E&v5d3iuldE}qw*vJ?^n zbm%tP0Qu(!KJ?@;EL|=DI0ib1qX5nf0N|tJ3bO)*TQUI7FBAaxR~W!DsZ6E#_IqhO zR;+v+i4!q#1-8_l;fUd{9m8S6#M0=N=MgfnO*h02KsTni$IpISLt+>f@oySP}le?9H){hs2ZDUIZ>+H)7|>4fn|H z!XLJ?XElkG8WNsURF!EUZux+2#U0%IgJs7@X)-EL+Xbqmp57cx3HRC@eDZ&G`pGlG zs0Oavlq~0{Y>a2MK97%+%aucJe4K_>hDP%KZRHJcpO3RWwxRyutGzz6IQDj=CwV^% z5$d1L>dmBeO;uOZDPJmh$|~_3*WgfWVfr}|Id>Ugv}}*YT*-di78KBPZC{jLF}Cd@ zua(a7Ao3rObS?Iy!*AF#yvksBGfA?4vLey>+tXMzTVbimq9eTS;7*7~d6oO;cx`<| zn^?}E@cRx0M?bT<0t7UPSIHAfEV$Wr?kew8KtJ;B=a^(^`Nifv*U%y}U#)@9e}J_T z-!5cE;?e)uT3`y&wm5cM)=~1KU+&IM+r&iaY1^sk87D@0DFw1}{+Kn4NxbCS#UWOY z`u#)eqWV-%{@#FZsrRkDidG%@g?^XF(&j4QM~%Gp5$k+vkoGNaZJZCos-WGJ z0W+g=_KL-+t%bJcZSjXX{q{_pnsf{=md;!Gi)!CRm0rTUu8Oj`&$9iqo@oaeEAFYM z4DG&EGui!;K5gqkv4*8=o+H{zL>c>s3u+(QjthV}?9y#I_%Z&iKI5OoyejHDyQ%N% z?t^Xa+2vc~EROBF-x*z(-s!H)GX^i3;wh|VznZV58`e@I_!C#QO08@_KP+96qPEmf zDL}97@*RVQS>m#hA|oJ(~hpWscSc4HRZFTN=&RU|LRp)mZM zRyaUY{(a~W<<0gdsxVPODULO%Llh)cHmMg<)brSc(Z`}RJ<=fNwrAtXjGS%7a*n+K z7I9CSw0T5P7AS5`uKw1DYfPQAugk4AkW_N+y7eM%zKEGa5jzL*^L$}AQxPWje+ImA3z!ilzQJb<@e4>Q$a zBWJxpCi`?D9iJyzn;I0Arc$SKGN|R)bSoiCzYx$O(&RDZeyy1F5}yDc3j-5_IQliM z4YnqT;nD=bP|09chXf``nnKmyv{02K?;(AKYWOKAc2>evNG|Nv{rIhpd+Ri4#c3}{ zY|9m65z7CU7M6HcgdNTho@z6bM#T``UKWel$T_7A3aB$6#5gfk_iNIm5*O?20Z4uT zDe)&{W~?-kV$>)_I3@&3hKUKu9pI}4kY1Lc7%8GsQiY-NQByGy6iUgxcF{;U0MF6?Ob94>W#3ss$e_gV*raq-+ZwwbYCh7_nq4vY8TS zQjqBQ@l%)ym1C5MqQaC2zXCEcig+}8C0ghX*>O_Qax}3hR3M6l?|(QrEAa0CPHX_; zFnyp8`Hf8vfb+0?BX=^aYFWn4WfIDhJl-jd*RLRgzz5JoN?yEN zPI2KZJNxL7rLGOBXt7oHE?}fP7sxgZGP>%>;$CZmsL;0N9IZw~Xr&VB8Zf~B7Un?O z%ZCOlhK`i(+DuuursJW!&2!i)S+rwm2)=2H#1L?laOl00?!{Ruc&~k2J+!l5&a|=G zma!swVg}xFr2kM+$=ubYq;V8_o=BFUCNR|^Udt)g>Xu4llyB6})Y8gN@iy-E+4@_hS~SMgZ|mXFBc}5ou$|lX zhD5T|MCJCdC!!=e#^t_&Z$*960`{mi#@NBIO68HynSiH+;lb8~XBhZWYTa>~wTdt&OFtlRx!e zM><`lg(KHWs{sXMQVTyejlA21<$>&6Pic_nm zoqwI`aT22oon%I=mVymiQDVo5l7%Ppso=Z=MyVCEaazeRfV{K>B%u!<- zp2fvX=0#rh`Z!-X6#A7G$XoTLLwsL3x!|R>{LvyMo#R!MA~O?*95ue!mZm5*7b>+< zQl(?+Oz-}ipih*SGZT6uN?&~EkVZDY3#u_6NwiX7qJ;EnQOlkTC?Aviu3ut0tU zKlfk3bY7}(Av2*fBi{FCK3V7C@kDb1+ zriQW)*i07j@tbCU^AmH?7gfDyYiQ3mFMm^3u`14}W4(FxExY;0eV4KW&v@U*C?k?0(NNI(V^ zRX6PA{HJIXfC?O~f@L6;hdzR0AmSwyHnp)zyLV~Gwt0S)O5RN&@ROVZyVB@iaY`|l zbaKPReV2to7J|@NG3Rx<){92zHM+u1%#@T8>et3p^vDoD8-qE`2~Eln3Cyp5u78B+|7P2^Ab?Q&+o1eIy{x*wGT3Kt64o(1|o86(xn zNAl>1kHI*gTyc7eW_UGbh04ySX z;+@DpMJKxD>FePS6kXo>2w`Tech9|HvBzQ|)LDY~9W@A=OnxvoKF}-Py?Uw?L z9q5^oNtlADD@ZF6WLf!<)0k#t2_3TAKO;{o7pG9AgYk*xD{_n@jVVz~*-QKs6m6=K zIAt(2IW!yd$`v>M4^0%yjEql;JTVca%O{B}^S#~jvo*RU@V~Q=Ff0dP$4V|_!f42p zK?0_^-oy@6h2^|r_*Tg9XYi{PP2ZONkd44!XSI}t1XJuR0q}ARQHejgWdv58_(QfS zld;Qow8~Ti`~=cW@_JO<0%-w)XKKgX=N20T?cU?gja|yRbK=u#zE?dZ~cS4o$4{Z=ihqI74c`*=UMk52GF{F^N(v+b~0;$4u8_CT$VN<mSHs|EYLtn zuq^$n^lj~Wku>w@B|Ci6rj#;}rQJ=so@!#Ys6Udf)*+DmMk9rfGKADdlHu#((!bJ2 zT1j>-Bx3E4Ig9pszHyx@Fcjr%dNi_P10udu>AEegQF4zV{I#;&pj(F8MwDAq(dM_N z&2)$eKi5C$I6PV{Oy$4XCm3z;R|uAVri#!An;8T6Jb&cqTj za0myG5C2L@AYuwjkmk{mG=HHCL}H<00C*suQlF5zh)xq(B57hp?y}y*yH;-M@lV84 z>F9&_G#6jhw@^VE_@>)k;$ooDZD9M(;sLVTxbPIt?Bh`>0D?@vY;dZJa&ydDPYAg9-mdsYtMoh2G^Ta z1z$D1cw?v|%uie^kUYyQ4`-tkuKo=v5U+##Nx*c%4^OW;Kep)yN=Q6)1m!wy@Pd{u zs$0n?PR$uv>oyS)ko;$nxwvkR_-GD!=L6O(d{OFjd=>AgA$~k?dV_+DsVYT9fOi~C z1)$hUMNz$p2C~6S2Bg1~=?l50(`dITUU~;QZRMH9jV>NcLiX;-DM*Eyjjb0WePvIB zeje-vnc7&`ureH~<#I3o8C|XbWuipij97G8iOaToi8hP`(0$*Hr{&8K0|4 zMz*LJ`?X@E_Wx*VJYTtsnek%Z6DGXQW=3)NHp%2r(X7oYM-7$blV-*y5q?5vD@q`+gvw!uZ|@iT&Ql#^%t)Fof(_)o;~6pep(%tRlw% z39FN8Y(|AXO-0`LJ^k0wDo}*1+MM$0bw&zxbg%4(d?gm=<*n&42DoSt!JTkW+wJ!> zc#GbRJp+VqaYf6t(=N+qR`5?xm+-E@+O+jXyHn~4g}$&Y$$R#x(6{HFD)fRxaEP`? zT&q(iO}J~eo=fwO;Bm67<+H=c)WwI6Q0yix;w@#vHbD~MAqz6j`HLpTY@7i6xRw4M zoIOOGyE<1QU+K1od1#f8mrMTb(vnGg@Ux_^D^JW;T6VZ8{n@{|yJvMjejH6s&cdqfNGJVlbBtshx4$)S&JjJg-pQ3kyu)cI)kR(akzHYG zv$Jt~8XqLERKB_XRtKXSYrDU+&$*Jtw7O;chS%v}$yZOc^vc6W)_hKBg=R_1Bw#az z4)MewZ`w9&Htgf0()Np!XE~X@)H^~6Q~h`Kk>&cBpeYG{0XAJsN*M-g&@DkGZVvFX zcG1qqSI3XSh~FtGiEa3^RXqmAvKiHiDn=&9Vv*iphG|~wBnG@S{A+#eT0K@|yK6LA zsZ(T3_4ijUuNB`@b)9}~#y($?#f~2SgiS@Ih}stpJ_1Pk)M1*yFGZP#WJLgwL$^dP zQJkXbsR+g5U(J6MM|fSt;u1XL)=6?cV$b~emo|e4TAMB?|8^HTUOxCtw~(8_G_Jq` zO5b?|lhZc59Jy0@Qu$MOQW&b4Nk)dMc~W?d<8ACFn{@4Fat}PxGCfK8Q+TVmt+g8+ zV);_2Pp#TmC5DQKq@3O>rlFARe1`s=-e{hoSQx74hjj9DP=5LA^ea?kFo*%%NQA!>Fb@u^Wo|voECE)OTESNy?97tVlTpKOY zZC01#%H|nuKI!QB^@rOqN^Nob+`k4bLX#SA%e1IohU1gZ7s?Sx$!V{lw3Bk+P4uCE z3J?0;2@uca%K|)MDVWG1&LuCpaQ=Xr`Q$?4KB5;W^nYJ!zucaPk|zH8%Q1{tODq#G zbSc54I~S9pxki>fx4;XJ1ydAzGA2&*L-+w-RNM+3RE@t;**F+@hLOYd?e(P zmitT{zEzCE1r(yvAh8gmXSWv>YfkcM^T|7u$PmTK(!fdi+=ostNL17f9HS2`@I3G$C_DL8Gh1J%b&KWc7C`% zlAktRJAlyMf!TBNlEv*s{7u~fxAVMWOY=FVBH0%&B>XK<>v1X6v?q+^|s#uoSN;FP+dYA5!`P8%gM>!Yj=bFda(JhD3TKMR>bP_6g z=%u#kU0CVo_Pc$IFx7X3{$eeowY8E%biPsIY?YyuGjX-;eDs{fMOWLo7;@YFwm?EL zd-KX7^S8PQ#m+LQ06(?4Q{t3ltI+uE(3Xs@_c`?@yeJM}P+ zA>q;?xSRiXKz(Z^RI$B(%;o<$y6$MU+qWNz$LwQ|=rCf$9tlOOYNSc*ShYF`5`@~6 z4r-5*L~KPwY_(@gwN}hpwW(b#TC}vKo;SbuoSYaHW$(8H=Ohk)wCf;{-MI%zg z7w4?Ou9L5kd7TT&=AVnm9`soxIma9q%t+_lvNWYs$@m#JNSm!_t`LMt-sL(ix8{}G zsbEcSc`bx4s<03_*=X**aF`s~;Y7Bg?)T-I6|nlJDAx&G3Vp(S1qU%+%5pcZ={F6lp2Txj^y`Q3=r^@%S zt9I1JovQ};EAADS)SVX1TL!+W_>XbeMD36Nd^8+9xAsNV`DKmH!*6jTW0y6O?Z0eH zYRpCdnD(FsA1z<;%bvR~bG>$aB1pIo)Z#YC#l1FOt&$)r=E=dq{mg}%4%u)6-y_~Uu~uY%T%J${AFrJ(gpSf=@Ha%VhBf=yq-zj$P({b#_JOQkSW zwi+pG5S`bwv9QRsC0b=`EJXWI`gqp&)BDgoT8dfjH<_>(pX%1yrw3_^uupZd6>pOS zzX&S_@qp{JvXL%^Ghf(}5y^kX2qE-5-gE#8C{}oRo-X0VJiX3}W)yzj&SXJvj4{v$ z$k(#>0V3&&ATFN3#Cp%wq6CHl*-prZ4`o=sQRpY`Zhlg`yYj%)Cqg}e$wBpr?SBC8 z^xL+HP925CLYpaOym)JEpz0Hw??_wb5|@grt({;p0nDhJ6G||Ex7SfT12cFN5R68k zz?ZXc@o*m4PgSHO98Q6%%rO54Fys=l#C{lOReGn?AA+U;bO4o1fD1qd#>=W7STXkj zX&?x+n_nVKBs8Kz@X@)O1$quD;9p%yJHGSqhX%~i<7ajiH6CTaV`<^j7th1 zSRI05ofw26Qq&xvMv^)}^d$Xr0qM({^32*D95iWnHRez^DJoCmkOEBi&Q5~3jl`H@ z@%J%g`q-utfOKwD&JzVpKyXQ{(I1UcB!0!iDRh3JmD|!9Fcn|NG(qNIbos*SMi`EF z_a4t~fR>G<4WS$Iebmr`1Ng)##04q(1%oO>l4Fd_kA}X{b>9*7>A~Z5@9*{IPc|l3 zU%s07Yge#+8lPd9(~0t6vA-Ff`OdDVqALJr5c&q=I<;x9c}>i-BOOx%@E@^T|1&~xXr3C_XDu)^iSx$ zkdv;@+hM`7ZixZqC^Pfa^vdqm7g*Dc;g82H4vEBex}o*nDf<_-JHeegtxGd2V}9SF zr4M8TEG>y$=TO>Eh;(62qRo%LuO%&&8(&vr=aa2nI)AM6vxpFq^X?a8XD+FG&9_<= z+?YRfMaT@JusW#)1sfl7AEtUJ_L*u^39l4w$Svnt`w{ZK+rK58))!=?XLL||5gAe< zl7CuOX15VDH;vmluaU&CvhG`VTM$Gp5=&*)hsWCNtQdF7aV^eiMSP6xOfzmbkN zd5>zc9`GrLpjHpR6119g8|O&ch>3{D<2sQYci9%;SD$Tc>`c6>t*P$Zbnv4N5bBwv zp;y@w%RAUntGtd856zX94)ro6%<@0n1Mr6glDMa}-NMY?XAZek_(s>HC1N8El@8Rn z0eFBsxnltx17NV8$1u@XDdsS5ZcYQUEI=X%4NzjTuz(=ty9IvUjB|K3_~^8FY+HA1 z_ndMQ|5r2n(@#y~kp-VuSO1QE^=i1PJZ1KDFv?#4TJtD;)Hx+PxlP^6lBkBSO5QMX zl@OsM&j}DEH=2hR%SEaU8>FMG)bn1&4%^~o47D5@)kNs3fHW)h2oY~*!oN|*35BC( zX?bO%0dBjKH^q>i1FV6vY1QpO#dO8H%C=c;dT zixJFgVFl2OjpP@1=COWed*j^%^1j(8(+16Q!2r8Jri;Tr4`JH^wt`4o%cLV%X&=i4 z_~w(~?H=|61Ng0Kh@b7Xf$+^Yp$@&((pk-bUu<8rBo zz0;R*c)EkODOv(A+h~h}JmWzC^`a6lGqG8SC*L=Kvse(w(L!%I(X;l<4B`(=&~zu6 zdS%kNp=okP&E*(^`W0jGXR*m&k+%X7h8N%RGRoFH6MNY$w?7u6I&ymkU7Ul&~H2oy_HpkL@m&vbPKw$I&A+c2m`_k8djYApO_l zmL7lpG;$+hicEYtKj--5?8F1+y|-cUJa3zSsr}w=@QKWtN}Epv+oq=L64sPP6{DfKEahPnBn<$ja{UYf?%JUB0I$GQJlT5k?)96)@AW z0v5DB#xzw-$S)6T8I-dgvAeFbp2|9CTk@l|&9Y-VVu6rY;c$gb(7>a!*(&#!3c*>wDMbxQ7MNN zNyr&AyB&K49<^rKbVVp`aV%(#5nC_1L7j}tSl|zB`EDdoZ#MaqvBrt0w^w6d;0yY& zG2t}vDM1@s`sq!j>u>Q}nnP%3`6e6_>B1rLlWuy&F6W7zC$pGw03}As(6V>_?rqzp zuK5AyUEU_WOOwG|IK##XHXVs*;%42yewx^3z^}l}R9S|>8AamkAOUdeFpbfcVFAw# zkS}C^Of0%{K}iQBs3ZHjZ3v{EZeHt|~ zm$-es)E(DHnMfZEgO|fcI#eHd>er)nYBAehC^gVT^ms=0O-S;5v8@LP=&_mIIXqr0 zGgnlsC2X7o%}!46La7c(#wiYt(keZ4k&^z`N;sSv1j}}E8f1V}N&j!L7$UYW>HPwD=r$TgXq^Tn`xBpL?V?%@=+ogLv3fA|af6IzdS7ek((xGja5779%B6p(tqw3IJF#&vQG`?_mEYz1HMd^Kz2zb^oh^xJ7r|f1UDFo{8{s!aMkgW%E$BMF4N?wR(uf@x*>Dia-0% z6PsL~{tUyyNG1qljKttrrbdv19v&gUs3e=71aHm30zsfe_+s)rC6>ONr>Id9;oKh# z=wPcz;W&a@2W+jzE+0pkS(^j!L~JnUj`4}9?uz^{epmCQ-*`d9YN z%>Md|y!&HsvOO@>eCO3d+{iCKbpEYwC(!Z|ZMq@D;?EUX_cu+!8`bpu=NkLnMq)Z@ zvrWVAn~&1`L$el{l~2e0*;=Bh7$Y}Co2guq^Xp5$^CY1no=l<)gZ5DYuSn z*UmG~E*%n=rzEC`)MLNnr~7lQgMywGiTBD+to(6~?Z4=bM(O4zP^sLTmZh+#b@r01 zBMAMA0$bBJb5vg1yfB+`sy@1_OxGyV%HuQ7(~o7qOAaV{TaD)R7mDozluhu>$`Okr zZNEgT6{Okba;J&FEvs1Qi1g{fDe&fO>)4||LRaiutk;EvK_zukzDesF7AwA2H^sVAtV$iP?J33N3v$5( zH(hC1`Iul!doti7cfHh4$`RK~lD#*Od0n^1+RF6Uu*Aqz(>GV*n9Oo!rQXq;>z?4h z*GdkxTE*)}jtFYXaGuTc6_sY#LGCvm3zn`=vAD!EPnlHjowA);PX&b{*kdAtP4|=YJqt^W5 zCe>-_^X5z2UT{`(z#C01-t4^BDR>W^Nq>;FGZ!eiMqIBtzIi~ZGQr(n31(noi01-o z7#mLGqcfkFfObD;N~3JhO>LKs*2a@G^0VM6Fty^GC(f7ERC2inw*G(R#3#Q_@lnZ6 z$B%>B)I5iHM_iqk=Ac6wWDTmbiJP@t{h}cms>W?oq~-*hu&Do4w|ekGXCMUO@2H zjZ<8BpoSA~i}ecCK2_DX&E{vwq&_c!WfDN;z>o4N?+RoyMa@#EpL+*p>L1Ce=X5C6 zhu0@RuDdQ{#N{7Hw933%f79i~o5FS1fdl{ROyU0ocgtEFUYFdT;;@jVq~5-#^M0&{ zlw6WLu9hhye`LGelj>caz)xbd{q3Q1XnO`Sn_kPZk@(V~LK(jM^@(bd*yo2%hv-#U zPUiNS7()ZA^zY-AT5OUe;X91$nKi*k`|jO0ulEz20hWXr5Fs(bTS zX=n`INvbet#&W_cc?~Q_t1F9b_-vv-UQ5pDQ)#&Kw$-&5{#M-!$^kZ<(+lVF^b%l) zSkjw-3lr$dYOF=Ko<&Vu>(ocRnAe(;ue7&aZ)H1N{yTbB=W6(Fz=Tg{a684DPl`+Q zqo09En#5Wp;|2>=So~sCmY5z%WZI$!VyeQZ$NCZ`{3SYWab)M=#U6+U?cuwgSm;CX z1Wr$v*K7bTet;SSpj!+81Te+vsXPN<0U$`E!~{SXZvensvtn5ASbClvFIZdxUqv6$ ztc`aD31HsX?6MRd%!q2?kfEBzxKUABY@#d^D?9z>lEw?@jlsLrm8U2u3_bLbA*>rq z4=={J<5cMt)_Ami?&O`xFeP^!aY%Kef%Hwr43MRMwxa=6{< zL1Yu?1=}25nTorLfols39t&45&m7p+KMf52d*l4h=8?Ji1;}OyOY@3*z~=BeZtGVP zV*30)KzDO!tLv66VO2W7RBq{VZB2+)z}Z!UOrr4Xv|OyF0ygY%=GZ^d3;C7DU$);o zee?9|u}0qV9se9Zr&8tBd$ZePq*29dV=}&#Z~g-`{RePgmregBv6#;HIFkWL(=!YrJd(Q-9dTCP1 z`;}dnlaG&dMY~QqEsf~Zc4*CE{gQTH((2#%^qeHm+)VVD0GDFw zXKcw4AGl>-V{OtmDa6RplUVU5-Z&z+^k=~PU2E{0GfhF0A}Q#5+nO}ZFrXP&a}%%C z+Bb7)iE1^cabo2?YBp&E#jzvTmI`ZIWR(PHH(zd)1{43bU2exFUTUYaXwRR1d}rkY zA*`P8=f3F+ocHXdDxq4x6D;rY@FFTrTQ(YZB0}8}O)~N@`phc#qp|6j+E5+x$dg?= z&us+DM;RHI&&7v(4TgXA#VM7$QAIiKxGSQ(iw>HjNtayW)QB3c7?FU}E5(dD} z%F05I;Kmr-G6EJl38@wpME1nSNY!;pcGn z;){DX?db>0+n4rdU?w}4+SJ>Gk-P7jfBxMi40u)!=4&e%##0I&qx(TF0ea ztYbP7>`MNPg)W`MbhwFRsSd{=(mIAZIRM( z289xJ_!tr@g8*I&4$^Wl&7fLFjR$=I4EkXA`@ZW*ybNG zuLoqapvzY_C3#K^yB!xU-bowyDBu975D}2Px|@wukfURs>EIk$KA1K1LJ$YULON&T zxT+-PFmM+b35AaBNi5652KgOg$ketQQ5hGi^}<C@hzUmq7e0T#j$a z+m@4!s9=j@ij1lj|8ZsEB6>@-J4KV@vG6y+b1nl>U%_*51J`QjTsiwnsIQ6%cCJmN zx`ll%NAAVz^?Zjk8hx?dwvCOBGf5?@_?4B{iZ7N)i5%N{5W05=3CuG?xg~ zA=t|=&jGB)Jzj0%pr{T)v3|hN1fS8N5-`6_q!`44_kuy4^D}O-%PR9G*0X|SZDI9! znF|i=G6_||e2w$ZF|TWC=S5AMV<$pi5xFRP+OjFs2vb)>%Qt+D8PF;bg}I*5 z*)*64Q!Tf*0FLu}0FADyesMBij^45SDf9db=5Aa__p8KhKV9>PP8m6b#$Ly&Gsth0 z*ZRD@qxn~HL_(V%uw-FlGr)84^-XXA%^}y4iJg^85w1Nua4IWW+{! z;ncm2Kg0;EMeR&K(>zuqRN*wGWX8g~-iXGJ;_koO6!I~q7mA!EZWJM&kd~Mhk{xrt zU7^{~Um7>a<(PS~x<7VhcH)U4!LlTrZ>{6zZohw2nLMeo*$eE9bBt(@2rg#I@%I5Y zSAID>f2#$RZG}3b$|RIsOn+}ez%kKKMoT07ua$ z`5>AEBb~z0B?9-1e@iqYDHB-d9P}PKMS8KzGRKcFzoghr@bgC*cLhDA@deIsO@0E? z!C-QArCE81K9cD9;n;!rA0V8cROxwdEX^F-fj-XJOkdwxxxz-2cu!oy`6o|w;Of_^ zdm)+21H|S9oR#=FvG?IZ3k~7iqL0iqJVA?hBhBBc2jm z+WGtM3y9dUlBK^f9MPAgPUBXr}Ce1|BO0Mp3nXK&^NdKJNU#|_vQi8s0x>B0EB-es7sm! zCB`-5i}AVWR;g@=r?k0ol@nst6QL%jAwokzeTLC4vvr)b97MK;|CbhSn&SVYcpira zMqMDdt0i5vX`P+x3QR5;R3T`3CQE;zWi7g?CrRutXm5=w94UC-zCM?pm?<6M@7XwP z#AW!nMqC~&XT%!IqZS+|gT`~yci`cq3#Zab-PWcb1Qq*y0uAyrnMbmHYUvwXJ@7h; zo&42Py#q&{&yvsO)uV8vyA|1r;#A}kU;ca^DR*f?lU&RskaypUGuT?yN5e_1-v-(& zbN$dNf|M!ctR5$A43);W4+wccKy!6%yt&*;FgvwEx%dY~bKHGP&IDlEeyqoRSWZ#4 zPm$Jm9`uhQL!f~BGA6N6Esx>tXch94LJ5cR{AP9&RT94BqI4|*TNnG$`hf?s2h|VH zG!5{++B`~P2R?(2)}0j_(Iw#NtT}WoID3ObVTGZyehLrMhxD_Ydb#(0Li&qPKkBDN5A?ot*8E@t*SeLf39c2J zRi5g1J=rtc?nDK3nMnT&e^oC$*j!Rn8Y&5aIIC6!JGjFs&ag6ibC{soxL^V-z6{ft zU?hp5K*Y)Ql+T!Sh_!{dI5|<60KCNj=bpLGW6kRJwk!|;(B=lb)q|*z_5WwcWcXmg zqfhR6M^2uHf<_VtRw>)nwL}@u!Vicy$s)GT67ayrJuN63)Is$7R!yQUqi>no)W8E zFP&!mYP~k){JmP{=+Gmlv}clJ?ee)Q1+*H({|ou}ELa-%%aOl;)c+GkR#`=1!3ZlN zdOmOG0Q6dCZA7p)DEHkr_U)#pO#XS|plPVxyL)FF#Xv&2M#06l{{T;(^py4X_FkLx zoVWWlBN;Jqw0c}}d@6!2xmq&a{;ELAaAbkHDTf4it<)*{HqY-lb>7=MQC@hl@8<85 z>mG3TYtq6T<;%UZLMd75s%PfKtn_qIVzhIQUEMV!=fBsL-VwttIT065e?gKROR$0^ zEN%Y&#F=`~>WuupAd$K!B&C?}__sM-d67PdEb!cr9azE241Ie% zys+84KO(p}wAs?FzFl96mJls{7uYNG12Pk`{T4?`4ers)AreAn?T$}X2!DiYHuyo6 znNATQ>W9|LI~pH|L5O=o_dQk;-4KrjLb`49m;Od-Cv80&NWn7&?nzWnszRejC>5Xk&_1?mViWK|l$57> z!9N;^6X?Kc9z9hAG;1=*6lL#$Bd^dFppxN{L{%@0UfyBlfLXAVX_<}X6@XvoT zGfwfmYDV>$hGokNHEfE)WGi5SA31=EdUGHMo(o+kShR+>yY)s4Gb?KG@|M;F|8a%> zD$l;ib*e+Z(FA&5CCp^m0a&knGM7uct=Z+BnVu5beq%`H@ul;ff5lZJoRt;XHfx68 zhv}5LtUnDjmlAf4Nwx=`Cfm;C&uFmgc^$Hjs4m4|E+>yakc;Yp8tFl#78|pzOr=pk z+e8b_5{VDT{KYUb_k^Mm1(o2|gG@j|Pzea3J4RfRMm&2^Z9|ZQfhC!sOyC8J6&fvZ zVlC3f(d89DZhN$;iXo$>mZ>L+0UVRl7i2Ad$G*zIDYYKNEhr8siqsG^cZn2t<{bH0 z`!D_+eam-Zm#{r6aHhe;neuV%Ur6(9k^qJCQ?Nh|b zcvx!RSLQYmuc1Q34^G zfhiNNL__^roe&R;9SI$HK7Xy2_Pp!gRk>}e=@b>|EV3=~x>s(LX z7gJM&&aiKPh0&{R$n%-rr?pK-t0dkiXK;>T1O^Y{sZ)2wgock`&&HeiCIrSk4!n` z&4jGosG5S^S(*7q*oRsT?P**8g}!~|7h;0cvi{3SaNA4Nu`~Tdy5sS{n`}`+r_D;v ze}IXkvh4S9tXin2cGBTHO~Lb>JV9-cg5U}3+h5K3fve6s)p+`ZKRwMrl<>M(^eZ;$I4ZmcEO*l)=nKW^0C|* zur~k4giSntW{T7|n6Y&-Pu;PA{!86ipudws>p`8%jmqOoGG5PC2Yoiak}#vxT&#_* z9;ot-@=N&l%C>+Q2xV`X1@bgX0ud?n3CH)Fy{QD-fgQFJi3As^Pn1qa!AZVM}PetlO(?Im1&@vZsG7yT1 zt;+HO*4w|aOin;sBP^2({5N)lM`7C40|`2+_<#@$tzGSNLSCE5xUTnhp7)U7h`hVH z^W4Wzt{_noP5mWiH=QSXCb+NZhE_!axuiQ6?}hOGM_(+~z?G=Z9_#@|iK-E~dEHIF z4^;wVsMt$~T+~z6+225Otflq?UH9V9*dLqcqBR!iFSe4T}} zCsj0gqOQ<$7dt0Mqw=^Zvo*-Ml{Kr{1w-ClTY%mfh_@X=G+#$Oyv5q&=HS^xS20dJzlsG^p2mP{A0& zau8LeDY7p;qy^mP+OlOjNCNtDZ9TAc8Cab5< zI!GhHfjMYg9~pbyT+#$%;6&_=Na3f?&rkzvR&M$|4MRb0^0z7{I#4jl$}2Y zC@Kc54B|x;Cq@JKef&cjgd@Aa`*@-G~GTb6L<^)z8zxt=y zF8`%9(SOdigNfs+M*}Y-K3j?-;7p_^jVT% zD9=q~=2Ta#Vcu0mTCZ}!Zi^Hfl&faRhz=cqOkqk370w&`3+L>~PF?y@t2*lhY#&(1 zAA38%NeKEr3JW<8ub0x2d51%UeYa2wu}YS)6QZAq=@}-d6g?L51y5882lm$8_-b z<4$-wk?4~HZyk~9m~ZXv=n@pwxYkTSfX>fqRTJ$%D+0l3IS9ziRARbTx&yBCOj2ub zW8sOOPbL`pwggG(l53x6eq+;=#%s=E7VZ~tsUA1$ zC7Ae>Cf=CC19)pd4|kB)`!_NeASUEcDD|Wsd@J~-Wd803bn>e0Pr>Kzwl$+#-T>tOykweoKQ9f^mF?UIgny4 zZ6gumB&}`Tt!#gr@gbS^(aS5LJHv)0XrQH{aCLnqi=zL6CT0|#(r2EevfyDHi2kKE z`O=a)EM2yfJ(A{SnZ6Q`D!DoLdUu=9!PS2quj4&m9RvKBjZ?=rW=C(~^DC1#cGT6} z@H*nA8Mkl_>I<&z5%oklj0Jh>8U?!1NGsN4SMwZ=HMNI6taYW#x*^)NU4fC$w@e=o zwX0hcA?)jIQGH&MH@%D5VOF2M(B4sAge+x!q_~?#Z`#4^FdEgz^F_rsrV>s>{D5eJ zEq*L`R)fvH$`s0*eoG#L0NqlJGETQ06#Nm>K6{*)sEkXzF6J-Mjo>YIg(N~XxfO!> z9646tTQvE=tekk7oQlt+lA*evFwK%{+~0YC(BM6_FRn3EcnJ>GtxAS?jNu6>N=7{rd%S!uf*~g68-OJxu+oSn%(HybUac?CfvzcwG*L zm0Nw+W*yN_vXqNEwXOLAI&!vqq}V{~AOR20)o38g**C;??zBmf5O?Ci4KjQl9@ z!+4QA!B~Ao?rAa}%pWUG9+#y+F#lVe>2?ROI;h{(#H%%&KDEOIDUbmpu|%^$I+Y8R zVEh1rBu4V5Nzk7I>9_|aaR5%Xgcm(adwZV|Ol69MV3;lrm00ivD!w=1ZjlHPvEddJ z;}ffw9YKkcKj-|h9beHDdUx7XG$NEM19PDdM?2uB z0lhz^laBJ0o=7ocbAELk?5iIJyzWw;y4A1fon$u#^|Xz`Gr6w`{H+>AGOfC5kjX#O~3in{N7lsstD5j0cp|o zx%ub2hpetIUqpFF4Yx6G*d?25D_r$%(%%Oy5%=Ej(G_70PBPi872%=zO)G!nlS1C~ zIYGz%rpU;&eM2Dp=MNU+EBZ}Kj0dY}zhp0cOSm?8{bo)1d0#+I5_VeC{KeOPiR$LH znzk0Y4Fa)zXzbnEVtJ$oGkr0cwA?ix*EG^xNcv?SwM9NM({V|6p4fZp;<6O{rpxrn z<}L86nu(PauM|64GN>Hs)Z0NpbsVpqtX%r_)J2KS@z?f?w*uF0P74T~?3=u%bRq_q95tPAprp7gB#EmbbnL@7DCAMfuQGp{@- z_ryWwsiNKVR{z!lHZlT7QnJr0h%*7UU8Byc6E=^6E7RmqYv~U9YnKl9_{+5m3P7~O zrL_3Hm8_U@-8%@`N)x1zsHuOCjc*tG=cG0r3gk@JB0O;4XKkFRksUe&w=?^o+`h_# zI9%@5wbOK^oJzC#(HNy(MV>WE4K}@JXI@e*tTc(z`SR_lm-jNhJw2FQ|Fg17C@O4ca?x-l>#>Lxl|_R2Nf~&>)FMUhAvz0~ptmHM z3)#_z8*q>0HF%1}c>C-Fx8#90HtQNEWA{kzc0#(p#>Gm%?J@|B^z_iZ}n?2M) z7s%NY4XgV^E@CUS7Zv(2DYrqzFsmdFD{D8g<+eQRrQhzP9FL(UNcPs|;0EX;xqkZ_ zZE(9QTFKoZMNTs-x6HCIlQ}6(${rygEM#rU_$mBdHJg5NMNL&!2YO`uj@2T_&Nzq< z^qO?@nR*3p;UYe78^$~2Syi7kqh#sGwLuIgk<>qJZP6g>yl_yl~b0rR%$ zf@V=--%an&7FR~uiu387`lffV1s(*CeN`YGGPtutWV8g!gE{X*_Y!MIrM8egoWdRncf2U@hV~lMP+;+=)MivbP|!~2L^(mK(L%@ zWi%cx#DE?*Fr4LakiOA}!AKhJ(g9pc425PSX-Oi}!vTy8;Nud!ia~fifrm$u zi>)E<*}**UV5F-og()U7SV9j|DG<*pYYTr?-P0Dsy@o7Lr=4K@BXc9is(oDkez4~h z5uI1vbQ$<+b>#?eQlf74Mj_Bg0ww9EjDIwRSIbVOVBE)(s{4WwCdB-do_g<^&oFsI zGk8_jqJu0; zMtlDO&J&k(9dU#C72i&z1H#0GG#0-O?RWjgOz`uoQa4&?bEB)hy$=h5J07Q42W#2f zPRjVk@hQ5*QU1%8QzhWxA1M-)wYS7>^Gt-g5J*`Ucp33F3chzn-1qh%bK=KdGdn(HQX;#!A1kSvGn@##=QLT0N&mPj|oOBhRwX_J9 z|Lv7|M{1rt`Xn^Y1|xEqHqJ*J^gkquo~xK%F5Cv@NA-<9#_H;CIPXjn&T< zpba4dc(0;ihnHx@&OQ6DqTD+4VcurAyl=Qs+a-e8s+Mq5xu9WO z`?$_;sY-FkTppf!q-7H8s^KaHBLt#{TO_5U*WuHhoE{+CVy$-T08RI~%MF4LT1TBO zY3DWOm@HUkkf>q6yp(3ofa-qTh#G&aI#UZ*f++NHT2&f6F(^XPFjD?jdwgpps>H+nTSl?IyQLIRRrj7e3QibdQPx_OKZhK+%X=5lOK_a=$Ov|Ir zEO*r-?VPNQPgOrn=>(9nQF`u*~4@jz|a=)t=P z@7fu?(iZY)2Rg_}ybbBEc*&vu7Gm#i5npnRX}IOPX4)!@xjM;kGZQ zhg8YB>T?^3lX(yh>J=CazcHL1Y|RlhLHD7lhpWm-fgr5CI}hoX-U_4iWGgZ5@nFdC zhsk;_KrR#W#hyq8`2Qv_8O)nxgwM53;bCpWl4{ru3l)G8!^FZxXAj`4ea5F|NFOad zJ5gzk%5iT2Wtul|ZSq_L>)u6a&8_Iz>(y4mulm!VeUEWSxqaUl+gHIXA!3a2oKt zZ8_-okEQ(pAM4h}2iJQ2guw8foR$dxQ}qIQD^l~~lL_7Q(63-HQt<4a+sZak_7$#~ zXouK;+~pc}t^aao=%&U4u&>XK)hfux+GT#>&YtE_`NLoQnHS4jdv)(!C&_g3Pnanh zXD)ZLrn~+lnAcen@akAje0@on)`AV_=lCsU{H5gpS2|m+wMF!Lsr+JSw{wkH-bg^5 z9%8v`Lf*}H=6cbaK@xKagEP|+x)JqKmVS9M@@Cb_5-od;Ih4uOkaIo6H&UBa%Zqz* z@ukf{Bi7}`x04nM&}%P0uAqmBSV#ZWX=MN;V~f0yIV7H1+*M#NG*hXxh{p zvdhpmBHK*T*)_Rr9JtrPGT+3KMV#X&&u$XPJd|v8%Y0htcKo!F`iXXJ=v3h>4U1J#Z+7k0KYOg4{+(nFe)bd=!*j#_Tke?ovo0QPSAtM{1z(Rve2pYZYjE2ZPq<9}-aVBi8w z0Bu1Kqf`U(kE$iFD(s_R(Uq5;n%`eH{E53oc|X}m@5W{-PGaJh=o~nE|NZ&olTpsU zPp@kY{lL;YHx&LlU($W@X4GK~H%YfRNj@(Z2s9q3;Z4CtLAuD-QLp%_d2=r6uutsh-~CN7-J1>+SsHC@PBLT zCg6%+=>}Q90FSD6pkL&DeXjEjvpOW&JU&-8Oqn|M#dGhE(y>+Z!sTp+jm8Mk zwP;6e-r`)K$F0#*PdMeGqfLFtW2NNkfdV(LP8zy~yJiGVdW_desFR?|(K2sj@de(Y zv48d#3bepA3cwi{{-6@&2vYph#mbP_R*@W|GQ6pfVcEE!t;aky)?%U-OZN-#7V3Sl zVSgVKN#>C!5Ex2_xZaZHnE5GCd2zZkI{Y)mZC2C5_E>aB_ULFWbZ2h{N5H_lr zF@u+pZq+*oI^B4ET=~3Ufe3veQFFB;SV-E*&$2$+Vk)2tcb0RT!+ocx-7Q~QECAZ-blI3vDPuG*9)B{&u~RiZ=zNZRVGR(4&+Y zK>8cZ66=lJkENA%b%-vehmgMK>P8~<)jEX&Q6lCrRo1D53ImxS?k!K5lG)wC1)zaZ ziVjl}e2nm`L?RuDOd^LVi5oUPQy5LWHA@n!x9MGC42-XpXsm5eB{CO+SlIQD!u+xE zi;Am2Fr#~TH=L^qn=O&{+`5lW29}Mh8%gr_QFz+jz#)3UXk~~sM zt+0jYTifIqv4763rCwMxNVCX8?7>Zf^d(BN8yxB^6`b$Wpy_b0H(9+?mb{AXFnYfh z+AH5AIkzxDMiuG1#;ro~UY+h_YJ+dY+#e}@md-(Vw*O>&z<`q8L&((@$j6 z&s3ah_2gVeNUtdOe|K5+@;6`4y}?6Erjm2~j+P{~dSy$6WLrD2xeqg@!3gNwu{#*4 z9B8-XuV@=Tdh21U-G2b-Mw2Di!?VM4X3&EFiOa;^_tT{M%?k7P`^Xqt zW3F^`1!dk$?bZKrbe@51ukRn$dC+RrUey)}F^h|&3n_` zM(#g`l3vqQDtAY2un;8?3v2(#7}9jcP{_-sX{lM#madn?w1^Gs?R?w z>iRJHoPsPWd~=oKe#gLOg$BB6R3(M|bB-*6srA9K{QKiJd5?jKuY>-0C)J67VW^vb zK%#voVNE)2^T%yj8EFi*+d<#Y))W^6v4{@rX+wHSq>{98^xnI0Uh~tn3RU zh22{H=FZTp0lus^NpFbGtFJe|J}*`hOT`U2NV;&kY|m8TBs~O(ew+THNZyW2l)u~H z;gF>dp4LKolKTVV5vuD>x8M4(^Q@3w||FPiKdd8aGhc_@z zrEnea|ASwzI(X5nn_*jSrKk;!!A?(waQBF|6OHz|D}5n-EzCRf4BD&Q?hXc~b@o;t z#5b6SLpI&lGArJgW}z>ta*X73uKo`HY9BJxs+AUIpVHx?riaEoTDn;uR`2!7bzYcT zsQoPL;XKGEZ7fAM@EMftm7-vPFBDfLRowC-(UP&EuzY#N=9yL$$ZyC+TssuE^}10C zK;=~$7}YRP!_P}1KQ`GAhlKvHyOe2hF>7$iUvc`NZ`;-~Wmc$8LrP6426 zI!L^bMb<)s_2VaFHpcN~^BBzKF84cPcq5J2cc1FTKh3%dA(OlewVgEg&8J!ALb+n& zo;{_fp@HE4jlOm9gGt-~A#Q3$YZl<$sIpc$4~Qej+9Sukmk*d$_>slrD*>Jn?cHpf zI99KjaQNC!4s#dIgM5I$V$d8D0AA1GRg$x>bq**`C;0s{dD#};M~k9DxV0NOT0Hbz1q-Rt-y9;%PrIT>w|O#w~9@wZtTNK*`THk zMse~CC!P5mAcS{yY`m3@h1s~DFHPie@AEa4Max|MkAYfHTz$*FxUhFTz;tZc0-tpL z7;t<#8DXeOc+5o#EA#odMuMAjeu>~F{Rp(r!x4VCy%7pie?(^z8K9M#THF$3kOrTr0*>F^FWsd$4)=w z+3eUZN+|%m;2FJmA_W169GNbY9%pZh-?r3-H7WMz2GQ4y(NG1xy|#!xl$rVQF6l|_ ztjz-J3>qU&oI!|}dinJo9#zCn8l8+j6F=Vah$V-Tq7o%N3s| zl_+9#9;ax_1rAsiFMh^`MN&X*1~L7v->y-D-t>sztEJ1X1;m8Sy`fK5H2 z;4gomf1)ccrZ4|}oi4FpU?>!>FFBagvDmZ;zmDPmwVI)IyME($WbAiL1pY^YNuGnz zXrpQ;d)B*q-s+D_S=ewIAhAo%|voUBf^)KkLp(WS;868${APagd;3iVU+Zi)!$$};)B z{x4Y(q9lPjmdDn^A+b)GbV#2+3BOgP3;T)6A^rSE4>gxc^GH=l%*fF*WDN)`tB`$f ziXL!E8cJ)=!f?#!_B+keTo;#&f;|Y`l52)*B*F!y3@B-V>*twXNby+9w2}L8xy;fl z%6S{U689t+asQnO6q_YI02fDzIM=oe&d1mX5+kes6@hB-`RNWq#D;=qq()jae( zdtI6oylCAJg1e%~;jee=SjWapyl8MJcTF#q{5;9sCk}611peB1pU>_~w)dq&i{2pJ z`^a~WT2GsiR+#F63P$`#$JVP)C@b#>`cH+PN`%$MwXW1v9-MxXj%k=wwP7_CrwCcU zxGm-woy#@lDmT$BwpL&g$E9N%V0aoH6NsZOCQ#HoS9~S?nHK$ohfm5W1sB45t}GFZW-G>@H>=sze~9P)rQ{2 zD0aLlh$cAm^VP2jv9^X6YN%?-U-n3aZU9I&K_t1w)7H{eMs?Y!*7fI?vR6E_gvwMa z@Af=#5LfeJna8KtoV&9BU=~xW^Q`rpM@^!Il8W^k1*XERKolY6Nv$K03*HwrYMY~0 zm0aVa){{X-%1B-9cgl4>OZWZ!k;}sLt_%n_;93ks3Rsw~XIchP^@41Av?O(3!Q!Cl zSZP@kqXh83lXYCumo#wF?0BikdB-oUxwq?`=yn`o2`!*&UJ`$HZ<40ovsQ4d4e+1I zqMZUs#i+hzn}5#h&_H2-&sgSLMx?QuOe(JNOu~xIPH8W&5G$54rz0s<69Fg}MswPR zk+QDHI}LQ;@zlSe?brrLkbn&YCH`#)p2V|(9Ry&?tPl9Ug1dyC`GU=jV_IWcNtFp( zT-rabsO!hqS_4GfW=^k3Yj!D1^Eqi;HG8PRGM;nozGi5YS8ns%!+C9H3x#E5Qg9L- z8uvQMY;fMy^V3!bTz+v>Uh^xw-u+2^C7h0v!-r`0adD^!2_HL zQU`YYJ2xI4U9Dp`2)O^y7j+4CyiOl+VMq# zkF_-P3TJcPGMZi9Mp1ngrF1*Y(Mip~l8K5-*sh3S_W%l>;{m+7xC?1%YpA8rBsgju zT98}IFB$egiK>F2>tZ?d0lc=Z2{)viieAzVy%GhUiYxj65jTeU2IE|qa(d&~#SH1R zx)N6s&2{i{qhMc{&A6mX8U9%|8j#`g(!Olnce9mS5-Pd3N+(3us`|hDrBT97Uy33X zF#V7*B+VOBbeiPj)-M!?mcl%3wMe!MmMTl5U> z`MUJ?OK3`<`tOk_kv0nc8c2Z~C9Z78ftkh=0xU2ovfC%d|$|oLof# zJ^ou0{f?!5*6w^yymWCYp3_u(4nK2Au~9tOAa*;vtlZx-|I6HmLQ9+j_*VHhX{k}> znH9St2J`Rz79t-nN2@O~>^|qX`|WZ7|><=zpx^*2+YV`ios(5tM^n ztAD`RO4CiNX4dPDxhyJG=9ed`yF?OIg1ca~Crc%~-#CAL!37AeG{eNAg6^mWuD0fYne7@r8_Mmn)P^` zS9a@0vi5CI_wVv-eT#XO@{>#CL=9Tmv~(i=3zi!Hj6nXY=*Zuvo?9n+Agu=~UHy(RO(3ml(Bki6jI z0Dasn?S)!{o?5o_&F$Li@5X#TMTFREB-JPc@TZ2vU?p`)Hm_QK(5OlbBVQTcskkYM zBO|>C{>HV`fKcW>;fUhbVbkp}m{Lx_fUS~auBN#gQvLfcHTVkkwx;ekJ{&jGj{7cA z3n9Pv5ge^03Xq7l@5c~Q*qiGy(u=e3y8;AdMR>$v;1e7h_I1CkyJZCp!=;#b!_ z7LTqkN-|VU-X&cY|L3XmP1cW23@Y*+%Prrmw~0Ua+~kKeKNC=%cWv83Vo4c=SiOjpYQ8!wlAy3_7ZcD{i*3;9F(ePyt$5Hoa_vqKv`o{K9En$CQ$Rz!0 z4Ga^$CayUcVEdiTv(%3-r+0^F1|+G&&ZU;_#ycI|G8Y;v_Nz^PE9)(5%CbD(N9!Xz z&mLn-8Xx@rwa6pQ#AIcEDBZoA>O=Gper}-0lKz1rnE|$S5n-|n;-~N==qj3E2i+t$ z6}{{WlMva}ZS}b}1<`J;{_>q;FE=t@{?q*`bDr@5A)E#=j)rDll$I(dmd@4dKG)B* z*cAM^DM%{ouVc@~d6g}se>*bA;hd5cg!;uY>zW>MSI}J3+0Vy!-$l zvb&TZkVhO7ZH2ZiAL;!95a#fr-X04g6=awwED3y!-r$Q%#OV%Vla$*!xc!m+n`mrJ z%q;1!;YR^uS&SG>Z(R|jZ1z^&?(td_l4dxQ`WK7ONsYR0h2aEkkBrB4yaei%v{V={ zVdp?f(*H3$hl-ht{&OTjx8tx^vtNRj>Y~jBEg#><>Pk=enlNV##c#;&wk^m$ZcLS^ z?JEeHc-Tw{Ud#(&_t=(}yl=Qo)VdNxLxjJnJG&-v93)io1!qWNV4(XPP?y5T_#7`^ z`6rg!yZ`y6Achl$8z25xb^iBazFl@;iLX1wm4CN=Yt%IyR`A$4B>YOD$E*JsOp*(j z%cT9Be_oB)7z@Z&HZtrfq&#)(NebGZ&m4}FA)onQ)To}EhO*|f2`2)l+fz&6-kbOqaM*tgLEEofp{e6aiqY=xlwCeI3Y)Tc6l?7@8?0EnK<40D zN)2`fsBW&KfW!_WiU&>^mHDdYp@IO}UPe}H~vTcx6!y0;KdG9+BI%BrpN zrdV=BJD$z7viS!km{#A(jbQb*8mqSAYv~hlo)D}0q_mbf=CzWkGnCUVnH;x*rv(jL zuVLl=zHi8(A13Iop<8ux3{5S*jv=PeO=NtsLGC*hla;U>v~~-yl&f%g71<+P{jyR% zM7<*A23Z&qGCAuRvr_+PLrv+olC1lJB-Q25#RwbIZ(itbi75KB&}qjTlX1DeUnqN_ zqyVdhLdurjDz)V+HWIYbbXWhTZZPa?S8u7|oM5!+@?g+0qL|=2-|wEbZ6mfeBTg7Xhy#^Ghk#7mY~d8PtHi%N zS=cPxn;G{_uJh)P4~IW~h_0ZHX7Yb+m>?ezoTNUQYqx#Ozn<77vF|w_ zod!-FW!YvS4%sU|DV(b<663!1CW!#niBuT);klCeVP@gB`=~@}#nq~Ygi5niCKidd zASUA@d|aVoqoT!AHj~KH$7W)mBzuhN=1Yf6>sNrWqHb{-&N5m!J5X2N7028 z{@!(Jw{Ir%s+H4pB!6vh<*bify*EB8a|tiHJxV73=nk@gYYqHUApcv#ew6P89a8p2-3WZdaEHi*p1 zuoYJhYNH4yxh7a@=g(=DuzCD=q!S9!yORXg^LW7RTu9QEh)tYDbf@VBNECq3wmTJaZcEsm0sUo`;npA4WgE3aEjSr`N0 z#s2s&-vC;dTpH#0kPoOhu7f0~wTJM%paMp8c#Pip#B{S{lgtDi|)ZXUhaGY=crF-m@_YA0o3=A9mwPJBhZE`YvyFdb;--C4!nZi9)=GWB#8RaL=i*KM7sZ4L{=pJJ+k=i`-jz=#WQA@OE*__? z*W~0!qA7=Zt2U8XtvHPbY6kaxS0;!v23h6mnfi97WX4vM0M(yRC7T96 z)D}Ru$vZgp_$(AxN*AlwD?rJT%g0b#x5Dy+DT^_B+6kw-kaWBs{y1T|Lust{*Lm2l z$b>H`msTiD+8HL|fzM87^I6;8T-M7*(+IM>L$e|NQR%^D1&wO|9~W5;p4P!4Z6T>aQQ|_nsDR z@QG~%_^e$l|FKT~1MR=C4`~mFtj~$UM!~FONXKHq{eqm%%vaOjPi*ZHo#M^fd(CHe zqs)liS+hUwe#`~u0H4xZ_wlr%7WHi!sE42B;#3ni|V$ zB;N<#o}&|{XATuQV=RiI)1)9(w7@$Ad=>i_oS-7CtQgMMEWT2=U9UDbk^G1Kg+i%9 zkUh8v=hY*v7bD@7k=DsFbEU+vx3di;q&8QXE5vpbQuD6~I%vb6G!_ferq#5`9kw^N zkh^drPU~j@Ba&t|Q6(##qF_9ZxS5t|(1tzM0ps_j`RNt638*YZLZgerWUyS@v40*B zzwWzE?_@bCj``wCc*K=TGo^mI`j79L@B2FsjOYDofy*CG0z(kHJ7+xl_0S-GWLLv_ z?BQOH#0Ove#?b?1lqkwqtHK9W$FXz`QoM)-f`?7?!Wwezk`cA@>g@VMd}nAB*{5zf znPUP%eZFSJeo=JdH6rAPHAV>Q@D8<|vb!n?XFw%wJvM0Kb(zvzNpp( zp0R`g%5`y=mP7z%YuG$#Wq=j|%ar;yuh^Tb$B`i|QLD%mdLYcR__yELUNqJZb-bs7 zB1tO&(3*{|eiyeYV*`}+)(7?10}_)FV`cTZAX~`rv8;co`*<|FhuAR9iPmw%&4@2A z%x)-L!l}OMmv6xYat1|s{e}9`7L^QLO4Xl7x?DWdqF_3ZAHOid1KPpuV z0t{K_E-Tvdfc0O(gu#a_`Zyk~USnyirui#+@4yRplnEe%^etV-qH;c7`j-3C9r!h~ z+;|lH(TWN>;r-E}D+*p5_EpY z9f}5S*Fcm+@>jP;P=3kn@rj!_*~;XAoFc6;wYud82=hgpE& z;5UiJ3ho&x3FvoKd~i`mL(DCq>Mi??H2h1MbtMG7*C0-SwNOO0QA_0{_)QaW36lM!D%n$+a5Vo-$V>38r3XKgJ9Ha-&qkXVK z?r#}i3;>{9rN9o>a=?IhDeNXk#{OJ7=7Hg{E(F?PeN7K3Q7c((h`Gk>8n1e@XG5AR z=|%E{Tw$_zdeYC0I`!SZGh6bN!O;%U!;Mj_Qc^Y1F|~Ow1YpIw8|xF-Y9wQGlR0x-nm>wp4=vg#ZMg1lxfy` zNu|723HN>`vv-H^|3|~g_0D#1MFi)()*2H9Y} z`Po2Cv}jTC7E=D2c6Z6Zo)t zXNbey7Ne>9hwbJCv0|lG_0#LvlMu&K2g!T~%5l}2-y);^*L@Xqk}p1samv#%RFSvm z*4WG5x^(?SmVw^&B09+vA6p>6pFLR2C&gOgUe>Bz3{lV=q$iF!>P7?lQWwmVmZJ^5 zeFrzc6r!nl^TqPp_+Rs`5;(iQbof^6^512S;KplE9uN^iQ@H85Lwq;iN_lb3b&%_` z&_M1W=*0C~UoIPhe#YR*U1_l9r5KlX*PH(ZFn?zFaI07Hz;j$nhwU{CpKMu<+I!2X zTDM@Fbt->`+I`CUtEDwcp})v(c?i=Jw>KIV*|7ho_~uJd^{sUqcc(RB&2~-Psk!i9 zqN1p2s(O)2CpseoJT7EFpq%FPtDbpdxpU!Yx}}k3nq?2uNJPqGLRO@uav;ldG?qG7 z8DbqrT(S8ZkCs;E(2jS+hx=}gQ4ZHr?pho^BiFafIVZGosJ03Rjqdnq2VhHKQwOdS zX>wTi-2E%f7g+o@66v3o*K#bXeyV)pre3_b zrrP>`P}Xz^WA`DW>HMDQ=zk2iTQghh1DUG0{#yD>J-w&D-mX&I)l<5`rMM>9g8O4Q zi#0Yhb@{RS{&ZC-Qo3?rW9~*tfTY8PbRPOwe%Qc>!?^IHM;7bna=$}F^S8HCy4~_J z#DKMxZg<=58p}ma!?G+6{$p4LNSzR-EY67hnPpeg*cf zZA&B&zI_JIft&wT497lbLZ~QyWH|@taE%4@^ceOojD`VqQj{MK$oXY%sUtg^G-pH7m%EUvLUQXER z305^Pyq&wisI>pJ@?m<0%!F_ek4eJpZ81UPiNFu=c8`vy`>udwfSQ{*s=G{ zd4l5`KU{hEIUfje5`+^^YNRTj`@9wKi$_(w1C0gkXbziEux%^0f+?PXhb9g*A?qMg znL1n!lRkfQ>Q=67BWga_`N(nuG)N2nHCM;o|*6l z-mBUG>6 zy3*wH?IFaxV(y%0ao||V>NwZg8NHUP<5`om)v|6SE-k2;>F#okFM?Q!x~cG)FhfIX zRU4pLE#`i%k#O&Ewrn1s>kC9?zMc;ZD?X+na`P(q`Q}{hKJ_XgaKzE*HKWiHL|OHh zvnFPf7D&cCWAkJtVz`*2$yVl;%4sRt`yigRD(;uCo5D4-*_u;P%0*(5h>M(y5{zQ7 zVeFptkcO7>Ti>wSgtRy!xC5G9QE1I&Tk{6rWp8A4$ShJm7cLSvDVy6cY$c9TSl)62 z&zLG}zo4KfYz~a7OopR;k8k4mELXRA=k6Hxin?csd+BHBI>s4!5cTp`kPwCBye1bw zt+I5NL})@o+Ku+Q?E!N7vBqWi2feeXm^SxGo~_mbB(0a=ChfJJE(L#B*^rvyDP9r) zZzMZ;w&W?v8#EaC6XWG9=7i3Ktn`W~#Ui&*X@TbGo*|~eG?V9(X|~2kaM4$VAY12N zX}vjU6o&I}TUURrUHl6rC3!fofGS(!TyCDEckE6i}__S$2^A$WIZ!sawt@I zQgK2Qb==yn4^pL6z|4i!RVA+P_S`5|(4cciK;rcZ>MB4Pe=G~p1XwY{7WPu&Pp;QM z?2Kk3l3E<()@bW}F>Mu%kuE$-orQ-_gJu?t`3M-on=r>s3P1(%sjT{7pi1rgx@8M{ zTbq}@R7Lz1^W<{^Q(5UyYTn6Rk$26dX)#JFPB4XD=B?NLeD<~qQPe7GeETgc5+`PEDWx<~a+yfO|D^a>MRE9CgXqEgKzUfr$0tW?>3l zoC`7=cX)5p zO52Lg$SewYU;pZgUNpBGG;Mg>M0e<~!(&061UNUwi@nG`({D6nIjF2Zf?}@`its4? zz7EeT&WG<$hn7hup<-U5ztSanUV@%%)rw|Om6@YaxK*k+Z3Q#N-y(Ap(Xhc=F0x%W z{v+CL@DE?Am~E450-y74dd6j(HoB%n3~%wp@K8Yl@dl>d<8uAr^-8_66~y=7N4or) zXy{lF4B_Al$&yNK8fxTp2(nz+zChJ^Ec5Taqe+XmxcfxCot_l`I+F{PEzzYu@c`X6 zn2EU|X zDZrzNx`{_~pJHXC_z@2{-M`BtpJh`}K8OcA5~zA5kHw6~8_Y_yfap(0$ywkm79O%( zWDvYdHI+E@6S**>H{|khD_L_bW3Oz6FVq39BF?I*2Jt?j0SQ&m&AD4`Q`ynw%eSX2&KC=9YZA1y*#D805kgs?EE5Qwak&xabS z0#ogN#>;swb1^NWlteo2$Xkwyq~`%#N~9;wg|!$R4Qbe8-Np`|vas&ACK+EL+|XK z*gcm2;~c!UuvQS5-+>${J67fS%{QmfRobh1vNFT7gevf)JZ5QBs+6%Fml9F=Ay4fXg`EV9TVF-(jB%s z3{TRkhC0obi_^b;F+l^_LaCobzw>En0$k)~_Q@!pz>IW^ja>4B>H$&cSIr))v?6g?tH1wDM8#(`rshyNsQel#vfVFY}U+@i;U%v)dBKYqqc#u%w zS0}9zc{cGxU*~V;+g?9LND_IA{X!nuNs;s&y3)a<6V0DxhB0BpzMn4opNMq2?M{~I zm9X$F%UJ=pRY~y(Q@(80>ZsDa-o|rT0t0ha4@=#329`ROoXf9o(^5m_E^7=P=ICGH zb8!`R@OVRWvXtO3=a*!moBc-8t$Y2-GCu@LLT}I1+0zR6^PbFeNhtKc^(7822eL1r}ix#&-0OetUnnmy^hi!C1g#+v`sfV zkoO~8Mt|4$h%5o|;lpn%Z%!}biw=L8hKZhKpH|!X9X4ICR3Ip3f}3;1TXrW<^FPb` zb7J%J|9(c<2KsG(Mz_>BSC@#K{}fyy_5Qj>cc|EPViiSjCiW4bf0m+h4Lz77_7c=5 zD(s#3&!+ss2`2-&r2*M11)HVZkC|$&#OE7Kj-jLnI^8*h2k}L1xlgqbq({9!$vd8D z&;Oa|58K2TMftO9G7uBO$eOkeocUj>G3)K6y{oS1ag>(PQ)3 zm6RJ9P-(XP$ANkqR4z}{Iozx)r%?}8eKUR5^7~f`I`n-fR-v3z@-%L^kgF*K9PO0k zPj({raTL0fobg3iGx{Km&tL|FY*QK+nj@X;Cym9!s(F(QQ4)O3!=~}=6=MrBqN)o$ zD3Hp2+g+2s!hjhegx^GGa~8Y6#!G}Ipa(_7*ro0ms$MW=#GzI?SCTxmQRUiAUI{A# zJM0;R_fFxomAqd|Zw-c)j_#6!X0|$)^~T#u#TGVE#(LsKY14b%{I=VB$zHPr zT-nrKf(-t=C?vem*k~yd`$(M+nsrmocct|Nk_<3Qla|zU8^X_Dua4kr+rP!}nFZ{+ z)Zo&Z<(hZ|N7Y>a6_6+K=$GLc(17wg(QmD^i*4{5QC>AZPb8pUViGrGl(44bQ_;StuT9}q`|V0G$`cQ>0e%1mq)!12w6OBu-eZE7#NV2D69C}sa#Bd_H7l2Eh9-m48kjj^ z5N%rOFAYRCE^*SO=I~0!x-7}RZU$}T6vM_fOPyyNJ;*d@YN{Ol*wr3~S<#~=5>^r8 z6LzoZ`c@n9@aU-Rhqc!pGCXAwfBM4l#=!;4;1q`6z4V2}iNS{bqaJ^!QVTNr&I(@p zEIbFtpDyN0meSH33794lci{9eoCR&MLvx?<;8B-PuVh>`zq7Tu-+L{KiMsH<>6hD@sd65IYm>6;5m+XqIR>zL)z0`Lr!R~J} zK__8J_#{*2uJ!EGbenCO zqd0zoYGUyv?*Y`t8Qo)=@hZ{YbH?*uGJ7fq8OI!HkI=jLR+X+i!U5A#@OmmhB~ zAze)#tjJFnNKy5n-pqLpO*2dgu;l0J;n5bQuCpyz6 zS21)b!hFRf-kuGlfmJXm?FNYh6Vt^ew4=sekQB6pux2FVMlwsf-Z-~A-x-l({*EQd zq)SO65}Id4_S5Ak0ggM)e^1VMb5kjRT7>W^8(R1O$cFihDLItpF?$sM$GSD%!FQ{{ z&B)zE#>stB)*Q;&kULzT{HT-59i#tGP(bVxj3C({STFDTL7SY*eW=!T+RC0$OBkMO z8NuDnbzop(uAgc3CNN1tqwTJ>FPKt<)gze|NOvuZb$E8Okiw~%KZ2-ixvkF(JeHUB z&Zzk(>TG$p6?VF+MbekzDBO<+4k7yTnydK2+qlW5EBDKLG-?u9) zwmh#RJM0`t9pKtld~7L@W>)NqcZIIYZD$r-!LmcQBrAsvZ~ZL?yU(Sm5|FQfh@6qwDgHdUw?(j@T z+ws=RcKvGi)&Sd~a-*%BJvGzG)@@YJl|$cq@;DP!iXT~#E(ORQK0Q15?Z5YH|Z!Hsj&{F-Vj~ z9_5?@aXLjCuL4Uc&->qUgle$j&01CsHtNDv+r!#}7QVS3vAw2XJ2aR{)JxAs@(bF**lVEyE-NES>`vi!CUoPR0-Eg1hi2#lcrtbz^zI#JvCN^ zV~7>QabAdu;ANR`3BLY>q!)?zLk_Xa0_Ch&O;_&B@zyrhjp2wP##xf+& za&2kANa=cOL!A`q-o1o&;;UA~equ+a_N$fCOsqvI;}}}4S?AU1F4?UwpbFJ3J3#%N zi*n3Y=N7|!KFT~klz{e{mKxPV(${2)SUXgvGjpw{HWE7D&TgCrl+P|6FNo5sRAh=* zWSieeA;=6y zuNY;CclfHBR;OU%@>@!Yk>|>E34ddN4Ep>%g>zS!%++);wv#9 zH$JuEt!QsUbuTi=)m9T1JYW01Pfr#IlfVk;Vlvm6BlAw0^@MlbPFil#1ISZ! zkb-lUtymJWe5{f!AjZrMMD=MXRk_1rHR_uOU%msdyEZY$K5fA$1&+UZ@_d;M5XJgU zXT7e8%3j;BU6)sCroRGrv)M0o4*P_w9^k>qn@f8Q;{vEpwQcgrjwTD2&A@s7y8J&a zT;Ov=3g2=9CQPUp#aye)F>Wkr?J_$rmNSsJi>qlu>;~yH)MWfCAH&uk~&f(f9 zi-+G(!HOJ#Iywm&0-Y*J#k@(yMEQzQjx0FL>f+W=)9 z74i$%8~)F6zCrq=NSP?OIV>eWm|86HX^IDDb7`S#mJB z_%C&(=he`L&U&lL-2lxx?HfOQ9ohiooq544GjBrk0iI;B`;$5ciVF638eTwa2tec% zsCEaVkpvN|o;r)l|Gq8!7iM0nY40`c7xZf1*>OWmXT0AZ`Zj717GUI6@j1AzTA5pB z!-34c(B^6+98OiiEdZ^u+qe#UnpiSRI6Ta{Wk!*uiqrAeNn;+%qff|*XMzFeMdNEr{BUOUhnvwrn$JT=iQ9Kt5ZSW z#%{^#j`FI;e~u#W<#Mq#RXl0)d%jNs&J;eA$X)w8Ii1tl8wB~M#Z z7o2_WF}P#h=WP~QY^cawGsn;l1FpRKu9nr~UOBb2jgKuVY znE_chhpl74zn;|Kf-Ul-#-W|^>mGR|$k+$ROVavK%<1321e!P$SlOWO9hXpHVf4<>MjyC*pUaBk+|+J7)K(l|E5~BxvHdVi!rIGOozJWKILb)1stq>om}} ztNNTyR8BOYH{#$i@8bs&ty!8mweahVd;okQR8TWzKGE8{}W5(b@qLpo;D#kQEiXl~#NlEP*!fux0J% zd;UYT0B=Bx-&f!`N|Rj7tEGj;5p(+Ul#UHH2b*RP!udWkIQ=$Ylc3kXRps=`JrC@qO{bdu7rtEZiGkZ+H`=-+@ z+@e|MS;7EKHzRqD#aaOS`d(I}*KWE{8fVLGz)zp{$2W5p^&6>F5hLQtzxDW^AtQH# zH4bq`@oIm?2`kY%uCUP>kv+e%UgnAozCjL`=}%uCKr)j0NHc@k!}@;mhi!Q(V$xXM z@$%&GhBm)vufI)TY9Rn4E`CYRJCxcGj|6IX*6UTHhWF9wmRJB;TvWJKj#gO>1Tw0`O7 zgo8m=-#EX30xpM#JJHu4!-EC}f23m|VZsFxVr%{@cpb=~<}a>|+;`lr)BjTM?#8l` zG;(R7VLtqH8N%|=|5bFJ@oewyA4gHU#ExnuBE+f@6m5@^q!FV;Yit}FR(PV)S`|wnSeD1psbb6OZ zC+loYvBW{Td0g*GY?_JNxpmXSURQ)FXRBk;m8Psod&HjA9cH}lP_#_YSlTPad(A!S z^j-V5DBe)!QWm5eR_~nJFR|!hc4D-8vDmohffS!OuC(8i5w7tVNxz|xCwGKm6Bb2< zgU@iJAvcE|T&ajOWiQBwY*nGZO&PnAS%?}S%E&F=D5j=`CCJlA~ zfA)Ph4b&EcSg6bvS2CNZm`3f2XzP^bkA#kKr>vN+GV`Xq0=uTmG#7|N;&+4(?-v-) z>oGa^7Q9i*kze$g53k^xO`^*NBm{so*hC7>p8IH&dE=ujM1zsYz(=DUyQe96O7xEo zuX0PiYI{n< zse=lwj1P}POxrY&fw7FRYl<<&(H$dazdbP=|Dn4RZm4n?%Q!dXt&8Fm{iUFn9L>*J zX?4tPoX%(jzEIY$L9}$yQLyKWp?O-Lh%4}dR`4HJ*1FaKFWO%%3K}ne=ty?_booXo z`Lpy#s34pgxDo2+sEku7xE>sPwsr(&8vr%9=Vv$Kcmk&%AGtbB<6o^1jp4Wwi3`8; z?oZ)Qx(7;N`6U*woM-m~K6oX-e6EPR{WWP)kvvvZnDcE=45+9nR){JeIj3=sp;A#;9zgaG2>0Us!F!2~ z4(H7X$w{|VpYq<`{H;y)tbZl$?ql4S2e)5aZ!=P^-MAwCvWFkhpJfC;%h^Z&aIOD? z7}EQC@9Px<{}l_HMypGl@W)^9iLI0UY~S%eJ{&wgf9cNPtKxwt5nq;~lLOD)EH9b9 z{9newVC}MBG5V6)ugq`1*dN@Z9&TB(|NQym9wF&bg4)OZ7yFkD7Aw4)J+f4DH2x>_ zMECT8rsBeuK|St^!KdW^hV$=n|6Y5Y0di%PDCN8=jF4D;_WRw6q_4N%cB-tQF22dG zjE1GeJ6F&jwQ^doE+WDlUCFyY>Fc?|F^u|=t7CShlY`s`)BB?q=Er3$cZ=u^D8tz! zS_bfTa^8P})cxO8=PjW1VqJnGzuYf(&o;5BbTav#dRKjbpu$lj`$-M|)3^LSrsa@P zJ7QhVo>_e>*&M~6FAIR@#S@ zs-QZ0ca~ik(;*qit5JCBkC?J-ta0h804Mi1LreG9_@+JcP#F8tQ(&S20l}H<>S!>o$ag&9E znv5-f5vzaHf08!{TMYDr$d0&q3s+kC1C_*|E|z@23qtKRv%K_7--Q~->Zo`ZNMQK* z%*vk>pAYc-UQ*+~&c8S5(^VTf9~j1A#g_wh2q*W66@}NK&*JD=`%@Pp+;{R)LVf-i z0EX&E<=HdY6^QghN|ba|bH`IVs*ZgN$$!tCt;N`_pJuz53NnwgE3#TY-9Z2tyGWTwY+8%-OI3@-BGH%_ihZFH&%fKp!E z-c{eb5IcL)I`K~KQw5~XsG`c>Qp{LN!s`Tb_-8ga=X%!YZ@Io%j!mZ9uz&S}HMahd zjn!*HrMYi)7Z_{SdA&E^MtENNce1c`F}R=7B|1NA{#aM`O4H*HiRr;pIe)QAgZ&`mbH85g00fuFU*leV^S}sC%qU zEzsM z%I)ZlaKvL#jpR@x!4NdPfrAfus)(k#$o*uHF$+i8$Q1-iBfD4S@2l2y*}ozxV_8F?wSdk;epYi5p|<2Blpw!YGcwE9(2GL~vAner?>a2h-& zrgXo5kJg8vCMuP8&+HZVI#2GCVspSYGp~G}=-NDbEORF^)G0aOIYyNIlLG@!XVpX% zv#@r1TfU*ts%IVR6zP&tpy%BTkD{+)P!pe^B2WL?|&dRsJ zV~+JY?V%{-g<*&%H0H3IyX{d>% zTbl;7GXJbTQYWZL>2bUc+>dZa5NDlQrU!uPwj~@@Dx`hkRKc|Vm4V=2s&peo@!6Ee z_x3#&DeoKGq5Nh#zzycuMzsK-=o6DytGyxe5#+TwC2D0LxAQNl(wGX2>h_oLWOcwfykI@)K;DsqZ%`~6SI z?eO#Da_eL5fe@g_6XIXvPJ+yw*_w8@ymB*EzpCfNReJY5T9=sKdD35=;R`XfYvR20G z7v{-4`vvvl!k+oPSFVDK-yknX#-y3}ax2LlmwRO8t~Rdskr8#j=!#@dP`#H$f{PU_ z-k*f@Fx?7mMl7kq{&J+FV;r1SUXtY!vlDi+W|A$^JzU2J-?;FN1$JxscSSX}oHB*7 z+75HcRvJ8+{D>KEt-e}UZ@7MuvzNG1VO{~{kLvby(@YmlrnT=IZgu_U@!}+IKU2l$ z@N%!g00GBu$yhO#+TNSjTiX$zuId-!4_9~)=y-X3mgUJb4CJlW_Qj#lJyPioOKqM6 zK(97uAXWzKJ;p0calY{Z>PHspgzx>}S;(RKWSK;?Q5Bk_@vqrBmO}D%#Okz$A${(k z3Mu5t=3E^L>ZhXP6}g8IFAeVi9Q;1N^La9GS~PE$vbMJJ!dCTZ1b=Y{!!I|ksc3qN zigu~EF8_NIp*H;Nl+nZBl@D24HQW~$x-|?qHfIej-ImlM2j6a>7^Jg{kK-)c&YoaN zXFJIO6|}BHZ3_nSs{0)mkd(zu^P*77ikQ=Vrr) z*T|lXs}8#DyJM<=nQgH_nf;-F(1Le_K0@fN#AtI$KTwMER%Ct7Vtg`6NjhJ{VCy-{^d*ikM#scEww|nzZNah zMe{(w3j)?_OCW%X-U|dX&=kuzzL(-rOpB1Cyz_MF8k?XENi$4?qG6dK3QN(p4VPxYo4Feu7Y3AhWt*z@I{hkdl^ePbZ$ZEB03^2)G0SecqmT$$riaKf zz<`>P+s5ICHDF=3(mH^W^&#@$o9H!RWkN0ji}w5$%DH7(>UMqra-pENT0%q*pqy=p z6|yTzL;O$35GbgJk%R{im`?iF;PucEsqbNtp*zi- zvw;N}`$&u5$7Sb=*a^p{L7>*2wL`>kz_T)~94wG#OC;8{t--o7%Hm zhC;So8_$>2njz32`e^&=oz5B-p~sebd0=yOimiQFx` zPE0X2kq;l$Yyx%V2cn*@ie7w4kL^~4ufIBJT~j^|CEe7R&&SG5#A`Q?mz_}n@+ z@%rA&r6<40{xi7L@b_amX+Gp`iQ5;;8n-RS$G;f42K>Ge?)tDc;wio5Hv7N(uJblt+Ln%%xwGXr=*jl#cE|S$1_Rl&nUjeuE7_FXP@jAf0 z0Zm>-fCQGQvMU?6S=P&o&nQwe4x)`A*|ymvV9~+X1xpZ!g)nxCq58&ab0C( z+bBJoS8nfC;|OQUr3`~_Q*!q=6KEOC-d>8W86j_rX_=V2u0PqVXSk#tAqaH$$fEC8 z$5JV|f#r7GR}zO0q~?5Fb9{*|p$(rw+RZYDC-Y|3a*q_@dpDZ6{4T|Cs3ON2fC#Hw zcyt&W2Kxp*0xv}`k!@JGgL8JZW~hoHQWGcQokY`dngnSH?;)n}(M7R8JE-5;zefto ziBiU|(yFcSx>pCeA!-ZHsIF9Ar*-~hP{O=sK?iR@A#nmDPRoqvla$~Br(u9_al5s8 z&*mMe{SQWjxUbz zshgf_o}K6>q`DVIwz!IJkYQl9fYUfg)f#A*XwsXi%k=ViEx{HNb-SOgAyo5}ZmOj$ z!PAO61y}h2cl+-Ad$BB@hEa*AqOpSnZp^|WjXPn6;z<@oen+`s*`Kv35bvidI+Q1h zP~9E*j*FEqJ96jz!luzL>3>Yc-ivhAZTQTc@VQ2Na>bEFs#&;gB>#D$D-NO|;1@Tj zNJG2!@@+4y+pHEXk)+q?4%f^wmAiPu^&^06Ma~2(M#dGragL5vsi7eRFbw8_(WRig zxHpb~ub90THMXXQbhxpZ^{ZBwrVJ%FC+-3_*K)zYvblXt1*eOIbzN?hqZ>o(Mz-M| z(&*sEIt^bhXvDdZw43RQ()#)%+yQCU8`yx{#GOUZUME)emfPmyHS>y`|A-AgV z&n}O=UOYI5F@Lp9mRuX!+yLx0wSNc`a(mQZ<)@aF#w`Z~dk49`2hC-}2i0vU15y^L z7(qkJ5o_G4AeBYK=;$C=mS)}T`~NvIS|zOHxIXCRDpBg-13Ku+ogJE=PoO-!McS2z z&KM`Bt{y0wBSj}@iGihc?(lJ6N9Nj6bz`2MjBXLqpZMw1m%A4g`(z-7dNG?AaJ<=7KL+A8+PL z3TAzpd8W7m7*7=~{)E~iHI_wbioji7&49vf*-qpvNJIKvSp%S*i2_b@L*>14#&9BZ zqEA`nD$~ff#w!i{=H}(p8YG9jCeLlQaIaQKn!l*-s_Wb^aTglWAOGo78<6-Zq51m# zrR4;bc`I}69%IRCSz(Z$KL4q7#U9_ZI2IhdT3Oo{{fKQ>s%aB@CY3Whx)T~ z&CE(~r7+Dht6}2rM&6LwvOtuIcel8y7qJFK%RG}^V{=DG)Yg1E1V2vP4flepC>xdy zh_I+kh3@e#zSbJNBY%;u@2KT2u45oue1pe!32?{+pUs2jC!3y8nk{t=EgvvrSZO0+ z>Q1x{NFv3JSANYwXRLob|4xWy>>1)}XMTKP%w$hD%?i0ZtWvYf!<*{sm0DsuZ$IK) zLz!#WD@DE^AD)){U<0xR?uWKn18sr}cGCEHWw|!ER$)4U;@-hk{%`nsi4e_^GtHn&Ug|2+R%|++V>%{*)-S z6erUJ$^f}d;3^lDOhv(ZOMP&8y2#9wypEmN`Nr&MRAif({`U}$Qu>VF@~^#@zlNnu zFsU0(p`1uVZs>DK#gIR_txAnb^(d?0$oto{Hp96srOgSfTisf$#$(ZumIx!3$Wf>p z-0gL`wUPZqR+)Gsf&{jb#c(Yh!3+}*%{4PCY@6YeB=@-r5&ZB1=Ues1PGuX#>COAB zL*;P&(&gd2HW0}-|Fi2!>FSXytmb^|js5XF5i(;$u69sf&R{K6Ak1@T>^KXhbr06DhuYh1KEEp{oO zkmB$mXvuZh?5bIw(t(w4DbyLbQgvisq-c0wOmUF%&aTQWCe*>r!VOey;NT9^w{ww& zU`gsRr*-dkTDHMoL1(_@#3@(xsQY@^9d7{Tm!4=@3@ypuLh$_4%oNbZKo~#;Ni;Xw zjMd;y2QCX{mkA}tb!tmdm0rzl4$4a!t*%jb66VheZYW#c{^MDPk9FI=NZ-O<(!AzA zUAp}Jqbq}QW!q^v1+~@Cxu0~|+mdkDS$^)ZW%Z&<@ z_4XXSE?-3q6`d4}Vmt9XsSO>TC5l)jztn|M-zZHLZsdKa^MDGMMqLhuCg5$thbI}G zrZ-#SBh>f9$mG4FxwDVDU2eUzt_${x(KcQ+N~AGmcoZ<4x|6OqH`3VejfyXQbTp$C z-)tT+D~Mtat2<~|ZR_4C^Ay%Ir<*FmO0ThPzHSSFc|*Pv)n{>nJx-iu~BLI$KCd z5g?Higwr}QyDKj$Q-h|8npFMb!hjw)XC17>{(4i|Jmi`!&_^*Ce-o!Ne(Ri1Hq2}Z z1YR`bwb?>F(}8&f`W@~96r{2M9hu#BKgn2)wE`+#`{rvx+;#nV;vj139R{@zy2?s9 zQjqku`%GeEX+=E8%p31U4$7+rw3<5t!Kk8=Q=5=APo)Qo^y|AMCDv?pYH|I)p&vRT zZ7)A(KaPyJW-~!jB34}5afHnP;#q!LrMpf~{ ze0)rcrqhbgu-C@Lgqt;aw&8ire_&KyWLE2KzMcF5$~))vq-8{M>59MSYOO)tycM+G z@}5y=!kedyj#pl-4z%?|7*#@}q9Z>nh3y>v_%t~4E%97M46~+XztZ>j{|Q}xG+Hy; zPz0I(PyOHV$*?)Yzh_ku;}3>Ege;8$*tGJK|G3_2yG*GR@cqkRA&|BVa)Zwee z3g9`>*it&ivgo;kX3+)(9LY$l*}+{u2OOb<*+7!*FD$0yb7>t4u}mGa=-kzgM@8!M z9qin2?TS|PsP@jIr6Ony-7D_hj*a#D$C8_wB@U}f1DxgkqK+AD3`2N zzKVgoN91f#qKn@tn{Gb}MhD`8XvlAx;6`tNxnxAeeKN+S7%5R*AV%|&1nRkqerN_B zxizGsNwRU%@_wW-*AfV^sjjpBDv4M})0!s#bRf{df-AnW{4N$LXU18e17A>_Cc#a0QtY)whpV+EUnylhvvxsAs<$69}0{k z?PkRg5gyi8qmD_>Pj zz$D(V&NlsEGq*c|6FF;^7h)({I*3pX#^(VY1p4U)vaME_k_3&7Yknx?vc{0$xCKfb z3KL1pMr`o2oV?qoG~akU2e+YSa&+Ttvs(=dx!a>EZ`77j#CWA(1Kb3&Ok#?r|2A=G zSm3lX$U_hWjP^QANG5-U5%Ma#cl8Bd%}GaX9$T#uJzVx7!K64z}UPUx%}p4*SpZmT_> z5#XGjy@MUx9n7g*wQB*$i$NsaN$zoQI!scfsLal$OA@H<-02Q?*A)6JBCXXQLJ<aPR}O67-vkG{Mt&1KZ&7`tj*F!q?Ae%$xqMo5Bd z%j@aFmOi6Srl7N6iA{j@Y%+QBuqCnH`)J8E}|;Gd3Vn(GF}tPETAcG(c@gl3(1vkA&Q>(CLM0Ty^X(wsX_)PY zj)en{K~pr@?8dA;{MrD$NNIeH_c)}$tHHVOfQ$rP5&y39XKI#{=2~i57rY@tN6{N_ zNMF)1TQ)?sYVG_ z*pzWIEH+fzv9vqFuEkK4=K%wF`ap=FOdnt26Q>{teZT5kh^lsBA0a!TQ}O^)B@toK zQ_2t9?e!twjFcWOzRw5*&<1YYMe#ns7=(y)54Bvc9ZJ=Y0s8@PX?lwc1v=f-e%0Qt zz(*c#F$}_clIIlrk$RYX6>q%|D0AJlR;!cgd~Xkc>3xqia@3~aFKnvl}=7s|1cP7$u^ zanG5Yg&OUI8}(3Tjn(sC>#n~I9E%2z2glXD-VDFn4$8a5AYVn71^-iZJu2rpZAH;r zMid_IH&iMi(JUGs+$($QOp4&ghBnXeR{LR>KN(h2_FK^zc(Q=X;&_tmm(PYo#|y@s z5Qe}ESlN1O@-1Q2HEJnxICQq?hfTuB-}%q}MI~!EKAOH4zI(KkIO)_M`7JR8JW%6r z9rEShOGdvq7j6w)-a3!`sl7Q|m2pY4{e@ba!rVVaWp9=e4?+U-4?=QPC6zS{t@atTLR}SB*PR_QL#5tJu{pt zqQ#PC5mUuRMQy5rpX_2o3J)y^=A{$)2?98#jKC;R{wQzrsMeej7ZEnrqp2}|9J@h~ z!$<4pmu+uxZt>@Pe;@w~c&uo?sWBlwvmridEE%GC8t+Dj#Uis_8|CyCEa+(pMk@$K z2X_t~o{MB@pYpNmWzDQp1maU{C)ywgp5;ad!wih{ciJE7k=&NyEj)QYWMRk63|pP} zinP{{${k&NVIEYinTiy)Fb5PIB!xP7%kPYL8PD{oPZn#z)Yg`%7LdXzl&6x|0+k}9 zpdziBXsY0}Pdn4Al>tgs^t!@5uV<$_FUjOqRe>0vLL&;O+4wRAq{XS@??DUG)c|*h zZ!IBA5J$_*;6~)=bh?Fk2AKlw(TPfM5uHMZ*Y?$v>S}j)foPj!mukG=HfBn0FO(1k zEV)kpX>wJ_GZ!F)WVwwzch%mt@2r{qfRLLc;4C2`ch#arQwxtUxT~QMhW>zpR(g6N zr5OemzlyT~a|U)gRJ$`drLty=?HNYE2AW%y2Fx6zM;*7PZlDD@urdT&87ZcWr6D0U zTImH}Q-$2dQi(UyBaO2S3pxU;)H3lOkA0PE7krEVis8Jm=!h{*UAA7%w=+xBV4UV;WdU>K~1hU@Le@07L_kEZXJt>4v&PVK65LE2eMOzDY9e zFNikTyu1_F{5Z~9-N%;!)IyO}+-s=^=?e?8B6cnwRX45*SC}lq^qtX?5nQ5J5MOD6 zvW2erg7@JBtpbct8ZY~_uV|0K-Lw?*}bP1IlT{>7dBju&kAE|mQG@c7!3y2I^Y&bb?vmU5-LcYv;p8)v-b z=q7>ry|s!~-3I02>1uCoIRMlD#1z2PzV^PnZLMwFA>$muhR@t`yOTMV2m|b+Uu?E> zkTW-*JvI1n&4%X4i!)siJXdO|wJ|GwWlY7IxlYK$JiC)C&I}1ndD|&F>d}Rp`1xQk z*8?b-cebTjU|f?(B2Xlia?~W11a5dMZ8*e7%OX1zB9-GzwpUXQa#`q+cJ{S&V9E)2 z6C`{zXl{Ivmg9vgcCJOmfO1dRgwMW(7Em7eBXx#m}APQtlx{EISO13l0j> zkL(=X7E;m8b>&1hMlY*0eKKC{l;xC8vtAa?fw(Ba_Ss3Q3l zU4f%hg(izdWoH-lPO0(qctB*Ett^0wLK-_EWR>;DhO(k@g6ra}Dxl6tHXc+kE|ifj z9x_`FD)vyjB2KMtDDl-R6F8BP#^^@OIFhUgo=Don`J2Z))EXJ+QbnZNnHpcaidH*) zDML$GNCC-M(^=-}(A~kILg+I2MKFQ{aiVYRoP_I!{Zub-%aZ_gUK{6^!z-6I0jv_C z>H60hrfvYJiLj?+5iUc9FbVq;+=-P43Y5w)6$QE5R}~8@6{I;TrRh6VWe92g;-t7E zf%;=!sKr*1uimPcQ#H8D479EGVMufI3jh!B0h&}-o>q3KJx!0zawtOr6%wX$lYwP@^!wk0kUc~j}=96Ji@Oeo@uo=nAXYqAn-V~H)F+lh^;%Y@ILVu@!T zdR$+6S$ONs5;C5*NT=j1nvd4zD!f#ifMReO-w7#gman7|b8opF-4D~knhvVL(gr^k z%L%mIw}Hn3j*hv7t-&or>5gNNtnjT+*KFV^&t3LR^n*kPjk=raXQz-bpRh$qCQOBW zy+#Rc52tpiW8s)w9t%ZpRT7+pyu4_Ret=!#azZn5OTGST7>bg~T!XrMVa+>^^%jRF z=P1b{q2X8F-I>`unol~?0uA@yFLC~&6pvpC ze6%!42;i0;G6gOjrX}A=;ih`yzin@Iq^&ZfG7Puuv*$Q&0`gbJ8yB5mRD1wD%7Qo% zKHdb_HuRSe>Mgz(lJb(Ti?k3$IP3i4|Rdz&$ zI;%v~#n-9Ch0a8SpSdmR#J!s+Rk0MfYx;BFPhqH4&B!I8kyKKuKyE{oe<@ukA|crG zDcgD32@AVUMwTmzQ_R$STA*2y>i{(owFX1sYQbJlO-O#2E^itrw#`i+_CgD}ITTo9 z!Op8=@)pah z#!0iFsF+p+Zy~vX*k@3Z3#rt_VRO*2+D(5=KK-sLF{cjx9XfJU$|+Na@8#S+y|; zu1c@AyMqx8_XZR!R_Eu`h1i8bEaG5d%3fC#j1X=I)vETY5{67?DZxRHQHKB6v&+#Y za9<(UcQO~7;nV?5!H4GP4M=N=SU&F!WNyixu^-m5%W8uqJ0PlAB&u40qPG&&+;ucg zJdNOblVKh1?vloPHkbVWl8xq?2gaSf(kUcX(0dn$IG6Tl@V^dY}P zO~>opuQ`WQWt6Hl=h$~%9%3rjW-%fh3a=ZRK>{r#$ zscXIQKiSWUw)jR9^~Uw|v6Dx1fi~@(QA}lE!aRDvlC^|>mn=D;ols1lB5dW^&uV8I zztzd>LvF;Ly^e5YX;``TnLn^O#%&0bWz8pc?M>7QEJdbacN!Jg5Vz_7}Z1ijab#hY$?5R5q1S#c7cjM4V zFw{szFd!DkLWtTpteJDy6g;517NLtouE_{CU}Oh`nYe@@;lqi-k^>DWKFPx$#7?l zIxLf#n8j4F+78+y=-aWK1Bv^4f*gxCQm_p*njot>6`I`G@rRI>PEHLRjdG3Wva&_Z z><_2|)s4)|w0^Fw^%94n*4jcUtuv)A<8=eqmUD9gK+KOSf5JPg1$R`$rK&`0=A}Ag zGNSG!0}EW))tQ+Rcnu^Pnq|ixgb^2>8UyryG6M^#Ibv&oo%{w+^#W3^p$urOSLg@r zl7eQrnEXt$3fe7LX}0f#;W0De4Xo0`!h;dtWmo4iMh^5zmdT5IE}s68d(+JU1DB5a z%kR08!s2848dYq~{;*}wIhQ>ED}|Xy{uZt~MW}~GoBaK5Hn=YGc(i5^X#3|Oz~b|4 z|ED;?H{0ak;P^#-O;|pyd@(E`WJ#|=N=iq^!MvFwE$4RMEjhGb$7E3b6m*=dRsYPe zSV$nPqNfR8O#}&hVQHloI8cSAg5`!;WqBi8xGPs+2|cHu+bF1nluqPf+r;pT$Xa`( zE?$YoG7pHSu_V~U+?O(4+6LE0!@$Dm2A<8iPw*oovM<{KGxb1aHUxu&x~Qa2I!ly3 zqF;=6X|~y)vW_2FvY0jHzB@irdZD)ns=48$jV!osbj7z!At%s!_uuJ|fwMs*86&}j zI4DZSD@NvQcXajDhq~}M!KhhK@+%RxfSut82Y#0bX%=R$;nakbAH{z*8uJAP||G`g2mQo{2K<1V|zga-<$Elcl^UH?P7F;NlG z163`mCgs6=?2}C$He8IQ<(ie=Kyq`VBB~^KD!DYYw*Tt}CaYi=&7R?*W!)Wl^sqYd z@7#kMQlM1D@X=JB2%MBhNy;elN!(#yNT;zBXVQzWXiw~$#}vRxY|;ygN*bL{HqGt z2q~Hmz#%N-fvSj9>t8`a54cn|Xa(#ZB2*1_;e>imgzb1<5=l42 WMehrXc2Uk}fjKnU0-x#s@&6B=H6d;Q literal 0 HcmV?d00001 diff --git a/wp-content/themes/twentyseventeen/assets/images/sandwich.jpg b/wp-content/themes/twentyseventeen/assets/images/sandwich.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6baddbf053749ba5224b147c4b54062131fcba62 GIT binary patch literal 171858 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

            ?uh4`8(dYBfwU3;=swm{^5eY|&y^gevns;;l2 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 P^+sye=y1@-e}w-JLv&rX literal 0 HcmV?d00001 diff --git a/wp-content/themes/twentyseventeen/assets/images/svg-icons.svg b/wp-content/themes/twentyseventeen/assets/images/svg-icons.svg new file mode 100644 index 0000000..d5f9ade --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/images/svg-icons.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wp-content/themes/twentyseventeen/assets/js/customize-controls.js b/wp-content/themes/twentyseventeen/assets/js/customize-controls.js new file mode 100644 index 0000000..8477975 --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/js/customize-controls.js @@ -0,0 +1,36 @@ +/** + * Scripts within the customizer controls window. + * + * Contextually shows the color hue control and informs the preview + * when users open or close the front page sections section. + */ + +(function() { + wp.customize.bind( 'ready', function() { + + // Only show the color hue control when there's a custom color scheme. + wp.customize( 'colorscheme', function( setting ) { + wp.customize.control( 'colorscheme_hue', function( control ) { + var visibility = function() { + if ( 'custom' === setting.get() ) { + control.container.slideDown( 180 ); + } else { + control.container.slideUp( 180 ); + } + }; + + visibility(); + setting.bind( visibility ); + }); + }); + + // Detect when the front page sections section is expanded (or closed) so we can adjust the preview accordingly. + wp.customize.section( 'theme_options', function( section ) { + section.expanded.bind( function( isExpanding ) { + + // Value of isExpanding will = true if you're entering the section, false if you're leaving it. + wp.customize.previewer.send( 'section-highlight', { expanded: isExpanding }); + } ); + } ); + }); +})(); diff --git a/wp-content/themes/twentyseventeen/assets/js/customize-preview.js b/wp-content/themes/twentyseventeen/assets/js/customize-preview.js new file mode 100644 index 0000000..e97dd83 --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/js/customize-preview.js @@ -0,0 +1,150 @@ +/** + * File customize-preview.js. + * + * Instantly live-update customizer settings in the preview for improved user experience. + */ + +(function( $ ) { + + // Collect information from customize-controls.js about which panels are opening. + wp.customize.bind( 'preview-ready', function() { + + // Initially hide the theme option placeholders on load. + $( '.panel-placeholder' ).hide(); + + wp.customize.preview.bind( 'section-highlight', function( data ) { + + // Only on the front page. + if ( ! $( 'body' ).hasClass( 'twentyseventeen-front-page' ) ) { + return; + } + + // When the section is expanded, show and scroll to the content placeholders, exposing the edit links. + if ( true === data.expanded ) { + $( 'body' ).addClass( 'highlight-front-sections' ); + $( '.panel-placeholder' ).slideDown( 200, function() { + $.scrollTo( $( '#panel1' ), { + duration: 600, + offset: { 'top': -70 } // Account for sticky menu. + }); + }); + + // If we've left the panel, hide the placeholders and scroll back to the top. + } else { + $( 'body' ).removeClass( 'highlight-front-sections' ); + // Don't change scroll when leaving - it's likely to have unintended consequences. + $( '.panel-placeholder' ).slideUp( 200 ); + } + }); + }); + + // Site title and description. + wp.customize( 'blogname', function( value ) { + value.bind( function( to ) { + $( '.site-title a' ).text( to ); + }); + }); + wp.customize( 'blogdescription', function( value ) { + value.bind( function( to ) { + $( '.site-description' ).text( to ); + }); + }); + + // Header text color. + wp.customize( 'header_textcolor', function( value ) { + value.bind( function( to ) { + if ( 'blank' === to ) { + $( '.site-title, .site-description' ).css({ + clip: 'rect(1px, 1px, 1px, 1px)', + position: 'absolute' + }); + // Add class for different logo styles if title and description are hidden. + $( 'body' ).addClass( 'title-tagline-hidden' ); + } else { + + // Check if the text color has been removed and use default colors in theme stylesheet. + if ( ! to.length ) { + $( '#twentyseventeen-custom-header-styles' ).remove(); + } + $( '.site-title, .site-description' ).css({ + clip: 'auto', + position: 'relative' + }); + $( '.site-branding, .site-branding a, .site-description, .site-description a' ).css({ + color: to + }); + // Add class for different logo styles if title and description are visible. + $( 'body' ).removeClass( 'title-tagline-hidden' ); + } + }); + }); + + // Color scheme. + wp.customize( 'colorscheme', function( value ) { + value.bind( function( to ) { + + // Update color body class. + $( 'body' ) + .removeClass( 'colors-light colors-dark colors-custom' ) + .addClass( 'colors-' + to ); + }); + }); + + // Custom color hue. + wp.customize( 'colorscheme_hue', function( value ) { + value.bind( function( to ) { + + // Update custom color CSS. + var style = $( '#custom-theme-colors' ), + hue = style.data( 'hue' ), + css = style.html(); + + // Equivalent to css.replaceAll, with hue followed by comma to prevent values with units from being changed. + css = css.split( hue + ',' ).join( to + ',' ); + style.html( css ).data( 'hue', to ); + }); + }); + + // Page layouts. + wp.customize( 'page_layout', function( value ) { + value.bind( function( to ) { + if ( 'one-column' === to ) { + $( 'body' ).addClass( 'page-one-column' ).removeClass( 'page-two-column' ); + } else { + $( 'body' ).removeClass( 'page-one-column' ).addClass( 'page-two-column' ); + } + } ); + } ); + + // Whether a header image is available. + function hasHeaderImage() { + var image = wp.customize( 'header_image' )(); + return '' !== image && 'remove-header' !== image; + } + + // Whether a header video is available. + function hasHeaderVideo() { + var externalVideo = wp.customize( 'external_header_video' )(), + video = wp.customize( 'header_video' )(); + + return '' !== externalVideo || ( 0 !== video && '' !== video ); + } + + // Toggle a body class if a custom header exists. + $.each( [ 'external_header_video', 'header_image', 'header_video' ], function( index, settingId ) { + wp.customize( settingId, function( setting ) { + setting.bind(function() { + if ( hasHeaderImage() ) { + $( document.body ).addClass( 'has-header-image' ); + } else { + $( document.body ).removeClass( 'has-header-image' ); + } + + if ( ! hasHeaderVideo() ) { + $( document.body ).removeClass( 'has-header-video' ); + } + } ); + } ); + } ); + +} )( jQuery ); diff --git a/wp-content/themes/twentyseventeen/assets/js/global.js b/wp-content/themes/twentyseventeen/assets/js/global.js new file mode 100644 index 0000000..b6322de --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/js/global.js @@ -0,0 +1,250 @@ +/* global twentyseventeenScreenReaderText */ +(function( $ ) { + + // Variables and DOM Caching. + var $body = $( 'body' ), + $customHeader = $body.find( '.custom-header' ), + $branding = $customHeader.find( '.site-branding' ), + $navigation = $body.find( '.navigation-top' ), + $navWrap = $navigation.find( '.wrap' ), + $navMenuItem = $navigation.find( '.menu-item' ), + $menuToggle = $navigation.find( '.menu-toggle' ), + $menuScrollDown = $body.find( '.menu-scroll-down' ), + $sidebar = $body.find( '#secondary' ), + $entryContent = $body.find( '.entry-content' ), + $formatQuote = $body.find( '.format-quote blockquote' ), + isFrontPage = $body.hasClass( 'twentyseventeen-front-page' ) || $body.hasClass( 'home blog' ), + navigationFixedClass = 'site-navigation-fixed', + navigationHeight, + navigationOuterHeight, + navPadding, + navMenuItemHeight, + idealNavHeight, + navIsNotTooTall, + headerOffset, + menuTop = 0, + resizeTimer; + + // Ensure the sticky navigation doesn't cover current focused links. + $( 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]', '.site-content-contain' ).filter( ':visible' ).focus( function() { + if ( $navigation.hasClass( 'site-navigation-fixed' ) ) { + var windowScrollTop = $( window ).scrollTop(), + fixedNavHeight = $navigation.height(), + itemScrollTop = $( this ).offset().top, + offsetDiff = itemScrollTop - windowScrollTop; + + // Account for Admin bar. + if ( $( '#wpadminbar' ).length ) { + offsetDiff -= $( '#wpadminbar' ).height(); + } + + if ( offsetDiff < fixedNavHeight ) { + $( window ).scrollTo( itemScrollTop - ( fixedNavHeight + 50 ), 0 ); + } + } + }); + + // Set properties of navigation. + function setNavProps() { + navigationHeight = $navigation.height(); + navigationOuterHeight = $navigation.outerHeight(); + navPadding = parseFloat( $navWrap.css( 'padding-top' ) ) * 2; + navMenuItemHeight = $navMenuItem.outerHeight() * 2; + idealNavHeight = navPadding + navMenuItemHeight; + navIsNotTooTall = navigationHeight <= idealNavHeight; + } + + // Make navigation 'stick'. + function adjustScrollClass() { + + // Make sure we're not on a mobile screen. + if ( 'none' === $menuToggle.css( 'display' ) ) { + + // Make sure the nav isn't taller than two rows. + if ( navIsNotTooTall ) { + + // When there's a custom header image or video, the header offset includes the height of the navigation. + if ( isFrontPage && ( $body.hasClass( 'has-header-image' ) || $body.hasClass( 'has-header-video' ) ) ) { + headerOffset = $customHeader.innerHeight() - navigationOuterHeight; + } else { + headerOffset = $customHeader.innerHeight(); + } + + // If the scroll is more than the custom header, set the fixed class. + if ( $( window ).scrollTop() >= headerOffset ) { + $navigation.addClass( navigationFixedClass ); + } else { + $navigation.removeClass( navigationFixedClass ); + } + + } else { + + // Remove 'fixed' class if nav is taller than two rows. + $navigation.removeClass( navigationFixedClass ); + } + } + } + + // Set margins of branding in header. + function adjustHeaderHeight() { + if ( 'none' === $menuToggle.css( 'display' ) ) { + + // The margin should be applied to different elements on front-page or home vs interior pages. + if ( isFrontPage ) { + $branding.css( 'margin-bottom', navigationOuterHeight ); + } else { + $customHeader.css( 'margin-bottom', navigationOuterHeight ); + } + + } else { + $customHeader.css( 'margin-bottom', '0' ); + $branding.css( 'margin-bottom', '0' ); + } + } + + // Set icon for quotes. + function setQuotesIcon() { + $( twentyseventeenScreenReaderText.quote ).prependTo( $formatQuote ); + } + + // Add 'below-entry-meta' class to elements. + function belowEntryMetaClass( param ) { + var sidebarPos, sidebarPosBottom; + + if ( ! $body.hasClass( 'has-sidebar' ) || ( + $body.hasClass( 'search' ) || + $body.hasClass( 'single-attachment' ) || + $body.hasClass( 'error404' ) || + $body.hasClass( 'twentyseventeen-front-page' ) + ) ) { + return; + } + + sidebarPos = $sidebar.offset(); + sidebarPosBottom = sidebarPos.top + ( $sidebar.height() + 28 ); + + $entryContent.find( param ).each( function() { + var $element = $( this ), + elementPos = $element.offset(), + elementPosTop = elementPos.top; + + // Add 'below-entry-meta' to elements below the entry meta. + if ( elementPosTop > sidebarPosBottom ) { + $element.addClass( 'below-entry-meta' ); + } else { + $element.removeClass( 'below-entry-meta' ); + } + }); + } + + /* + * Test if inline SVGs are supported. + * @link https://github.com/Modernizr/Modernizr/ + */ + function supportsInlineSVG() { + var div = document.createElement( 'div' ); + div.innerHTML = ''; + return 'http://www.w3.org/2000/svg' === ( 'undefined' !== typeof SVGRect && div.firstChild && div.firstChild.namespaceURI ); + } + + /** + * Test if an iOS device. + */ + function checkiOS() { + return /iPad|iPhone|iPod/.test(navigator.userAgent) && ! window.MSStream; + } + + /* + * Test if background-attachment: fixed is supported. + * @link http://stackoverflow.com/questions/14115080/detect-support-for-background-attachment-fixed + */ + function supportsFixedBackground() { + var el = document.createElement('div'), + isSupported; + + try { + if ( ! ( 'backgroundAttachment' in el.style ) || checkiOS() ) { + return false; + } + el.style.backgroundAttachment = 'fixed'; + isSupported = ( 'fixed' === el.style.backgroundAttachment ); + return isSupported; + } + catch (e) { + return false; + } + } + + // Fire on document ready. + $( document ).ready( function() { + + // If navigation menu is present on page, setNavProps and adjustScrollClass. + if ( $navigation.length ) { + setNavProps(); + adjustScrollClass(); + } + + // If 'Scroll Down' arrow in present on page, calculate scroll offset and bind an event handler to the click event. + if ( $menuScrollDown.length ) { + + if ( $( 'body' ).hasClass( 'admin-bar' ) ) { + menuTop -= 32; + } + if ( $( 'body' ).hasClass( 'blog' ) ) { + menuTop -= 30; // The div for latest posts has no space above content, add some to account for this. + } + if ( ! $navigation.length ) { + navigationOuterHeight = 0; + } + + $menuScrollDown.click( function( e ) { + e.preventDefault(); + $( window ).scrollTo( '#primary', { + duration: 600, + offset: { top: menuTop - navigationOuterHeight } + }); + }); + } + + adjustHeaderHeight(); + setQuotesIcon(); + belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); + if ( true === supportsInlineSVG() ) { + document.documentElement.className = document.documentElement.className.replace( /(\s*)no-svg(\s*)/, '$1svg$2' ); + } + + if ( true === supportsFixedBackground() ) { + document.documentElement.className += ' background-fixed'; + } + }); + + // If navigation menu is present on page, adjust it on scroll and screen resize. + if ( $navigation.length ) { + + // On scroll, we want to stick/unstick the navigation. + $( window ).on( 'scroll', function() { + adjustScrollClass(); + adjustHeaderHeight(); + }); + + // Also want to make sure the navigation is where it should be on resize. + $( window ).resize( function() { + setNavProps(); + setTimeout( adjustScrollClass, 500 ); + }); + } + + $( window ).resize( function() { + clearTimeout( resizeTimer ); + resizeTimer = setTimeout( function() { + belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); + }, 300 ); + setTimeout( adjustHeaderHeight, 1000 ); + }); + + // Add header video class after the video is loaded. + $( document ).on( 'wp-custom-header-video-loaded', function() { + $body.addClass( 'has-header-video' ); + }); + +})( jQuery ); diff --git a/wp-content/themes/twentyseventeen/assets/js/html5.js b/wp-content/themes/twentyseventeen/assets/js/html5.js new file mode 100644 index 0000000..9c1f049 --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/js/html5.js @@ -0,0 +1,326 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +;(function(window, document) { +/*jshint evil:true */ + /** version */ + var version = '3.7.3'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Extends the built-in list of html5 elements + * @memberOf html5 + * @param {String|Array} newElements whitespace separated list or array of new element names to shiv + * @param {Document} ownerDocument The context document. + */ + function addElements(newElements, ownerDocument) { + var elements = html5.elements; + if(typeof elements != 'string'){ + elements = elements.join(' '); + } + if(typeof newElements != 'string'){ + newElements = newElements.join(' '); + } + html5.elements = elements +' '+ newElements; + shivDocument(ownerDocument); + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document|DocumentFragment} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;igmailcom | http://flesler.blogspot.com + * Licensed under MIT + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + * @projectDescription Lightweight, cross-browser and highly customizable animated scrolling with jQuery + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // AMD + define( ['jquery'], factory ); + } else if (typeof module !== 'undefined' && module.exports) { + // CommonJS + module.exports = factory( require( 'jquery' ) ); + } else { + // Global + factory( jQuery ); + } +})(function($) { + 'use strict'; + + var $scrollTo = $.scrollTo = function(target, duration, settings) { + return $( window ).scrollTo( target, duration, settings ); + }; + + $scrollTo.defaults = { + axis:'xy', + duration: 0, + limit:true + }; + + function isWin(elem) { + return ! elem.nodeName || + $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) !== -1; + } + + $.fn.scrollTo = function(target, duration, settings) { + if (typeof duration === 'object') { + settings = duration; + duration = 0; + } + if (typeof settings === 'function') { + settings = { onAfter:settings }; + } + if (target === 'max') { + target = 9e9; + } + + settings = $.extend( {}, $scrollTo.defaults, settings ); + // Speed is still recognized for backwards compatibility + duration = duration || settings.duration; + // Make sure the settings are given right + var queue = settings.queue && settings.axis.length > 1; + if (queue) { + // Let's keep the overall duration + duration /= 2; + } + settings.offset = both( settings.offset ); + settings.over = both( settings.over ); + + return this.each(function() { + // Null target yields nothing, just like jQuery does + if (target === null) { return; } + + var win = isWin( this ), + elem = win ? this.contentWindow || window : this, + $elem = $( elem ), + targ = target, + attr = {}, + toff; + + switch (typeof targ) { + // A number will pass the regex + case 'number': + case 'string': + if (/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test( targ )) { + targ = both( targ ); + // We are done + break; + } + // Relative/Absolute selector + targ = win ? $( targ ) : $( targ, elem ); + /* falls through */ + case 'object': + if (targ.length === 0) { return; } + // DOMElement / jQuery + if (targ.is || targ.style) { + // Get the real position of the target + toff = (targ = $( targ )).offset(); + } + } + + var offset = $.isFunction( settings.offset ) && settings.offset( elem, targ ) || settings.offset; + + $.each(settings.axis.split( '' ), function(i, axis) { + var Pos = axis === 'x' ? 'Left' : 'Top', + pos = Pos.toLowerCase(), + key = 'scroll' + Pos, + prev = $elem[key](), + max = $scrollTo.max( elem, axis ); + + if (toff) {// jQuery / DOMElement + attr[key] = toff[pos] + (win ? 0 : prev - $elem.offset()[pos]); + + // If it's a dom element, reduce the margin + if (settings.margin) { + attr[key] -= parseInt( targ.css( 'margin' + Pos ), 10 ) || 0; + attr[key] -= parseInt( targ.css( 'border' + Pos + 'Width' ), 10 ) || 0; + } + + attr[key] += offset[pos] || 0; + + if (settings.over[pos]) { + // Scroll to a fraction of its width/height + attr[key] += targ[axis === 'x'?'width':'height']() * settings.over[pos]; + } + } else { + var val = targ[pos]; + // Handle percentage values + attr[key] = val.slice && val.slice( -1 ) === '%' ? + parseFloat( val ) / 100 * max + : val; + } + + // Number or 'number' + if (settings.limit && /^\d+$/.test( attr[key] )) { + // Check the limits + attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); + } + + // Don't waste time animating, if there's no need. + if ( ! i && settings.axis.length > 1) { + if (prev === attr[key]) { + // No animation needed + attr = {}; + } else if (queue) { + // Intermediate animation + animate( settings.onAfterFirst ); + // Don't animate this axis again in the next iteration. + attr = {}; + } + } + }); + + animate( settings.onAfter ); + + function animate(callback) { + var opts = $.extend({}, settings, { + // The queue setting conflicts with animate() + // Force it to always be true + queue: true, + duration: duration, + complete: callback && function() { + callback.call( elem, targ, settings ); + } + }); + $elem.animate( attr, opts ); + } + }); + }; + + // Max scrolling position, works on quirks mode + // It only fails (not too badly) on IE, quirks mode. + $scrollTo.max = function(elem, axis) { + var Dim = axis === 'x' ? 'Width' : 'Height', + scroll = 'scroll' + Dim; + + if ( ! isWin( elem )) { + return elem[scroll] - $( elem )[Dim.toLowerCase()](); } + + var size = 'client' + Dim, + doc = elem.ownerDocument || elem.document, + html = doc.documentElement, + body = doc.body; + + return Math.max( html[scroll], body[scroll] ) - Math.min( html[size], body[size] ); + }; + + function both(val) { + return $.isFunction( val ) || $.isPlainObject( val ) ? val : { top:val, left:val }; + } + + // Add special hooks so that window scroll properties can be animated + $.Tween.propHooks.scrollLeft = $.Tween.propHooks.scrollTop = { + get: function(t) { + return $( t.elem )[t.prop](); + }, + set: function(t) { + var curr = this.get( t ); + // If interrupt is true and user scrolled, stop animating + if (t.options.interrupt && t._last && t._last !== curr) { + return $( t.elem ).stop(); + } + var next = Math.round( t.now ); + // Don't waste CPU + // Browsers don't render floating point scroll + if (curr !== next) { + $( t.elem )[t.prop](next); + t._last = this.get( t ); + } + } + }; + + // AMD requirement + return $scrollTo; +}); diff --git a/wp-content/themes/twentyseventeen/assets/js/navigation.js b/wp-content/themes/twentyseventeen/assets/js/navigation.js new file mode 100644 index 0000000..f0fd652 --- /dev/null +++ b/wp-content/themes/twentyseventeen/assets/js/navigation.js @@ -0,0 +1,109 @@ +/* global twentyseventeenScreenReaderText */ +/** + * Theme functions file. + * + * Contains handlers for navigation and widget area. + */ + +(function( $ ) { + var masthead, menuToggle, siteNavContain, siteNavigation; + + function initMainNavigation( container ) { + + // Add dropdown toggle that displays child menu items. + var dropdownToggle = $( '

            + +
            +
            + + + +
            +
            + + + + + + diff --git a/wp-content/themes/twentyseventeen/front-page.php b/wp-content/themes/twentyseventeen/front-page.php new file mode 100644 index 0000000..a28074e --- /dev/null +++ b/wp-content/themes/twentyseventeen/front-page.php @@ -0,0 +1,59 @@ + + +
            +
            + + + + + +
            +
            + + tag in the document head, and expect WordPress to + * provide it for us. + */ + add_theme_support( 'title-tag' ); + + /* + * Enable support for Post Thumbnails on posts and pages. + * + * @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/ + */ + add_theme_support( 'post-thumbnails' ); + + add_image_size( 'twentyseventeen-featured-image', 2000, 1200, true ); + + add_image_size( 'twentyseventeen-thumbnail-avatar', 100, 100, true ); + + // Set the default content width. + $GLOBALS['content_width'] = 525; + + // This theme uses wp_nav_menu() in two locations. + register_nav_menus( + array( + 'top' => __( 'Top Menu', 'twentyseventeen' ), + 'social' => __( 'Social Links Menu', 'twentyseventeen' ), + ) + ); + + /* + * Switch default core markup for search form, comment form, and comments + * to output valid HTML5. + */ + add_theme_support( + 'html5', + array( + 'comment-form', + 'comment-list', + 'gallery', + 'caption', + 'script', + 'style', + ) + ); + + /* + * Enable support for Post Formats. + * + * See: https://wordpress.org/support/article/post-formats/ + */ + add_theme_support( + 'post-formats', + array( + 'aside', + 'image', + 'video', + 'quote', + 'link', + 'gallery', + 'audio', + ) + ); + + // Add theme support for Custom Logo. + add_theme_support( + 'custom-logo', + array( + 'width' => 250, + 'height' => 250, + 'flex-width' => true, + ) + ); + + // Add theme support for selective refresh for widgets. + add_theme_support( 'customize-selective-refresh-widgets' ); + + /* + * This theme styles the visual editor to resemble the theme style, + * specifically font, colors, and column width. + */ + add_editor_style( array( 'assets/css/editor-style.css', twentyseventeen_fonts_url() ) ); + + // Load regular editor styles into the new block-based editor. + add_theme_support( 'editor-styles' ); + + // Load default block styles. + add_theme_support( 'wp-block-styles' ); + + // Add support for responsive embeds. + add_theme_support( 'responsive-embeds' ); + + // Define and register starter content to showcase the theme on new sites. + $starter_content = array( + 'widgets' => array( + // Place three core-defined widgets in the sidebar area. + 'sidebar-1' => array( + 'text_business_info', + 'search', + 'text_about', + ), + + // Add the core-defined business info widget to the footer 1 area. + 'sidebar-2' => array( + 'text_business_info', + ), + + // Put two core-defined widgets in the footer 2 area. + 'sidebar-3' => array( + 'text_about', + 'search', + ), + ), + + // Specify the core-defined pages to create and add custom thumbnails to some of them. + 'posts' => array( + 'home', + 'about' => array( + 'thumbnail' => '{{image-sandwich}}', + ), + 'contact' => array( + 'thumbnail' => '{{image-espresso}}', + ), + 'blog' => array( + 'thumbnail' => '{{image-coffee}}', + ), + 'homepage-section' => array( + 'thumbnail' => '{{image-espresso}}', + ), + ), + + // Create the custom image attachments used as post thumbnails for pages. + 'attachments' => array( + 'image-espresso' => array( + 'post_title' => _x( 'Espresso', 'Theme starter content', 'twentyseventeen' ), + 'file' => 'assets/images/espresso.jpg', // URL relative to the template directory. + ), + 'image-sandwich' => array( + 'post_title' => _x( 'Sandwich', 'Theme starter content', 'twentyseventeen' ), + 'file' => 'assets/images/sandwich.jpg', + ), + 'image-coffee' => array( + 'post_title' => _x( 'Coffee', 'Theme starter content', 'twentyseventeen' ), + 'file' => 'assets/images/coffee.jpg', + ), + ), + + // Default to a static front page and assign the front and posts pages. + 'options' => array( + 'show_on_front' => 'page', + 'page_on_front' => '{{home}}', + 'page_for_posts' => '{{blog}}', + ), + + // Set the front page section theme mods to the IDs of the core-registered pages. + 'theme_mods' => array( + 'panel_1' => '{{homepage-section}}', + 'panel_2' => '{{about}}', + 'panel_3' => '{{blog}}', + 'panel_4' => '{{contact}}', + ), + + // Set up nav menus for each of the two areas registered in the theme. + 'nav_menus' => array( + // Assign a menu to the "top" location. + 'top' => array( + 'name' => __( 'Top Menu', 'twentyseventeen' ), + 'items' => array( + 'link_home', // Note that the core "home" page is actually a link in case a static front page is not used. + 'page_about', + 'page_blog', + 'page_contact', + ), + ), + + // Assign a menu to the "social" location. + 'social' => array( + 'name' => __( 'Social Links Menu', 'twentyseventeen' ), + 'items' => array( + 'link_yelp', + 'link_facebook', + 'link_twitter', + 'link_instagram', + 'link_email', + ), + ), + ), + ); + + /** + * Filters Twenty Seventeen array of starter content. + * + * @since Twenty Seventeen 1.1 + * + * @param array $starter_content Array of starter content. + */ + $starter_content = apply_filters( 'twentyseventeen_starter_content', $starter_content ); + + add_theme_support( 'starter-content', $starter_content ); +} +add_action( 'after_setup_theme', 'twentyseventeen_setup' ); + +/** + * Set the content width in pixels, based on the theme's design and stylesheet. + * + * Priority 0 to make it available to lower priority callbacks. + * + * @global int $content_width + */ +function twentyseventeen_content_width() { + + $content_width = $GLOBALS['content_width']; + + // Get layout. + $page_layout = get_theme_mod( 'page_layout' ); + + // Check if layout is one column. + if ( 'one-column' === $page_layout ) { + if ( twentyseventeen_is_frontpage() ) { + $content_width = 644; + } elseif ( is_page() ) { + $content_width = 740; + } + } + + // Check if is single post and there is no sidebar. + if ( is_single() && ! is_active_sidebar( 'sidebar-1' ) ) { + $content_width = 740; + } + + /** + * Filter Twenty Seventeen content width of the theme. + * + * @since Twenty Seventeen 1.0 + * + * @param int $content_width Content width in pixels. + */ + $GLOBALS['content_width'] = apply_filters( 'twentyseventeen_content_width', $content_width ); +} +add_action( 'template_redirect', 'twentyseventeen_content_width', 0 ); + +/** + * Register custom fonts. + */ +function twentyseventeen_fonts_url() { + $fonts_url = ''; + + /* + * translators: If there are characters in your language that are not supported + * by Libre Franklin, translate this to 'off'. Do not translate into your own language. + */ + $libre_franklin = _x( 'on', 'Libre Franklin font: on or off', 'twentyseventeen' ); + + if ( 'off' !== $libre_franklin ) { + $font_families = array(); + + $font_families[] = 'Libre Franklin:300,300i,400,400i,600,600i,800,800i'; + + $query_args = array( + 'family' => urlencode( implode( '|', $font_families ) ), + 'subset' => urlencode( 'latin,latin-ext' ), + 'display' => urlencode( 'fallback' ), + ); + + $fonts_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' ); + } + + return esc_url_raw( $fonts_url ); +} + +/** + * Add preconnect for Google Fonts. + * + * @since Twenty Seventeen 1.0 + * + * @param array $urls URLs to print for resource hints. + * @param string $relation_type The relation type the URLs are printed. + * @return array $urls URLs to print for resource hints. + */ +function twentyseventeen_resource_hints( $urls, $relation_type ) { + if ( wp_style_is( 'twentyseventeen-fonts', 'queue' ) && 'preconnect' === $relation_type ) { + $urls[] = array( + 'href' => 'https://fonts.gstatic.com', + 'crossorigin', + ); + } + + return $urls; +} +add_filter( 'wp_resource_hints', 'twentyseventeen_resource_hints', 10, 2 ); + +/** + * Register widget area. + * + * @link https://developer.wordpress.org/themes/functionality/sidebars/#registering-a-sidebar + */ +function twentyseventeen_widgets_init() { + register_sidebar( + array( + 'name' => __( 'Blog Sidebar', 'twentyseventeen' ), + 'id' => 'sidebar-1', + 'description' => __( 'Add widgets here to appear in your sidebar on blog posts and archive pages.', 'twentyseventeen' ), + 'before_widget' => '
            ', + 'after_widget' => '
            ', + 'before_title' => '

            ', + 'after_title' => '

            ', + ) + ); + + register_sidebar( + array( + 'name' => __( 'Footer 1', 'twentyseventeen' ), + 'id' => 'sidebar-2', + 'description' => __( 'Add widgets here to appear in your footer.', 'twentyseventeen' ), + 'before_widget' => '
            ', + 'after_widget' => '
            ', + 'before_title' => '

            ', + 'after_title' => '

            ', + ) + ); + + register_sidebar( + array( + 'name' => __( 'Footer 2', 'twentyseventeen' ), + 'id' => 'sidebar-3', + 'description' => __( 'Add widgets here to appear in your footer.', 'twentyseventeen' ), + 'before_widget' => '
            ', + 'after_widget' => '
            ', + 'before_title' => '

            ', + 'after_title' => '

            ', + ) + ); +} +add_action( 'widgets_init', 'twentyseventeen_widgets_init' ); + +/** + * Replaces "[...]" (appended to automatically generated excerpts) with ... and + * a 'Continue reading' link. + * + * @since Twenty Seventeen 1.0 + * + * @param string $link Link to single post/page. + * @return string 'Continue reading' link prepended with an ellipsis. + */ +function twentyseventeen_excerpt_more( $link ) { + if ( is_admin() ) { + return $link; + } + + $link = sprintf( + '
            ', + esc_url( get_permalink( get_the_ID() ) ), + /* translators: %s: Post title. */ + sprintf( __( 'Continue reading "%s"', 'twentyseventeen' ), get_the_title( get_the_ID() ) ) + ); + return ' … ' . $link; +} +add_filter( 'excerpt_more', 'twentyseventeen_excerpt_more' ); + +/** + * Handles JavaScript detection. + * + * Adds a `js` class to the root `` element when JavaScript is detected. + * + * @since Twenty Seventeen 1.0 + */ +function twentyseventeen_javascript_detection() { + echo "\n"; +} +add_action( 'wp_head', 'twentyseventeen_javascript_detection', 0 ); + +/** + * Add a pingback url auto-discovery header for singularly identifiable articles. + */ +function twentyseventeen_pingback_header() { + if ( is_singular() && pings_open() ) { + printf( '' . "\n", esc_url( get_bloginfo( 'pingback_url' ) ) ); + } +} +add_action( 'wp_head', 'twentyseventeen_pingback_header' ); + +/** + * Display custom color CSS. + */ +function twentyseventeen_colors_css_wrap() { + if ( 'custom' !== get_theme_mod( 'colorscheme' ) && ! is_customize_preview() ) { + return; + } + + require_once get_parent_theme_file_path( '/inc/color-patterns.php' ); + $hue = absint( get_theme_mod( 'colorscheme_hue', 250 ) ); + + $customize_preview_data_hue = ''; + if ( is_customize_preview() ) { + $customize_preview_data_hue = 'data-hue="' . $hue . '"'; + } + ?> + + twentyseventeen_get_svg( array( 'icon' => 'quote-right' ) ), + ); + + if ( has_nav_menu( 'top' ) ) { + wp_enqueue_script( 'twentyseventeen-navigation', get_theme_file_uri( '/assets/js/navigation.js' ), array( 'jquery' ), '20161203', true ); + $twentyseventeen_l10n['expand'] = __( 'Expand child menu', 'twentyseventeen' ); + $twentyseventeen_l10n['collapse'] = __( 'Collapse child menu', 'twentyseventeen' ); + $twentyseventeen_l10n['icon'] = twentyseventeen_get_svg( + array( + 'icon' => 'angle-down', + 'fallback' => true, + ) + ); + } + + wp_enqueue_script( 'twentyseventeen-global', get_theme_file_uri( '/assets/js/global.js' ), array( 'jquery' ), '20190121', true ); + + wp_enqueue_script( 'jquery-scrollto', get_theme_file_uri( '/assets/js/jquery.scrollTo.js' ), array( 'jquery' ), '2.1.2', true ); + + wp_localize_script( 'twentyseventeen-skip-link-focus-fix', 'twentyseventeenScreenReaderText', $twentyseventeen_l10n ); + + if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { + wp_enqueue_script( 'comment-reply' ); + } +} +add_action( 'wp_enqueue_scripts', 'twentyseventeen_scripts' ); + +/** + * Enqueues styles for the block-based editor. + * + * @since Twenty Seventeen 1.8 + */ +function twentyseventeen_block_editor_styles() { + // Block styles. + wp_enqueue_style( 'twentyseventeen-block-editor-style', get_theme_file_uri( '/assets/css/editor-blocks.css' ), array(), '20190328' ); + // Add custom fonts. + wp_enqueue_style( 'twentyseventeen-fonts', twentyseventeen_fonts_url(), array(), null ); +} +add_action( 'enqueue_block_editor_assets', 'twentyseventeen_block_editor_styles' ); + +/** + * Add custom image sizes attribute to enhance responsive image functionality + * for content images. + * + * @since Twenty Seventeen 1.0 + * + * @param string $sizes A source size value for use in a 'sizes' attribute. + * @param array $size Image size. Accepts an array of width and height + * values in pixels (in that order). + * @return string A source size value for use in a content image 'sizes' attribute. + */ +function twentyseventeen_content_image_sizes_attr( $sizes, $size ) { + $width = $size[0]; + + if ( 740 <= $width ) { + $sizes = '(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px'; + } + + if ( is_active_sidebar( 'sidebar-1' ) || is_archive() || is_search() || is_home() || is_page() ) { + if ( ! ( is_page() && 'one-column' === get_theme_mod( 'page_options' ) ) && 767 <= $width ) { + $sizes = '(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px'; + } + } + + return $sizes; +} +add_filter( 'wp_calculate_image_sizes', 'twentyseventeen_content_image_sizes_attr', 10, 2 ); + +/** + * Filter the `sizes` value in the header image markup. + * + * @since Twenty Seventeen 1.0 + * + * @param string $html The HTML image tag markup being filtered. + * @param object $header The custom header object returned by 'get_custom_header()'. + * @param array $attr Array of the attributes for the image tag. + * @return string The filtered header image HTML. + */ +function twentyseventeen_header_image_tag( $html, $header, $attr ) { + if ( isset( $attr['sizes'] ) ) { + $html = str_replace( $attr['sizes'], '100vw', $html ); + } + return $html; +} +add_filter( 'get_header_image_tag', 'twentyseventeen_header_image_tag', 10, 3 ); + +/** + * Add custom image sizes attribute to enhance responsive image functionality + * for post thumbnails. + * + * @since Twenty Seventeen 1.0 + * + * @param array $attr Attributes for the image markup. + * @param int $attachment Image attachment ID. + * @param array $size Registered image size or flat array of height and width dimensions. + * @return array The filtered attributes for the image markup. + */ +function twentyseventeen_post_thumbnail_sizes_attr( $attr, $attachment, $size ) { + if ( is_archive() || is_search() || is_home() ) { + $attr['sizes'] = '(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px'; + } else { + $attr['sizes'] = '100vw'; + } + + return $attr; +} +add_filter( 'wp_get_attachment_image_attributes', 'twentyseventeen_post_thumbnail_sizes_attr', 10, 3 ); + +/** + * Use front-page.php when Front page displays is set to a static page. + * + * @since Twenty Seventeen 1.0 + * + * @param string $template front-page.php. + * + * @return string The template to be used: blank if is_home() is true (defaults to index.php), else $template. + */ +function twentyseventeen_front_page_template( $template ) { + return is_home() ? '' : $template; +} +add_filter( 'frontpage_template', 'twentyseventeen_front_page_template' ); + +/** + * Modifies tag cloud widget arguments to display all tags in the same font size + * and use list format for better accessibility. + * + * @since Twenty Seventeen 1.4 + * + * @param array $args Arguments for tag cloud widget. + * @return array The filtered arguments for tag cloud widget. + */ +function twentyseventeen_widget_tag_cloud_args( $args ) { + $args['largest'] = 1; + $args['smallest'] = 1; + $args['unit'] = 'em'; + $args['format'] = 'list'; + + return $args; +} +add_filter( 'widget_tag_cloud_args', 'twentyseventeen_widget_tag_cloud_args' ); + +/** + * Get unique ID. + * + * This is a PHP implementation of Underscore's uniqueId method. A static variable + * contains an integer that is incremented with each call. This number is returned + * with the optional prefix. As such the returned value is not universally unique, + * but it is unique across the life of the PHP process. + * + * @since Twenty Seventeen 2.0 + * @see wp_unique_id() Themes requiring WordPress 5.0.3 and greater should use this instead. + * + * @staticvar int $id_counter + * + * @param string $prefix Prefix for the returned ID. + * @return string Unique ID. + */ +function twentyseventeen_unique_id( $prefix = '' ) { + static $id_counter = 0; + if ( function_exists( 'wp_unique_id' ) ) { + return wp_unique_id( $prefix ); + } + return $prefix . (string) ++$id_counter; +} + +/** + * Implement the Custom Header feature. + */ +require get_parent_theme_file_path( '/inc/custom-header.php' ); + +/** + * Custom template tags for this theme. + */ +require get_parent_theme_file_path( '/inc/template-tags.php' ); + +/** + * Additional features to allow styling of the templates. + */ +require get_parent_theme_file_path( '/inc/template-functions.php' ); + +/** + * Customizer additions. + */ +require get_parent_theme_file_path( '/inc/customizer.php' ); + +/** + * SVG icons functions and filters. + */ +require get_parent_theme_file_path( '/inc/icon-functions.php' ); diff --git a/wp-content/themes/twentyseventeen/header.php b/wp-content/themes/twentyseventeen/header.php new file mode 100644 index 0000000..3368bd3 --- /dev/null +++ b/wp-content/themes/twentyseventeen/header.php @@ -0,0 +1,58 @@ + section and everything up until
            + * + * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials + * + * @package WordPress + * @subpackage Twenty_Seventeen + * @since Twenty Seventeen 1.0 + * @version 1.0 + */ + +?> + class="no-js no-svg"> + + + + + + + + +> + +
            + + + + + '; + echo get_the_post_thumbnail( get_queried_object_id(), 'twentyseventeen-featured-image' ); + echo '
            '; + endif; + ?> + +
            +
            diff --git a/wp-content/themes/twentyseventeen/inc/back-compat.php b/wp-content/themes/twentyseventeen/inc/back-compat.php new file mode 100644 index 0000000..64f2d73 --- /dev/null +++ b/wp-content/themes/twentyseventeen/inc/back-compat.php @@ -0,0 +1,76 @@ +

            %s

            ', $message ); +} + +/** + * Prevents the Customizer from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Seventeen 1.0 + * + * @global string $wp_version WordPress version. + */ +function twentyseventeen_customize() { + wp_die( + /* translators: %s: The current WordPress version. */ + sprintf( __( 'Twenty Seventeen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentyseventeen' ), $GLOBALS['wp_version'] ), + '', + array( + 'back_link' => true, + ) + ); +} +add_action( 'load-customize.php', 'twentyseventeen_customize' ); + +/** + * Prevents the Theme Preview from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Seventeen 1.0 + * + * @global string $wp_version WordPress version. + */ +function twentyseventeen_preview() { + if ( isset( $_GET['preview'] ) ) { + /* translators: %s: The current WordPress version. */ + wp_die( sprintf( __( 'Twenty Seventeen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentyseventeen' ), $GLOBALS['wp_version'] ) ); + } +} +add_action( 'template_redirect', 'twentyseventeen_preview' ); diff --git a/wp-content/themes/twentyseventeen/inc/color-patterns.php b/wp-content/themes/twentyseventeen/inc/color-patterns.php new file mode 100644 index 0000000..225b124 --- /dev/null +++ b/wp-content/themes/twentyseventeen/inc/color-patterns.php @@ -0,0 +1,580 @@ + .comment-body > .comment-meta > .comment-author .avatar { + border-color: hsl( ' . $hue . ', ' . $reduced_saturation . ', 20% ); /* base: #333; */ +} + +.colors-custom h2, +.colors-custom blockquote, +.colors-custom input[type="text"], +.colors-custom input[type="email"], +.colors-custom input[type="url"], +.colors-custom input[type="password"], +.colors-custom input[type="search"], +.colors-custom input[type="number"], +.colors-custom input[type="tel"], +.colors-custom input[type="range"], +.colors-custom input[type="date"], +.colors-custom input[type="month"], +.colors-custom input[type="week"], +.colors-custom input[type="time"], +.colors-custom input[type="datetime"], +.colors-custom input[type="datetime-local"], +.colors-custom input[type="color"], +.colors-custom textarea, +.colors-custom .site-description, +.colors-custom .entry-content blockquote.alignleft, +.colors-custom .entry-content blockquote.alignright, +.colors-custom .colors-custom .taxonomy-description, +.colors-custom .site-info a, +.colors-custom .wp-caption, +.colors-custom .gallery-caption { + color: hsl( ' . $hue . ', ' . $saturation . ', 40% ); /* base: #666; */ +} + +.colors-custom abbr, +.colors-custom acronym { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 40% ); /* base: #666; */ +} + +.colors-custom h5, +.colors-custom .entry-meta, +.colors-custom .entry-meta a, +.colors-custom.blog .entry-meta a.post-edit-link, +.colors-custom.archive .entry-meta a.post-edit-link, +.colors-custom.search .entry-meta a.post-edit-link, +.colors-custom .nav-subtitle, +.colors-custom .comment-metadata, +.colors-custom .comment-metadata a, +.colors-custom .no-comments, +.colors-custom .comment-awaiting-moderation, +.colors-custom .page-numbers.current, +.colors-custom .page-links .page-number, +.colors-custom .navigation-top .current-menu-item > a, +.colors-custom .navigation-top .current_page_item > a, +.colors-custom .main-navigation a:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-current-item .wp-playlist-item-artist { + color: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */ +} + +.colors-custom :not( .mejs-button ) > button:hover, +.colors-custom :not( .mejs-button ) > button:focus, +.colors-custom input[type="button"]:hover, +.colors-custom input[type="button"]:focus, +.colors-custom input[type="submit"]:hover, +.colors-custom input[type="submit"]:focus, +.colors-custom .entry-footer .edit-link a.post-edit-link:hover, +.colors-custom .entry-footer .edit-link a.post-edit-link:focus, +.colors-custom .social-navigation a, +.colors-custom .prev.page-numbers:focus, +.colors-custom .prev.page-numbers:hover, +.colors-custom .next.page-numbers:focus, +.colors-custom .next.page-numbers:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:focus { + background: hsl( ' . esc_attr( $hue ) . ', ' . esc_attr( $saturation ) . ', 46% ); /* base: #767676; */ +} + +.colors-custom button.secondary:hover, +.colors-custom button.secondary:focus, +.colors-custom input[type="reset"]:hover, +.colors-custom input[type="reset"]:focus, +.colors-custom input[type="button"].secondary:hover, +.colors-custom input[type="button"].secondary:focus, +.colors-custom input[type="reset"].secondary:hover, +.colors-custom input[type="reset"].secondary:focus, +.colors-custom input[type="submit"].secondary:hover, +.colors-custom input[type="submit"].secondary:focus, +.colors-custom hr { + background: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom input[type="text"], +.colors-custom input[type="email"], +.colors-custom input[type="url"], +.colors-custom input[type="password"], +.colors-custom input[type="search"], +.colors-custom input[type="number"], +.colors-custom input[type="tel"], +.colors-custom input[type="range"], +.colors-custom input[type="date"], +.colors-custom input[type="month"], +.colors-custom input[type="week"], +.colors-custom input[type="time"], +.colors-custom input[type="datetime"], +.colors-custom input[type="datetime-local"], +.colors-custom input[type="color"], +.colors-custom textarea, +.colors-custom select, +.colors-custom fieldset, +.colors-custom .widget .tagcloud a:hover, +.colors-custom .widget .tagcloud a:focus, +.colors-custom .widget.widget_tag_cloud a:hover, +.colors-custom .widget.widget_tag_cloud a:focus, +.colors-custom .wp_widget_tag_cloud a:hover, +.colors-custom .wp_widget_tag_cloud a:focus { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom thead th { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom .entry-footer .cat-links .icon, +.colors-custom .entry-footer .tags-links .icon { + color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom button.secondary, +.colors-custom input[type="reset"], +.colors-custom input[type="button"].secondary, +.colors-custom input[type="reset"].secondary, +.colors-custom input[type="submit"].secondary, +.colors-custom .prev.page-numbers, +.colors-custom .next.page-numbers { + background-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom .widget .tagcloud a, +.colors-custom .widget.widget_tag_cloud a, +.colors-custom .wp_widget_tag_cloud a { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom.twentyseventeen-front-page article:not(.has-post-thumbnail):not(:first-child), +.colors-custom .widget ul li { + border-top-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom .widget ul li { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom pre, +.colors-custom mark, +.colors-custom ins { + background: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .navigation-top, +.colors-custom .main-navigation > div > ul, +.colors-custom .pagination, +.colors-custom .comments-pagination, +.colors-custom .entry-footer, +.colors-custom .site-footer { + border-top-color: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .navigation-top, +.colors-custom .main-navigation li, +.colors-custom .entry-footer, +.colors-custom .single-featured-image-header, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item, +.colors-custom tr { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .site-content .wp-playlist-light { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .site-header, +.colors-custom .single-featured-image-header { + background-color: hsl( ' . $hue . ', ' . $saturation . ', 98% ); /* base: #fafafa; */ +} + +.colors-custom button, +.colors-custom input[type="button"], +.colors-custom input[type="submit"], +.colors-custom .entry-footer .edit-link a.post-edit-link, +.colors-custom .social-navigation a, +.colors-custom .site-content .wp-playlist-light a.wp-playlist-caption:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:hover a, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:focus a, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:focus, +.colors-custom .prev.page-numbers:focus, +.colors-custom .prev.page-numbers:hover, +.colors-custom .next.page-numbers:focus, +.colors-custom .next.page-numbers:hover, +.colors-custom.has-header-image .site-title, +.colors-custom.has-header-video .site-title, +.colors-custom.has-header-image .site-title a, +.colors-custom.has-header-video .site-title a, +.colors-custom.has-header-image .site-description, +.colors-custom.has-header-video .site-description { + color: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ +} + +body.colors-custom, +.colors-custom .navigation-top, +.colors-custom .main-navigation ul { + background: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ +} + +.colors-custom .widget ul li a, +.colors-custom .site-footer .widget-area ul li a { + -webkit-box-shadow: inset 0 -1px 0 hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: rgba(255, 255, 255, 1); */ + box-shadow: inset 0 -1px 0 hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: rgba(255, 255, 255, 1); */ +} + +.colors-custom .menu-toggle, +.colors-custom .menu-toggle:hover, +.colors-custom .menu-toggle:focus, +.colors-custom .menu .dropdown-toggle, +.colors-custom .menu-scroll-down, +.colors-custom .menu-scroll-down:hover, +.colors-custom .menu-scroll-down:focus { + background-color: transparent; +} + +.colors-custom .widget .tagcloud a, +.colors-custom .widget .tagcloud a:focus, +.colors-custom .widget .tagcloud a:hover, +.colors-custom .widget.widget_tag_cloud a, +.colors-custom .widget.widget_tag_cloud a:focus, +.colors-custom .widget.widget_tag_cloud a:hover, +.colors-custom .wp_widget_tag_cloud a, +.colors-custom .wp_widget_tag_cloud a:focus, +.colors-custom .wp_widget_tag_cloud a:hover, +.colors-custom .entry-footer .edit-link a.post-edit-link:focus, +.colors-custom .entry-footer .edit-link a.post-edit-link:hover { + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +/* Reset non-customizable hover styling for links */ +.colors-custom .entry-content a:hover, +.colors-custom .entry-content a:focus, +.colors-custom .entry-summary a:hover, +.colors-custom .entry-summary a:focus, +.colors-custom .comment-content a:focus, +.colors-custom .comment-content a:hover, +.colors-custom .widget a:hover, +.colors-custom .widget a:focus, +.colors-custom .site-footer .widget-area a:hover, +.colors-custom .site-footer .widget-area a:focus, +.colors-custom .posts-navigation a:hover, +.colors-custom .posts-navigation a:focus, +.colors-custom .widget_authors a:hover strong, +.colors-custom .widget_authors a:focus strong { + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); +} + +.colors-custom .gallery-item a, +.colors-custom .gallery-item a:hover, +.colors-custom .gallery-item a:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +@media screen and (min-width: 48em) { + + .colors-custom .nav-links .nav-previous .nav-title .icon, + .colors-custom .nav-links .nav-next .nav-title .icon { + color: hsl( ' . $hue . ', ' . $saturation . ', 20% ); /* base: #222; */ + } + + .colors-custom .main-navigation li li:hover, + .colors-custom .main-navigation li li.focus { + background: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */ + } + + .colors-custom .navigation-top .menu-scroll-down { + color: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */; + } + + .colors-custom abbr[title] { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */; + } + + .colors-custom .main-navigation ul ul { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ + background: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ + } + + .colors-custom .main-navigation ul li.menu-item-has-children:before, + .colors-custom .main-navigation ul li.page_item_has_children:before { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ + } + + .colors-custom .main-navigation ul li.menu-item-has-children:after, + .colors-custom .main-navigation ul li.page_item_has_children:after { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ + } + + .colors-custom .main-navigation li li.focus > a, + .colors-custom .main-navigation li li:focus > a, + .colors-custom .main-navigation li li:hover > a, + .colors-custom .main-navigation li li a:hover, + .colors-custom .main-navigation li li a:focus, + .colors-custom .main-navigation li li.current_page_item a:hover, + .colors-custom .main-navigation li li.current-menu-item a:hover, + .colors-custom .main-navigation li li.current_page_item a:focus, + .colors-custom .main-navigation li li.current-menu-item a:focus { + color: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ + } +}'; + + /** + * Filters Twenty Seventeen custom colors CSS. + * + * @since Twenty Seventeen 1.0 + * + * @param string $css Base theme colors CSS. + * @param int $hue The user's selected color hue. + * @param string $saturation Filtered theme color saturation level. + */ + return apply_filters( 'twentyseventeen_custom_colors_css', $css, $hue, $saturation ); +} diff --git a/wp-content/themes/twentyseventeen/inc/custom-header.php b/wp-content/themes/twentyseventeen/inc/custom-header.php new file mode 100644 index 0000000..ad266a2 --- /dev/null +++ b/wp-content/themes/twentyseventeen/inc/custom-header.php @@ -0,0 +1,131 @@ + get_parent_theme_file_uri( '/assets/images/header.jpg' ), + 'width' => 2000, + 'height' => 1200, + 'flex-height' => true, + 'video' => true, + 'wp-head-callback' => 'twentyseventeen_header_style', + ) + ) + ); + + register_default_headers( + array( + 'default-image' => array( + 'url' => '%s/assets/images/header.jpg', + 'thumbnail_url' => '%s/assets/images/header.jpg', + 'description' => __( 'Default Header Image', 'twentyseventeen' ), + ), + ) + ); +} +add_action( 'after_setup_theme', 'twentyseventeen_custom_header_setup' ); + +if ( ! function_exists( 'twentyseventeen_header_style' ) ) : + /** + * Styles the header image and text displayed on the blog. + * + * @see twentyseventeen_custom_header_setup(). + */ + function twentyseventeen_header_style() { + $header_text_color = get_header_textcolor(); + + // If no custom options for text are set, let's bail. + // get_header_textcolor() options: add_theme_support( 'custom-header' ) is default, hide text (returns 'blank') or any hex value. + if ( get_theme_support( 'custom-header', 'default-text-color' ) === $header_text_color ) { + return; + } + + // If we get this far, we have custom styles. Let's do this. + ?> + + ' . __( 'Play background video', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'play' ) ); + $settings['l10n']['pause'] = '' . __( 'Pause background video', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'pause' ) ); + return $settings; +} +add_filter( 'header_video_settings', 'twentyseventeen_video_controls' ); diff --git a/wp-content/themes/twentyseventeen/inc/customizer.php b/wp-content/themes/twentyseventeen/inc/customizer.php new file mode 100644 index 0000000..e84d4a4 --- /dev/null +++ b/wp-content/themes/twentyseventeen/inc/customizer.php @@ -0,0 +1,249 @@ +get_setting( 'blogname' )->transport = 'postMessage'; + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; + + $wp_customize->selective_refresh->add_partial( + 'blogname', + array( + 'selector' => '.site-title a', + 'render_callback' => 'twentyseventeen_customize_partial_blogname', + ) + ); + $wp_customize->selective_refresh->add_partial( + 'blogdescription', + array( + 'selector' => '.site-description', + 'render_callback' => 'twentyseventeen_customize_partial_blogdescription', + ) + ); + + /** + * Custom colors. + */ + $wp_customize->add_setting( + 'colorscheme', + array( + 'default' => 'light', + 'transport' => 'postMessage', + 'sanitize_callback' => 'twentyseventeen_sanitize_colorscheme', + ) + ); + + $wp_customize->add_setting( + 'colorscheme_hue', + array( + 'default' => 250, + 'transport' => 'postMessage', + 'sanitize_callback' => 'absint', // The hue is stored as a positive integer. + ) + ); + + $wp_customize->add_control( + 'colorscheme', + array( + 'type' => 'radio', + 'label' => __( 'Color Scheme', 'twentyseventeen' ), + 'choices' => array( + 'light' => __( 'Light', 'twentyseventeen' ), + 'dark' => __( 'Dark', 'twentyseventeen' ), + 'custom' => __( 'Custom', 'twentyseventeen' ), + ), + 'section' => 'colors', + 'priority' => 5, + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'colorscheme_hue', + array( + 'mode' => 'hue', + 'section' => 'colors', + 'priority' => 6, + ) + ) + ); + + /** + * Theme options. + */ + $wp_customize->add_section( + 'theme_options', + array( + 'title' => __( 'Theme Options', 'twentyseventeen' ), + 'priority' => 130, // Before Additional CSS. + ) + ); + + $wp_customize->add_setting( + 'page_layout', + array( + 'default' => 'two-column', + 'sanitize_callback' => 'twentyseventeen_sanitize_page_layout', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'page_layout', + array( + 'label' => __( 'Page Layout', 'twentyseventeen' ), + 'section' => 'theme_options', + 'type' => 'radio', + 'description' => __( 'When the two-column layout is assigned, the page title is in one column and content is in the other.', 'twentyseventeen' ), + 'choices' => array( + 'one-column' => __( 'One Column', 'twentyseventeen' ), + 'two-column' => __( 'Two Column', 'twentyseventeen' ), + ), + 'active_callback' => 'twentyseventeen_is_view_with_layout_option', + ) + ); + + /** + * Filter number of front page sections in Twenty Seventeen. + * + * @since Twenty Seventeen 1.0 + * + * @param int $num_sections Number of front page sections. + */ + $num_sections = apply_filters( 'twentyseventeen_front_page_sections', 4 ); + + // Create a setting and control for each of the sections available in the theme. + for ( $i = 1; $i < ( 1 + $num_sections ); $i++ ) { + $wp_customize->add_setting( + 'panel_' . $i, + array( + 'default' => false, + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'panel_' . $i, + array( + /* translators: %d: The front page section number. */ + 'label' => sprintf( __( 'Front Page Section %d Content', 'twentyseventeen' ), $i ), + 'description' => ( 1 !== $i ? '' : __( 'Select pages to feature in each area from the dropdowns. Add an image to a section by setting a featured image in the page editor. Empty sections will not be displayed.', 'twentyseventeen' ) ), + 'section' => 'theme_options', + 'type' => 'dropdown-pages', + 'allow_addition' => true, + 'active_callback' => 'twentyseventeen_is_static_front_page', + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'panel_' . $i, + array( + 'selector' => '#panel' . $i, + 'render_callback' => 'twentyseventeen_front_page_section', + 'container_inclusive' => true, + ) + ); + } +} +add_action( 'customize_register', 'twentyseventeen_customize_register' ); + +/** + * Sanitize the page layout options. + * + * @param string $input Page layout. + */ +function twentyseventeen_sanitize_page_layout( $input ) { + $valid = array( + 'one-column' => __( 'One Column', 'twentyseventeen' ), + 'two-column' => __( 'Two Column', 'twentyseventeen' ), + ); + + if ( array_key_exists( $input, $valid ) ) { + return $input; + } + + return ''; +} + +/** + * Sanitize the colorscheme. + * + * @param string $input Color scheme. + */ +function twentyseventeen_sanitize_colorscheme( $input ) { + $valid = array( 'light', 'dark', 'custom' ); + + if ( in_array( $input, $valid, true ) ) { + return $input; + } + + return 'light'; +} + +/** + * Render the site title for the selective refresh partial. + * + * @since Twenty Seventeen 1.0 + * @see twentyseventeen_customize_register() + * + * @return void + */ +function twentyseventeen_customize_partial_blogname() { + bloginfo( 'name' ); +} + +/** + * Render the site tagline for the selective refresh partial. + * + * @since Twenty Seventeen 1.0 + * @see twentyseventeen_customize_register() + * + * @return void + */ +function twentyseventeen_customize_partial_blogdescription() { + bloginfo( 'description' ); +} + +/** + * Return whether we're previewing the front page and it's a static page. + */ +function twentyseventeen_is_static_front_page() { + return ( is_front_page() && ! is_home() ); +} + +/** + * Return whether we're on a view that supports a one or two column layout. + */ +function twentyseventeen_is_view_with_layout_option() { + // This option is available on all pages. It's also available on archives when there isn't a sidebar. + return ( is_page() || ( is_archive() && ! is_active_sidebar( 'sidebar-1' ) ) ); +} + +/** + * Bind JS handlers to instantly live-preview changes. + */ +function twentyseventeen_customize_preview_js() { + wp_enqueue_script( 'twentyseventeen-customize-preview', get_theme_file_uri( '/assets/js/customize-preview.js' ), array( 'customize-preview' ), '20161002', true ); +} +add_action( 'customize_preview_init', 'twentyseventeen_customize_preview_js' ); + +/** + * Load dynamic logic for the customizer controls area. + */ +function twentyseventeen_panels_js() { + wp_enqueue_script( 'twentyseventeen-customize-controls', get_theme_file_uri( '/assets/js/customize-controls.js' ), array(), '20161020', true ); +} +add_action( 'customize_controls_enqueue_scripts', 'twentyseventeen_panels_js' ); diff --git a/wp-content/themes/twentyseventeen/inc/icon-functions.php b/wp-content/themes/twentyseventeen/inc/icon-functions.php new file mode 100644 index 0000000..34581f6 --- /dev/null +++ b/wp-content/themes/twentyseventeen/inc/icon-functions.php @@ -0,0 +1,220 @@ + '', + 'title' => '', + 'desc' => '', + 'fallback' => false, + ); + + // Parse args. + $args = wp_parse_args( $args, $defaults ); + + // Set aria hidden. + $aria_hidden = ' aria-hidden="true"'; + + // Set ARIA. + $aria_labelledby = ''; + + /* + * Twenty Seventeen doesn't use the SVG title or description attributes; non-decorative icons are described with .screen-reader-text. + * + * However, child themes can use the title and description to add information to non-decorative SVG icons to improve accessibility. + * + * Example 1 with title: 'arrow-right', 'title' => __( 'This is the title', 'textdomain' ) ) ); ?> + * + * Example 2 with title and description: 'arrow-right', 'title' => __( 'This is the title', 'textdomain' ), 'desc' => __( 'This is the description', 'textdomain' ) ) ); ?> + * + * See https://www.paciellogroup.com/blog/2013/12/using-aria-enhance-svg-accessibility/. + */ + if ( $args['title'] ) { + $aria_hidden = ''; + $unique_id = twentyseventeen_unique_id(); + $aria_labelledby = ' aria-labelledby="title-' . $unique_id . '"'; + + if ( $args['desc'] ) { + $aria_labelledby = ' aria-labelledby="title-' . $unique_id . ' desc-' . $unique_id . '"'; + } + } + + // Begin SVG markup. + $svg = ''; + + // Display the title. + if ( $args['title'] ) { + $svg .= '' . esc_html( $args['title'] ) . ''; + + // Display the desc only if the title is already set. + if ( $args['desc'] ) { + $svg .= '' . esc_html( $args['desc'] ) . ''; + } + } + + /* + * Display the icon. + * + * The whitespace around `` is intentional - it is a work around to a keyboard navigation bug in Safari 10. + * + * See https://core.trac.wordpress.org/ticket/38387. + */ + $svg .= ' '; + + // Add some markup to use as a fallback for browsers that do not support SVGs. + if ( $args['fallback'] ) { + $svg .= ''; + } + + $svg .= ''; + + return $svg; +} + +/** + * Display SVG icons in social links menu. + * + * @param string $item_output The menu item output. + * @param WP_Post $item Menu item object. + * @param int $depth Depth of the menu. + * @param array $args wp_nav_menu() arguments. + * @return string $item_output The menu item output with social icon. + */ +function twentyseventeen_nav_menu_social_icons( $item_output, $item, $depth, $args ) { + // Get supported social icons. + $social_icons = twentyseventeen_social_links_icons(); + + // Change SVG icon inside social links menu if there is supported URL. + if ( 'social' === $args->theme_location ) { + foreach ( $social_icons as $attr => $value ) { + if ( false !== strpos( $item_output, $attr ) ) { + $item_output = str_replace( $args->link_after, '' . twentyseventeen_get_svg( array( 'icon' => esc_attr( $value ) ) ), $item_output ); + } + } + } + + return $item_output; +} +add_filter( 'walker_nav_menu_start_el', 'twentyseventeen_nav_menu_social_icons', 10, 4 ); + +/** + * Add dropdown icon if menu item has children. + * + * @param string $title The menu item's title. + * @param WP_Post $item The current menu item. + * @param array $args An array of wp_nav_menu() arguments. + * @param int $depth Depth of menu item. Used for padding. + * @return string $title The menu item's title with dropdown icon. + */ +function twentyseventeen_dropdown_icon_to_menu_link( $title, $item, $args, $depth ) { + if ( 'top' === $args->theme_location ) { + foreach ( $item->classes as $value ) { + if ( 'menu-item-has-children' === $value || 'page_item_has_children' === $value ) { + $title = $title . twentyseventeen_get_svg( array( 'icon' => 'angle-down' ) ); + } + } + } + + return $title; +} +add_filter( 'nav_menu_item_title', 'twentyseventeen_dropdown_icon_to_menu_link', 10, 4 ); + +/** + * Returns an array of supported social links (URL and icon name). + * + * @return array $social_links_icons + */ +function twentyseventeen_social_links_icons() { + // Supported social links icons. + $social_links_icons = array( + 'behance.net' => 'behance', + 'codepen.io' => 'codepen', + 'deviantart.com' => 'deviantart', + 'digg.com' => 'digg', + 'docker.com' => 'dockerhub', + 'dribbble.com' => 'dribbble', + 'dropbox.com' => 'dropbox', + 'facebook.com' => 'facebook', + 'flickr.com' => 'flickr', + 'foursquare.com' => 'foursquare', + 'plus.google.com' => 'google-plus', + 'github.com' => 'github', + 'instagram.com' => 'instagram', + 'linkedin.com' => 'linkedin', + 'mailto:' => 'envelope-o', + 'medium.com' => 'medium', + 'pinterest.com' => 'pinterest-p', + 'pscp.tv' => 'periscope', + 'getpocket.com' => 'get-pocket', + 'reddit.com' => 'reddit-alien', + 'skype.com' => 'skype', + 'skype:' => 'skype', + 'slideshare.net' => 'slideshare', + 'snapchat.com' => 'snapchat-ghost', + 'soundcloud.com' => 'soundcloud', + 'spotify.com' => 'spotify', + 'stumbleupon.com' => 'stumbleupon', + 'tumblr.com' => 'tumblr', + 'twitch.tv' => 'twitch', + 'twitter.com' => 'twitter', + 'vimeo.com' => 'vimeo', + 'vine.co' => 'vine', + 'vk.com' => 'vk', + 'wordpress.org' => 'wordpress', + 'wordpress.com' => 'wordpress', + 'yelp.com' => 'yelp', + 'youtube.com' => 'youtube', + ); + + /** + * Filter Twenty Seventeen social links icons. + * + * @since Twenty Seventeen 1.0 + * + * @param array $social_links_icons Array of social links icons. + */ + return apply_filters( 'twentyseventeen_social_links_icons', $social_links_icons ); +} diff --git a/wp-content/themes/twentyseventeen/inc/template-functions.php b/wp-content/themes/twentyseventeen/inc/template-functions.php new file mode 100644 index 0000000..77a8801 --- /dev/null +++ b/wp-content/themes/twentyseventeen/inc/template-functions.php @@ -0,0 +1,102 @@ +' . get_the_author() . '' + ); + + // Finally, let's write all of this to the page. + echo '' . twentyseventeen_time_link() . ''; + } +endif; + + +if ( ! function_exists( 'twentyseventeen_time_link' ) ) : + /** + * Gets a nicely formatted string for the published date. + */ + function twentyseventeen_time_link() { + $time_string = ''; + if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { + $time_string = ''; + } + + $time_string = sprintf( + $time_string, + get_the_date( DATE_W3C ), + get_the_date(), + get_the_modified_date( DATE_W3C ), + get_the_modified_date() + ); + + // Wrap the time string in a link, and preface it with 'Posted on'. + return sprintf( + /* translators: %s: Post date. */ + __( 'Posted on %s', 'twentyseventeen' ), + '' . $time_string . '' + ); + } +endif; + + +if ( ! function_exists( 'twentyseventeen_entry_footer' ) ) : + /** + * Prints HTML with meta information for the categories, tags and comments. + */ + function twentyseventeen_entry_footer() { + + /* translators: Used between list items, there is a space after the comma. */ + $separate_meta = __( ', ', 'twentyseventeen' ); + + // Get Categories for posts. + $categories_list = get_the_category_list( $separate_meta ); + + // Get Tags for posts. + $tags_list = get_the_tag_list( '', $separate_meta ); + + // We don't want to output .entry-footer if it will be empty, so make sure its not. + if ( ( ( twentyseventeen_categorized_blog() && $categories_list ) || $tags_list ) || get_edit_post_link() ) { + + echo '
            '; + + if ( 'post' === get_post_type() ) { + if ( ( $categories_list && twentyseventeen_categorized_blog() ) || $tags_list ) { + echo ''; + + // Make sure there's more than one category before displaying. + if ( $categories_list && twentyseventeen_categorized_blog() ) { + echo '' . twentyseventeen_get_svg( array( 'icon' => 'folder-open' ) ) . '' . __( 'Categories', 'twentyseventeen' ) . '' . $categories_list . ''; + } + + if ( $tags_list && ! is_wp_error( $tags_list ) ) { + echo '' . twentyseventeen_get_svg( array( 'icon' => 'hashtag' ) ) . '' . __( 'Tags', 'twentyseventeen' ) . '' . $tags_list . ''; + } + + echo ''; + } + } + + twentyseventeen_edit_link(); + + echo '
            '; + } + } +endif; + + +if ( ! function_exists( 'twentyseventeen_edit_link' ) ) : + /** + * Returns an accessibility-friendly link to edit a post or page. + * + * This also gives us a little context about what exactly we're editing + * (post or page?) so that users understand a bit more where they are in terms + * of the template hierarchy and their content. Helpful when/if the single-page + * layout with multiple posts/pages shown gets confusing. + */ + function twentyseventeen_edit_link() { + edit_post_link( + sprintf( + /* translators: %s: Post title. */ + __( 'Edit "%s"', 'twentyseventeen' ), + get_the_title() + ), + '', + '' + ); + } +endif; + +/** + * Display a front page section. + * + * @param WP_Customize_Partial $partial Partial associated with a selective refresh request. + * @param integer $id Front page section to display. + */ +function twentyseventeen_front_page_section( $partial = null, $id = 0 ) { + if ( is_a( $partial, 'WP_Customize_Partial' ) ) { + // Find out the id and set it up during a selective refresh. + global $twentyseventeencounter; + + $id = str_replace( 'panel_', '', $partial->id ); + + $twentyseventeencounter = $id; + } + + global $post; // Modify the global post object before setting up post data. + if ( get_theme_mod( 'panel_' . $id ) ) { + $post = get_post( get_theme_mod( 'panel_' . $id ) ); + setup_postdata( $post ); + set_query_var( 'panel', $id ); + + get_template_part( 'template-parts/page/content', 'front-page-panels' ); + + wp_reset_postdata(); + } elseif ( is_customize_preview() ) { + // The output placeholder anchor. + printf( + '
            ' . + '%2$s
            ', + $id, + /* translators: %s: The section ID. */ + sprintf( __( 'Front Page Section %s Placeholder', 'twentyseventeen' ), $id ) + ); + } +} + +/** + * Returns true if a blog has more than 1 category. + * + * @return bool + */ +function twentyseventeen_categorized_blog() { + $category_count = get_transient( 'twentyseventeen_categories' ); + + if ( false === $category_count ) { + // Create an array of all the categories that are attached to posts. + $categories = get_categories( + array( + 'fields' => 'ids', + 'hide_empty' => 1, + // We only need to know if there is more than one category. + 'number' => 2, + ) + ); + + // Count the number of categories that are attached to the posts. + $category_count = count( $categories ); + + set_transient( 'twentyseventeen_categories', $category_count ); + } + + // Allow viewing case of 0 or 1 categories in post preview. + if ( is_preview() ) { + return true; + } + + return $category_count > 1; +} + + +/** + * Flush out the transients used in twentyseventeen_categorized_blog. + */ +function twentyseventeen_category_transient_flusher() { + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { + return; + } + // Like, beat it. Dig? + delete_transient( 'twentyseventeen_categories' ); +} +add_action( 'edit_category', 'twentyseventeen_category_transient_flusher' ); +add_action( 'save_post', 'twentyseventeen_category_transient_flusher' ); + +if ( ! function_exists( 'wp_body_open' ) ) : + /** + * Fire the wp_body_open action. + * + * Added for backward compatibility to support pre-5.2.0 WordPress versions. + * + * @since Twenty Seventeen 2.2 + */ + function wp_body_open() { + /** + * Triggered after the opening tag. + * + * @since Twenty Seventeen 2.2 + */ + do_action( 'wp_body_open' ); + } +endif; diff --git a/wp-content/themes/twentyseventeen/index.php b/wp-content/themes/twentyseventeen/index.php new file mode 100644 index 0000000..0bf56bb --- /dev/null +++ b/wp-content/themes/twentyseventeen/index.php @@ -0,0 +1,72 @@ + + +
            + + + + + + +
            +
            + + twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '' . __( 'Previous page', 'twentyseventeen' ) . '', + 'next_text' => '' . __( 'Next page', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ), + 'before_page_number' => '' . __( 'Page', 'twentyseventeen' ) . ' ', + ) + ); + + else : + + get_template_part( 'template-parts/post/content', 'none' ); + + endif; + ?> + +
            +
            + +
            + + + +
            +
            +
            + + + +
            +
            +
            + + Themes and click the 'Add New' button. +2. Type in Twenty Seventeen in the search form and press the 'Enter' key on your keyboard. +3. Click on the 'Activate' button to use your new theme right away. +4. Go to https://wordpress.org/support/article/twenty-seventeen/ for a guide on how to customize this theme. +5. Navigate to Appearance > Customize in your admin panel and customize to taste. + +== Copyright == + +Twenty Seventeen WordPress Theme, Copyright 2016-2020 WordPress.org +Twenty Seventeen is distributed under the terms of the GNU GPL + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Twenty Seventeen bundles the following third-party resources: + +HTML5 Shiv, Copyright 2014 Alexander Farkas +Licenses: MIT/GPL2 +Source: https://github.com/aFarkas/html5shiv + +jQuery scrollTo, Copyright 2007-2015 Ariel Flesler +License: MIT +Source: https://github.com/flesler/jquery.scrollTo + +normalize.css, Copyright 2012-2016 Nicolas Gallagher and Jonathan Neal +License: MIT +Source: https://necolas.github.io/normalize.css/ + +Font Awesome icons, Copyright Dave Gandy +License: SIL Open Font License, version 1.1. +Source: http://fontawesome.io/ + +Bundled header image, Copyright Alvin Engler +License: CC0 1.0 Universal (CC0 1.0) +Source: https://unsplash.com/@englr?photo=bIhpiQA009k + +== Changelog == + += 2.3 = +* Released: March 31, 2020 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.3 + += 2.2 = +* Released: May 7, 2019 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.2 + += 2.1 = +* Released: February 21, 2019 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.1 + += 2.0 = +* Released: January 9, 2019 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.0 + += 1.9 = +* Released: December 19, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.9 + += 1.8 = +* Released: December 6, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.8 + += 1.7 = +* Released: August 2, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.7 + += 1.6 = +* Released: May 17, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.6 + += 1.5 = +* Released: April 4, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.5 + += 1.4 = +* Released: November 14, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.4 + += 1.3 = +* Released: June 8, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.3 + += 1.2 = +* Released: April 18, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.2 + += 1.1 = +* Released: January 6, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.1 + += 1.0 = +* Released: December 6, 2016 + +Initial release diff --git a/wp-content/themes/twentyseventeen/rtl.css b/wp-content/themes/twentyseventeen/rtl.css new file mode 100644 index 0000000..2d8773d --- /dev/null +++ b/wp-content/themes/twentyseventeen/rtl.css @@ -0,0 +1,556 @@ +/* +Theme Name: Twenty Seventeen + +Adding support for languages 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. + +https://codex.wordpress.org/Right-to-Left_Language_Support + +*/ + +/* Reset */ + +body { + direction: rtl; + unicode-bidi: embed; +} + +th { + text-align: right; +} + +/* Accessibility */ + +.screen-reader-text:focus { + left: auto; + right: 5px; +} + +/* Typography */ + +textarea { + padding-right: 3px; +} + +li > ul, +li > ol { + margin-left: 0; + margin-right: 1.5em; +} + +th:first-child, +td:first-child { + padding-left: 0.4em; + padding-right: 0; +} + +th:last-child, +td:last-child { + padding-left: 0; + padding-right: 0.4em; +} + +/* Forms */ + +input[type="radio"], +input[type="checkbox"] { + margin-left: 0.5em; + margin-right: 0; +} + +/* Media */ + +.mejs-offscreen { + right: -10000px; +} + +/* Site Branding */ + +.custom-logo-link { + padding-left: 1em; + padding-right: 0; +} + +/* Main Navigation */ + +.main-navigation ul { + text-align: right; +} + +.main-navigation ul ul { + padding-left: 0; + padding-right: 1.5em; +} + +.menu-toggle .icon { + margin-left: 0.5em; + margin-right: 0; +} + +.dropdown-toggle { + left: -0.5em; + right: auto; +} + +/* Front Page */ + +.wp-custom-header-video-button { + left: 30px; + right: auto; +} + +.twentyseventeen-panel .recent-posts .entry-header .edit-link { + margin-left: 0; + margin-right: 1em; +} + +/* Blog, Archive, Search */ + +.blog .entry-meta a.post-edit-link, +.archive .entry-meta a.post-edit-link, +.search .entry-meta a.post-edit-link { + margin-left: 0; + margin-right: 1em; +} + +.search .page .entry-meta a.post-edit-link { + margin-right: 0; +} + +.sticky .icon-thumb-tack { + left: auto; + right: -1.5em; +} + +.prev.page-numbers .icon, +.next.page-numbers .icon { + display: inline-block; + -ms-transform: rotate(180deg); /* IE 9 */ + -webkit-transform: rotate(180deg); /* Chrome, Safari, Opera */ + transform: rotate(180deg); +} + +.prev.page-numbers { + float: right; +} + +.next.page-numbers { + float: left; +} + +.nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + margin-left: 0.5em; + margin-right: 0; +} + +.nav-links .nav-next .nav-title .nav-title-icon-wrapper { + margin-left: 0; + margin-right: 0.5em; +} + +/* Blog Entries */ + +.entry-footer .cat-links, +.entry-footer .tags-links { + padding-left: 0; + padding-right: 2.5em; +} + +.entry-footer .cat-links .icon, +.entry-footer .tags-links .icon { + left: auto; + margin-left: 0.5em; + margin-right: 0; + right: 0; +} + +/* Comments */ + +.comment-body { + margin-left: 0; + margin-right: 65px; +} + +.comment-reply-link .icon { + left: auto; + right: -2em; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.comment-author .avatar { + left: auto; + right: -65px; +} + +.comment-reply-link:before { + left: auto; + right: -2em; +} + +.children .comment-author .avatar { + left: auto; + right: -45px; +} + +.form-submit { + text-align: left; +} + +.comment-form #wp-comment-cookies-consent { + margin: 0 0 0 10px; +} + +/* Post Formats */ + +.format-quote blockquote .icon { + left: auto; + right: -1.25em; + -webkit-transform: none; + -ms-transform: none; + transform: none; +} + +/* Post Navigation */ + +.nav-links .nav-previous .nav-title .nav-title-icon-wrapper, +.nav-links .nav-next .nav-title .nav-title-icon-wrapper { + display: inline-block; + -ms-transform: rotate(180deg); /* IE 9 */ + -webkit-transform: rotate(180deg); /* Chrome, Safari, Opera */ + transform: rotate(180deg); +} + +/* Widgets */ + +.widget ul { + margin: 0; +} + +.search-form .search-submit { + left: 3px; + right: auto; +} + +.tagcloud ul li { + float: right; + margin: 4px 0 0 4px; +} + +.widget ul li li { + padding-left: 0; + padding-right: 1.5rem; +} + +.widget_text ul { + margin: 0 1.5em 1.5em 0; +} + +.widget_text ul li ul { + margin: 0 1.5em 0 0; +} + +/* Footer */ + +.social-navigation a { + margin-left: 1em; + margin-right: 0; +} + +/* Customizer styles */ + +.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel .twentyseventeen-panel-title { + left: 3.2em; + right: auto; +} + +/* Gallery Styles */ + +.gallery-item, +.gallery-caption { + text-align: right; +} + +/* SVG Fallback */ + +.no-svg .dropdown-toggle { + left: 0; + right: auto; +} + +/* Media queries */ + +@media screen and (min-width: 48em) { + + body.page-template-full-width-page #primary { + float: none; + } + + .has-sidebar:not(.error404) #primary { + float: right; + } + + .has-sidebar #secondary { + float: left; + } + + .error404 #primary { + float: none; + } + + /* Site Branding */ + + .custom-logo-link { + padding-left: 2em; + padding-right: 0; + } + + /* Navigation */ + + .main-navigation ul ul { + padding-right: 0; + } + + .main-navigation ul ul:before, + .main-navigation ul ul:after { + left: 0.5em; + right: auto; + } + + .main-navigation ul ul, + .main-navigation ul ul ul { + left: auto; + right: -999em; + } + + .main-navigation ul ul li:hover > ul, + .main-navigation ul ul li.focus > ul { + left: auto; + right: 100%; + } + + .main-navigation ul li:hover > ul, + .main-navigation ul li.focus > ul { + left: auto; + right: 0.5em; + } + + .main-navigation ul li.menu-item-has-children:before, + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:before, + .main-navigation ul li.page_item_has_children:after { + left: 1em; + right: auto; + } + + .main-navigation .menu-item-has-children > a > .icon, + .main-navigation .page_item_has_children > a > .icon { + left: auto; + right: 5px; + } + + .main-navigation ul ul .menu-item-has-children > a > .icon, + .main-navigation ul ul .page_item_has_children > a > .icon { + left: 1em; + right: auto; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + } + + /* Scroll down arrow */ + + .navigation-top .menu-scroll-down { + left: 0; + right: auto; + } + + .site-header .menu-scroll-down { + left: 0; + right: auto; + } + + .entry-title a { + margin-left: auto; + margin-right: -2px; + } + + /* Front Page */ + + .page-two-column .panel-content .entry-header { + float: right; + } + + .page-two-column .panel-content .entry-content { + float: left; + } + + /* Front Page - Recent Posts */ + + .page-two-column .panel-content .recent-posts { + clear: left; + float: left; + } + + /* Blog, Archive, Search */ + + .sticky .icon-thumb-tack { + left: auto; + right: -2.5em; + } + + body:not(.has-sidebar):not(.page-one-column) .page-header, + body.has-sidebar.error404 #primary .page-header, + body.page-two-column:not(.archive) #primary .entry-header, + body.page-two-column.archive:not(.has-sidebar) #primary .page-header { + float: right; + } + + .blog:not(.has-sidebar) #primary article, + .archive:not(.has-sidebar):not(.page-one-column) #primary article, + .search:not(.has-sidebar) #primary article, + .has-sidebar.error404 #primary .page-content, + .error404.has-sidebar #primary .page-content, + body.page-two-column:not(.archive) #primary .entry-content, + body.page-two-column #comments { + float: left; + } + + .entry-footer .edit-link a.post-edit-link { + margin-left: 0; + margin-right: 1em; + } + + /* Entry content */ + + /* with sidebar */ + + .has-sidebar .entry-content blockquote.alignleft { + margin-left: 0; + width: 34%; + } + + .has-sidebar #primary .entry-content blockquote.alignright, + .has-sidebar #primary .entry-content blockquote.alignright.below-entry-meta { + margin-right: 0; + width: 34%; + } + + .has-sidebar #primary .entry-content blockquote.alignleft.below-entry-meta { + margin-left: -72.5%; + width: 62%; + } + + /* blog index and archive */ + + .blog:not(.has-sidebar) .entry-content blockquote.alignleft, + .twentyseventeen-front-page.page-two-column .entry-content blockquote.alignleft, + .archive:not(.has-sidebar) .entry-content blockquote.alignleft, + .page-two-column .entry-content blockquote.alignleft { + margin-left: 0; + width: 34%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignright, + .twentyseventeen-front-page.page-two-column #primary .entry-content blockquote.alignright, + .archive:not(.has-sidebar) .entry-content blockquote.alignright, + .page-two-column #primary .entry-content blockquote.alignright { + margin-right: -72.5%; + width: 62%; + } + + /* Post formats */ + + .format-quote blockquote .icon { + left: auto; + right: -1.5em; + } + + .navigation.pagination { + float: left; + } + + .has-sidebar .navigation.pagination, + .archive.page-one-column:not(.has-sidebar) .navigation.pagination { + float: none; + } + + .post-navigation .nav-previous { + float: right; + } + + .post-navigation .nav-next { + float: left; + text-align: left; + } + + /* Comments */ + + ol.children .children { + padding-left: 0; + padding-right: 2em; + } + + /* Post Navigation */ + + .nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + left: auto; + right: -2em; + } + + .nav-links .nav-next .nav-title .nav-title-icon-wrapper { + left: -2em; + right: auto; + } + + /* Footer */ + + .site-footer .widget-column.footer-widget-1 { + float: right; + } + + .site-footer .widget-column.footer-widget-2 { + float: left; + } + + .social-navigation { + clear: right; + float: right; + } + + .site-info { + float: right; + } + + .social-navigation + .site-info { + margin-left: 0; + margin-right: 6%; + } +} + +@media screen and (min-width: 67em) { + + /* Sticky posts */ + + .sticky .icon-thumb-tack { + left: auto; + right: -1.25em; + } +} + +@media screen and (min-width: 79em) { + + .has-sidebar #primary .entry-content blockquote.alignright, + .has-sidebar #primary .entry-content blockquote.alignright.below-entry-meta { + margin-right: -20%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignleft, + .archive:not(.has-sidebar) .entry-content blockquote.alignleft, + .page-two-column .entry-content blockquote.alignleft, + .twentyseventeen-front-page .entry-content blockquote.alignleft { + margin-left: -20%; + } +} diff --git a/wp-content/themes/twentyseventeen/screenshot.png b/wp-content/themes/twentyseventeen/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..088b7413e7a88c9d135af933a4d715dae5690441 GIT binary patch literal 363833 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ℜSOqek#rPm3|PF~Gp2$N%TtROv1RK!|bPn4(rUM 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 z
          • 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 + +
            + + + +
            +
            + + twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '' . __( 'Previous page', 'twentyseventeen' ) . '', + 'next_text' => '' . __( 'Next page', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ), + 'before_page_number' => '' . __( 'Page', 'twentyseventeen' ) . ' ', + ) + ); + + else : + ?> + +

            + + +
            +
            + +
            + + + + + + diff --git a/wp-content/themes/twentyseventeen/sidebar.php b/wp-content/themes/twentyseventeen/sidebar.php new file mode 100644 index 0000000..ed441c1 --- /dev/null +++ b/wp-content/themes/twentyseventeen/sidebar.php @@ -0,0 +1,20 @@ + + + diff --git a/wp-content/themes/twentyseventeen/single.php b/wp-content/themes/twentyseventeen/single.php new file mode 100644 index 0000000..afe2e02 --- /dev/null +++ b/wp-content/themes/twentyseventeen/single.php @@ -0,0 +1,47 @@ + + +
            +
            +
            + + '' . __( 'Previous Post', 'twentyseventeen' ) . ' ' . twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '%title', + 'next_text' => '' . __( 'Next Post', 'twentyseventeen' ) . ' %title' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ) . '', + ) + ); + + endwhile; // End the loop. + ?> + +
            +
            + +
            + +>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 Normalize +2.0 Accessibility +3.0 Alignments +4.0 Clearings +5.0 Typography +6.0 Forms +7.0 Formatting +8.0 Lists +9.0 Tables +10.0 Links +11.0 Featured Image Hover +12.0 Navigation +13.0 Layout + 13.1 Header + 13.2 Front Page + 13.3 Regular Content + 13.4 Posts + 13.5 Pages + 13.6 Footer +14.0 Comments +15.0 Widgets +16.0 Media + 16.1 Galleries +17.0 Customizer +18.0 SVGs Fallbacks +19.0 Media Queries +20.0 Print +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 Normalize +Styles based on Normalize v5.0.0 @link https://github.com/necolas/normalize.css +--------------------------------------------------------------*/ + +html { + font-family: sans-serif; + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +figcaption, +figure, +main { + display: block; +} + +figure { + margin: 1em 0; +} + +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +a:active, +a:hover { + outline-width: 0; +} + +abbr[title] { + border-bottom: 1px #767676 dotted; + text-decoration: none; +} + +b, +strong { + font-weight: inherit; +} + +b, +strong { + font-weight: 700; +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +dfn { + font-style: italic; +} + +mark { + background-color: #eee; + color: #222; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +img { + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +fieldset { + border: 1px solid #bbb; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +progress { + display: inline-block; + vertical-align: baseline; +} + +textarea { + overflow: auto; +} + +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details, +menu { + display: block; +} + +summary { + display: list-item; +} + +canvas { + display: inline-block; +} + +template { + display: none; +} + +[hidden] { + display: none; +} + +/*-------------------------------------------------------------- +2.0 Accessibility +--------------------------------------------------------------*/ + +/* Text meant only for screen readers. */ + +.screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute !important; + width: 1px; + word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */ +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + -webkit-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + color: #21759b; + display: block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 700; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; /* Above WP toolbar. */ +} + +/*-------------------------------------------------------------- +3.0 Alignments +--------------------------------------------------------------*/ + +.alignleft { + display: inline; + float: left; + margin-right: 1.5em; +} + +.alignright { + display: inline; + float: right; + margin-left: 1.5em; +} + +.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} + +/*-------------------------------------------------------------- +4.0 Clearings +--------------------------------------------------------------*/ + +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.entry-footer:before, +.entry-footer:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after, +.nav-links:before, +.nav-links:after, +.pagination:before, +.pagination:after, +.comment-author:before, +.comment-author:after, +.widget-area:before, +.widget-area:after, +.widget:before, +.widget:after, +.comment-meta:before, +.comment-meta:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.entry-footer:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after, +.nav-links:after, +.pagination:after, +.comment-author:after, +.widget-area:after, +.widget:after, +.comment-meta:after { + clear: both; +} + +/*-------------------------------------------------------------- +5.0 Typography +--------------------------------------------------------------*/ + +body, +button, +input, +select, +textarea { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + font-size: 15px; + font-size: 0.9375rem; + font-weight: 400; + line-height: 1.66; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + line-height: 1.4; + margin: 0 0 0.75em; + padding: 1.5em 0 0; +} + +h1:first-child, +h2:first-child, +h3:first-child, +h4:first-child, +h5:first-child, +h6:first-child { + padding-top: 0; +} + +h1 { + font-size: 24px; + font-size: 1.5rem; + font-weight: 300; +} + +h2, +.home.blog .entry-title { + color: #666; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; +} + +h3 { + color: #333; + font-size: 18px; + font-size: 1.125rem; + font-weight: 300; +} + +h4 { + color: #333; + font-size: 16px; + font-size: 1rem; + font-weight: 800; +} + +h5 { + color: #767676; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 800; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +h6 { + color: #333; + font-size: 15px; + font-size: 0.9375rem; + font-weight: 800; +} + +p { + margin: 0 0 1.5em; + padding: 0; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + color: #666; + font-size: 18px; + font-size: 1.125rem; + font-style: italic; + line-height: 1.7; + margin: 0; + overflow: hidden; + padding: 0; +} + +blockquote cite { + display: block; + font-style: normal; + font-weight: 600; + margin-top: 0.5em; +} + +address { + margin: 0 0 1.5em; +} + +pre { + background: #eee; + font-family: "Courier 10 Pitch", Courier, monospace; + font-size: 15px; + font-size: 0.9375rem; + line-height: 1.6; + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 1.6em; +} + +code, +kbd, +tt, +var { + font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; + font-size: 15px; + font-size: 0.9375rem; +} + +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #eee; + text-decoration: none; +} + +big { + font-size: 125%; +} + +blockquote { + quotes: "" ""; +} + +q { + quotes: "“" "”" "‘" "’"; +} + +blockquote:before, +blockquote:after { + content: ""; +} + +:focus { + outline: none; +} + +/* Typography for Arabic Font */ + +html[lang="ar"] body, +html[lang="ar"] button, +html[lang="ar"] input, +html[lang="ar"] select, +html[lang="ar"] textarea, +html[lang="ary"] body, +html[lang="ary"] button, +html[lang="ary"] input, +html[lang="ary"] select, +html[lang="ary"] textarea, +html[lang="azb"] body, +html[lang="azb"] button, +html[lang="azb"] input, +html[lang="azb"] select, +html[lang="azb"] textarea, +html[lang="fa-IR"] body, +html[lang="fa-IR"] button, +html[lang="fa-IR"] input, +html[lang="fa-IR"] select, +html[lang="fa-IR"] textarea, +html[lang="haz"] body, +html[lang="haz"] button, +html[lang="haz"] input, +html[lang="haz"] select, +html[lang="haz"] textarea, +html[lang="ps"] body, +html[lang="ps"] button, +html[lang="ps"] input, +html[lang="ps"] select, +html[lang="ps"] textarea, +html[lang="ur"] body, +html[lang="ur"] button, +html[lang="ur"] input, +html[lang="ur"] select, +html[lang="ur"] textarea { + font-family: Tahoma, Arial, sans-serif; +} + +html[lang="ar"] h1, +html[lang="ar"] h2, +html[lang="ar"] h3, +html[lang="ar"] h4, +html[lang="ar"] h5, +html[lang="ar"] h6, +html[lang="ary"] h1, +html[lang="ary"] h2, +html[lang="ary"] h3, +html[lang="ary"] h4, +html[lang="ary"] h5, +html[lang="ary"] h6, +html[lang="azb"] h1, +html[lang="azb"] h2, +html[lang="azb"] h3, +html[lang="azb"] h4, +html[lang="azb"] h5, +html[lang="azb"] h6, +html[lang="fa-IR"] h1, +html[lang="fa-IR"] h2, +html[lang="fa-IR"] h3, +html[lang="fa-IR"] h4, +html[lang="fa-IR"] h5, +html[lang="fa-IR"] h6, +html[lang="haz"] h1, +html[lang="haz"] h2, +html[lang="haz"] h3, +html[lang="haz"] h4, +html[lang="haz"] h5, +html[lang="haz"] h6, +html[lang="ps"] h1, +html[lang="ps"] h2, +html[lang="ps"] h3, +html[lang="ps"] h4, +html[lang="ps"] h5, +html[lang="ps"] h6, +html[lang="ur"] h1, +html[lang="ur"] h2, +html[lang="ur"] h3, +html[lang="ur"] h4, +html[lang="ur"] h5, +html[lang="ur"] h6 { + font-weight: 700; +} + +/* Typography for Chinese Font */ + +html[lang^="zh-"] body, +html[lang^="zh-"] button, +html[lang^="zh-"] input, +html[lang^="zh-"] select, +html[lang^="zh-"] textarea { + font-family: "PingFang TC", "Helvetica Neue", Helvetica, STHeitiTC-Light, Arial, sans-serif; +} + +html[lang="zh-CN"] body, +html[lang="zh-CN"] button, +html[lang="zh-CN"] input, +html[lang="zh-CN"] select, +html[lang="zh-CN"] textarea { + font-family: "PingFang SC", "Helvetica Neue", Helvetica, STHeitiSC-Light, Arial, sans-serif; +} + +html[lang^="zh-"] h1, +html[lang^="zh-"] h2, +html[lang^="zh-"] h3, +html[lang^="zh-"] h4, +html[lang^="zh-"] h5, +html[lang^="zh-"] h6 { + font-weight: 700; +} + +/* Typography for Cyrillic Font */ + +html[lang="bg-BG"] body, +html[lang="bg-BG"] button, +html[lang="bg-BG"] input, +html[lang="bg-BG"] select, +html[lang="bg-BG"] textarea, +html[lang="ru-RU"] body, +html[lang="ru-RU"] button, +html[lang="ru-RU"] input, +html[lang="ru-RU"] select, +html[lang="ru-RU"] textarea, +html[lang="uk"] body, +html[lang="uk"] button, +html[lang="uk"] input, +html[lang="uk"] select, +html[lang="uk"] textarea { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +html[lang="bg-BG"] h1, +html[lang="bg-BG"] h2, +html[lang="bg-BG"] h3, +html[lang="bg-BG"] h4, +html[lang="bg-BG"] h5, +html[lang="bg-BG"] h6, +html[lang="ru-RU"] h1, +html[lang="ru-RU"] h2, +html[lang="ru-RU"] h3, +html[lang="ru-RU"] h4, +html[lang="ru-RU"] h5, +html[lang="ru-RU"] h6, +html[lang="uk"] h1, +html[lang="uk"] h2, +html[lang="uk"] h3, +html[lang="uk"] h4, +html[lang="uk"] h5, +html[lang="uk"] h6 { + font-weight: 700; + line-height: 1.2; +} + +/* Typography for Devanagari Font */ + +html[lang="bn-BD"] body, +html[lang="bn-BD"] button, +html[lang="bn-BD"] input, +html[lang="bn-BD"] select, +html[lang="bn-BD"] textarea, +html[lang="hi-IN"] body, +html[lang="hi-IN"] button, +html[lang="hi-IN"] input, +html[lang="hi-IN"] select, +html[lang="hi-IN"] textarea, +html[lang="mr-IN"] body, +html[lang="mr-IN"] button, +html[lang="mr-IN"] input, +html[lang="mr-IN"] select, +html[lang="mr-IN"] textarea { + font-family: Arial, sans-serif; +} + +html[lang="bn-BD"] h1, +html[lang="bn-BD"] h2, +html[lang="bn-BD"] h3, +html[lang="bn-BD"] h4, +html[lang="bn-BD"] h5, +html[lang="bn-BD"] h6, +html[lang="hi-IN"] h1, +html[lang="hi-IN"] h2, +html[lang="hi-IN"] h3, +html[lang="hi-IN"] h4, +html[lang="hi-IN"] h5, +html[lang="hi-IN"] h6, +html[lang="mr-IN"] h1, +html[lang="mr-IN"] h2, +html[lang="mr-IN"] h3, +html[lang="mr-IN"] h4, +html[lang="mr-IN"] h5, +html[lang="mr-IN"] h6 { + font-weight: 700; +} + +/* Typography for Greek Font */ + +html[lang="el"] body, +html[lang="el"] button, +html[lang="el"] input, +html[lang="el"] select, +html[lang="el"] textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="el"] h1, +html[lang="el"] h2, +html[lang="el"] h3, +html[lang="el"] h4, +html[lang="el"] h5, +html[lang="el"] h6 { + font-weight: 700; + line-height: 1.3; +} + +/* Typography for Gujarati Font */ + +html[lang="gu-IN"] body, +html[lang="gu-IN"] button, +html[lang="gu-IN"] input, +html[lang="gu-IN"] select, +html[lang="gu-IN"] textarea { + font-family: Arial, sans-serif; +} + +html[lang="gu-IN"] h1, +html[lang="gu-IN"] h2, +html[lang="gu-IN"] h3, +html[lang="gu-IN"] h4, +html[lang="gu-IN"] h5, +html[lang="gu-IN"] h6 { + font-weight: 700; +} + +/* Typography for Hebrew Font */ + +html[lang="he-IL"] body, +html[lang="he-IL"] button, +html[lang="he-IL"] input, +html[lang="he-IL"] select, +html[lang="he-IL"] textarea { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +html[lang="he-IL"] h1, +html[lang="he-IL"] h2, +html[lang="he-IL"] h3, +html[lang="he-IL"] h4, +html[lang="he-IL"] h5, +html[lang="he-IL"] h6 { + font-weight: 700; +} + +/* Typography for Japanese Font */ + +html[lang="ja"] body, +html[lang="ja"] button, +html[lang="ja"] input, +html[lang="ja"] select, +html[lang="ja"] textarea { + font-family: "Hiragino Kaku Gothic Pro", Meiryo, sans-serif; +} + +html[lang="ja"] h1, +html[lang="ja"] h2, +html[lang="ja"] h3, +html[lang="ja"] h4, +html[lang="ja"] h5, +html[lang="ja"] h6 { + font-weight: 700; +} + +/* Typography for Korean font */ + +html[lang="ko-KR"] body, +html[lang="ko-KR"] button, +html[lang="ko-KR"] input, +html[lang="ko-KR"] select, +html[lang="ko-KR"] textarea { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +html[lang="ko-KR"] h1, +html[lang="ko-KR"] h2, +html[lang="ko-KR"] h3, +html[lang="ko-KR"] h4, +html[lang="ko-KR"] h5, +html[lang="ko-KR"] h6 { + font-weight: 600; +} + +/* Typography for Thai Font */ + +html[lang="th"] h1, +html[lang="th"] h2, +html[lang="th"] h3, +html[lang="th"] h4, +html[lang="th"] h5, +html[lang="th"] h6 { + line-height: 1.65; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="th"] body, +html[lang="th"] button, +html[lang="th"] input, +html[lang="th"] select, +html[lang="th"] textarea { + line-height: 1.8; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +/* Remove letter-spacing for all non-latin alphabets */ + +html[lang="ar"] *, +html[lang="ary"] *, +html[lang="azb"] *, +html[lang="haz"] *, +html[lang="ps"] *, +html[lang^="zh-"] *, +html[lang="bg-BG"] *, +html[lang="ru-RU"] *, +html[lang="uk"] *, +html[lang="bn-BD"] *, +html[lang="hi-IN"] *, +html[lang="mr-IN"] *, +html[lang="el"] *, +html[lang="gu-IN"] *, +html[lang="he-IL"] *, +html[lang="ja"] *, +html[lang="ko-KR"] *, +html[lang="th"] * { + letter-spacing: 0 !important; +} + +/*-------------------------------------------------------------- +6.0 Forms +--------------------------------------------------------------*/ + +label { + color: #333; + display: block; + font-weight: 800; + margin-bottom: 0.5em; +} + +fieldset { + margin-bottom: 1em; +} + +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"], +textarea { + color: #666; + background: #fff; + background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0)); + border: 1px solid #bbb; + -webkit-border-radius: 3px; + border-radius: 3px; + display: block; + padding: 0.7em; + width: 100%; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +input[type="search"]:focus, +input[type="number"]:focus, +input[type="tel"]:focus, +input[type="range"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="week"]:focus, +input[type="time"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="color"]:focus, +textarea:focus { + color: #222; + border-color: #333; +} + +select { + border: 1px solid #bbb; + -webkit-border-radius: 3px; + border-radius: 3px; + height: 3em; + max-width: 100%; +} + +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; +} + +input[type="radio"], +input[type="checkbox"] { + margin-right: 0.5em; +} + +input[type="radio"] + label, +input[type="checkbox"] + label { + font-weight: 400; +} + +button, +input[type="button"], +input[type="submit"] { + background-color: #222; + border: 0; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1; + padding: 1em 2em; + text-shadow: none; + -webkit-transition: background 0.2s; + transition: background 0.2s; +} + +input + button, +input + input[type="button"], +input + input[type="submit"] { + padding: 0.75em 2em; +} + +button.secondary, +input[type="reset"], +input[type="button"].secondary, +input[type="reset"].secondary, +input[type="submit"].secondary { + background-color: #ddd; + color: #222; +} + +:not( .mejs-button ) > button:hover, +:not( .mejs-button ) > button:focus, +input[type="button"]:hover, +input[type="button"]:focus, +input[type="submit"]:hover, +input[type="submit"]:focus { + background: #767676; +} + +button.secondary:hover, +button.secondary:focus, +input[type="reset"]:hover, +input[type="reset"]:focus, +input[type="button"].secondary:hover, +input[type="button"].secondary:focus, +input[type="reset"].secondary:hover, +input[type="reset"].secondary:focus, +input[type="submit"].secondary:hover, +input[type="submit"].secondary:focus { + background: #bbb; +} + +/* Placeholder text color -- selectors need to be separate to work. */ +::-webkit-input-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +:-moz-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +::-moz-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + opacity: 1; + /* Since FF19 lowers the opacity of the placeholder by default */ +} + +:-ms-input-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +/*-------------------------------------------------------------- +7.0 Formatting +--------------------------------------------------------------*/ + +hr { + background-color: #bbb; + border: 0; + height: 1px; + margin-bottom: 1.5em; +} + +/*-------------------------------------------------------------- +8.0 Lists +--------------------------------------------------------------*/ + +ul, +ol { + margin: 0 0 1.5em; + padding: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li > ul, +li > ol { + margin-bottom: 0; + margin-left: 1.5em; +} + +dt { + font-weight: 700; +} + +dd { + margin: 0 1.5em 1.5em; +} + +/*-------------------------------------------------------------- +9.0 Tables +--------------------------------------------------------------*/ + +table { + border-collapse: collapse; + margin: 0 0 1.5em; + width: 100%; +} + +thead th { + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +th { + padding: 0.4em; + text-align: left; +} + +tr { + border-bottom: 1px solid #eee; +} + +td { + padding: 0.4em; +} + +th:first-child, +td:first-child { + padding-left: 0; +} + +th:last-child, +td:last-child { + padding-right: 0; +} + +/*-------------------------------------------------------------- +10.0 Links +--------------------------------------------------------------*/ + +a { + color: #222; + text-decoration: none; +} + +a:focus { + outline: thin dotted; +} + +a:hover, +a:active { + color: #000; + outline: 0; +} + +/* Hover effects */ + +.entry-content a, +.entry-summary a, +.comment-content a, +.widget a, +.site-footer .widget-area a, +.posts-navigation a, +.widget_authors a strong { + -webkit-box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + -webkit-transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out, -webkit-box-shadow 130ms ease-in-out; +} + +.entry-title a, +.entry-meta a, +.page-links a, +.page-links a .page-number, +.entry-footer a, +.entry-footer .cat-links a, +.entry-footer .tags-links a, +.edit-link a, +.post-navigation a, +.logged-in-as a, +.comment-navigation a, +.comment-metadata a, +.comment-metadata a.comment-edit-link, +.comment-reply-link, +a .nav-title, +.pagination a, +.comments-pagination a, +.site-info a, +.widget .widget-title a, +.widget ul li a, +.site-footer .widget-area ul li a, +.site-footer .widget-area ul li a { + -webkit-box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + text-decoration: none; + -webkit-transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out, -webkit-box-shadow 130ms ease-in-out; +} + +.entry-content a:focus, +.entry-content a:hover, +.entry-summary a:focus, +.entry-summary a:hover, +.comment-content a:focus, +.comment-content a:hover, +.widget a:focus, +.widget a:hover, +.site-footer .widget-area a:focus, +.site-footer .widget-area a:hover, +.posts-navigation a:focus, +.posts-navigation a:hover, +.comment-metadata a:focus, +.comment-metadata a:hover, +.comment-metadata a.comment-edit-link:focus, +.comment-metadata a.comment-edit-link:hover, +.comment-reply-link:focus, +.comment-reply-link:hover, +.widget_authors a:focus strong, +.widget_authors a:hover strong, +.entry-title a:focus, +.entry-title a:hover, +.entry-meta a:focus, +.entry-meta a:hover, +.page-links a:focus .page-number, +.page-links a:hover .page-number, +.entry-footer a:focus, +.entry-footer a:hover, +.entry-footer .cat-links a:focus, +.entry-footer .cat-links a:hover, +.entry-footer .tags-links a:focus, +.entry-footer .tags-links a:hover, +.post-navigation a:focus, +.post-navigation a:hover, +.pagination a:not(.prev):not(.next):focus, +.pagination a:not(.prev):not(.next):hover, +.comments-pagination a:not(.prev):not(.next):focus, +.comments-pagination a:not(.prev):not(.next):hover, +.logged-in-as a:focus, +.logged-in-as a:hover, +a:focus .nav-title, +a:hover .nav-title, +.edit-link a:focus, +.edit-link a:hover, +.site-info a:focus, +.site-info a:hover, +.widget .widget-title a:focus, +.widget .widget-title a:hover, +.widget ul li a:focus, +.widget ul li a:hover { + color: #000; + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); +} + +/* Fixes linked images */ +.entry-content a img, +.comment-content a img, +.widget a img { + -webkit-box-shadow: 0 0 0 8px #fff; + box-shadow: 0 0 0 8px #fff; +} + +.post-navigation a:focus .icon, +.post-navigation a:hover .icon { + color: #222; +} + +/*-------------------------------------------------------------- +11.0 Featured Image Hover +--------------------------------------------------------------*/ + +.post-thumbnail { + margin-bottom: 1em; +} + +.post-thumbnail a img { + -webkit-backface-visibility: hidden; + -webkit-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.post-thumbnail a:hover img, +.post-thumbnail a:focus img { + opacity: 0.7; +} + +/*-------------------------------------------------------------- +12.0 Navigation +--------------------------------------------------------------*/ + +.navigation-top { + background: #fff; + border-bottom: 1px solid #eee; + border-top: 1px solid #eee; + font-size: 16px; + font-size: 1rem; + position: relative; +} + +.navigation-top .wrap { + max-width: 1000px; + padding: 0; +} + +.navigation-top a { + color: #222; + font-weight: 600; + -webkit-transition: color 0.2s; + transition: color 0.2s; +} + +.navigation-top .current-menu-item > a, +.navigation-top .current_page_item > a { + color: #767676; +} + +.main-navigation { + clear: both; + display: block; +} + +.main-navigation ul { + background: #fff; + list-style: none; + margin: 0; + padding: 0 1.5em; + text-align: left; +} + +/* Hide the menu on small screens when JavaScript is available. + * It only works with JavaScript. + */ + +.js .main-navigation ul, +.main-navigation .menu-item-has-children > a > .icon, +.main-navigation .page_item_has_children > a > .icon, +.main-navigation ul a > .icon { + display: none; +} + +.main-navigation > div > ul { + border-top: 1px solid #eee; + padding: 0.75em 1.695em; +} + +.js .main-navigation.toggled-on > div > ul { + display: block; +} + +.main-navigation ul ul { + padding: 0 0 0 1.5em; +} + +.main-navigation ul ul.toggled-on { + display: block; +} + +.main-navigation ul ul a { + letter-spacing: 0; + padding: 0.4em 0; + position: relative; + text-transform: none; +} + +.main-navigation li { + border-bottom: 1px solid #eee; + position: relative; +} + +.main-navigation li li, +.main-navigation li:last-child { + border: 0; +} + +.main-navigation a { + display: block; + padding: 0.5em 0; + text-decoration: none; +} + +.main-navigation a:hover { + color: #767676; +} + +/* Menu toggle */ + +.menu-toggle { + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + color: #222; + display: none; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1.5; + margin: 1px auto 2px; + padding: 1em; + text-shadow: none; +} + +/* Display the menu toggle when JavaScript is available. */ + +.js .menu-toggle { + display: block; +} + +.main-navigation.toggled-on ul.nav-menu { + display: block; +} + +.menu-toggle:hover, +.menu-toggle:focus { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.menu-toggle:focus { + outline: thin solid; +} + +.menu-toggle .icon { + margin-right: 0.5em; + top: -2px; +} + +.toggled-on .menu-toggle .icon-bars, +.menu-toggle .icon-close { + display: none; +} + +.toggled-on .menu-toggle .icon-close { + display: inline-block; +} + +/* Dropdown Toggle */ + +.dropdown-toggle { + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + color: #222; + display: block; + font-size: 16px; + right: -0.5em; + line-height: 1.5; + margin: 0 auto; + padding: 0.5em; + position: absolute; + text-shadow: none; + top: 0; +} + +.dropdown-toggle:hover, +.dropdown-toggle:focus { + background: transparent; +} + +.dropdown-toggle:focus { + outline: thin dotted; +} + +.dropdown-toggle.toggled-on .icon { + -ms-transform: rotate(-180deg); /* IE 9 */ + -webkit-transform: rotate(-180deg); /* Chrome, Safari, Opera */ + transform: rotate(-180deg); +} + +/* Scroll down arrow */ + +.site-header .menu-scroll-down { + display: none; +} + +/*-------------------------------------------------------------- +13.0 Layout +--------------------------------------------------------------*/ + +html { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*, +*:before, +*:after { + /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ + -webkit-box-sizing: inherit; + -moz-box-sizing: inherit; + box-sizing: inherit; +} + +body { + background: #fff; + /* Fallback for when there is no custom background color defined. */ +} + +#page { + position: relative; + word-wrap: break-word; +} + +.wrap { + margin-left: auto; + margin-right: auto; + max-width: 700px; + padding-left: 2em; + padding-right: 2em; +} + +.wrap:after { + clear: both; + content: ""; + display: block; +} + +/*-------------------------------------------------------------- +13.1 Header +--------------------------------------------------------------*/ + +#masthead .wrap { + position: relative; +} + +.site-header { + background-color: #fafafa; + position: relative; +} + +/* Site branding */ + +.site-branding { + padding: 1em 0; + position: relative; + -webkit-transition: margin-bottom 0.2s; + transition: margin-bottom 0.2s; + z-index: 3; +} + +.site-branding a { + text-decoration: none; + -webkit-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.site-branding a:hover, +.site-branding a:focus { + opacity: 0.7; +} + +.site-title { + clear: none; + font-size: 24px; + font-size: 1.5rem; + font-weight: 800; + line-height: 1.25; + letter-spacing: 0.08em; + margin: 0; + padding: 0; + text-transform: uppercase; +} + +.site-title, +.site-title a { + color: #222; + opacity: 1; /* Prevent opacity from changing during selective refreshes in the customize preview */ +} + +body.has-header-image .site-title, +body.has-header-video .site-title, +body.has-header-image .site-title a, +body.has-header-video .site-title a { + color: #fff; +} + +.site-description { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + margin-bottom: 0; +} + +body.has-header-image .site-description, +body.has-header-video .site-description { + color: #fff; + opacity: 0.8; +} + +.custom-logo-link { + display: inline-block; + padding-right: 1em; + vertical-align: middle; + width: auto; +} + +.custom-logo-link img { + display: inline-block; + max-height: 80px; + width: auto; +} + +body.home.title-tagline-hidden.has-header-image .custom-logo-link img, +body.home.title-tagline-hidden.has-header-video .custom-logo-link img { + max-height: 200px; + max-width: 100%; +} + +.custom-logo-link a:hover, +.custom-logo-link a:focus { + opacity: 0.9; +} + +body:not(.title-tagline-hidden) .site-branding-text { + display: inline-block; + max-width: 100%; + vertical-align: middle; +} + +.custom-header { + position: relative; +} + +.has-header-image.twentyseventeen-front-page .custom-header, +.has-header-video.twentyseventeen-front-page .custom-header, +.has-header-image.home.blog .custom-header, +.has-header-video.home.blog .custom-header { + display: table; + height: 300px; + height: 75vh; + width: 100%; +} + +.custom-header-media { + bottom: 0; + left: 0; + overflow: hidden; + position: absolute; + right: 0; + top: 0; + width: 100%; +} + +.custom-header-media:before { + /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#000000+0,000000+100&0+0,0.3+75 */ + background: -moz-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* FF3.6-15 */ + background: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000", endColorstr="#4d000000", GradientType=0); /* IE6-9 */ + bottom: 0; + content: ""; + display: block; + height: 100%; + left: 0; + position: absolute; + right: 0; + z-index: 2; +} + +.has-header-image .custom-header-media img, +.has-header-video .custom-header-media video, +.has-header-video .custom-header-media iframe { + position: fixed; + height: auto; + left: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100%; + min-width: 100vw; /* vw prevents 1px gap on left that 100% has */ + width: auto; + top: 50%; + padding-bottom: 1px; /* Prevent header from extending beyond the footer */ + -ms-transform: translateX(-50%) translateY(-50%); + -moz-transform: translateX(-50%) translateY(-50%); + -webkit-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%); +} + +.wp-custom-header .wp-custom-header-video-button { /* Specificity prevents .color-dark button overrides */ + background-color: rgba(34, 34, 34, 0.5); + border: 1px solid rgba(255, 255, 255, 0.6); + color: rgba(255, 255, 255, 0.6); + height: 45px; + overflow: hidden; + padding: 0; + position: fixed; + right: 30px; + top: 30px; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + width: 45px; +} + +.wp-custom-header .wp-custom-header-video-button:hover, +.wp-custom-header .wp-custom-header-video-button:focus { /* Specificity prevents .color-dark button overrides */ + border-color: rgba(255, 255, 255, 0.8); + background-color: rgba(34, 34, 34, 0.8); + color: #fff; +} + +.admin-bar .wp-custom-header-video-button { + top: 62px; +} + +.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-media img { + bottom: 0; + position: absolute; + top: auto; + -ms-transform: translateX(-50%) translateY(0); + -moz-transform: translateX(-50%) translateY(0); + -webkit-transform: translateX(-50%) translateY(0); + transform: translateX(-50%) translateY(0); +} + +/* For browsers that support 'object-fit' */ +@supports ( object-fit: cover ) { + .has-header-image .custom-header-media img, + .has-header-video .custom-header-media video, + .has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-media img { + height: 100%; + left: 0; + -o-object-fit: cover; + object-fit: cover; + top: 0; + -ms-transform: none; + -moz-transform: none; + -webkit-transform: none; + transform: none; + width: 100%; + } +} + +/* Hides div in Customizer preview when header images or videos change. */ + +body:not(.has-header-image):not(.has-header-video) .custom-header-media { + display: none; +} + +.has-header-image.twentyseventeen-front-page .site-branding, +.has-header-video.twentyseventeen-front-page .site-branding, +.has-header-image.home.blog .site-branding, +.has-header-video.home.blog .site-branding { + display: table-cell; + height: 100%; + vertical-align: bottom; +} + +/*-------------------------------------------------------------- +13.2 Front Page +--------------------------------------------------------------*/ + +.twentyseventeen-front-page .site-content { + padding: 0; +} + +.twentyseventeen-panel { + overflow: hidden; + position: relative; +} + +.panel-image { + background-position: center center; + background-repeat: no-repeat; + -webkit-background-size: cover; + background-size: cover; + position: relative; +} + +.panel-image:before { + /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#000000+0,000000+100&0+0,0.3+100 */ /* FF3.6-15 */ + background: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%); /* Chrome10-25,Safari5.1-6 */ + background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.3))); + background: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%); + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000", endColorstr="#4d000000", GradientType=0); /* IE6-9 */ + bottom: 0; + content: ""; + left: 0; + right: 0; + position: absolute; + top: 100px; +} + +.twentyseventeen-front-page article:not(.has-post-thumbnail):not(:first-child) { + border-top: 1px solid #ddd; +} + +.panel-content { + position: relative; +} + +.panel-content .wrap { + padding-bottom: 0.5em; + padding-top: 1.75em; +} + +/* Panel edit link */ + +.twentyseventeen-panel .edit-link { + display: block; + margin: 0.3em 0 0; +} + +.twentyseventeen-panel .entry-header .edit-link { + font-size: 14px; + font-size: 0.875rem; +} + +/* Front Page - Recent Posts */ + +.twentyseventeen-front-page .panel-content .recent-posts article { + border: 0; + color: #333; + margin-bottom: 3em; +} + +.recent-posts .entry-header { + margin-bottom: 1.2em; +} + +.page .panel-content .recent-posts .entry-title { + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; + letter-spacing: 0; + text-transform: none; +} + +.twentyseventeen-panel .recent-posts .entry-header .edit-link { + color: #222; + display: inline-block; + font-size: 11px; + font-size: 0.6875rem; + margin-left: 1em; +} + +/*-------------------------------------------------------------- +13.3 Regular Content +--------------------------------------------------------------*/ + +.site-content-contain { + background-color: #fff; + position: relative; +} + +.site-content { + padding: 2.5em 0 0; +} + +/*-------------------------------------------------------------- +13.4 Posts +--------------------------------------------------------------*/ + +/* Post Landing Page */ + +.sticky { + position: relative; +} + +.post:not(.sticky) .icon-thumb-tack { + display: none; +} + +.sticky .icon-thumb-tack { + display: block; + height: 18px; + left: -1.5em; + position: absolute; + top: 1.65em; + width: 20px; +} + +.page .panel-content .entry-title, +.page-title, +body.page:not(.twentyseventeen-front-page) .entry-title { + color: #222; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.entry-header .entry-title { + margin-bottom: 0.25em; +} + +.entry-title a { + color: #333; + text-decoration: none; + margin-left: -2px; +} + +.entry-title:not(:first-child) { + padding-top: 0; +} + +.entry-meta { + color: #767676; + font-size: 11px; + font-size: 0.6875rem; + font-weight: 800; + letter-spacing: 0.1818em; + padding-bottom: 0.25em; + text-transform: uppercase; +} + +.entry-meta a { + color: #767676; +} + +.byline, +.updated:not(.published) { + display: none; +} + +.single .byline, +.group-blog .byline { + display: inline; +} + +.pagination, +.comments-pagination { + border-top: 1px solid #eee; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + padding: 2em 0 3em; + text-align: center; +} + +.pagination .icon, +.comments-pagination .icon { + width: 0.666666666em; + height: 0.666666666em; +} + +.comments-pagination { + border: 0; +} + +.page-numbers { + display: none; + padding: 0.5em 0.75em; +} + +.page-numbers.current { + color: #767676; + display: inline-block; +} + +.page-numbers.current .screen-reader-text { + clip: auto; + height: auto; + overflow: auto; + position: relative !important; + width: auto; +} + +.prev.page-numbers, +.next.page-numbers { + background-color: #ddd; + -webkit-border-radius: 2px; + border-radius: 2px; + display: inline-block; + font-size: 24px; + font-size: 1.5rem; + line-height: 1; + padding: 0.25em 0.5em 0.4em; +} + +.prev.page-numbers, +.next.page-numbers { + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.prev.page-numbers:focus, +.prev.page-numbers:hover, +.next.page-numbers:focus, +.next.page-numbers:hover { + background-color: #767676; + color: #fff; +} + +.prev.page-numbers { + float: left; +} + +.next.page-numbers { + float: right; +} + +/* Aligned blockquotes */ + +.entry-content blockquote.alignleft, +.entry-content blockquote.alignright { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + width: 48%; +} + +/* Blog landing, search, archives */ + +.blog .site-main > article, +.archive .site-main > article, +.search .site-main > article { + padding-bottom: 2em; +} + +body:not(.twentyseventeen-front-page) .entry-header { + padding: 1em 0; +} + +body:not(.twentyseventeen-front-page) .entry-header, +body:not(.twentyseventeen-front-page) .entry-content, +body:not(.twentyseventeen-front-page) #comments { + margin-left: auto; + margin-right: auto; +} + +body:not(.twentyseventeen-front-page) .entry-header { + padding-top: 0; +} + +.blog .entry-meta a.post-edit-link, +.archive .entry-meta a.post-edit-link, +.search .entry-meta a.post-edit-link { + color: #222; + display: inline-block; + margin-left: 1em; + white-space: nowrap; +} + +.search .page .entry-meta a.post-edit-link { + margin-left: 0; + white-space: nowrap; +} + +.taxonomy-description { + color: #666; + font-size: 13px; + font-size: 0.8125rem; +} + +/* More tag */ + +.entry-content .more-link:before { + content: ""; + display: block; + margin-top: 1.5em; +} + +/* Single Post */ + +.single-post:not(.has-sidebar) #primary, +.page.page-one-column:not(.twentyseventeen-front-page) #primary, +.archive.page-one-column:not(.has-sidebar) .page-header, +.archive.page-one-column:not(.has-sidebar) #primary { + margin-left: auto; + margin-right: auto; + max-width: 740px; +} + +.single-featured-image-header { + background-color: #fafafa; + border-bottom: 1px solid #eee; +} + +.single-featured-image-header img { + display: block; + margin: auto; +} + +.page-links { + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + padding: 2em 0 3em; +} + +.page-links .page-number { + color: #767676; + display: inline-block; + padding: 0.5em 1em; +} + +.page-links a { + display: inline-block; +} + +.page-links a .page-number { + color: #222; +} + +/* Entry footer */ + +.entry-footer { + border-bottom: 1px solid #eee; + border-top: 1px solid #eee; + margin-top: 2em; + padding: 2em 0; +} + +.entry-footer .cat-links, +.entry-footer .tags-links { + display: block; + font-size: 11px; + font-size: 0.6875rem; + font-weight: 800; + letter-spacing: 0.1818em; + padding-left: 2.5em; + position: relative; + text-transform: uppercase; +} + +.entry-footer .cat-links + .tags-links { + margin-top: 1em; +} + +.entry-footer .cat-links a, +.entry-footer .tags-links a { + color: #333; +} + +.entry-footer .cat-links .icon, +.entry-footer .tags-links .icon { + color: #767676; + left: 0; + margin-right: 0.5em; + position: absolute; + top: 2px; +} + +.entry-footer .edit-link { + display: inline-block; +} + +.entry-footer .edit-link a.post-edit-link { + background-color: #222; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.entry-footer .edit-link a.post-edit-link:hover, +.entry-footer .edit-link a.post-edit-link:focus { + background-color: #767676; +} + +/* Post Formats */ + +.blog .format-status .entry-title, +.archive .format-status .entry-title, +.blog .format-aside .entry-title, +.archive .format-aside .entry-title { + display: none; +} + +.format-quote blockquote { + color: #333; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; + overflow: visible; + position: relative; +} + +.format-quote blockquote .icon { + display: block; + height: 20px; + left: -1.25em; + position: absolute; + top: 0.4em; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); + width: 20px; +} + +/* Post Navigation */ + +.post-navigation { + font-weight: 800; + margin: 3em 0; +} + +.post-navigation .nav-links { + padding: 1em 0; +} + +.nav-subtitle { + background: transparent; + color: #767676; + display: block; + font-size: 11px; + font-size: 0.6875rem; + letter-spacing: 0.1818em; + margin-bottom: 1em; + text-transform: uppercase; +} + +.nav-title { + color: #333; + font-size: 15px; + font-size: 0.9375rem; +} + +.post-navigation .nav-next { + margin-top: 1.5em; +} + +.nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + margin-right: 0.5em; +} + +.nav-links .nav-next .nav-title .nav-title-icon-wrapper { + margin-left: 0.5em; +} + +/*-------------------------------------------------------------- +13.5 Pages +--------------------------------------------------------------*/ + +.page-header { + padding-bottom: 2em; +} + +.page .entry-header .edit-link { + font-size: 14px; + font-size: 0.875rem; +} + +.search .page .entry-header .edit-link { + font-size: 11px; + font-size: 0.6875rem; +} + +.page-links { + clear: both; + margin: 0 0 1.5em; +} + +.page:not(.home) #content { + padding-bottom: 1.5em; +} + +/* 404 page */ + +.error404 .page-content { + padding-bottom: 4em; +} + +.error404 .page-content .search-form, +.search .page-content .search-form { + margin-bottom: 3em; +} + +/*-------------------------------------------------------------- +13.6 Footer +--------------------------------------------------------------*/ + +.site-footer { + border-top: 1px solid #eee; +} + +.site-footer .wrap { + padding-bottom: 1.5em; + padding-top: 2em; +} + +/* Footer widgets */ + +.site-footer .widget-area { + padding-bottom: 2em; + padding-top: 2em; +} + +/* Social nav */ + +.social-navigation { + font-size: 16px; + font-size: 1rem; + margin-bottom: 1em; +} + +.social-navigation ul { + list-style: none; + margin-bottom: 0; + margin-left: 0; +} + +.social-navigation li { + display: inline; +} + +.social-navigation a { + background-color: #767676; + -webkit-border-radius: 40px; + border-radius: 40px; + color: #fff; + display: inline-block; + height: 40px; + margin: 0 1em 0.5em 0; + text-align: center; + width: 40px; +} + +.social-navigation a:hover, +.social-navigation a:focus { + background-color: #333; +} + +.social-navigation .icon { + height: 16px; + top: 12px; + width: 16px; + vertical-align: top; +} + +/* Site info */ + +.site-info { + font-size: 14px; + font-size: 0.875rem; + margin-bottom: 1em; +} + +.site-info a { + color: #666; +} + +.site-info .sep { + margin: 0; + display: block; + visibility: hidden; + height: 0; + width: 100%; +} + +.site-info span[role=separator] { + padding: 0 0.2em 0 0.4em; +} + +.site-info span[role=separator]::before { + content: '\002f'; +} + +/*-------------------------------------------------------------- +14.0 Comments +--------------------------------------------------------------*/ + +#comments { + clear: both; + padding: 2em 0 0.5em; +} + +.comments-title { + font-size: 20px; + font-size: 1.25rem; + margin-bottom: 1.5em; +} + +.comment-list, +.comment-list .children { + list-style: none; + margin: 0; + padding: 0; +} + +.comment-list li:before { + display: none; +} + +.comment-body { + margin-left: 65px; +} + +.comment-author { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0.4em; + position: relative; + z-index: 2; +} + +.comment-author .avatar { + height: 50px; + left: -65px; + position: absolute; + width: 50px; +} + +.comment-author .says { + display: none; +} + +.comment-meta { + margin-bottom: 1.5em; +} + +.comment-metadata { + color: #767676; + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + text-transform: uppercase; +} + +.comment-metadata a { + color: #767676; +} + +.comment-metadata a.comment-edit-link { + color: #222; + margin-left: 1em; +} + +.comment-body { + color: #333; + font-size: 14px; + font-size: 0.875rem; + margin-bottom: 4em; +} + +.comment-reply-link { + font-weight: 800; + position: relative; +} + +.comment-reply-link .icon { + color: #222; + left: -2em; + height: 1em; + position: absolute; + top: 0; + width: 1em; +} + +.children .comment-author .avatar { + height: 30px; + left: -45px; + width: 30px; +} + +.bypostauthor > .comment-body > .comment-meta > .comment-author .avatar { + border: 1px solid #333; + padding: 2px; +} + +.no-comments, +.comment-awaiting-moderation { + color: #767676; + font-size: 14px; + font-size: 0.875rem; + font-style: italic; +} + +.comments-pagination { + margin: 2em 0 3em; +} + +.form-submit { + text-align: right; +} + +.comment-form #wp-comment-cookies-consent { + margin: 0 10px 0 0; +} + +.comment-form .comment-form-cookies-consent label { + display: inline; +} + +/*-------------------------------------------------------------- +15.0 Widgets +--------------------------------------------------------------*/ + +#secondary { + padding: 1em 0 2em; +} + +.widget { + padding-bottom: 3em; +} + +h2.widget-title { + color: #222; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 800; + letter-spacing: 0.1818em; + margin-bottom: 1.5em; + text-transform: uppercase; +} + +.widget-title a { + color: inherit; +} + +/* widget forms */ + +.widget select { + width: 100%; +} + + +/* widget lists */ + +.widget ul { + list-style: none; + margin: 0; +} + +.widget ul li, +.widget ol li { + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + padding: 0.5em 0; +} + +.widget:not(.widget_tag_cloud) ul li + li { + margin-top: -1px; +} + +.widget ul li ul { + margin: 0 0 -1px; + padding: 0; + position: relative; +} + +.widget ul li li { + border: 0; + padding-left: 24px; + padding-left: 1.5rem; +} + +/* Widget lists of links */ + +.widget_top-posts ul li ul, +.widget_rss_links ul li ul, +.widget-grofile ul.grofile-links li ul, +.widget_pages ul li ul, +.widget_meta ul li ul { + bottom: 0; +} + +.widget_nav_menu ul li li, +.widget_top-posts ul li, +.widget_top-posts ul li li, +.widget_rss_links ul li, +.widget_rss_links ul li li, +.widget-grofile ul.grofile-links li, +.widget-grofile ul.grofile-links li li { + padding-bottom: 0.25em; + padding-top: 0.25em; +} + +.widget_rss ul li { + padding-bottom: 1em; + padding-top: 1em; +} + +/* Widget markup */ + +.widget .post-date, +.widget .rss-date { + font-size: 0.81em; +} + +/* Text widget */ + +.widget_text { + word-wrap: break-word; +} + +.widget_text ul { + list-style: disc; + margin: 0 0 1.5em 1.5em; +} + +.widget_text ol { + list-style: decimal; +} + +.widget_text ul li, +.widget_text ol li { + border: none; +} + +.widget_text ul li:last-child, +.widget_text ol li:last-child { + padding-bottom: 0; +} + +.widget_text ul li ul { + margin: 0 0 0 1.5em; +} + +.widget_text ul li li { + padding-left: 0; + padding-right: 0; +} + +.widget_text ol li { + list-style-position: inside; +} + +.widget_text ol li + li { + margin-top: -1px; +} + +/* RSS Widget */ + +.widget_rss .widget-title .rsswidget:first-child { + float: right; +} + +.widget_rss .widget-title .rsswidget:first-child:hover { + background-color: transparent; +} + +.widget_rss .widget-title .rsswidget:first-child img { + display: block; +} + +.widget_rss ul li { + padding: 2.125em 0; +} + +.widget_rss ul li:first-child { + border-top: none; + padding-top: 0; +} + +.widget_rss li .rsswidget { + font-size: 22px; + font-size: 1.375rem; + font-weight: 300; + line-height: 1.4; +} + +.widget_rss .rss-date, +.widget_rss li cite { + color: #767676; + display: block; + font-size: 10px; + font-size: 0.625rem; + font-style: normal; + font-weight: 800; + letter-spacing: 0.18em; + line-height: 1.5; + text-transform: uppercase; +} + +.widget_rss .rss-date { + margin: 0.5em 0 1.5em; + padding: 0; +} + +.widget_rss .rssSummary { + margin-bottom: 0.5em; +} + +/* Contact Info Widget */ + +.widget_contact_info .contact-map { + margin-bottom: 0.5em; +} + +/* Gravatar */ + +.widget-grofile h4 { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0; +} + +/* Recent Comments */ + +.widget_recent_comments table, +.widget_recent_comments th, +.widget_recent_comments td { + border: 0; +} + +/* Recent Posts widget */ + +.widget_recent_entries .post-date { + display: block; +} + +/* Search */ + +.search-form { + position: relative; +} + +.search-form .search-submit { + bottom: 3px; + padding: 0.5em 1em; + position: absolute; + right: 3px; + top: 3px; +} + +.search-form .search-submit .icon { + height: 24px; + top: -2px; + width: 24px; +} + +/* Tag cloud widget */ + +.tagcloud ul li { + float: left; + border-top: 0; + border-bottom: 0; + padding: 0; + margin: 4px 4px 0 0; +} + +.tagcloud, +.widget_tag_cloud, +.wp_widget_tag_cloud { + line-height: 1.5; +} + +.widget .tagcloud a, +.widget.widget_tag_cloud a, +.wp_widget_tag_cloud a { + border: 1px solid #ddd; + -webkit-box-shadow: none; + box-shadow: none; + display: block; + padding: 4px 10px 5px; + position: relative; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + width: auto; + word-wrap: break-word; + z-index: 0; +} + +.widget .tagcloud a:hover, +.widget .tagcloud a:focus, +.widget.widget_tag_cloud a:hover, +.widget.widget_tag_cloud a:focus, +.wp_widget_tag_cloud a:hover, +.wp_widget_tag_cloud a:focus { + border-color: #bbb; + -webkit-box-shadow: none; + box-shadow: none; + text-decoration: none; +} + +/* Calendar widget */ + +.widget_calendar .wp-calendar-table { + margin-bottom: 0; +} + +.widget_calendar .wp-calendar-nav { + display: table; + width: 100%; + margin: 0 0 1.5em; + padding: 0.4em 0; +} + +.widget_calendar .wp-calendar-nav span { + display: table-cell; +} + +.widget_calendar .wp-calendar-nav-prev, +.widget_calendar .wp-calendar-nav-next { + width: 40%; +} + +.widget_calendar th, +.widget_calendar td, +.widget_calendar .wp-calendar-nav span { + text-align: center; +} + +.widget_calendar tfoot td { + border: 0; +} + +/* Gallery widget */ + +.gallery-columns-5 .gallery-caption, +.gallery-columns-6 .gallery-caption, +.gallery-columns-7 .gallery-caption, +.gallery-columns-8 .gallery-caption, +.gallery-columns-9 .gallery-caption { + display: none; +} + +/*-------------------------------------------------------------- +16.0 Media +--------------------------------------------------------------*/ + +img, +video { + height: auto; /* Make sure images are scaled correctly. */ + max-width: 100%; /* Adhere to container width. */ +} + +img.alignleft, +img.alignright { + float: none; + margin: 0; +} + +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +audio:focus, +video:focus { + outline: thin dotted; +} + +/* Make sure embeds and iframes fit their containers. */ + +embed, +iframe, +object { + margin-bottom: 1.5em; + max-width: 100%; +} + +/* Remove bottom on embeds that wrapped in paragraphs via wpautop. */ + +p > embed:only-child, +p > iframe:only-child, +p > object:only-child { + margin-bottom: 0; +} + +.wp-caption, +.gallery-caption { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + font-style: italic; + margin-bottom: 1.5em; + max-width: 100%; +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.wp-caption .wp-caption-text { + margin: 0.8075em 0; +} + +/* Media Elements */ + +.mejs-container { + margin-bottom: 1.5em; +} + +/* Audio Player */ + +.mejs-controls a.mejs-horizontal-volume-slider, +.mejs-controls a.mejs-horizontal-volume-slider:focus, +.mejs-controls a.mejs-horizontal-volume-slider:hover { + background: transparent; + border: 0; +} + +/* Playlist Color Overrides: Light */ + +.site-content .wp-playlist-light { + border-color: #eee; + color: #222; +} + +.site-content .wp-playlist-light .wp-playlist-current-item .wp-playlist-item-album { + color: #333; +} + +.site-content .wp-playlist-light .wp-playlist-current-item .wp-playlist-item-artist { + color: #767676; +} + +.site-content .wp-playlist-light .wp-playlist-item { + border-bottom: 1px dotted #eee; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.site-content .wp-playlist-light .wp-playlist-item:hover, +.site-content .wp-playlist-light .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #767676; + color: #fff; +} + +.site-content .wp-playlist-light a.wp-playlist-caption:hover, +.site-content .wp-playlist-light .wp-playlist-item:hover a, +.site-content .wp-playlist-light .wp-playlist-item:focus a { + color: #fff; +} + +/* Playlist Color Overrides: Dark */ + +.site-content .wp-playlist-dark { + background: #222; + border-color: #333; +} + +.site-content .wp-playlist-dark .mejs-container .mejs-controls { + background-color: #333; +} + +.site-content .wp-playlist-dark .wp-playlist-caption { + color: #fff; +} + +.site-content .wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-album { + color: #eee; +} + +.site-content .wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-artist { + color: #aaa; +} + +.site-content .wp-playlist-dark .wp-playlist-playing { + background-color: #333; +} + +.site-content .wp-playlist-dark .wp-playlist-item { + border-bottom: 1px dotted #555; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.site-content .wp-playlist-dark .wp-playlist-item:hover, +.site-content .wp-playlist-dark .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #aaa; + color: #222; +} + +.site-content .wp-playlist-dark a.wp-playlist-caption:hover, +.site-content .wp-playlist-dark .wp-playlist-item:hover a, +.site-content .wp-playlist-dark .wp-playlist-item:focus a { + color: #222; +} + +/* Playlist Style Overrides */ + +.site-content .wp-playlist { + padding: 0.625em 0.625em 0.3125em; +} + +.site-content .wp-playlist-current-item .wp-playlist-item-title { + font-weight: 700; +} + +.site-content .wp-playlist-current-item .wp-playlist-item-album { + font-style: normal; +} + +.site-content .wp-playlist-current-item .wp-playlist-item-artist { + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + text-transform: uppercase; +} + +.site-content .wp-playlist-item { + padding: 0 0.3125em; + cursor: pointer; +} + +.site-content .wp-playlist-item:last-of-type { + border-bottom: none; +} + +.site-content .wp-playlist-item a { + padding: 0.3125em 0; + border-bottom: none; +} + +.site-content .wp-playlist-item a, +.site-content .wp-playlist-item a:focus, +.site-content .wp-playlist-item a:hover { + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; +} + +.site-content .wp-playlist-item-length { + top: 5px; +} + +/* SVG Icons base styles */ + +.icon { + display: inline-block; + fill: currentColor; + height: 1em; + position: relative; /* Align more nicely with capital letters */ + top: -0.0625em; + vertical-align: middle; + width: 1em; +} + +/*-------------------------------------------------------------- +16.1 Galleries +--------------------------------------------------------------*/ + +.gallery-item { + display: inline-block; + text-align: left; + vertical-align: top; + margin: 0 0 1.5em; + padding: 0 1em 0 0; + width: 50%; +} + +.gallery-columns-1 .gallery-item { + width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: 50%; +} + +.gallery-item a, +.gallery-item a:hover, +.gallery-item a:focus, +.widget-area .gallery-item a, +.widget-area .gallery-item a:hover, +.widget-area .gallery-item a:focus { + -webkit-box-shadow: none; + box-shadow: none; + background: none; + display: inline-block; + max-width: 100%; +} + +.gallery-item a img { + display: block; + -webkit-transition: -webkit-filter 0.2s ease-in; + transition: -webkit-filter 0.2s ease-in; + transition: filter 0.2s ease-in; + transition: filter 0.2s ease-in, -webkit-filter 0.2s ease-in; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} + +.gallery-item a:hover img, +.gallery-item a:focus img { + -webkit-filter: opacity(60%); + filter: opacity(60%); +} + +.gallery-caption { + display: block; + text-align: left; + padding: 0 10px 0 0; + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +17.0 Customizer +--------------------------------------------------------------*/ + +.highlight-front-sections.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel:after { + border: 2px dashed #0085ba; /* Matches visible edit shortcuts. */ + bottom: 1em; + content: ""; + display: block; + left: 1em; + position: absolute; + right: 1em; + top: 1em; + z-index: 1; +} + +.highlight-front-sections.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel .panel-content { + z-index: 2; /* Prevent :after from preventing interactions within the section */ +} + +/* Used for placeholder text */ +.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel .twentyseventeen-panel-title { + display: block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 700; + letter-spacing: 1px; + padding: 3em; + text-transform: uppercase; + text-align: center; +} + +/* Show borders on the custom page panels only when the front page sections are being edited */ +.highlight-front-sections.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel:nth-of-type(1):after { + border: none; +} + +.twentyseventeen-front-page.twentyseventeen-customizer #primary article.panel-placeholder { + border: 0; +} + +/* Add some space around the visual edit shortcut buttons. */ +.twentyseventeen-panel > .customize-partial-edit-shortcut > button { + top: 30px; + left: 30px; +} + +/* Ensure that placeholder icons are visible. */ +.twentyseventeen-panel .customize-partial-edit-shortcut-hidden:before { + visibility: visible; +} + +/*-------------------------------------------------------------- +18.0 SVGs Fallbacks +--------------------------------------------------------------*/ + +.svg-fallback { + display: none; +} + +.no-svg .svg-fallback { + display: inline-block; +} + +.no-svg .dropdown-toggle { + padding: 0.5em 0 0; + right: 0; + text-align: center; + width: 2em; +} + +.no-svg .dropdown-toggle .svg-fallback.icon-angle-down { + font-size: 20px; + font-size: 1.25rem; + font-weight: 400; + line-height: 1; + -webkit-transform: rotate(180deg); /* Chrome, Safari, Opera */ + -ms-transform: rotate(180deg); /* IE 9 */ + transform: rotate(180deg); +} + +.no-svg .dropdown-toggle.toggled-on .svg-fallback.icon-angle-down { + -webkit-transform: rotate(0); /* Chrome, Safari, Opera */ + -ms-transform: rotate(0); /* IE 9 */ + transform: rotate(0); +} + +.no-svg .dropdown-toggle .svg-fallback.icon-angle-down:before { + content: "\005E"; +} + +/* Social Menu fallbacks */ + +.no-svg .social-navigation a { + background: transparent; + color: #222; + height: auto; + width: auto; +} + +/* Show screen reader text in some cases */ + +.no-svg .next.page-numbers .screen-reader-text, +.no-svg .prev.page-numbers .screen-reader-text, +.no-svg .social-navigation li a .screen-reader-text, +.no-svg .search-submit .screen-reader-text { + clip: auto; + font-size: 16px; + font-size: 1rem; + font-weight: 400; + height: auto; + position: relative !important; /* overrides previous !important styles */ + width: auto; +} + +/*-------------------------------------------------------------- +19.0 Media Queries +--------------------------------------------------------------*/ + +/* Adjust positioning of edit shortcuts, override style in customize-preview.css */ +@media screen and (min-width: 20em) { + + body.customize-partial-edit-shortcuts-shown .site-header .site-title { + padding-left: 0; + } +} + +@media screen and (min-width: 30em) { + + /* Typography */ + + body, + button, + input, + select, + textarea { + font-size: 18px; + font-size: 1.125rem; + } + + h1 { + font-size: 30px; + font-size: 1.875rem; + } + + h2, + .home.blog .entry-title, + .page .panel-content .recent-posts .entry-title { + font-size: 26px; + font-size: 1.625rem; + } + + h3 { + font-size: 22px; + font-size: 1.375rem; + } + + h4 { + font-size: 18px; + font-size: 1.125rem; + } + + h5 { + font-size: 13px; + font-size: 0.8125rem; + } + + h6 { + font-size: 16px; + font-size: 1rem; + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + font-size: 14px; + font-size: 0.875rem; + } + + /* Fix image alignment */ + img.alignleft { + float: left; + margin-right: 1.5em; + } + + img.alignright { + float: right; + margin-left: 1.5em; + } + + /* Site Branding */ + + .site-branding { + padding: 3em 0; + } + + /* Front Page */ + + .panel-content .wrap { + padding-bottom: 2em; + padding-top: 3.5em; + } + + .page-one-column .panel-content .wrap { + max-width: 740px; + } + + .panel-content .entry-header { + margin-bottom: 4.5em; + } + + .panel-content .recent-posts .entry-header { + margin-bottom: 0; + } + + /* Blog Index, Archive, Search */ + + .taxonomy-description { + font-size: 14px; + font-size: 0.875rem; + } + + .page-numbers.current { + font-size: 16px; + font-size: 1rem; + } + + /* Site Footer */ + + .site-footer { + font-size: 16px; + font-size: 1rem; + } + + /* Gallery Columns */ + + .gallery-item { + max-width: 25%; + } + + .gallery-columns-1 .gallery-item { + max-width: 100%; + } + + .gallery-columns-2 .gallery-item { + max-width: 50%; + } + + .gallery-columns-3 .gallery-item { + max-width: 33.33%; + } + + .gallery-columns-4 .gallery-item { + max-width: 25%; + } +} + +@media screen and (min-width: 48em) { + + /* Typography */ + + body, + button, + input, + select, + textarea { + font-size: 16px; + font-size: 1rem; + line-height: 1.5; + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + font-size: 13px; + font-size: 0.8125rem; + } + + /* Layout */ + + .wrap { + max-width: 1000px; + padding-left: 3em; + padding-right: 3em; + } + + .has-sidebar:not(.error404) #primary { + float: left; + width: 58%; + } + + .has-sidebar #secondary { + float: right; + padding-top: 0; + width: 36%; + } + + .error404 #primary { + float: none; + } + + /* Site Branding */ + + .site-branding { + margin-bottom: 0; + } + + .has-header-image.twentyseventeen-front-page .site-branding, + .has-header-video.twentyseventeen-front-page .site-branding, + .has-header-image.home.blog .site-branding, + .has-header-video.home.blog .site-branding { + bottom: 0; + display: block; + left: 0; + height: auto; + padding-top: 0; + position: absolute; + width: 100%; + } + + .has-header-image.twentyseventeen-front-page .custom-header, + .has-header-video.twentyseventeen-front-page .custom-header, + .has-header-image.home.blog .custom-header, + .has-header-video.home.blog .custom-header { + display: block; + height: auto; + } + + .custom-header-media { + height: 165px; + position: relative; + } + + .twentyseventeen-front-page.has-header-image .custom-header-media, + .twentyseventeen-front-page.has-header-video .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .home.blog.has-header-video .custom-header-media { + height: 0; + position: relative; + } + + .has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-media, + .has-header-video:not(.twentyseventeen-front-page):not(.home) .custom-header-media { + bottom: 0; + height: auto; + left: 0; + position: absolute; + right: 0; + top: 0; + } + + .custom-logo-link { + padding-right: 2em; + } + + .custom-logo-link img, + body.home.title-tagline-hidden.has-header-image .custom-logo-link img, + body.home.title-tagline-hidden.has-header-video .custom-logo-link img { + max-width: 350px; + } + + .title-tagline-hidden.home.has-header-image .custom-logo-link img, + .title-tagline-hidden.home.has-header-video .custom-logo-link img { + max-height: 200px; + } + + .site-title { + font-size: 36px; + font-size: 2.25rem; + } + + .site-description { + font-size: 16px; + font-size: 1rem; + } + + /* Navigation */ + + .navigation-top { + bottom: 0; + font-size: 14px; + font-size: 0.875rem; + left: 0; + position: absolute; + right: 0; + width: 100%; + z-index: 3; + } + + .navigation-top .wrap { + max-width: 1000px; + /* The font size is 14px here and we need 50px padding in ems */ + padding: 0.75em 3.4166666666667em; + } + + .navigation-top nav { + margin-left: -1.25em; + } + + .site-navigation-fixed.navigation-top { + bottom: auto; + position: fixed; + left: 0; + right: 0; + top: 0; + width: 100%; + z-index: 7; + } + + .admin-bar .site-navigation-fixed.navigation-top { + top: 32px; + } + + /* Main Navigation */ + + .js .menu-toggle, + .js .dropdown-toggle { + display: none; + } + + .main-navigation { + width: auto; + } + + .js .main-navigation ul, + .js .main-navigation ul ul, + .js .main-navigation > div > ul { + display: block; + } + + .main-navigation ul { + background: transparent; + padding: 0; + } + + .main-navigation > div > ul { + border: 0; + margin-bottom: 0; + padding: 0; + } + + .main-navigation li { + border: 0; + display: inline-block; + } + + .main-navigation li li { + display: block; + } + + .main-navigation a { + padding: 1em 1.25em; + } + + .main-navigation ul ul { + background: #fff; + border: 1px solid #bbb; + left: -999em; + padding: 0; + position: absolute; + top: 100%; + z-index: 99999; + } + + .main-navigation ul li.menu-item-has-children:before, + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:before, + .main-navigation ul li.page_item_has_children:after { + border-style: solid; + border-width: 0 6px 6px; + content: ""; + display: none; + height: 0; + position: absolute; + right: 1em; + bottom: -1px; + width: 0; + z-index: 100000; + } + + .main-navigation ul li.menu-item-has-children.focus:before, + .main-navigation ul li.menu-item-has-children:hover:before, + .main-navigation ul li.menu-item-has-children.focus:after, + .main-navigation ul li.menu-item-has-children:hover:after, + .main-navigation ul li.page_item_has_children.focus:before, + .main-navigation ul li.page_item_has_children:hover:before, + .main-navigation ul li.page_item_has_children.focus:after, + .main-navigation ul li.page_item_has_children:hover:after { + display: block; + } + + .main-navigation ul li.menu-item-has-children:before, + .main-navigation ul li.page_item_has_children:before { + border-color: transparent transparent #bbb; + bottom: 0; + } + + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:after { + border-color: transparent transparent #fff; + } + + .main-navigation ul ul li:hover > ul, + .main-navigation ul ul li.focus > ul { + left: 100%; + right: auto; + } + + .main-navigation ul ul a { + padding: 0.75em 1.25em; + width: 16em; + } + + .main-navigation li li { + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + } + + .main-navigation li li:hover, + .main-navigation li li.focus { + background: #767676; + } + + .main-navigation li li a { + -webkit-transition: color 0.3s ease-in-out; + transition: color 0.3s ease-in-out; + } + + .main-navigation li li.focus > a, + .main-navigation li li:focus > a, + .main-navigation li li:hover > a, + .main-navigation li li a:hover, + .main-navigation li li a:focus, + .main-navigation li li.current_page_item a:hover, + .main-navigation li li.current-menu-item a:hover, + .main-navigation li li.current_page_item a:focus, + .main-navigation li li.current-menu-item a:focus { + color: #fff; + } + + .main-navigation ul li:hover > ul, + .main-navigation ul li.focus > ul { + left: 0.5em; + right: auto; + } + + .main-navigation .menu-item-has-children > a > .icon, + .main-navigation .page_item_has_children > a > .icon { + display: inline; + left: 5px; + position: relative; + top: -1px; + } + + .main-navigation ul ul .menu-item-has-children > a > .icon, + .main-navigation ul ul .page_item_has_children > a > .icon { + margin-top: -9px; + left: auto; + position: absolute; + right: 1em; + top: 50%; + -webkit-transform: rotate(-90deg); /* Chrome, Safari, Opera */ + -ms-transform: rotate(-90deg); /* IE 9 */ + transform: rotate(-90deg); + } + + .main-navigation ul ul ul { + left: -999em; + margin-top: -1px; + top: 0; + } + + .main-navigation ul ul li.menu-item-has-children.focus:before, + .main-navigation ul ul li.menu-item-has-children:hover:before, + .main-navigation ul ul li.menu-item-has-children.focus:after, + .main-navigation ul ul li.menu-item-has-children:hover:after, + .main-navigation ul ul li.page_item_has_children.focus:before, + .main-navigation ul ul li.page_item_has_children:hover:before, + .main-navigation ul ul li.page_item_has_children.focus:after, + .main-navigation ul ul li.page_item_has_children:hover:after { + display: none; + } + + .site-header .site-navigation-fixed .menu-scroll-down { + display: none; + } + + /* Scroll down arrow */ + + .site-header .menu-scroll-down { + display: block; + padding: 1em; + position: absolute; + right: 0; + } + + .site-header .menu-scroll-down .icon { + -webkit-transform: rotate(90deg); /* Chrome, Safari, Opera */ + -ms-transform: rotate(90deg); /* IE 9 */ + transform: rotate(90deg); + } + + .site-header .menu-scroll-down { + color: #fff; + top: 2em; + } + + .site-header .navigation-top .menu-scroll-down { + color: #767676; + top: 0.7em; + } + + .menu-scroll-down:focus { + outline: thin dotted; + } + + .menu-scroll-down .icon { + height: 18px; + width: 18px; + } + + /* Front Page */ + + .twentyseventeen-front-page.has-header-image .site-branding, + .twentyseventeen-front-page.has-header-video .site-branding, + .home.blog.has-header-image .site-branding, + .home.blog.has-header-video .site-branding { + margin-bottom: 70px; + } + + .twentyseventeen-front-page.has-header-image .custom-header-media, + .twentyseventeen-front-page.has-header-video .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .home.blog.has-header-video .custom-header-media { + height: 1200px; + height: 100vh; + max-height: 100%; + overflow: hidden; + } + + .twentyseventeen-front-page.has-header-image .custom-header-media:before, + .twentyseventeen-front-page.has-header-video .custom-header-media:before, + .home.blog.has-header-image .custom-header-media:before, + .home.blog.has-header-video .custom-header-media:before { + height: 33%; + } + + .admin-bar.twentyseventeen-front-page.has-header-image .custom-header-media, + .admin-bar.twentyseventeen-front-page.has-header-video .custom-header-media, + .admin-bar.home.blog.has-header-image .custom-header-media, + .admin-bar.home.blog.has-header-video .custom-header-media { + height: calc(100vh - 32px); + } + + .panel-content .wrap { + padding-bottom: 4.5em; + padding-top: 6em; + } + + .panel-image { + height: 100vh; + max-height: 1200px; + } + + /* With panel images 100% of the screen height, we're going to fix the background image where supported to create a parallax-like effect. */ + .background-fixed .panel-image { + background-attachment: fixed; + } + + .page-two-column .panel-content .entry-header { + float: left; + width: 36%; + } + + .page-two-column .panel-content .entry-content { + float: right; + width: 58%; + } + + /* Front Page - Recent Posts */ + + .page-two-column .panel-content .recent-posts { + clear: right; + float: right; + width: 58%; + } + + .panel-content .recent-posts article { + margin-bottom: 4em; + } + + .panel-content .recent-posts .entry-header, + .page-two-column #primary .panel-content .recent-posts .entry-header, + .panel-content .recent-posts .entry-content, + .page-two-column #primary .panel-content .recent-posts .entry-content { + float: none; + width: 100%; + } + + .panel-content .recent-posts .entry-header { + margin-bottom: 1.5em; + } + + .page .panel-content .recent-posts .entry-title { + font-size: 26px; + font-size: 1.625rem; + } + + /* Posts */ + + .site-content { + padding: 5.5em 0 0; + } + + .single-post .entry-title, + .page .entry-title { + font-size: 26px; + font-size: 1.625rem; + } + + .comments-pagination, + .post-navigation { + clear: both; + } + + .post-navigation .nav-previous { + float: left; + width: 50%; + } + + .post-navigation .nav-next { + float: right; + text-align: right; + width: 50%; + } + + .nav-next, + .post-navigation .nav-next { + margin-top: 0; + } + + /* Blog, archive, search */ + + .sticky .icon-thumb-tack { + height: 23px; + left: -2.5em; + top: 1.5em; + width: 32px; + } + + body:not(.has-sidebar):not(.page-one-column) .page-header, + body.has-sidebar.error404 #primary .page-header, + body.page-two-column:not(.archive) #primary .entry-header, + body.page-two-column.archive:not(.has-sidebar) #primary .page-header { + float: left; + width: 36%; + } + + .blog:not(.has-sidebar) #primary article, + .archive:not(.page-one-column):not(.has-sidebar) #primary article, + .search:not(.has-sidebar) #primary article, + .error404:not(.has-sidebar) #primary .page-content, + .error404.has-sidebar #primary .page-content, + body.page-two-column:not(.archive) #primary .entry-content, + body.page-two-column #comments { + float: right; + width: 58%; + } + + .blog .site-main > article, + .archive .site-main > article, + .search .site-main > article { + padding-bottom: 4em; + } + + .navigation.pagination { + clear: both; + float: right; + width: 58%; + } + + .has-sidebar .navigation.pagination, + .archive.page-one-column:not(.has-sidebar) .navigation.pagination { + float: none; + width: 100%; + } + + .entry-footer { + display: table; + width: 100%; + } + + .entry-footer .cat-tags-links { + display: table-cell; + vertical-align: middle; + width: 100%; + } + + .entry-footer .edit-link { + display: table-cell; + text-align: right; + vertical-align: middle; + } + + .entry-footer .edit-link a.post-edit-link { + margin-top: 0; + margin-left: 1em; + } + + /* Entry content */ + + /* without sidebar */ + + :not(.has-sidebar) .entry-content blockquote.alignleft { + margin-left: -17.5%; + width: 48%; + } + + :not(.has-sidebar) .entry-content blockquote.alignright { + margin-right: -17.5%; + width: 48%; + } + + /* with sidebar */ + + .has-sidebar .entry-content blockquote.alignleft { + margin-left: 0; + width: 34%; + } + + .has-sidebar .entry-content blockquote.alignright { + margin-right: 0; + width: 34%; + } + + .has-sidebar #primary .entry-content blockquote.alignright.below-entry-meta { + margin-right: -72.5%; + width: 62%; + } + + /* blog and archive */ + + .blog:not(.has-sidebar) .entry-content blockquote.alignleft, + .twentyseventeen-front-page.page-two-column .entry-content blockquote.alignleft, + .archive:not(.has-sidebar) .entry-content blockquote.alignleft, + .page-two-column .entry-content blockquote.alignleft { + margin-left: -72.5%; + width: 62%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignright, + .twentyseventeen-front-page.page-two-column .entry-content blockquote.alignright, + .archive:not(.has-sidebar) .entry-content blockquote.alignright, + .page-two-column .entry-content blockquote.alignright { + margin-right: 0; + width: 36%; + } + + /* Post formats */ + + .format-quote blockquote .icon { + left: -1.5em; + } + + /* Pages */ + + .page.page-one-column .entry-header, + .twentyseventeen-front-page.page-one-column .entry-header, + .archive.page-one-column:not(.has-sidebar) .page-header { + margin-bottom: 4em; + } + + .page:not(.home) #content { + padding-bottom: 3.25em; + } + + /* 404 page */ + + .error404 .page-content { + padding-bottom: 9em; + } + + /* Comments */ + + #comments { + padding-top: 5em; + } + + .comments-title { + margin-bottom: 2.5em; + } + + ol.children .children { + padding-left: 2em; + } + + /* Posts pagination */ + + .nav-links .nav-title { + position: relative; + } + + .nav-title-icon-wrapper { + position: absolute; + text-align: center; + width: 2em; + } + + .nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + left: -2em; + } + + .nav-links .nav-next .nav-title .nav-title-icon-wrapper { + right: -2em; + } + + /* Secondary */ + + #secondary { + font-size: 14px; + font-size: 0.875rem; + line-height: 1.6; + } + + /* Widgets */ + + h2.widget-title { + font-size: 11px; + font-size: 0.6875rem; + margin-bottom: 2em; + } + + /* Footer */ + + .site-footer { + font-size: 14px; + font-size: 0.875rem; + line-height: 1.6; + margin-top: 3em; + } + + .site-footer .widget-column.footer-widget-1 { + float: left; + width: 36%; + } + + .site-footer .widget-column.footer-widget-2 { + float: right; + width: 58%; + } + + .social-navigation { + clear: left; + float: left; + margin-bottom: 0; + width: 36%; + } + + .site-info { + float: left; + padding: 0.7em 0 0; + width: 58%; + } + + .social-navigation + .site-info { + margin-left: 6%; + } + + .site-info .sep { + margin: 0 0.5em; + display: inline; + visibility: visible; + height: auto; + width: auto; + } + + /* Gallery Columns */ + + .gallery-columns-5 .gallery-item { + max-width: 20%; + } + + .gallery-columns-6 .gallery-item { + max-width: 16.66%; + } + + .gallery-columns-7 .gallery-item { + max-width: 14.28%; + } + + .gallery-columns-8 .gallery-item { + max-width: 12.5%; + } + + .gallery-columns-9 .gallery-item { + max-width: 11.11%; + } +} + +@media screen and ( min-width: 67em ) { + + /* Layout */ + + /* Navigation */ + .navigation-top .wrap { + padding: 0.75em 2em; + } + + .navigation-top nav { + margin-left: 0; + } + + /* Sticky posts */ + + .sticky .icon-thumb-tack { + font-size: 32px; + font-size: 2rem; + height: 22px; + left: -1.25em; + top: 0.75em; + width: 32px; + } + + /* Pagination */ + + .page-numbers { + display: inline-block; + } + + .page-numbers.current { + font-size: 15px; + font-size: 0.9375rem; + } + + .page-numbers.current .screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute !important; + width: 1px; + } + + /* Comments */ + + .comment-body { + margin-left: 0; + } +} + +@media screen and ( min-width: 79em ) { + + .has-sidebar .entry-content blockquote.alignleft { + margin-left: -20%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignright, + .archive:not(.has-sidebar) .entry-content blockquote.alignright, + .page-two-column .entry-content blockquote.alignright, + .twentyseventeen-front-page .entry-content blockquote.alignright { + margin-right: -20%; + } +} + +@media screen and ( max-width: 48.875em ) and ( min-width: 48em ) { + + .admin-bar .site-navigation-fixed.navigation-top, + .admin-bar .site-navigation-hidden.navigation-top { + top: 46px; + } +} + +/*-------------------------------------------------------------- +20.0 Print +--------------------------------------------------------------*/ + +@media print { + + /* Hide elements */ + + form, + button, + input, + select, + textarea, + .navigation-top, + .social-navigation, + #secondary, + .content-bottom-widgets, + .header-image, + .panel-image-prop, + .icon-thumb-tack, + .page-links, + .edit-link, + .post-navigation, + .pagination.navigation, + .comments-pagination, + .comment-respond, + .comment-edit-link, + .comment-reply-link, + .comment-metadata .edit-link, + .pingback .edit-link, + .site-footer aside.widget-area, + .site-info { + display: none !important; + } + + .entry-footer, + #comments, + .site-footer, + .single-featured-image-header { + border: 0; + } + + /* Font sizes */ + + body { + font-size: 12pt; + } + + h1 { + font-size: 24pt; + } + + h2 { + font-size: 22pt; + } + + h3 { + font-size: 17pt; + } + + h4 { + font-size: 12pt; + } + + h5 { + font-size: 11pt; + } + + h6 { + font-size: 12pt; + } + + .page .panel-content .entry-title, + .page-title, + body.page:not(.twentyseventeen-front-page) .entry-title { + font-size: 10pt; + } + + /* Layout */ + + .wrap { + padding-left: 5% !important; + padding-right: 5% !important; + max-width: none; + } + + /* Site Branding */ + + .site-header { + background: transparent; + padding: 0; + } + + .custom-header-media { + padding: 0; + } + + .twentyseventeen-front-page.has-header-image .site-branding, + .twentyseventeen-front-page.has-header-video .site-branding, + .home.blog.has-header-image .site-branding, + .home.blog.has-header-video .site-branding { + position: relative; + } + + .site-branding { + margin-top: 0; + margin-bottom: 1.75em !important; /* override styles added by JavaScript */ + } + + .site-title { + font-size: 25pt; + } + + .site-description { + font-size: 12pt; + opacity: 1; + } + + /* Posts */ + + .single-featured-image-header { + background: transparent; + } + + .entry-meta { + font-size: 9pt; + } + + /* Colors */ + + body, + .site { + background: none !important; /* Brute force since user agents all print differently. */ + } + + body, + a, + .site-title a, + .twentyseventeen-front-page.has-header-image .site-title, + .twentyseventeen-front-page.has-header-video .site-title, + .twentyseventeen-front-page.has-header-image .site-title a, + .twentyseventeen-front-page.has-header-video .site-title a { + color: #222 !important; /* Make sure color schemes don't affect to print */ + } + + h2, + h5, + blockquote, + .site-description, + .twentyseventeen-front-page.has-header-image .site-description, + .twentyseventeen-front-page.has-header-video .site-description, + .entry-meta, + .entry-meta a { + color: #777 !important; /* Make sure color schemes don't affect to print */ + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + font-size: 11pt; + width: 34%; + } + + .site-footer { + padding: 0; + } +} diff --git a/wp-content/themes/twentyseventeen/template-parts/footer/footer-widgets.php b/wp-content/themes/twentyseventeen/template-parts/footer/footer-widgets.php new file mode 100644 index 0000000..4d42a18 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/footer/footer-widgets.php @@ -0,0 +1,35 @@ + + + + + + + diff --git a/wp-content/themes/twentyseventeen/template-parts/footer/site-info.php b/wp-content/themes/twentyseventeen/template-parts/footer/site-info.php new file mode 100644 index 0000000..7549376 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/footer/site-info.php @@ -0,0 +1,24 @@ + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/header/header-image.php b/wp-content/themes/twentyseventeen/template-parts/header/header-image.php new file mode 100644 index 0000000..9672d70 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/header/header-image.php @@ -0,0 +1,20 @@ + +
            + +
            + +
            + + + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/header/site-branding.php b/wp-content/themes/twentyseventeen/template-parts/header/site-branding.php new file mode 100644 index 0000000..798bbe5 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/header/site-branding.php @@ -0,0 +1,38 @@ + +
            +
            + + + +
            + +

            + +

            + + + +

            + +
            + + + 'arrow-right' ) ); ?> + + +
            +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/navigation/navigation-top.php b/wp-content/themes/twentyseventeen/template-parts/navigation/navigation-top.php new file mode 100644 index 0000000..d1922fc --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/navigation/navigation-top.php @@ -0,0 +1,33 @@ + + diff --git a/wp-content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php b/wp-content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php new file mode 100644 index 0000000..ca0b5f6 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php @@ -0,0 +1,87 @@ + + +
            > + + ID ), 'twentyseventeen-featured-image' ); + + // Calculate aspect ratio: h / w * 100%. + $ratio = $thumbnail[2] / $thumbnail[1] * 100; + ?> + +
            +
            +
            + + + +
            +
            +
            + ', '' ); ?> + + + +
            + +
            + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + ?> +
            + + + + 3, + 'post_status' => 'publish', + 'ignore_sticky_posts' => true, + 'no_found_rows' => true, + ) + ); + ?> + + have_posts() ) : ?> + +
            + + have_posts() ) : + $recent_posts->the_post(); + get_template_part( 'template-parts/post/content', 'excerpt' ); + endwhile; + wp_reset_postdata(); + ?> +
            + + + +
            +
            + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/page/content-front-page.php b/wp-content/themes/twentyseventeen/template-parts/page/content-front-page.php new file mode 100644 index 0000000..f1de0df --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/page/content-front-page.php @@ -0,0 +1,52 @@ + +
            > + + ID ), 'twentyseventeen-featured-image' ); + + // Calculate aspect ratio: h / w * 100%. + $ratio = $thumbnail[2] / $thumbnail[1] * 100; + ?> + +
            +
            +
            + + + +
            +
            +
            + ', '' ); ?> + + + +
            + +
            + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + ?> +
            + +
            +
            + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/page/content-page.php b/wp-content/themes/twentyseventeen/template-parts/page/content-page.php new file mode 100644 index 0000000..af621e9 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/page/content-page.php @@ -0,0 +1,32 @@ + + +
            > +
            + ', '' ); ?> + +
            +
            + '', + ) + ); + ?> +
            +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/post/content-audio.php b/wp-content/themes/twentyseventeen/template-parts/post/content-audio.php new file mode 100644 index 0000000..1ee148a --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/post/content-audio.php @@ -0,0 +1,109 @@ + + +
            > + 'thumb-tack' ) ); + } + ?> +
            + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo '
          • '; + }; + + if ( is_single() ) { + the_title( '

            ', '

            ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

            ', '

            ' ); + } else { + the_title( '

            ', '

            ' ); + } + ?> + + + + + +
            + + + +
            + + +
            + + '; + echo $audio_html; + echo '
            '; + } + }; + + }; + + if ( is_single() || empty( $audio ) ) { + + the_content( + sprintf( + /* translators: %s: Post title. */ + __( 'Continue reading "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + + }; + ?> + +
            + + + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/post/content-excerpt.php b/wp-content/themes/twentyseventeen/template-parts/post/content-excerpt.php new file mode 100644 index 0000000..2a93cc5 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/post/content-excerpt.php @@ -0,0 +1,48 @@ + + + diff --git a/wp-content/themes/twentyseventeen/template-parts/post/content-gallery.php b/wp-content/themes/twentyseventeen/template-parts/post/content-gallery.php new file mode 100644 index 0000000..34e2d77 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/post/content-gallery.php @@ -0,0 +1,96 @@ + + +
            > + 'thumb-tack' ) ); + } + ?> +
            + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo ''; + }; + + if ( is_single() ) { + the_title( '

            ', '

            ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

            ', '

            ' ); + } else { + the_title( '

            ', '

            ' ); + } + ?> +
            + + +
            + + + +
            + + +
            + + '; + echo get_post_gallery(); + echo '
            '; + }; + + }; + + if ( is_single() || ! get_post_gallery() ) { + + the_content( + sprintf( + /* translators: %s: Post title. */ + __( 'Continue reading "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + + }; + ?> + + + + + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/post/content-image.php b/wp-content/themes/twentyseventeen/template-parts/post/content-image.php new file mode 100644 index 0000000..07b89c4 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/post/content-image.php @@ -0,0 +1,86 @@ + + +
            > + 'thumb-tack' ) ); + } + ?> +
            + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo ''; + }; + + if ( is_single() ) { + the_title( '

            ', '

            ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

            ', '

            ' ); + } else { + the_title( '

            ', '

            ' ); + } + ?> +
            + + +
            + + + +
            + + +
            + + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + + }; + ?> + +
            + + + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/post/content-none.php b/wp-content/themes/twentyseventeen/template-parts/post/content-none.php new file mode 100644 index 0000000..62a9ada --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/post/content-none.php @@ -0,0 +1,40 @@ + + +
            + +
            + + +

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

            + + + +

            + +
            +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/post/content-video.php b/wp-content/themes/twentyseventeen/template-parts/post/content-video.php new file mode 100644 index 0000000..b073052 --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/post/content-video.php @@ -0,0 +1,107 @@ + + +
            > + 'thumb-tack' ) ); + } + ?> +
            + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + } + echo ''; + }; + + if ( is_single() ) { + the_title( '

            ', '

            ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

            ', '

            ' ); + } else { + the_title( '

            ', '

            ' ); + } + ?> +
            + + + + +
            + + + +
            + + +
            + + '; + echo $video_html; + echo '
            '; + } + }; + + }; + + if ( is_single() || empty( $video ) ) { + + the_content( + sprintf( + /* translators: %s: Post title. */ + __( 'Continue reading "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + }; + ?> + + + + + +
            diff --git a/wp-content/themes/twentyseventeen/template-parts/post/content.php b/wp-content/themes/twentyseventeen/template-parts/post/content.php new file mode 100644 index 0000000..366a42a --- /dev/null +++ b/wp-content/themes/twentyseventeen/template-parts/post/content.php @@ -0,0 +1,79 @@ + + +
            > + 'thumb-tack' ) ); + endif; + ?> +
            + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo ''; + }; + + if ( is_single() ) { + the_title( '

            ', '

            ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

            ', '

            ' ); + } else { + the_title( '

            ', '

            ' ); + } + ?> +
            + + +
            + + + +
            + + +
            + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + ?> +
            + + + +
            diff --git a/wp-content/themes/twentysixteen/404.php b/wp-content/themes/twentysixteen/404.php new file mode 100644 index 0000000..70592f6 --- /dev/null +++ b/wp-content/themes/twentysixteen/404.php @@ -0,0 +1,34 @@ + + +
            +
            + +
            + + +
            +

            + + +
            +
            + +
            + + + +
            + + + diff --git a/wp-content/themes/twentysixteen/archive.php b/wp-content/themes/twentysixteen/archive.php new file mode 100644 index 0000000..ebfeece --- /dev/null +++ b/wp-content/themes/twentysixteen/archive.php @@ -0,0 +1,69 @@ + + +
            +
            + + + + + + __( 'Previous page', 'twentysixteen' ), + 'next_text' => __( 'Next page', 'twentysixteen' ), + 'before_page_number' => '' . __( 'Page', 'twentysixteen' ) . ' ', + ) + ); + + // If no content, include the "No posts found" template. + else : + get_template_part( 'template-parts/content', 'none' ); + + endif; + ?> + +
            +
            + + + diff --git a/wp-content/themes/twentysixteen/comments.php b/wp-content/themes/twentysixteen/comments.php new file mode 100644 index 0000000..42a0834 --- /dev/null +++ b/wp-content/themes/twentysixteen/comments.php @@ -0,0 +1,83 @@ + + +
            + + +

            + +

            + + + +
              + 'ol', + 'short_ping' => true, + 'avatar_size' => 42, + ) + ); + ?> +
            + + + + + + +

            + + + '

            ', + 'title_reply_after' => '

            ', + ) + ); + ?> + +
            diff --git a/wp-content/themes/twentysixteen/css/blocks.css b/wp-content/themes/twentysixteen/css/blocks.css new file mode 100644 index 0000000..732a2c8 --- /dev/null +++ b/wp-content/themes/twentysixteen/css/blocks.css @@ -0,0 +1,436 @@ +/* +Theme Name: Twenty Sixteen +Description: Used to style blocks. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 General Block Styles +2.0 Blocks - Common Blocks +3.0 Blocks - Formatting +4.0 Blocks - Layout Elements +5.0 Blocks - Widgets +6.0 Blocks - Colors +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 General Block Styles +--------------------------------------------------------------*/ + +/* Captions */ + +[class^="wp-block-"] figcaption { + color: #686868; + font-style: italic; + line-height: 1.6153846154; + padding-top: 0.5384615385em; + text-align: left; +} + +.rtl [class^="wp-block-"] figcaption { + text-align: right; +} + +/*-------------------------------------------------------------- +2.0 Blocks - Common Blocks +--------------------------------------------------------------*/ + +/* Paragraph */ + +p.has-drop-cap:not(:focus)::first-letter { + font-size: 5em; +} + +/* Image */ + +@media screen and (min-width: 61.5625em) { + body:not(.search-results) article:not(.type-page) .wp-block-image figcaption.below-entry-meta { + clear: both; + display: block; + float: none; + margin-right: 0; + margin-left: -40%; + max-width: 140%; + } + + body.rtl:not(.search-results) article:not(.type-page) .wp-block-image figcaption.below-entry-meta { + margin-left: 0; + margin-right: -40%; + } +} + +/* Gallery */ + +.wp-block-gallery { + margin-bottom: 1.75em; +} + +/* Quote */ + +.wp-block-quote:not(.is-large):not(.is-style-large).alignleft, +.wp-block-quote:not(.is-large):not(.is-style-large).alignright { + border-left: none; + padding-left: 0; +} + +.rtl .wp-block-quote:not(.is-large):not(.is-style-large).alignleft, +.rtl .wp-block-quote:not(.is-large):not(.is-style-large).alignright { + border-right: none; + padding-right: 0; +} + +.wp-block-quote cite { + color: #1a1a1a; + display: block; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +.wp-block-quote cite:before { + content: "\2014\00a0"; +} + +/* Audio */ + +.wp-block-audio audio { + display: block; + width: 100%; +} + +/* Cover */ + +.wp-block-cover-image.aligncenter, +.wp-block-cover.aligncenter { + display: flex; +} + +/* File */ + +.wp-block-file .wp-block-file__button { + background: #1a1a1a; + border: 0; + border-radius: 2px; + color: #fff; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-weight: 700; + letter-spacing: 0.046875em; + line-height: 1; + padding: 0.84375em 0.875em 0.78125em; + text-transform: uppercase; +} + +.wp-block-file .wp-block-file__button:hover, +.wp-block-file .wp-block-file__button:focus { + background: #007acc; +} + +.wp-block-file .wp-block-file__button:focus { + outline: thin dotted; + outline-offset: -4px; +} + +.rtl .wp-block-file * + .wp-block-file__button { + margin-left: 0.75em; + margin-right: 0; +} + +/*-------------------------------------------------------------- +3.0 Blocks - Formatting Blocks +--------------------------------------------------------------*/ + +/* Code */ + +.wp-block-code { + border: 0; + font-family: Inconsolata, monospace; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; + padding: 0; +} + +/* Pullquote */ + +.wp-block-pullquote { + border-width: 4px; +} + +.wp-block-pullquote blockquote { + color: #686868; + border-left: 4px solid #1a1a1a; + margin: 0; + padding: 0 0 0 24px; +} + +.rtl .wp-block-pullquote blockquote { + border-left: none; + border-right: 4px solid #1a1a1a; + padding: 0 24px 0 0; +} + +.wp-block-pullquote p { + font-size: 19px; + font-size: 1.1875rem; +} + +.wp-block-pullquote cite { + color: #1a1a1a; + display: block; + font-size: 16px; + font-size: 1rem; + font-style: none; + line-height: 1.75; + text-transform: none; +} + +.wp-block-pullquote cite:before { + content: "\2014\00a0"; +} + +/* Table */ + +.wp-block-table, +.wp-block-table th, +.wp-block-table td { + border: 1px solid #d1d1d1; +} + +.wp-block-table { + border-collapse: separate; + border-spacing: 0; + border-width: 1px 0 0 1px; + margin: 0 0 1.75em; + table-layout: fixed; + width: 100%; +} + +.wp-block-table th, +.wp-block-table td { + font-weight: normal; + padding: 0.4375em; + text-align: left; +} + +.wp-block-table th { + border-width: 0 1px 1px 0; + font-weight: 700; +} + +.wp-block-table td { + border-width: 0 1px 1px 0; +} + +.rtl .wp-block-table th, +.rtl .wp-block-table td { + text-align: right; +} + +/*-------------------------------------------------------------- +4.0 Blocks - Layout Elements +--------------------------------------------------------------*/ + +/* Buttons */ + +.wp-block-button .wp-block-button__link { + box-shadow: none; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-weight: 700; + letter-spacing: 0.046875em; + line-height: 1; + padding: 0.84375em 1.3125em 0.78125em; + text-transform: uppercase; +} + +.entry-content .wp-block-button__link { + background: #1a1a1a; + color: #fff; +} + +.entry-content .is-style-outline .wp-block-button__link:not(.has-background) { + background: transparent; +} + +.entry-content .is-style-outline .wp-block-button__link:not(.has-text-color) { + color: #1a1a1a; +} + +.entry-content .wp-block-button__link:hover, +.entry-content .wp-block-button__link:focus, +.entry-content .is-style-outline .wp-block-button__link:not(.has-background):hover, +.entry-content .is-style-outline .wp-block-button__link:not(.has-background):focus, +.entry-content .is-style-outline .wp-block-button__link:not(.has-text-color):hover, +.entry-content .is-style-outline .wp-block-button__link:not(.has-text-color):focus { + background: #007acc; + color: #fff; +} + +.wp-block-button .wp-block-button__link:focus { + outline: thin dotted; + outline-offset: -4px; +} + +/* Seperator */ + +hr.wp-block-separator { + border: 0; +} + +.wp-block-separator { + margin-left: auto; + margin-right: auto; + max-width: 100px; +} + +.wp-block-separator.is-style-wide { + max-width: 100%; +} + +/* Media & Text */ + +.wp-block-media-text { + margin-bottom: 1.75em; +} + +.wp-block-media-text *:last-child { + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +5.0 Blocks - Widget Blocks +--------------------------------------------------------------*/ + +/* Archives, Categories & Latest Posts */ + +.wp-block-archives.aligncenter, +.wp-block-categories.aligncenter, +.wp-block-latest-posts.aligncenter { + list-style-position: inside; + text-align: center; +} + +/* Latest Comments */ + +.wp-block-latest-comments__comment-meta a { + box-shadow: none; + font-weight: 700; +} + +.wp-block-latest-comments__comment-date { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment { + border-top: 1px solid #d1d1d1; + margin-bottom: 0; + padding: 1.75em 0; +} + +.wp-block-latest-comments__comment-excerpt p:last-child { + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +6.0 Blocks - Colors +--------------------------------------------------------------*/ + +.entry-content .has-dark-gray-color { + color: #1a1a1a; +} + +.entry-content .has-dark-gray-background-color { + background-color: #1a1a1a; +} + +.entry-content .has-medium-gray-color { + color: #686868; +} + +.entry-content .has-medium-gray-background-color { + background-color: #686868; +} + +.entry-content .has-light-gray-color { + color: #e5e5e5; +} + +.entry-content .has-light-gray-background-color { + background-color: #e5e5e5; +} + +.entry-content .has-white-color { + color: #fff; +} + +.entry-content .has-white-background-color { + background-color: #fff; +} + +.entry-content .has-blue-gray-color { + color: #4d545c; +} + +.entry-content .has-blue-gray-background-color { + background-color: #4d545c; +} + +.entry-content .has-bright-blue-color { + color: #007acc; +} + +.entry-content .has-bright-blue-background-color { + background-color: #007acc; +} + +.entry-content .has-light-blue-color { + color: #9adffd; +} + +.entry-content .has-light-blue-background-color { + background-color: #9adffd; +} + +.entry-content .has-dark-brown-color { + color: #402b30; +} + +.entry-content .has-dark-brown-background-color { + background-color: #402b30; +} + +.entry-content .has-medium-brown-color { + color: #774e24; +} + +.entry-content .has-medium-brown-background-color { + background-color: #774e24; +} + +.entry-content .has-dark-red-color { + color: #640c1f; +} + +.entry-content .has-dark-red-background-color { + background-color: #640c1f; +} + +.entry-content .has-bright-red-color { + color: #ff675f; +} + +.entry-content .has-bright-red-background-color { + background-color: #ff675f; +} + +.entry-content .has-yellow-color { + color: #ffef8e; +} + +.entry-content .has-yellow-background-color { + background-color: #ffef8e; +} diff --git a/wp-content/themes/twentysixteen/css/editor-blocks.css b/wp-content/themes/twentysixteen/css/editor-blocks.css new file mode 100644 index 0000000..cc7411a --- /dev/null +++ b/wp-content/themes/twentysixteen/css/editor-blocks.css @@ -0,0 +1,616 @@ +/* +Theme Name: Twenty Sixteen +Description: Used to style blocks in the editor. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 General Typography +2.0 General Block Styles +3.0 Blocks - Common Blocks +4.0 Blocks - Formatting +5.0 Blocks - Layout Elements +6.0 Blocks - Widgets +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 General Typography +--------------------------------------------------------------*/ + +.edit-post-visual-editor .editor-block-list__block, +.editor-default-block-appender textarea.editor-default-block-appender__content { + font-family: Merriweather, Georgia, serif; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +.edit-post-visual-editor .editor-block-list__block { + color: #1a1a1a; +} + +.editor-post-title__block .editor-post-title__input { + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 28px; + font-size: 1.75rem; + font-weight: 700; + line-height: 1.25; + margin-bottom: 1em; +} + +.edit-post-visual-editor h1 { + font-size: 28px; + font-size: 1.75rem; + line-height: 1.25; + margin-top: 2em; + margin-bottom: 1em; +} + +.edit-post-visual-editor h2 { + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.2173913043; + margin-top: 2.4347826087em; + margin-bottom: 1.2173913043em; +} + +.edit-post-visual-editor h3 { + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.1052631579; + margin-top: 2.9473684211em; + margin-bottom: 1.4736842105em; +} + +.edit-post-visual-editor h4, +.edit-post-visual-editor h5, +.edit-post-visual-editor h6 { + font-size: 16px; + font-size: 1rem; + line-height: 1.3125; + margin-top: 3.5em; + margin-bottom: 1.75em; +} + +.edit-post-visual-editor h4 { + letter-spacing: 0.140625em; + text-transform: uppercase; +} + +.edit-post-visual-editor h6 { + font-style: italic; +} + +.edit-post-visual-editor h1, +.edit-post-visual-editor h2, +.edit-post-visual-editor h3, +.edit-post-visual-editor h4, +.edit-post-visual-editor h5, +.edit-post-visual-editor h6 { + font-weight: 900; +} + +@media screen and (min-width: 61.5625em) { + .edit-post-visual-editor h1 { + font-size: 33px; + font-size: 2.0625rem; + line-height: 1.2727272727; + margin-top: 1.696969697em; + margin-bottom: 0.8484848485em; + } + + .edit-post-visual-editor h2 { + font-size: 28px; + font-size: 1.75rem; + line-height: 1.25; + margin-top: 2em; + margin-bottom: 1em; + } + + .edit-post-visual-editor h3 { + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.2173913043; + margin-top: 2.4347826087em; + margin-bottom: 1.2173913043em; + } + + .edit-post-visual-editor h4 { + letter-spacing: 0.131578947em; + } + + .edit-post-visual-editor h4, + .edit-post-visual-editor h5, + .edit-post-visual-editor h6 { + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.1052631579; + margin-top: 2.9473684211em; + margin-bottom: 1.473684211em; + } +} + +.edit-post-visual-editor h1:first-child, +.edit-post-visual-editor h2:first-child, +.edit-post-visual-editor h3:first-child, +.edit-post-visual-editor h4:first-child, +.edit-post-visual-editor h5:first-child, +.edit-post-visual-editor h6:first-child { + margin-top: 0; +} + +.edit-post-visual-editor p { + margin: 0 0 1.75em; +} + +.edit-post-visual-editor blockquote p { + margin-bottom: 1.4736842105em; +} + +@media screen and (min-width: 44.375em) { + .editor-post-title__block .editor-post-title__input { + font-size: 33px; + font-size: 2.0625rem; + line-height: 1.2727272727; + margin-bottom: 0.8484848485em; + } +} + +@media screen and (min-width: 61.5625em) { + .editor-post-title__block .editor-post-title__input { + font-size: 40px; + font-size: 2.5rem; + line-height: 1.225; + margin-bottom: 1.05em; + } +} + +/*-------------------------------------------------------------- +2.0 General Block Styles +--------------------------------------------------------------*/ + +/* Main column width */ + +.editor-styles-wrapper { + max-width: 100% !important; /* Override where editor-style.css is affecting this */ +} + +.wp-block { + max-width: 630px; /* 600px + 30px to account for padding. */ +} + +/* Link styles */ + +.edit-post-visual-editor a, +.editor-block-list__block a, +.wp-block-freeform.block-library-rich-text__tinymce a { + color: #007acc; +} + +/* List styles */ + +.edit-post-visual-editor ul:not(.wp-block-gallery), +.editor-block-list__block ul:not(.wp-block-gallery), +.block-library-list ul, +.edit-post-visual-editor ol, +.editor-block-list__block ol, +.block-library-list ol { + margin: 0 0 1.75em 1.25em; + padding: 0; +} + +.edit-post-visual-editor ul:not(.wp-block-gallery), +.editor-block-list__block ul:not(.wp-block-gallery), +.block-library-list ul { + list-style: disc; +} + +.edit-post-visual-editor ol, +.editor-block-list__block ol, +.block-library-list ol { + list-style: decimal; + margin-left: 1.5em; +} + +.edit-post-visual-editor ul:not(.wp-block-gallery) li, +.editor-block-list__block ul:not(.wp-block-gallery) li, +.edit-post-visual-editor ol li, +.editor-block-list__block ol li, +.block-library-list li { + margin-bottom: 0; +} + +.edit-post-visual-editor ul:not(.wp-block-gallery) li > ul, +.editor-block-list__block ul:not(.wp-block-gallery) li > ul, +.block-library-list li > ul, +.edit-post-visual-editor li > ol, +.editor-block-list__block li > ol, +.block-library-list li > ol { + margin-bottom: 0; +} + +.rtl .edit-post-visual-editor ul:not(.wp-block-gallery), +.rtl .editor-block-list__block ul:not(.wp-block-gallery), +.rtl .block-library-list ul, +.rtl .edit-post-visual-editor ol, +.rtl .editor-block-list__block ol, +.rtl .block-library-list ol { + margin-left: 0; + margin-right: 1.25em; + padding: 0; +} + +.rtl .edit-post-visual-editor ol, +.rtl .editor-block-list__block ol, +.rtl .block-library-list ol { + margin-left: 1.5em; + margin-right: 1.5em; +} + +/* Quotes */ + +.rtl .editor-block-list__block blockquote { + border-left: 0; + padding-left: 0; +} + +/* Captions */ + +[class^="wp-block-"] figcaption { + color: #686868; + font-style: italic; + line-height: 1.6153846154; + padding-top: 0.5384615385em; + text-align: left; +} + +.rtl [class^="wp-block-"] figcaption { + text-align: right; +} + +/*-------------------------------------------------------------- +3.0 Blocks - Common Blocks +--------------------------------------------------------------*/ + +/* Paragraph */ + +.wp-block-paragraph.has-drop-cap:not(:focus)::first-letter { + font-size: 5em; + line-height: 0.68; + margin: 0.05em 0.1em 0 0; + text-transform: uppercase; + font-style: normal; +} + +.rtl .wp-block-paragraph.has-drop-cap:not(:focus)::first-letter { + margin: 0.05em 0 0 0.1em; +} + +/* Quote */ + +.wp-block-quote { + border: 0 solid #1a1a1a; + border-left-width: 4px; + color: #686868; + font-style: italic; + line-height: 1.4736842105; + margin: 0 0 1.4736842105em; + overflow: hidden; + padding: 0 0 0 1.263157895em; +} + +.wp-block-quote:not(.is-large):not(.is-style-large).alignleft, +.wp-block-quote:not(.is-large):not(.is-style-large).alignright { + border-left: 0; + padding-left: 0; +} + +.editor-block-list__block .wp-block-quote p { + font-size: 19px; + font-size: 1.1875rem; + margin-bottom: 1.4736842105em; +} + +.wp-block-quote__citation { + color: #1a1a1a; + display: block; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +.wp-block-quote__citation:before { + content: "\2014\00a0"; +} + +.wp-block-quote em, +.wp-block-quote i, +.wp-block-quote__citation:before { + font-style: normal; +} + +.wp-block-quote strong, +.wp-block-quote b { + font-weight: 400; +} + +.wp-block-quote > :last-child { + margin-bottom: 0; +} + +.wp-block-quote.alignleft { + margin: 0.3157894737em 1.4736842105em 1.473684211em 0; +} + +.wp-block-quote.alignright { + margin: 0.3157894737em 0 1.473684211em 1.4736842105em; +} + +.wp-block-quote.aligncenter { + margin-bottom: 1.473684211em; +} + +.rtl .wp-block-quote:not(.is-large):not(.is-style-large).alignleft, +.rtl .wp-block-quote:not(.is-large):not(.is-style-large).alignright { + border-right: 0; + padding-right: 0; +} + +@media screen and (min-width: 44.375em) { + .wp-block-quote.alignleft, + .wp-block-quote.alignright { + border-width: 4px 0 0 0; + padding: 0.9473684211em 0 0; + width: -webkit-calc(50% - 0.736842105em); + width: calc(50% - 0.736842105em); + } + + .wp-block-quote:not(.alignleft):not(.alignright) { + margin-left: -1.473684211em; + } + + .rtl .wp-block-quote:not(.alignleft):not(.alignright) { + margin-left: 0; + margin-right: -1.473684211em; + } +} + +@media screen and (min-width: 80em) { + .editor-block-list__block .wp-block-quote.alignleft { + margin-left: -40%; + width: -webkit-calc(60% - 1.4736842105em); + width: calc(60% - 1.4736842105em); + } +} + +/* File */ + +.wp-block-file__textlink { + box-shadow: 0 1px 0 0 currentColor; + color: #007acc; +} + +.wp-block-file .wp-block-file__button { + background: #1a1a1a; + border: 0; + border-radius: 2px; + color: #fff; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-weight: 700; + letter-spacing: 0.046875em; + line-height: 1; + padding: 0.84375em 0.875em 0.78125em; + text-transform: uppercase; +} + +/*-------------------------------------------------------------- +4.0 Blocks - Formatting +--------------------------------------------------------------*/ + +/* Code */ + +.wp-block-code { + border: 0; + padding: 0.125em 0.25em; +} + +/* Classic */ + +.wp-block-freeform.block-library-rich-text__tinymce blockquote { + border: 0 solid #1a1a1a; + border-left-width: 4px; + color: #686868; + font-style: italic; + line-height: 1.4736842105; + margin: 0 0 1.4736842105em; + overflow: hidden; + padding: 0 0 0 1.263157895em; +} + +.editor-block-list__block .wp-block-freeform.block-library-rich-text__tinymce blockquote:not(.alignleft):not(.alignright) { + margin-left: 0; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote p { + font-size: 19px; + font-size: 1.1875rem; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote cite { + color: #1a1a1a; + display: block; + font-size: 16px; + font-size: 1rem; + font-style: normal; + line-height: 1.75; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote cite:before { + content: "\2014\00a0"; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote.alignleft { + margin: 0.3157894737em 1.4736842105em 1.473684211em 0; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote.alignright { + margin: 0.3157894737em 0 1.473684211em 1.4736842105em; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote.aligncenter { + margin-bottom: 1.473684211em; +} + +@media screen and (min-width: 44.375em) { + .wp-block-freeform.block-library-rich-text__tinymce blockquote.alignleft, + .wp-block-freeform.block-library-rich-text__tinymce blockquote.alignright { + border-width: 4px 0 0 0; + padding: 0.9473684211em 0 0; + width: -webkit-calc(50% - 0.736842105em); + width: calc(50% - 0.736842105em); + } +} + +.rtl .wp-block-freeform.block-library-rich-text__tinymce blockquote { + border-left-width: 0; + border-right-width: 4px; + overflow: hidden; + padding-left: 0; + padding-right: 1.263157895em; +} + +.rtl .wp-block-freeform.block-library-rich-text__tinymce .alignleft { + float: left; +} + +.rtl .wp-block-freeform.block-library-rich-text__tinymce .alignright { + float: right; +} + +.rtl .wp-block-freeform.block-library-rich-text__tinymce blockquote.alignleft { + margin: 0.3157894737em 0 1.473684211em 1.4736842105em; +} + +.rtl .wp-block-freeform.block-library-rich-text__tinymce blockquote.alignright { + margin: 0.3157894737em 1.4736842105em 1.473684211em 0; +} + +/* Pullquote */ + +.editor-block-list__block .wp-block-pullquote blockquote { + border: 0; + margin: 0; + padding: 0; +} + +.wp-block-pullquote blockquote > .editor-rich-text p { + font-size: 19px; + font-size: 1.1875rem; +} + +.wp-block-pullquote .wp-block-pullquote__citation { + color: #1a1a1a; + display: block; + font-size: 16px; + font-size: 1rem; + font-style: italic; + line-height: 1.75; + text-transform: none; +} + +.wp-block-pullquote .wp-block-pullquote__citation:before { + content: "\2014\00a0"; +} + +/* Table */ + +.editor-block-list__block table.wp-block-table th, +.editor-block-list__block table.wp-block-table td { + padding: 0; +} + +.rtl .wp-block-table th, +.rtl .wp-block-table td { + text-align: right; +} + +/*-------------------------------------------------------------- +5.0 Blocks - Layout Elements +--------------------------------------------------------------*/ + +/* Buttons */ + +.wp-block-button .wp-block-button__link { + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-weight: 700; + letter-spacing: 0.046875em; + line-height: 1; + padding: 0.84375em 1.3125em 0.78125em; + text-transform: uppercase; +} + +.wp-block-button__link { + background: #1a1a1a; + color: #fff; +} + +.is-style-outline .wp-block-button__link { + color: #1a1a1a; +} + +/* Media & Text */ + +.wp-block-media-text *:last-child { + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +6.0 Blocks - Widgets +--------------------------------------------------------------*/ + +/* Archives, Categories & Latest Posts */ + +[data-align="center"] .wp-block-archives ul, +[data-align="center"] .wp-block-categories ul, +[data-align="center"] .wp-block-latest-posts ul { + list-style-position: inside; +} + +/* Latest Comments */ + +.editor-block-list__block .wp-block-latest-comments__comment-meta a { + box-shadow: none; + font-weight: 700; + text-decoration: none; +} + +.wp-block-latest-comments__comment-date { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment { + border-top: 1px solid #d1d1d1; + margin-bottom: 0; + padding: 1.75em 0; +} + +.wp-block-latest-comments__comment-excerpt p:last-child { + margin-bottom: 0; +} + +/* Latest Posts */ + +.edit-post-visual-editor .wp-block-latest-posts.is-grid { + list-style: none; + margin-left: 0; + margin-right: 0; +} + +.edit-post-visual-editor .wp-block-latest-posts.is-grid li { + margin-bottom: 16px; +} diff --git a/wp-content/themes/twentysixteen/css/editor-style.css b/wp-content/themes/twentysixteen/css/editor-style.css new file mode 100644 index 0000000..a4cab64 --- /dev/null +++ b/wp-content/themes/twentysixteen/css/editor-style.css @@ -0,0 +1,547 @@ +/* +Theme Name: Twenty Sixteen +Description: Used to style the TinyMCE editor. +*/ + + +/** + * Table of Contents: + * + * 1.0 - Body + * 2.0 - Typography + * 3.0 - Elements + * 4.0 - Alignment + * 5.0 - Caption + * 6.0 - Galleries + * 7.0 - Audio / Video + * 8.0 - RTL + */ + + +/** + * 1.0 - Body + */ + +body { + color: #1a1a1a; + font-family: Merriweather, Georgia, serif; + font-size: 16px; + font-weight: 400; + line-height: 1.75; + margin: 20px 40px; + max-width: 600px; + vertical-align: baseline; +} + +body.post-type-page { + max-width: 840px; +} + + +/** + * 2.0 - Typography + */ + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + font-weight: 900; + margin: 56px 0 28px; +} + +h1 { + font-size: 33px; + line-height: 1.2727272727; +} + +h2 { + font-size: 28px; + line-height: 1.25; +} + +h3 { + font-size: 23px; + line-height: 1.2173913043; +} + +h4, +h5, +h6 { + font-size: 19px; + line-height: 1.1052631579; +} + +h4 { + letter-spacing: 0.13333em; + text-transform: uppercase; +} + +h6 { + font-style: italic; +} + +h1:first-child, +h2:first-child, +h3:first-child, +h4:first-child, +h5:first-child, +h6:first-child { + margin-top: 0; +} + +p { + margin: 0 0 28px; +} + +b, +strong { + font-weight: 700; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + border-left: 4px solid #1a1a1a; + color: #686868; + font-size: 19px; + font-style: italic; + line-height: 1.4736842105; + margin-bottom: 28px; + overflow: hidden; + padding: 0 0 0 24px; +} + +blockquote:not(.alignleft):not(.alignright) { + margin-left: -28px; +} + +blockquote blockquote:not(.alignleft):not(.alignright) { + margin-left: 0; +} + +blockquote:before, +blockquote:after { + content: ""; + display: table; +} + +blockquote:after { + clear: both; +} + +blockquote > :last-child { + margin-bottom: 0; +} + +blockquote cite, +blockquote small { + color: #1a1a1a; + font-size: 16px; + line-height: 1.75; +} + +blockquote em, +blockquote i, +blockquote cite { + font-style: normal; +} + +blockquote strong, +blockquote b { + font-weight: 400; +} + +blockquote.alignleft, +blockquote.alignright { + border: 0 solid #1a1a1a; + border-top-width: 4px; + padding: 18px 0 0; + width: -webkit-calc(50% - 14px); + width: calc(50% - 14px); +} + +address { + font-style: italic; + margin: 0 0 28px; +} + +code, +kbd, +tt, +var, +samp, +pre { + font-family: Inconsolata, monospace; +} + +pre { + border: 1px solid #d1d1d1; + font-size: 16px; + line-height: 1.3125; + margin: 0 0 28px; + max-width: 100%; + overflow: auto; + padding: 14px; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +code { + background-color: #d1d1d1; + padding: 2px 4px; +} + +abbr[title] { + border-bottom: 1px dotted #d1d1d1; + cursor: help; +} + +mark, +ins { + background: #007acc; + color: #fff; + padding: 2px 4px; + text-decoration: none; +} + +sup, +sub { + font-size: 75%; + height: 0; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -6px; +} + +sub { + bottom: -3px; +} + +small { + font-size: 80%; +} + +big { + font-size: 125%; +} + + +/** + * 3.0 - Elements + */ + +hr { + background-color: #d1d1d1; + border: 0; + height: 1px; + margin-bottom: 28px; +} + +ul, +ol { + margin: 0 0 28px 0; + padding: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li > ul, +li > ol { + margin-bottom: 0; +} + +li > ul, +blockquote > ul { + margin-left: 20px; +} + +li > ol, +blockquote > ol { + margin-left: 24px; +} + +dl { + margin: 0 0 28px; +} + +dt { + font-weight: bold; +} + +dd { + margin: 0 0 28px; +} + +table, +th, +td, +.mce-item-table, +.mce-item-table th, +.mce-item-table td { + border: 1px solid #d1d1d1; +} + +table a { + color: #007acc; +} + +table, +.mce-item-table { + border-collapse: separate; + border-spacing: 0; + border-width: 1px 0 0 1px; + margin: 0 0 28px; + width: 100%; +} + +table th, +.mce-item-table th, +table caption { + border-width: 0 1px 1px 0; + font-size: 16px; + font-weight: 700; + padding: 7px; + text-align: left; + vertical-align: baseline; +} + +table td, +.mce-item-table td { + border-width: 0 1px 1px 0; + font-size: 16px; + padding: 7px; + vertical-align: baseline; +} + +img { + border: 0; + height: auto; + max-width: 100%; + vertical-align: middle; +} + +a img { + display: block; +} + +figure { + margin: 0; +} + +del { + opacity: 0.8; +} + +a { + box-shadow: 0 1px 0 0 currentColor; + color: #007acc; + text-decoration: none; +} + +fieldset { + border: 1px solid #d1d1d1; + margin: 0 0 28px; + padding: 14px; +} + + +/** + * 4.0 - Alignment + */ + +.alignleft { + float: left; + margin: 6px 28px 28px 0; +} + +.alignright { + float: right; + margin: 6px 0 28px 28px; +} + +.aligncenter { + clear: both; + display: block; + margin: 0 auto 28px; +} + + +/** + * 5.0 - Caption + */ + +.wp-caption { + background: transparent; + border: none; + margin-bottom: 28px; + max-width: 100%; + padding: 0; + text-align: inherit; +} + +.wp-caption-text, +.wp-caption-dd { + color: #686868; + font-size: 13px; + font-style: italic; + line-height: 1.6153846154; + padding-top: 7px; +} + + +/** + * 6.0 - Galleries + */ + +.mce-content-body .wpview-wrap { + margin-bottom: 28px; +} + +.gallery { + margin: 0 -1.1666667%; + padding: 0; +} + +.gallery .gallery-item { + display: inline-block; + max-width: 33.33%; + padding: 0 1.1400652% 2.2801304%; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-columns-1 .gallery-item { + max-width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: 50%; +} + +.gallery-columns-4 .gallery-item { + max-width: 25%; +} + +.gallery-columns-5 .gallery-item { + max-width: 20%; +} + +.gallery-columns-6 .gallery-item { + max-width: 16.66%; +} + +.gallery-columns-7 .gallery-item { + max-width: 14.28%; +} + +.gallery-columns-8 .gallery-item { + max-width: 12.5%; +} + +.gallery-columns-9 .gallery-item { + max-width: 11.11%; +} + +.gallery .gallery-caption { + font-size: 13px; + margin: 0; +} + +.gallery-columns-6 .gallery-caption, +.gallery-columns-7 .gallery-caption, +.gallery-columns-8 .gallery-caption, +.gallery-columns-9 .gallery-caption { + display: none; +} + + +/** + * 7.0 - Audio / Video + */ + +.wp-audio-shortcode a, +.wp-playlist a { + box-shadow: none; +} + +.mce-content-body .wp-audio-playlist { + margin: 0; + padding-bottom: 0; +} + +.mce-content-body .wp-playlist-tracks { + margin-top: 0; +} + +.mce-content-body .wp-playlist-item { + padding: 10px 0; +} + +.mce-content-body .wp-playlist-item-length { + top: 10px; +} + + +/** + * 8.0 - RTL + */ + +.rtl blockquote { + border: 0 solid #1a1a1a; + border-right-width: 4px; +} + +.rtl blockquote.alignleft, +.rtl blockquote.alignright { + border: 0 solid #1a1a1a; + border-top-width: 4px; +} + +.rtl blockquote:not(.alignleft):not(.alignright) { + margin-right: -28px; + padding: 0 24px 0 0; +} + +.rtl blockquote blockquote:not(.alignleft):not(.alignright) { + margin-right: 0; + margin-left: auto; +} + +.rtl li > ul, +.rtl blockquote > ul { + margin-right: 20px; + margin-left: auto; +} + +.rtl li > ol, +.rtl blockquote > ol { + margin-right: 24px; + margin-left: auto; +} + +.rtl table th, +.rtl .mce-item-table th, +.rtl table caption { + text-align: right; +} diff --git a/wp-content/themes/twentysixteen/css/ie.css b/wp-content/themes/twentysixteen/css/ie.css new file mode 100644 index 0000000..ddf1210 --- /dev/null +++ b/wp-content/themes/twentysixteen/css/ie.css @@ -0,0 +1,48 @@ +/* +Theme Name: Twenty Sixteen +Description: Global Styles for older IE versions (previous to IE10). +*/ + +.site-header-main:before, +.site-header-main:after, +.site-footer:before, +.site-footer:after { + content: ""; + display: table; +} + +.site-header-main:after, +.site-footer:after { + clear: both; +} + +@media screen and (min-width: 56.875em) { + .site-branding, + .site-info { + float: left; + } + + .site-header-menu, + .site-footer .social-navigation { + float: right; + } + + .site-footer .social-navigation { + margin-left: 7px; + } + + .rtl .site-branding, + .rtl .site-info { + float: right; + } + + .rtl .site-header-menu, + .rtl .site-footer .social-navigation { + float: left; + } + + .rtl .site-footer .social-navigation { + margin-right: 7px; + margin-left: 0; + } +} diff --git a/wp-content/themes/twentysixteen/css/ie7.css b/wp-content/themes/twentysixteen/css/ie7.css new file mode 100644 index 0000000..97089a7 --- /dev/null +++ b/wp-content/themes/twentysixteen/css/ie7.css @@ -0,0 +1,176 @@ +/* +Theme Name: Twenty Sixteen +Description: IE7 specific style. +*/ + +.site-inner { + max-width: 656px; +} + +.post-navigation, +.pagination, +.image-navigation, +.entry-header, +.entry-summary, +.entry-content, +.entry-footer, +.page-header, +.page-content, +.post-thumbnail, +.content-bottom-widgets, +.comments-area { + margin-right: 28px; + margin-left: 28px; + max-width: 100%; +} + +.site-header, +.sidebar, +.site-footer, +.widecolumn { + padding-right: 28px; + padding-left: 28px; +} + +.search-submit { + height: auto; + margin-top: 28px; + padding: 15px 0 8px; + position: relative; + width: auto; +} + +.search-submit .screen-reader-text { + height: auto; + position: relative !important; + width: auto; +} + +.image-navigation .nav-previous, +.image-navigation .nav-next, +.comment-navigation .nav-previous, +.comment-navigation .nav-next { + *display: inline; + zoom: 1; +} + +.image-navigation .nav-previous + .nav-next, +.comment-navigation .nav-previous + .nav-next { + margin-left: 14px; +} + +.pagination .nav-links { + padding: 0; +} + +.pagination .page-numbers { + line-height: 1; + margin: -4px 14px 0; + padding: 18px 0; +} + +.pagination .prev, +.pagination .next { + display: inline-block; + font-size: 16px; + font-weight: 700; + height: auto; + left: 0; + line-height: 1; + margin: 0; + padding: 18px 14px; + position: relative; + right: 0; + text-transform: none; + width: auto; +} + +.dropdown-toggle { + display: none; +} + +.main-navigation ul ul { + display: block; +} + +.social-navigation { + margin-top: 1.75em; +} + +.social-navigation a { + height: auto; + padding: 3px 7px; + width: auto; +} + +.social-navigation .screen-reader-text { + height: auto; + position: relative !important; + width: auto; +} + +.site-header-main { + overflow : hidden; + zoom : 1; +} + +.entry-footer > span { + margin-right: 14px; +} + +.site-info .site-title { + font-size: 13px; + margin-right: 14px; +} + +.gallery-item { + max-width: 30%; +} + +.gallery-columns-1 .gallery-item { + max-width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: 46%; +} + +.gallery-columns-4 .gallery-item { + max-width: 22%; +} + +.gallery-columns-5 .gallery-item { + max-width: 17%; +} + +.gallery-columns-6 .gallery-item { + max-width: 13.5%; +} + +.gallery-columns-7 .gallery-item { + max-width: 11%; +} + +.gallery-columns-8 .gallery-item { + max-width: 9.5%; +} + +.gallery-columns-9 .gallery-item { + max-width: 8%; +} + +.rtl .image-navigation .nav-previous + .nav-next, +.rtl .comment-navigation .nav-previous + .nav-next { + margin-right: 14px; + margin-left: 0; +} + +.rtl .entry-footer > span { + margin-right: 14px; + margin-left: 0; +} + +.rtl .site-info .site-title { + margin-right: 0; + margin-left: 14px; +} diff --git a/wp-content/themes/twentysixteen/css/ie8.css b/wp-content/themes/twentysixteen/css/ie8.css new file mode 100644 index 0000000..261df7d --- /dev/null +++ b/wp-content/themes/twentysixteen/css/ie8.css @@ -0,0 +1,222 @@ +/* +Theme Name: Twenty Sixteen +Description: IE8 specific style. +*/ + +code { + background-color: transparent; + padding: 0; +} + +.entry-content a, +.entry-summary a, +.taxonomy-description a, +.logged-in-as a, +.comment-content a, +.pingback .comment-body > a, +.textwidget a, +.entry-footer a:hover, +.site-info a:hover { + text-decoration: underline; +} + +.entry-content a:hover, +.entry-content a:focus, +.entry-summary a:hover, +.entry-summary a:focus, +.taxonomy-description a:hover, +.taxonomy-description a:focus, +.logged-in-as a:hover, +.logged-in-as a:focus, +.comment-content a:hover, +.comment-content a:focus, +.pingback .comment-body > a:hover, +.pingback .comment-body > a:focus, +.textwidget a:hover, +.textwidget a:focus, +.entry-content .wp-audio-shortcode a, +.entry-content .wp-playlist a, +.page-links a { + text-decoration: none; +} + +.site { + margin: 21px; +} + +.site-inner { + max-width: 710px; +} + +.site-header { + padding-top: 3.9375em; + padding-bottom: 3.9375em; +} + +.site-branding { + float: left; + margin-top: 1.3125em; + margin-bottom: 1.3125em; +} + +.site-title { + font-size: 28px; + line-height: 1.25; +} + +.site-description { + display: block; +} + +.menu-toggle { + float: right; + font-size: 16px; + margin: 1.3125em 0; + padding: 0.8125em 0.875em 0.6875em; +} + +.site-header-menu { + clear: both; + margin: 0; + padding: 1.3125em 0; +} + +.site-header .main-navigation + .social-navigation { + margin-top: 2.625em; +} + +.header-image { + margin: 1.3125em 0; +} + +.site-main { + margin-bottom: 5.25em; +} + +.post-navigation { + margin-bottom: 5.25em; +} + +.post-navigation .post-title { + font-size: 28px; + line-height: 1.25; +} + +.pagination { + margin: 0 7.6923% 4.421052632em; +} + +.pagination .nav-links:before, +.pagination .nav-links:after { + display: none; +} + +/* restore screen-reader-text */ +.pagination .current .screen-reader-text { + position: absolute !important; +} + +.pagination .page-numbers { + display: inline-block; + font-weight: 400; +} + +.image-navigation .nav-previous, +.image-navigation .nav-next, +.comment-navigation .nav-previous, +.comment-navigation .nav-next { + display: inline-block; +} + +.image-navigation .nav-previous + .nav-next:before, +.comment-navigation .nav-previous + .nav-next:before { + content: "\002f"; + display: inline-block; + filter: alpha(opacity=70); + padding: 0 0.538461538em; +} + +.site-main > article { + margin-bottom: 5.25em; +} + +.entry-title { + font-size: 33px; + line-height: 1.2727272727; + margin-bottom: 0.8484848485em; +} + +.entry-content blockquote.alignleft, +.entry-content blockquote.alignright { + border-width: 4px 0 0 0; + padding: 0.9473684211em 0 0; + width: 50%; +} + +.entry-footer > span:after { + content: "\002f"; + display: inline-block; + filter: alpha(opacity=70); + padding: 0 0.538461538em; +} + +.updated { + display: none; +} + +.updated.published { + display: inline; +} + +.comment-author { + margin-bottom: 0; +} + +.comment-author .avatar { + height: 42px; + position: relative; + top: 0.25em; + width: 42px; +} + +.comment-list .children > li { + padding-left: 1.75em; +} + +.comment-list + .comment-respond, +.comment-navigation + .comment-respond { + padding-top: 3.5em; +} + +.comment-reply-link { + margin-top: 0; +} + +.comments-area, +.widget, +.content-bottom-widgets .widget-area { + margin-bottom: 5.25em; +} + +.sidebar, +.widecolumn { + margin-bottom: 5.25em; +} + +.site-footer .main-navigation, +.site-footer .social-navigation { + display: none; +} + +.rtl .site-branding { + float: right; +} + +.rtl .menu-toggle { + float: left; +} + +.rtl .comment-list .children > li { + padding-right: 1.75em; + padding-left: 0; +} diff --git a/wp-content/themes/twentysixteen/footer.php b/wp-content/themes/twentysixteen/footer.php new file mode 100644 index 0000000..f389fcf --- /dev/null +++ b/wp-content/themes/twentysixteen/footer.php @@ -0,0 +1,73 @@ + + + + +
            + + + + + + + + +
            + + + ' ); + } + ?> + + + +
            +
            + + + + + + diff --git a/wp-content/themes/twentysixteen/functions.php b/wp-content/themes/twentysixteen/functions.php new file mode 100644 index 0000000..561f00e --- /dev/null +++ b/wp-content/themes/twentysixteen/functions.php @@ -0,0 +1,587 @@ + tag in the document head, and expect WordPress to + * provide it for us. + */ + add_theme_support( 'title-tag' ); + + /* + * Enable support for custom logo. + * + * @since Twenty Sixteen 1.2 + */ + add_theme_support( + 'custom-logo', + array( + 'height' => 240, + 'width' => 240, + 'flex-height' => true, + ) + ); + + /* + * Enable support for Post Thumbnails on posts and pages. + * + * @link https://developer.wordpress.org/reference/functions/add_theme_support/#post-thumbnails + */ + add_theme_support( 'post-thumbnails' ); + set_post_thumbnail_size( 1200, 9999 ); + + // This theme uses wp_nav_menu() in two locations. + register_nav_menus( + array( + 'primary' => __( 'Primary Menu', 'twentysixteen' ), + 'social' => __( 'Social Links Menu', 'twentysixteen' ), + ) + ); + + /* + * Switch default core markup for search form, comment form, and comments + * to output valid HTML5. + */ + add_theme_support( + 'html5', + array( + 'search-form', + 'comment-form', + 'comment-list', + 'gallery', + 'caption', + 'script', + 'style', + ) + ); + + /* + * Enable support for Post Formats. + * + * See: https://wordpress.org/support/article/post-formats/ + */ + add_theme_support( + 'post-formats', + array( + 'aside', + 'image', + 'video', + 'quote', + 'link', + 'gallery', + 'status', + 'audio', + 'chat', + ) + ); + + /* + * This theme styles the visual editor to resemble the theme style, + * specifically font, colors, icons, and column width. + */ + add_editor_style( array( 'css/editor-style.css', twentysixteen_fonts_url() ) ); + + // Load regular editor styles into the new block-based editor. + add_theme_support( 'editor-styles' ); + + // Load default block styles. + add_theme_support( 'wp-block-styles' ); + + // Add support for responsive embeds. + add_theme_support( 'responsive-embeds' ); + + // Add support for custom color scheme. + add_theme_support( + 'editor-color-palette', + array( + array( + 'name' => __( 'Dark Gray', 'twentysixteen' ), + 'slug' => 'dark-gray', + 'color' => '#1a1a1a', + ), + array( + 'name' => __( 'Medium Gray', 'twentysixteen' ), + 'slug' => 'medium-gray', + 'color' => '#686868', + ), + array( + 'name' => __( 'Light Gray', 'twentysixteen' ), + 'slug' => 'light-gray', + 'color' => '#e5e5e5', + ), + array( + 'name' => __( 'White', 'twentysixteen' ), + 'slug' => 'white', + 'color' => '#fff', + ), + array( + 'name' => __( 'Blue Gray', 'twentysixteen' ), + 'slug' => 'blue-gray', + 'color' => '#4d545c', + ), + array( + 'name' => __( 'Bright Blue', 'twentysixteen' ), + 'slug' => 'bright-blue', + 'color' => '#007acc', + ), + array( + 'name' => __( 'Light Blue', 'twentysixteen' ), + 'slug' => 'light-blue', + 'color' => '#9adffd', + ), + array( + 'name' => __( 'Dark Brown', 'twentysixteen' ), + 'slug' => 'dark-brown', + 'color' => '#402b30', + ), + array( + 'name' => __( 'Medium Brown', 'twentysixteen' ), + 'slug' => 'medium-brown', + 'color' => '#774e24', + ), + array( + 'name' => __( 'Dark Red', 'twentysixteen' ), + 'slug' => 'dark-red', + 'color' => '#640c1f', + ), + array( + 'name' => __( 'Bright Red', 'twentysixteen' ), + 'slug' => 'bright-red', + 'color' => '#ff675f', + ), + array( + 'name' => __( 'Yellow', 'twentysixteen' ), + 'slug' => 'yellow', + 'color' => '#ffef8e', + ), + ) + ); + + // Indicate widget sidebars can use selective refresh in the Customizer. + add_theme_support( 'customize-selective-refresh-widgets' ); + } +endif; // twentysixteen_setup() +add_action( 'after_setup_theme', 'twentysixteen_setup' ); + +/** + * Sets the content width in pixels, based on the theme's design and stylesheet. + * + * Priority 0 to make it available to lower priority callbacks. + * + * @global int $content_width + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_content_width() { + $GLOBALS['content_width'] = apply_filters( 'twentysixteen_content_width', 840 ); +} +add_action( 'after_setup_theme', 'twentysixteen_content_width', 0 ); + +/** + * Add preconnect for Google Fonts. + * + * @since Twenty Sixteen 1.6 + * + * @param array $urls URLs to print for resource hints. + * @param string $relation_type The relation type the URLs are printed. + * @return array $urls URLs to print for resource hints. + */ +function twentysixteen_resource_hints( $urls, $relation_type ) { + if ( wp_style_is( 'twentysixteen-fonts', 'queue' ) && 'preconnect' === $relation_type ) { + $urls[] = array( + 'href' => 'https://fonts.gstatic.com', + 'crossorigin', + ); + } + + return $urls; +} +add_filter( 'wp_resource_hints', 'twentysixteen_resource_hints', 10, 2 ); + +/** + * Registers a widget area. + * + * @link https://developer.wordpress.org/reference/functions/register_sidebar/ + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_widgets_init() { + register_sidebar( + array( + 'name' => __( 'Sidebar', 'twentysixteen' ), + 'id' => 'sidebar-1', + 'description' => __( 'Add widgets here to appear in your sidebar.', 'twentysixteen' ), + 'before_widget' => '
            ', + 'after_widget' => '
            ', + 'before_title' => '

            ', + 'after_title' => '

            ', + ) + ); + + register_sidebar( + array( + 'name' => __( 'Content Bottom 1', 'twentysixteen' ), + 'id' => 'sidebar-2', + 'description' => __( 'Appears at the bottom of the content on posts and pages.', 'twentysixteen' ), + 'before_widget' => '
            ', + 'after_widget' => '
            ', + 'before_title' => '

            ', + 'after_title' => '

            ', + ) + ); + + register_sidebar( + array( + 'name' => __( 'Content Bottom 2', 'twentysixteen' ), + 'id' => 'sidebar-3', + 'description' => __( 'Appears at the bottom of the content on posts and pages.', 'twentysixteen' ), + 'before_widget' => '
            ', + 'after_widget' => '
            ', + 'before_title' => '

            ', + 'after_title' => '

            ', + ) + ); +} +add_action( 'widgets_init', 'twentysixteen_widgets_init' ); + +if ( ! function_exists( 'twentysixteen_fonts_url' ) ) : + /** + * Register Google fonts for Twenty Sixteen. + * + * Create your own twentysixteen_fonts_url() function to override in a child theme. + * + * @since Twenty Sixteen 1.0 + * + * @return string Google fonts URL for the theme. + */ + function twentysixteen_fonts_url() { + $fonts_url = ''; + $fonts = array(); + $subsets = 'latin,latin-ext'; + + /* + * translators: If there are characters in your language that are not supported + * by Merriweather, translate this to 'off'. Do not translate into your own language. + */ + if ( 'off' !== _x( 'on', 'Merriweather font: on or off', 'twentysixteen' ) ) { + $fonts[] = 'Merriweather:400,700,900,400italic,700italic,900italic'; + } + + /* + * translators: If there are characters in your language that are not supported + * by Montserrat, translate this to 'off'. Do not translate into your own language. + */ + if ( 'off' !== _x( 'on', 'Montserrat font: on or off', 'twentysixteen' ) ) { + $fonts[] = 'Montserrat:400,700'; + } + + /* + * translators: If there are characters in your language that are not supported + * by Inconsolata, translate this to 'off'. Do not translate into your own language. + */ + if ( 'off' !== _x( 'on', 'Inconsolata font: on or off', 'twentysixteen' ) ) { + $fonts[] = 'Inconsolata:400'; + } + + if ( $fonts ) { + $fonts_url = add_query_arg( + array( + 'family' => urlencode( implode( '|', $fonts ) ), + 'subset' => urlencode( $subsets ), + 'display' => urlencode( 'fallback' ), + ), + 'https://fonts.googleapis.com/css' + ); + } + + return $fonts_url; + } +endif; + +/** + * Handles JavaScript detection. + * + * Adds a `js` class to the root `` element when JavaScript is detected. + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_javascript_detection() { + echo "\n"; +} +add_action( 'wp_head', 'twentysixteen_javascript_detection', 0 ); + +/** + * Enqueues scripts and styles. + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_scripts() { + // Add custom fonts, used in the main stylesheet. + wp_enqueue_style( 'twentysixteen-fonts', twentysixteen_fonts_url(), array(), null ); + + // Add Genericons, used in the main stylesheet. + wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.4.1' ); + + // Theme stylesheet. + wp_enqueue_style( 'twentysixteen-style', get_stylesheet_uri(), array(), '20190507' ); + + // Theme block stylesheet. + wp_enqueue_style( 'twentysixteen-block-style', get_template_directory_uri() . '/css/blocks.css', array( 'twentysixteen-style' ), '20190102' ); + + // Load the Internet Explorer specific stylesheet. + wp_enqueue_style( 'twentysixteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentysixteen-style' ), '20170530' ); + wp_style_add_data( 'twentysixteen-ie', 'conditional', 'lt IE 10' ); + + // Load the Internet Explorer 8 specific stylesheet. + wp_enqueue_style( 'twentysixteen-ie8', get_template_directory_uri() . '/css/ie8.css', array( 'twentysixteen-style' ), '20170530' ); + wp_style_add_data( 'twentysixteen-ie8', 'conditional', 'lt IE 9' ); + + // Load the Internet Explorer 7 specific stylesheet. + wp_enqueue_style( 'twentysixteen-ie7', get_template_directory_uri() . '/css/ie7.css', array( 'twentysixteen-style' ), '20170530' ); + wp_style_add_data( 'twentysixteen-ie7', 'conditional', 'lt IE 8' ); + + // Load the html5 shiv. + wp_enqueue_script( 'twentysixteen-html5', get_template_directory_uri() . '/js/html5.js', array(), '3.7.3' ); + wp_script_add_data( 'twentysixteen-html5', 'conditional', 'lt IE 9' ); + + wp_enqueue_script( 'twentysixteen-skip-link-focus-fix', get_template_directory_uri() . '/js/skip-link-focus-fix.js', array(), '20170530', true ); + + if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { + wp_enqueue_script( 'comment-reply' ); + } + + if ( is_singular() && wp_attachment_is_image() ) { + wp_enqueue_script( 'twentysixteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20170530' ); + } + + wp_enqueue_script( 'twentysixteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20181217', true ); + + wp_localize_script( + 'twentysixteen-script', + 'screenReaderText', + array( + 'expand' => __( 'expand child menu', 'twentysixteen' ), + 'collapse' => __( 'collapse child menu', 'twentysixteen' ), + ) + ); +} +add_action( 'wp_enqueue_scripts', 'twentysixteen_scripts' ); + +/** + * Enqueue styles for the block-based editor. + * + * @since Twenty Sixteen 1.6 + */ +function twentysixteen_block_editor_styles() { + // Block styles. + wp_enqueue_style( 'twentysixteen-block-editor-style', get_template_directory_uri() . '/css/editor-blocks.css', array(), '20190102' ); + // Add custom fonts. + wp_enqueue_style( 'twentysixteen-fonts', twentysixteen_fonts_url(), array(), null ); +} +add_action( 'enqueue_block_editor_assets', 'twentysixteen_block_editor_styles' ); + +/** + * Adds custom classes to the array of body classes. + * + * @since Twenty Sixteen 1.0 + * + * @param array $classes Classes for the body element. + * @return array (Maybe) filtered body classes. + */ +function twentysixteen_body_classes( $classes ) { + // Adds a class of custom-background-image to sites with a custom background image. + if ( get_background_image() ) { + $classes[] = 'custom-background-image'; + } + + // Adds a class of group-blog to sites with more than 1 published author. + if ( is_multi_author() ) { + $classes[] = 'group-blog'; + } + + // Adds a class of no-sidebar to sites without active sidebar. + if ( ! is_active_sidebar( 'sidebar-1' ) ) { + $classes[] = 'no-sidebar'; + } + + // Adds a class of hfeed to non-singular pages. + if ( ! is_singular() ) { + $classes[] = 'hfeed'; + } + + return $classes; +} +add_filter( 'body_class', 'twentysixteen_body_classes' ); + +/** + * Converts a HEX value to RGB. + * + * @since Twenty Sixteen 1.0 + * + * @param string $color The original color, in 3- or 6-digit hexadecimal form. + * @return array Array containing RGB (red, green, and blue) values for the given + * HEX code, empty array otherwise. + */ +function twentysixteen_hex2rgb( $color ) { + $color = trim( $color, '#' ); + + if ( strlen( $color ) === 3 ) { + $r = hexdec( substr( $color, 0, 1 ) . substr( $color, 0, 1 ) ); + $g = hexdec( substr( $color, 1, 1 ) . substr( $color, 1, 1 ) ); + $b = hexdec( substr( $color, 2, 1 ) . substr( $color, 2, 1 ) ); + } elseif ( strlen( $color ) === 6 ) { + $r = hexdec( substr( $color, 0, 2 ) ); + $g = hexdec( substr( $color, 2, 2 ) ); + $b = hexdec( substr( $color, 4, 2 ) ); + } else { + return array(); + } + + return array( + 'red' => $r, + 'green' => $g, + 'blue' => $b, + ); +} + +/** + * Custom template tags for this theme. + */ +require get_template_directory() . '/inc/template-tags.php'; + +/** + * Customizer additions. + */ +require get_template_directory() . '/inc/customizer.php'; + +/** + * Add custom image sizes attribute to enhance responsive image functionality + * for content images + * + * @since Twenty Sixteen 1.0 + * + * @param string $sizes A source size value for use in a 'sizes' attribute. + * @param array $size Image size. Accepts an array of width and height + * values in pixels (in that order). + * @return string A source size value for use in a content image 'sizes' attribute. + */ +function twentysixteen_content_image_sizes_attr( $sizes, $size ) { + $width = $size[0]; + + if ( 840 <= $width ) { + $sizes = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px'; + } + + if ( 'page' === get_post_type() ) { + if ( 840 > $width ) { + $sizes = '(max-width: ' . $width . 'px) 85vw, ' . $width . 'px'; + } + } else { + if ( 840 > $width && 600 <= $width ) { + $sizes = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px'; + } elseif ( 600 > $width ) { + $sizes = '(max-width: ' . $width . 'px) 85vw, ' . $width . 'px'; + } + } + + return $sizes; +} +add_filter( 'wp_calculate_image_sizes', 'twentysixteen_content_image_sizes_attr', 10, 2 ); + +/** + * Add custom image sizes attribute to enhance responsive image functionality + * for post thumbnails + * + * @since Twenty Sixteen 1.0 + * + * @param array $attr Attributes for the image markup. + * @param int $attachment Image attachment ID. + * @param array $size Registered image size or flat array of height and width dimensions. + * @return array The filtered attributes for the image markup. + */ +function twentysixteen_post_thumbnail_sizes_attr( $attr, $attachment, $size ) { + if ( 'post-thumbnail' === $size ) { + if ( is_active_sidebar( 'sidebar-1' ) ) { + $attr['sizes'] = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 60vw, (max-width: 1362px) 62vw, 840px'; + } else { + $attr['sizes'] = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 88vw, 1200px'; + } + } + return $attr; +} +add_filter( 'wp_get_attachment_image_attributes', 'twentysixteen_post_thumbnail_sizes_attr', 10, 3 ); + +/** + * Modifies tag cloud widget arguments to display all tags in the same font size + * and use list format for better accessibility. + * + * @since Twenty Sixteen 1.1 + * + * @param array $args Arguments for tag cloud widget. + * @return array The filtered arguments for tag cloud widget. + */ +function twentysixteen_widget_tag_cloud_args( $args ) { + $args['largest'] = 1; + $args['smallest'] = 1; + $args['unit'] = 'em'; + $args['format'] = 'list'; + + return $args; +} +add_filter( 'widget_tag_cloud_args', 'twentysixteen_widget_tag_cloud_args' ); diff --git a/wp-content/themes/twentysixteen/genericons/COPYING.txt b/wp-content/themes/twentysixteen/genericons/COPYING.txt new file mode 100644 index 0000000..aece214 --- /dev/null +++ b/wp-content/themes/twentysixteen/genericons/COPYING.txt @@ -0,0 +1,9 @@ +Genericons is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + +The fonts are distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. + +This license does not convey any intellectual property rights to third party trademarks that may be included in the icon font; such marks remain subject to all rights and guidelines of use of their owner. \ No newline at end of file diff --git a/wp-content/themes/twentysixteen/genericons/Genericons.eot b/wp-content/themes/twentysixteen/genericons/Genericons.eot new file mode 100644 index 0000000000000000000000000000000000000000..7322565a01d25b8e3e8a69319593e5d3ccd59689 GIT binary patch literal 22374 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�?tPM9#*mhy-i22XlwWDitjkb7zKQL&(lu66l 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 Phwpv<4P3tWU# + + + + +Created by FontForge 20150618 at Fri Sep 18 10:24:13 2015 + By Joen Asmussen +Copyright (c) 2015, Joen Asmussen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wp-content/themes/twentysixteen/genericons/Genericons.ttf b/wp-content/themes/twentysixteen/genericons/Genericons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..017443851965255c626a5ad3537d3ed0b7c00f6a GIT binary patch literal 22188 zcmdsfd0-S(y6-u)bY)L^PdZyK>24rNC+U?02u*+h3HuUuWnUsoAb=>2)~G0mpfe~c zBH*}=+o&U`gG;XCzHkS(>*zQaX6CwGyyGZ(71G7~eN`1ioaO!dUUyg3sdG+!XZy~# zS2NBS%V#PR*~He?spHoF_iy?!)^R;@%O*^zi!Q2J{{mxt2JYuATsgn%mur80J7dBZ z$a{3*hIL*xLbfs{-HCE(>HO}l)29K6b!@?X*3uOhExGUbn8S?8?=d#|`elpfFUp!>rjG`y9EP&;}ebus+>o(5#V#-?FKY?T5iq#9}zqakehXDFs+}E$1zp;yb z%1fvW^}Va+uUtI&s>}84p3bx3BRev$Q@o7g9;NWZ5ixt^D15j{sz zzT($28U2XKx1g}XxQhS5mIyZVmdThW^TQ1w#@)mvBNt&kykEQf`k?32So%I*#)ac- z1lCcCB81KkDzNdi*_{PgA~Lrm{Em0pNLD0fAu9 z8Q*EfRd0`;RB_*Tu+t~0O|A;_^eI3on?mJOPo#Vs>Z({noY6OehcdmNl-f_Q&3wHS z&ruylb#VTQEunVlqqm8(K0>2(KWd?-l-A2qxSPsXnLT{b=mWvgAsJ^z_^BUd)CfKg z;EqydOk#xhUVJ6G{w@2<>@Q2c41JY#BKt(iiT)=VPmDP+^ThHK8@_e}Ccl6_h9 zrS~g#f}JQj;XP4*B7I`wiFqfwzGkOSpZ;^9R8UZmRUqW|&x_{OuBqv*0-(S*wVK1Y!};h*`Bxk!S1!s zu-|9@%;9lF9Bq#49eW**Ilgpyo!2^_aDL)E>2kPgTxnN_YmsZMYm4h6x63`%y~X`% zu~b}BJihpn;&)4IB`qa0N|uydQu6bX{UyKi*gS2XOFVCSKJjR!^`%owFD-qpw70CO zY+2csvZu<9msgZ`ly{ZiT>i(3Zz{c&k;*2JH*3q}X(#U=A-w_2vd~_&Fqt@p!g5(5 zvokla)aUfcPG3S!_?#R^5NRu}0=7~wC{jkHO_l*A%7EyIc;5Vg0?|jq!35g(3ci4A zM_XRWRwPK?Dxt{6qRDv3Z*hoq{1<%w;ltWK?L2MY;luppw|DJ&dzZq#&zVm(dJiLa z*V`aFL=6o?;ZeDu7*3+?b z`mhV9#X5FAw3GTHfLfn5f0#R~kE2U;&{qPiUbUBrm=%r`S7n@u#%ijjpDBg;!CGM7i1@I{&a9Og0~6&)7EDqABw5l?zuvU=T`(`?Ok$9VHGS>5zPzsx79 zaC5&GHtjohOkV?4!3tvyXkF1CM*$C5qsavN*_ZTzW~*C|Z|mGe#8^*g=ryhLw&Pnl z+tqnilA&ib2K1$b#c5q#PAhtpNG7bbsJL-E(Kl<{jrm83H-vOEPdTZ`g_f=Huy}~) z9O~>yui3jM-O<_8(RoPw=1@aNqn@F#Lz^{q{@&0{O;fo#Va=KenmV=VrqJH`T-|&W z7fs!K=+I`arq@p|K^;x6!%>H3j`b+iw;~q6c%ypXs=1Z>Qa&2AkrBWO1^m>nWXz&= z?%LI7s;#fRDitON4NA^xZ|6lb7A~AIyRIcTVU&#GQ#gd8_qv@&$QmpX3nl#b7kwYL!;0H##x&M%wreQ3P=@#&FK&bqWh+sVV{c`Wv-==cR&rtDu^*l+at4P2CM4M9KW{$PXE zA_)B^Hm1sQyZ24rx?p@XXtP9S=M>0AiCQT?P+BY~xgHz06ju!NN%{RN1{CC2t0pw$ z6nibPXHN0Pd$#F=!z3~w4M|>@(=29X<)AH5mSz(f3r16dXkm&gn6#y;Uqr7` zF3AlHZ5Cotmphp%;7U?a+gA#;v($%wr)fL1!`kVZnrV0ZZ0Lng2ZG*)`pfPeKcjs{ z^csH6pK_WOZfPICE%uWYj;W2SEcIREOP$N#e&f(>-NWvZL#++sj@3$j$!k~2)nfD) z=Pm5G@3q|i)ooiAHVsLYq|?j&pq$iS2L7R_ER35zVqo>zeM7(_V(wHZ00vSH3JIq9 z0|KFa#0&DYkE&blmd7nW@8>gWG%Zs@ltTeUIK@CZU*b|v-ryAfGADWd`Vq&q-b~}J zP8lWCF3Ifj$7t7!8=pvwf!c^SOPGmDF8cL$MQJY|Q>eYD_5AUV?%L7kUD}rF^mvrH zi~7Yq+0wV#k>1C}F}#io@p;onC(A9OsC{G&*7`*u8>-2fvDrbHeQXh1g_gaN3#6ey z3iz?3i)={_%;gpy1@7i@mz~>_sb(<|Cqj?~(h-ZgLsbF4WKp8AXmTh|x-5!C;dT*p zBe!)QXt2CE{WmU%|(Iv13^G-Oqn=@j>meFLvzsLi@wXH?+%I#n3gEOTxEb zcKw+LCJItffn9MIJGfi6$pw-kjBn!EtF%vVy+%8Icywt=a7DoHv==yP>Ur?tOQ$*t z9gfWtLKg%A$aGc<0eQ$bkH4>|fd1IQi$8h(?(ShbzTji^)-wgiwM~np^4ogrBCo^DKD{4Xv@_$jpRa2xfV6%L^|MEB&G@^xh;``3yzy zdwEV@rqZwa>fM>fPTu_ilwOk7ujOBXmu_bbYzVEQj_i;wKqw7_RwCJ0Mk2Amelg_> z#+(6XAQ4E!5;5U@A(S5)x#*HzlQ+D-_xuI7zqfY%D=oVPN4Be|#8pvIWm|mzqDA*F z9@aHFSt4nViFZSW!beiWvB|qGSu`?q{@(XDtp8x|`Qyjl!t<5ir9= zk|PI|yrEY|KZzfKm|31?BD0~d=&98gCU!^53-S-PkE}SMI#1^w&Y1Bmh^rsZl2IIc-;6wO%r-I@t1yeu%tR%+~w1{ z4;yb;W?(X*Wh;}w7r+a6v_dkrQz$H8XM{s3J0SpOme2w7NqYplA_BRy z097FbDabCs{vte)rG^c^e`v?NcQ!UHQ*4SNIs_%)nzkWTHFm{Kzy5O;OD)*4|G?Z$e|mP$%E5Ef z+J^%-?M&W#vG8!VZ+ZOMLl;br?fkdKh1Wm98xAge(gq&h) zcHoAmy2kCjb^FHYQNnGKCk)=V5D8tLC=v<;P>pahW!LeU)1X9SP%gI%WP_)Yp|DBK zfjSsHiP~5o$RC7TSink-Npgo6vVI^-n0)?*9qnbK%eGIt=-;oOG-&OfH@Y_**?Z}P z{+&y0WwKxuWVv9(D79zJ;yXGAPTX}~Vrnoix1nOx@Z_vSQC9XEyIVe>9p7`d&T%-c6E2$n=+%=3FTZZu z&Tnr_%udwpxo|+s^br@gS5LCrwcwNmTPJWg-*EVhfFQ8_!aQZ3ydRsZkY>qM1lhKz z%Dl=BKI6m*?cNiab!I}|Pq!z`J6vg=RqV~{l|1IhjU+-x3V?ctfh-UeQ~26#ZW~x8 zQpmDdHgQK$9@L|sXKq`u%0Fq2T+JD)Cg+XoD*Q=jN zE66~uJ+@EN?**KDA)3Mx!#V6tmVV%8G!E=qC=*bUf%_>d7zWUW1kZ#ukkAK}l7{nN zYSXPnwS&iQxw?Dq+!dS7KW}(T{Kd}p_DHQ&QMEzZ$69<(O^v5&hW1g?<*KY~Z2IXY zVSOf$PS2XT4b%Mt`r&4^It@ODelV}4$mLBIp-1{|^y)GP`sRv3`nLivtGVA&&K<5n zJeoY4gou^ebH_-9f@uCfwynpt&yH`kY5&unkXfR=J)xSXA5syG9W$QlJtnf&Cg@7g zod%7}&?C};zGvFecbFbISGeUg+rfU$cClO7ZR~b-7rPg;2V8VG>n-$iSQ?-+SQ;z} zQb;(7pkO*Jg`8XbVP0RyL*e>R0^5$JHx!N|fgKo1ATthiCQ+YEBpc#{K8a{bzfw8{ zu3ewv$*7yxyBg|UF)UTz*NK#~o_-Fuqrt_kaw?mEC&;cf>qZ) z0_TFjjWaHp7HdCiriF_f=qyqhiq8H}P5luRiClOF)rDt}bp{53qbdN!D?ZL#m^t+^ zugJW37r#;a)5pT7Pe1*XR}1pT+Mk4`yQD8=NvjnUflKrZH3~R-n*;&yxmKH-$KN9G zMzaE{P$hH^58*+Hza_~6m$`sjI_NQ~tDoP>&DCltg&YirAW|Dt4Nve1+8fXA<}!|b{QW+6cul(jzI08uSeMQEWvinS$Nz%6A6-xKDD z5Dw{#N3TYrIG_=5x+kV2LRrLE=ghsN%A9sOuK;uKV1fVYp?e1%9V>8*1Ip+$i17!w6A{shUr!52xc@}&V!k)HO#9$^aln9%ZR<8noi*=Qm$v72PFs^a;Gs&5<5)^^ro!!t1r-gf8!0O$BZs$ zbk5lMdROa~^-+v9N8s%%23@-;R(t7z71Rx>N^KfE;i5!g-pV_Aum1M+ ztFBysr!*53T!a>C#LS7cq% z=Ppx*D3_C8fmdJ?6vz=MNY;WZh+KNALP(~-o+?D>olJm0XEPkYbv} z3ehd^RZ7N;oH1gMr=YTW#p(;YmQ7FFY#_T?R);qjFORR9I?`tMjTk<#h!3@53N2qF^JbTWRVRpMz6pOdFP8l`2th7Y5dP=ghk16h^{^hx&hmXAXo`-*N^QJi- zrN5XrAUbXC6+0eZFmvmalwHoxS1j6p3yRC_tq4?<=h}plioASY?5{4Usuds2d?d)Z zl5DRXe!Mh7}r!VWW}B*-|wC}ZSCfX zH*TEW(4JQ_rF-XH&n%d$y*hQ-j3I;jg-bnddv><15HKSCDzCRW;&fG2)kdQA5Jf!U z{$twaEg8`g4wX4Y9BYYZfHbz5OVTZSyY&iU=ih{2N>D_ z&X#IuISxy}2Lca6q)x^4i6`qc7`rd(vZ$_biHnZ*M4BWGEj?`As96Klo`zNP(_8@s z@Xc&3%F5#V6YUZ!ZK%rfg^e?6ceeMd?o4R}QwEe*li5-wT-r(Dn zn9{9Vw8E^O4P~RD$81F}ljxSQY;gz%U@x#&_GyW(DpF@Gq%#Jw?jbCx3p|06x^=+e zlDNa2By)*{!H^HLZrl#hMISXdoGy3u=|!jqD?`#PH$yL`seqOc4vH=}-B)nw<-!3K zg&j{G>L{!jP&n|qpJ{(>iA07Ci$q%Zh&e4Sb6Nynbz}e9$|;#`_w&Gg_h}#A|A6-4 zefRM|=1=|Vrj^(9Z<1@V5JPM49vCTD_k#9?_OABD3+s!@t4lUaX_!*>_Mjdm z2%Ip6xm=$%w^NakVdz-lgga#vN|Rhcm%onlIk(Lnsm@7qrEWx>{L;2okO{)w&O-kX50Ny1cDBadg``CpQk{L-OUgd8z_Jb;@mlPTuFg+0`k&A8PLm zYVT|B2RqwCe7S6G9MNc%72T|UM0fhkKSFl&%-vK$`+x&=@xU&rJP;_C&e^M|tIkj#5#m5Ty#c_P5eNpp*~I zbrmUW!2(UwnjH>jKc`K|(i)5MMOmrtCp+CWHD%iBU%M*3w%#m@3{)yE@Dyb2$#(?& zrQuRv9{J!n6#X9EA9S|%ca}3mx2ODF=ZER-AQ&oqhN|vUV%$g8B{%$qVoc}}drreY z2*(WX$>_GLj0&rdO5SxH-$5hsg>;+;Fg|NG?{fr7*a{h@G4VBMgq`gcBs0k3DsI|4 z4V#v#)7L^)$%24JcFjI%n#`Jp_Yam!7&#@o70Q-XY=GlMeyXeMDeaW@C+*bJt5-kG zZ&?4%t+Qv}`p)`2+Bds*^PE5M0kgG76t?M{5>%iYp;M`R-h9g{NFmSmopVk3!|F%(1FLO<{kYW1#TuV?yPDU}xw+vCUTe zSmx+~5YjW~STJ~?q@|_!fKZ9#!60^*xi@t>UxdgRMy3il z46v1|;I)ULpTVXL3I+}Z+Q(GQdh?U!{^0|8&hFK{t2Z7#ad;!0I0pRJ)!12j3AWCj zCvWDjnS~oSp0Q5@=cz4yq~|mTSH9j9OzAE=!VY9B|Lc$1%(R|?nI)*=YR&qicD3)m z?^TvQ$EIyu-*08CA4X~g>4Gc9mmqTVPx>KZF|kmzb>S-br`@siRm3Bif6*_@y^LN| zXEDn=@a>nu?-+z_3;usH6oj*R5-T8PV+&&9vq6?%U52UwzdwwRf-ZM~`O5s1CNI)X zK<+uQShMhxi+LU&!1IE9y|#Va3-3KYR=bw39rwbD6)#N4Ffwz&a5Z12tumg}ECHahvpOpg#5_S)P$+bUxB_gNatz@WNP{87zW*YEKqosydQ{HZ6C4De7=q`t zN$|ldhzaNw&=Ot25)Odq;@6W&lL{i>+IOG}ptt3a8+I``8nd|_KQ5PYg=tlfYe6me zxK<^Mee5ymGVNgIQ$ALEOmOoyF1RzF5^Yg+c|pb0LNUcI1K|y0<5|J=5o^O#5gW#W zU>N*hpw9I09u4!*Cm)l%fL0+6XLI}zT?0TFd_{auBCS$jO%I(ic#KK<{PkFR@LU!v zAUk)qK)c(G<*XBwAn*}$)YGeKX;IBQI8T_8*{{w^&r|t0q~}@CI>K~%FnTKMou`-O zQ;{h@selc45cNe5^HE?XC$R@)D4o%tq^|IuvuRx(_I4FU5!GWgd~u-)Q8-{@9`5wT zb2uUe0ya{Pz}Pu6d=71=5eK#RcSraRK8csTxau^UbJypvlOK4fYkwDha$mT_@A!hl zB3t#M_809}+S(%z@pfMF`CW5*RlOd=M?C!EM~)_$EZ|*p8$0tu#WI%NETRqPARHK5^!5e)pA6J#{4@D~!17 z`nOQPZ<_el`aL`+<9Ui_Jw?G(m~vqr(KGodwg`hT5#TAetm@nBsCraBIxoZcezgZ{ z#ef^s4?~t>C0Hz4FS=&2Z&5}EC;)9!96)iLX@A0(MbFt`VPZUtU0pzSVYd~FNJAhy zh}&na1cH%r8@3`$iU0Y}g8E6_h~V$b4InlGkW5phgMOZr5yL4 zM7lPQd_?`DCZUwY8VKjlQC9_Fpufm zQk9Tn_7jMt({&mjqmcz^PwD@}!}ge%u~T)Vy>L5a;=L}o(bKYKF*cD7Cv zY52yt3`sd7-tLz zT}8v}6b^$8X}U@Rsz-`P8kB;{u?YGToY+q&t{E4^KagN7>0&c+Bm*if88HnKwXv93 zI0iaH@!n*eFxX){Ifxr_g<)fYP@{FCOn_D*2M4no^?^vrEl}0Snc9X z$M!Y1=zCLDxFTa6C~nf_Ao)8CRDc^L4goys79o~f4z{;{+IFN}Yt)YNmv~#-r|oaI z&DejM?U(nozl9=L7#g{kir&UuTV~gO&h}$HIPoqSUs{sB`4^3j$VP_-m|Huzv z^MQk*@q~{{jDN1#r}OC)qN@E;eo(V(_6|N><A=FB2y7o(o zLgmw^Yj*j;4(*qCwu668Z3t=52tx`b2FXDpGCi3dmG?kv%=8G5eA0S7%(9%Os_08L zs_9k&A&oEUB3e>NXL=YuoKB)Ds!U)E7)%Y*LD^iwB@3lg2Hd7i+E-@E2{M&oL9<2b zyh=hDDNd)5OM4W7xqyR+Izg3HR6AGy3m~$qn$>~lq;ySC*8@r4qa%fYoId@pFYjO7 zLn1LhnZ8tSU(T5XCe8d1&KjS;mqOPWVzo(v!NL=TDaE9mQMU-#4WaAcVCU z4eC-ESpoangoX$Hu72O}0hNTvu9p*?p|N2M#Lp>6o37l4FjW!&Bk;%K8PF+# z>6czC@>QSy>@@q?r&mE3R7q-uCEU1XUb|WQ`q$;!S3JM`*E|=vpknLL`ddsbj_9*V z0012_@%Kak<_g_}3MwF>dkDM6S=6VGLa>d1UyJ3?=9;Oa$_=6*plb&0;$*fVK7xza zyZMm2y27Lp7_&)xbh%EaJysv};~%wd&>+YzW*>}Y{b9>GIWkD+-)R#zCsUTr*5fy< zNkJgPjF3iB z1w(qE^7c;t8u4JP$XU2z$Wg!#!ga!qK2}d;nhuh!&&XU1*kq+QM~t^ebh#1K#L`FS zsn}-~QQ;&t&-&;+hIDRSZsm4V=BTS0!i5ZErU&rR<#}Ci25-^dp8$TE?@wS&h}D9T z{sWrZXPBVQkOSikt$WQNx|p0S5Wtgq5morMkLc>-1wAz3TcBML&DCjY_76xq4U@hg zy?xCICUF(cG)ZHlg@C!;Xc~J~r>-J)htWJ9Qe{Tu=}b3h{Ac5x{an10XjhVx4)U7M z8H40@F5U@C^^vOkwH|fFXlLq?#LILYgWe&69{Km$Fg(}TRpiP>FcXA5`j+z;d9YK-f6zXEHaKAkDgPPDxyBD2v~UuD0_-gU6On>FWEB~ z_zVM3@_yNv3y;URkH_pd!hxWj2Y9TMk`@w~p$sv#gHP4|``v0a^H~QdH+~&Mafi)< zz7R7rDw=7%?_Z(s`Ia5z$si51SwQS2d{`CW*694kF@wTaKKaa;+ixH9%oCgY4ITsL zvUucgU%ItP^I&-1gX5|ECW_$-5upy1Ko6b?c}V&9TNnpfT3GVw9dkg7QfwW9N}ZN{4tRMe}dc zRPZX=d$7__EA-{mBE>iR5H>diyAgoM_j#I004B1=fn6Ea6^xaTnuj^XuqEIe;bHss z)S5L_v(AsI#NSj?cG7JP=b|$rbhsB&F8dI80aKKPkxbmHpSK?8uH#$DOA2{K`T^e3 zTYH!^647^clD>iW)2Cw$MX>$(X$(4*v?xwJ1SJ46f|z>*|5Wo5BN+fwUwUHo>iH8_ z&i~7AwMm>^zG!Ac!?N`|7ted$qPC8_W$Bd#O378LZ+k>|V#uhL@^Yo8^D z!z$WSv0q^W=K(RM_);-@Amx*1s9&i4v~)kZK)u97>6!$dF>Kx{`Y7Tl&>))UzQ7U= zYcT>bRpPY#fXR=sS$oK8d7L9y?j;1vrk$$*!!UFU?(#s3Y|M!jgid0| z`#xAcND|q+KPTD?+N1=tIaGR}C6F2C@ANg3kpg`no`-_(a3b2t8Re5;tfBQj!wao2 zDiID)74T?K6!hh6zHDRv#@N|B%pJBUL-laWFl^I>yiORZxQ8N$J5MI3zS+rl3Rq#mze#E%HmMnHi*uCR_|8P#MB+Kp; z%ah)eVha>FJOQ4g1ak%_WkqlWajxa$9XVDTm#aXDw3fcDc}McNBXDd+PgDdn>9v*|rJwMJ?7GYo5C* zvT(}Jw9}7P$mm9K+awU7yuo0EBWw+IXO@keU?HtV z=Rs%NkT4p9m*`hYCydZG&8{CShfI9eacPl(LUWwQo{rKdD-- zeX(fR2x!a(PT&uEfDdG~q}W!(eA*Bu1SCM5TbNvYRbhI=#>lYYHB&uuXb?xhFrR3<^8K?Gz~+DXEJR-2qJ2H{3fwH5=_`1H z#I&CB+i<)1fzP@0`2&lQ+*6iOcV~vo`f|(c2Y)uG-?rcAPK9A@OSRM6b$ID_@4xVx ztrtG~Q6K_WE?3bgM@PLb$Nr8U&BmXLQ*qU*6F+qhy@e+_3j&{iBURWY~x@@=;s z(bmFy` zle5m46VONVOrjIXNi<7i51-vX z-R9c&w5WITTo`Zlb@9i*w0_h-zLfY2W>xpMyCC7ipUo2pjfFl0UQ2Y^N7#Xg5vyMb zg+Z376z_n$+z21RtF*MHr**Xp|8>Dhec07GYjpqVSAf`3SuZp0G!?S3PRMk&%t4MotzNV-3wUf@^NFgGc#;^q#`;VhG4bO1MNADt&_t+In;!EKGDMKl#qE|`j zg#wowB$i@@+)Ekm?g?e@?9qA|;&lc)IkpYjLf2k`3JTXgWZPd%*-Ct*Z-IWt_Gd1}{N zZvp5TTaxKtJ`+Gh%o^-j#`0@WCclp*m5@WhEyRP{;bNjQdR)LB0&L^sV-CNnLYfzyd$50 zf5FSzP;W8*HNnetzhXWTt$O8k z`gJX8EY`afLC3rZ!}b1Mz(z>}#Oqr8^+xTPVZhL_YF+E%^3|)n_4N&r`uck0{L2{t?bAQt zAWMwYIp>>jPbjLtbct6kW&Blz!n1fb!bx)x)0hvjxR4idEB=GU&K=x|Kc{i?V%RM_ zycC?01kg(EDejQ&L%On40@yap3qg9)#}gx6rgYcSz8nD81*cu^Bx)Pxr` z;YCe&Q4?O&gcmj7#msTV%yGr)jpt(KxMJqGV&=GF=D1?!xMJqG;wGH92`6sCiJNfZ zCY-nlCvL)tn{eW1;27hHoAVPl=O=E?Pu!fJxH&&@bAICH{KU=qiJS8iH|HmA&QIK& zpSU?cadUp+=KRFX`H7qJ6OS769giCG9gmv*iy8ABj~VkFj~Vk8j~VkFj~VkFj~VkF zj~VkFkD2gdCcKylFK)t%oABZ$ytoN3Zo-S3@Zu)CxCt+A!i$^m5+=Na2`^#7OPKHy zCcK0RFJZzF!3y5;#tDPGrS9K)-#^NyZ`3B(T{|QX9;s3ChCWoFh Gt^Ws)-B^wQ literal 0 HcmV?d00001 diff --git a/wp-content/themes/twentysixteen/genericons/Genericons.woff b/wp-content/themes/twentysixteen/genericons/Genericons.woff new file mode 100644 index 0000000000000000000000000000000000000000..0e7212af75273146e900bb3f0dbe2c83b0913e23 GIT binary patch literal 13988 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 literal 0 HcmV?d00001 diff --git a/wp-content/themes/twentysixteen/genericons/LICENSE.txt b/wp-content/themes/twentysixteen/genericons/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/wp-content/themes/twentysixteen/genericons/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/wp-content/themes/twentysixteen/genericons/README.md b/wp-content/themes/twentysixteen/genericons/README.md new file mode 100644 index 0000000..4aa8cc0 --- /dev/null +++ b/wp-content/themes/twentysixteen/genericons/README.md @@ -0,0 +1,218 @@ +# Genericons + +Genericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic. + +Use genericons for instant HiDPI, to change icon colors on the fly, or even with CSS effects such as drop-shadows or gradients! + + +## Usage + +To use it, place the `genericons` folder in your stylesheet directory and enqueue the genericons.css file. Now you can create an icon like this: + +``` +.my-icon:before { + content: '\f101'; + font: normal 16px/1 'Genericons'; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +``` + +This will output a comment icon before every element with the class "my-icon". The `content: '\f101';` part of this CSS is easily copied from the helper tool at http://genericons.com/, or `example.html` in the `font` directory. + +You can also use the bundled example.css if you'd rather insert the icons using HTML tags. + + +## Building your own Genericons + +In the `source` directory, you'll find all Genericons source icons in SVG format. This will allow you to bake your own flavor of Genericons using a tool such as FontCustom (http://fontcustom.com) or Fontello (http://fontello.com). Perhaps you need more logos than are available in the base Genericons package? Just add those logos and bake your own expanded set. Maybe you need just a few of the icons Genericons provides, but would like to trim the fat? Remove the ones you won't need! + + +### FontCustom instructions + +FontCustom is a powerful commandline tool which which bakes icon fonts from the SVG source files. It's the tool Genericons is built on, and it provides highly accurate and perfectly crisp icons, *provided all SVGs have the same pixel height*. + +It's not that hard to use, and once it's installed you'll never think of icon-fonts the same way again. Seriously, you should try it. Icon fonts for everyone! + +1. Install FontCustom. Follow the instructions on the website: http://fontcustom.com/ +2. In the `source` directory from the Genericons download, open the file called `fontcustom.yml` in a text editor. Customize the `font_name` and `css_selector`. +3. Open a terminal. Browse to the `source` directory. Type `fontcustom compile`. + +You'll now receive a brand new subdirectory called `fontcustom-webfont`. Inside here you'll find your very own flavor of Genericons, with only the icons you want, including a handy example page that'll help you copy/paste the necessary glyphs or CSS values. + +*Please note*: In the source directory, there's a hidden file called `.fontcustom-manifest.json`. This file is auto-generated by the FontCustom tool, and holds codepoints (unicode addresses) for every glyph, so its address doesn't change when you add or remove icons. If you feel the need to "start fresh" with the unicode addresses, you should delete this file. + + +### Fontello instructions + +Fontello is very easy to use. Just drop the SVG files of the icons you want onto their website and download the font. The downside is that Fontello seems to ignore the 16px pixelgrid, so you'll end up with fuzzy icons. Buyer beware. + + +## Notes + +**Photoshop mockups** + +The `Genericons.ttf` file can be placed in your system fonts folder and used Photoshop or other graphics apps if you like. + +If you're using Genericons in your Photoshop mockups, please remember to delete the old version of the font from Font Book, and grab the new one from the zip file. This also affects using it in your webdesigns: if you have an old version of the font installed locally, that's the font that'll be used in your website as well, so if you're missing icons, check for old versions of the font on your system. + +**Pixel grid** + +Genericons has been designed for a 16x16px grid. That means it'll look sharp at font-size: 16px exactly. It'll also be crisp at multiples thereof, such as 32px or 64px. It'll look reasonably crisp at in-between font sizes such as 24px or 48px, but not quite as crisp as 16 or 32. Please don't set the font-size to 17px, though, that'll just look terrible blurry. + +**Antialiasing** + +If you keep intact the `-webkit-font-smoothing: antialiased;` and `-moz-osx-font-smoothing: grayscale;` CSS properties. That'll make the icons look their best possible, in Firefox and WebKit based browsers. + +**optimizeLegibility** + +Note: On Android browsers with version 4.2, 4.3, and probably later, Genericons will simply not show up if you're using the CSS property "text-rendering" set to "optimizeLegibility. + +**Updates** + +We don't often update icons, but do very carefully when we get good feedback suggesting improvements. Please be mindful if you upgrade, and check that the updated icons behave as you intended. + +**Base64 encoding** + +By default, Genericons ships with a stylesheet that includes a base64 encoded version of the font. This is to sidestep issues with cross-origin requests for fonts, that happen when a stylesheet loads a font that's stored on a different domain or subdomain. This is very common when using caching plugins. + +Base64 encoding comes with a 25% filesize overhead compared to just loading the WOFF file directly. If you know that you won't be loading fonts across domains, or have the ability to edit your server config files to allow it, you can get slightly faster performance by loading Genericons without the base64 encoding. Simply edit `genericons.css` and edit the `@font-face` declaration to match this: + +``` +@font-face { + font-family: 'Genericons'; + src: url('Genericons.woff') format('woff'), + url('Genericons.ttf') format('truetype'), + url('Genericons.svg#genericonsregular') format('svg'); + font-weight: normal; + font-style: normal; +} +``` + + + +## Changelog + +**3.4.1** + +* IE8 support restored. + +**3.4** + +* Updated: Update Google Plus icon to new geometric version. This also *retires* the "alt" version, so *please be mindful if you choose to update, make sure you use the `f206` glyph, not the `f218` glyph, as it no longer exists! +* New: Added helper rotation classes to the base CSS, thanks to geminorum. Apply `genericon-rotate-90` to rotate 90 degrees, -180, -270. Or `genericon-flip-horizontal` or -vertical. + +*Again, it is important if you choose to update to this version, make sure you're not using `genericon-googleplus-alt` or unicode character `f218`, as that has been retired! Use `genericon-googleplus` and glyph `f206` instead!* + +**3.3.1** + +Security Hardening: Remove Genericons example.html file. Please visit genericons.com instead. + +**3.3** + +The Open Source release. + +You can now build your own flavors of Genericons with all the SVGs provided. + + +**3.2** + +A number of new icons and a couple of quick updates. + +* New: Activity +* New: HTML anchor +* New: Bug +* New: Download +* New: Handset +* New: Microphone +* New: Minus +* New: Plus +* New: Move +* New: Rating stars, empty, half, full +* New: Shuffle +* New: video camera +* New: Spotify +* New: Twitch +* Update: Fixed geometry in Edit icon +* Update: Updated Foursquare icon +* IE8 bugfix, slipstreamed into this. + +Twitch and Spotify mark the last social icons that will be added to Genericons. +Future social icons will have to happen in a separate font. + +**3.1** + +Genericons is now generated using a commandline tool called FontCustom. This makes it far easier to add new icons to the font, but the switch means the download zip now has a different layout, fonts have different filenames, there's now no .otf font included (but the .ttf should suffice), and the font now has slightly different metrics. I've taken great care to ensure this new version should work as a drop-in replacement, but please be mindful and test carefully if you choose to upgrade. + +* Per feedback, the baked-in 16px width and height has been removed from the helper CSS. It wasn't really necessary (the glyph itself has these dimensions naturally), and it caused some headaches. +* Base64 encoding is now included by default in the helper CSS. This makes it drop-in easy to get Genericons working in Firefox even when using a CDN. +* Title attribute on website tool. +* New: Website. +* New: Ellipsis. +* New: Foursquare. +* New: X-post. +* New: Sitemap. +* New: Hierarchy. +* New: Paintbrush. +* Updated: Show and Hide icons were updated for clarity. + +**3.0.3** + +Bunch of updates mostly. + +* Two new icons, Dropbox and Fullscreen. +* Updates to all icons containing an exclamation mark. +* Updates to Image and Quote. +* Nicer "Share" icon. +* Bigger default Linkedin icon. + +**3.0.2** + +A slew of new stuff and updates. + +* Social icons: Skype, Digg, Reddit, Stumbleupon, Pocket. +* New generic icons: heart, lock and print. +* New editing icons: code, bold, italic, image +* New interaction icons: subscribe, unsubscribe, subscribed, reply all, reply, flag. +* The hyperlink icon has been updated to be clearer, chunkier. +* The "home" icon has been updated for style, size and clarity. +* The email icon has been updated for style and clarity, and to fit with the new subscribe icons. +* The document icon has been updated for style. +* The "pin" icon has been updated for style and clarity. +* The Twitter icon has been scaled down to fit with the other social icons. + +**3.0.1** + +Mostly maintenance. + +* Fixed an issue with the example page that showed an old "top" icon instead of the actual NEW "refresh" icon. +* Added inverse Google+ and Path. +* Replaced tabs with spaces in the helper CSS. +* Changed the Genericons.com copy/paste tool to serve span's instead of div's for casual icon insertion. It's being converted to "inline-block" anyway. + +**3.0** + +Mainly maintenance and a few new icons. + +* Fast forward, rewind, PollDaddy, Notice, Info, Help, Portfolio +* Updated the feed icon. It's a bit smaller now for consistency, the previous one was rather big. +* So, the previous version numbering, 2.09, wasn't very PHP version compare friendly. So from now on it'll be 3.0, 3.1 etc. Props Ipstenu. +* Genericons.com now has a mini release blog. +* The CSS has prettier formatting, props Konstantin Obenland. + +**2.09** + +Updated Facebook icon to new version. Updated Instagram logo to use new one-color version. Updated Google+ icon to use same radius as Instagram and Facebook. Added a bunch of new icons, cog, unapprove, cart, media player buttons, tablet, send to tablet. + +**2.06** + +Included Base64 encoded version. This is necessary for Genericons to work with CDNs in Firefox. Firefox blocks fonts linked from a different domain. A CDN (typically s.example.com) usually puts the font on a subdomain, and is hence blocked in Firefox. + +**2.05** + +Added a bunch of new icons, including upload to cloud, download to cloud, many more. + +**2.0** + +Initial public release diff --git a/wp-content/themes/twentysixteen/genericons/genericons.css b/wp-content/themes/twentysixteen/genericons/genericons.css new file mode 100644 index 0000000..a91abdd --- /dev/null +++ b/wp-content/themes/twentysixteen/genericons/genericons.css @@ -0,0 +1,263 @@ +/** + + Genericons + +*/ + + +/* IE8 and below use EOT and allow cross-site embedding. + IE9 uses WOFF which is base64 encoded to allow cross-site embedding. + So unfortunately, IE9 will throw a console error, but it'll still work. + When the font is base64 encoded, cross-site embedding works in Firefox */ +@font-face { + font-family: "Genericons"; + src: url("./Genericons.eot"); + src: url("./Genericons.eot?") format("embedded-opentype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "Genericons"; + src: url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff"), + url("./Genericons.ttf") format("truetype"), + url("./Genericons.svg#Genericons") format("svg"); + font-weight: normal; + font-style: normal; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "Genericons"; + src: url("./Genericons.svg#Genericons") format("svg"); + } +} + + +/** + * All Genericons + */ + +.genericon { + font-size: 16px; + vertical-align: top; + text-align: center; + -moz-transition: color .1s ease-in 0; + -webkit-transition: color .1s ease-in 0; + display: inline-block; + font-family: "Genericons"; + font-style: normal; + font-weight: normal; + font-variant: normal; + line-height: 1; + text-decoration: inherit; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + speak: none; +} + + +/** + * Helper classes + */ + +.genericon-rotate-90 { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); +} + +.genericon-rotate-180 { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); +} + +.genericon-rotate-270 { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); +} + +.genericon-flip-horizontal { + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.genericon-flip-vertical { + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} + + +/** + * Individual icons + */ + +.genericon-404:before { content: "\f423"; } +.genericon-activity:before { content: "\f508"; } +.genericon-anchor:before { content: "\f509"; } +.genericon-aside:before { content: "\f101"; } +.genericon-attachment:before { content: "\f416"; } +.genericon-audio:before { content: "\f109"; } +.genericon-bold:before { content: "\f471"; } +.genericon-book:before { content: "\f444"; } +.genericon-bug:before { content: "\f50a"; } +.genericon-cart:before { content: "\f447"; } +.genericon-category:before { content: "\f301"; } +.genericon-chat:before { content: "\f108"; } +.genericon-checkmark:before { content: "\f418"; } +.genericon-close:before { content: "\f405"; } +.genericon-close-alt:before { content: "\f406"; } +.genericon-cloud:before { content: "\f426"; } +.genericon-cloud-download:before { content: "\f440"; } +.genericon-cloud-upload:before { content: "\f441"; } +.genericon-code:before { content: "\f462"; } +.genericon-codepen:before { content: "\f216"; } +.genericon-cog:before { content: "\f445"; } +.genericon-collapse:before { content: "\f432"; } +.genericon-comment:before { content: "\f300"; } +.genericon-day:before { content: "\f305"; } +.genericon-digg:before { content: "\f221"; } +.genericon-document:before { content: "\f443"; } +.genericon-dot:before { content: "\f428"; } +.genericon-downarrow:before { content: "\f502"; } +.genericon-download:before { content: "\f50b"; } +.genericon-draggable:before { content: "\f436"; } +.genericon-dribbble:before { content: "\f201"; } +.genericon-dropbox:before { content: "\f225"; } +.genericon-dropdown:before { content: "\f433"; } +.genericon-dropdown-left:before { content: "\f434"; } +.genericon-edit:before { content: "\f411"; } +.genericon-ellipsis:before { content: "\f476"; } +.genericon-expand:before { content: "\f431"; } +.genericon-external:before { content: "\f442"; } +.genericon-facebook:before { content: "\f203"; } +.genericon-facebook-alt:before { content: "\f204"; } +.genericon-fastforward:before { content: "\f458"; } +.genericon-feed:before { content: "\f413"; } +.genericon-flag:before { content: "\f468"; } +.genericon-flickr:before { content: "\f211"; } +.genericon-foursquare:before { content: "\f226"; } +.genericon-fullscreen:before { content: "\f474"; } +.genericon-gallery:before { content: "\f103"; } +.genericon-github:before { content: "\f200"; } +.genericon-googleplus:before { content: "\f206"; } +.genericon-googleplus-alt:before { content: "\f218"; } +.genericon-handset:before { content: "\f50c"; } +.genericon-heart:before { content: "\f461"; } +.genericon-help:before { content: "\f457"; } +.genericon-hide:before { content: "\f404"; } +.genericon-hierarchy:before { content: "\f505"; } +.genericon-home:before { content: "\f409"; } +.genericon-image:before { content: "\f102"; } +.genericon-info:before { content: "\f455"; } +.genericon-instagram:before { content: "\f215"; } +.genericon-italic:before { content: "\f472"; } +.genericon-key:before { content: "\f427"; } +.genericon-leftarrow:before { content: "\f503"; } +.genericon-link:before { content: "\f107"; } +.genericon-linkedin:before { content: "\f207"; } +.genericon-linkedin-alt:before { content: "\f208"; } +.genericon-location:before { content: "\f417"; } +.genericon-lock:before { content: "\f470"; } +.genericon-mail:before { content: "\f410"; } +.genericon-maximize:before { content: "\f422"; } +.genericon-menu:before { content: "\f419"; } +.genericon-microphone:before { content: "\f50d"; } +.genericon-minimize:before { content: "\f421"; } +.genericon-minus:before { content: "\f50e"; } +.genericon-month:before { content: "\f307"; } +.genericon-move:before { content: "\f50f"; } +.genericon-next:before { content: "\f429"; } +.genericon-notice:before { content: "\f456"; } +.genericon-paintbrush:before { content: "\f506"; } +.genericon-path:before { content: "\f219"; } +.genericon-pause:before { content: "\f448"; } +.genericon-phone:before { content: "\f437"; } +.genericon-picture:before { content: "\f473"; } +.genericon-pinned:before { content: "\f308"; } +.genericon-pinterest:before { content: "\f209"; } +.genericon-pinterest-alt:before { content: "\f210"; } +.genericon-play:before { content: "\f452"; } +.genericon-plugin:before { content: "\f439"; } +.genericon-plus:before { content: "\f510"; } +.genericon-pocket:before { content: "\f224"; } +.genericon-polldaddy:before { content: "\f217"; } +.genericon-portfolio:before { content: "\f460"; } +.genericon-previous:before { content: "\f430"; } +.genericon-print:before { content: "\f469"; } +.genericon-quote:before { content: "\f106"; } +.genericon-rating-empty:before { content: "\f511"; } +.genericon-rating-full:before { content: "\f512"; } +.genericon-rating-half:before { content: "\f513"; } +.genericon-reddit:before { content: "\f222"; } +.genericon-refresh:before { content: "\f420"; } +.genericon-reply:before { content: "\f412"; } +.genericon-reply-alt:before { content: "\f466"; } +.genericon-reply-single:before { content: "\f467"; } +.genericon-rewind:before { content: "\f459"; } +.genericon-rightarrow:before { content: "\f501"; } +.genericon-search:before { content: "\f400"; } +.genericon-send-to-phone:before { content: "\f438"; } +.genericon-send-to-tablet:before { content: "\f454"; } +.genericon-share:before { content: "\f415"; } +.genericon-show:before { content: "\f403"; } +.genericon-shuffle:before { content: "\f514"; } +.genericon-sitemap:before { content: "\f507"; } +.genericon-skip-ahead:before { content: "\f451"; } +.genericon-skip-back:before { content: "\f450"; } +.genericon-skype:before { content: "\f220"; } +.genericon-spam:before { content: "\f424"; } +.genericon-spotify:before { content: "\f515"; } +.genericon-standard:before { content: "\f100"; } +.genericon-star:before { content: "\f408"; } +.genericon-status:before { content: "\f105"; } +.genericon-stop:before { content: "\f449"; } +.genericon-stumbleupon:before { content: "\f223"; } +.genericon-subscribe:before { content: "\f463"; } +.genericon-subscribed:before { content: "\f465"; } +.genericon-summary:before { content: "\f425"; } +.genericon-tablet:before { content: "\f453"; } +.genericon-tag:before { content: "\f302"; } +.genericon-time:before { content: "\f303"; } +.genericon-top:before { content: "\f435"; } +.genericon-trash:before { content: "\f407"; } +.genericon-tumblr:before { content: "\f214"; } +.genericon-twitch:before { content: "\f516"; } +.genericon-twitter:before { content: "\f202"; } +.genericon-unapprove:before { content: "\f446"; } +.genericon-unsubscribe:before { content: "\f464"; } +.genericon-unzoom:before { content: "\f401"; } +.genericon-uparrow:before { content: "\f500"; } +.genericon-user:before { content: "\f304"; } +.genericon-video:before { content: "\f104"; } +.genericon-videocamera:before { content: "\f517"; } +.genericon-vimeo:before { content: "\f212"; } +.genericon-warning:before { content: "\f414"; } +.genericon-website:before { content: "\f475"; } +.genericon-week:before { content: "\f306"; } +.genericon-wordpress:before { content: "\f205"; } +.genericon-xpost:before { content: "\f504"; } +.genericon-youtube:before { content: "\f213"; } +.genericon-zoom:before { content: "\f402"; } + + + + diff --git a/wp-content/themes/twentysixteen/header.php b/wp-content/themes/twentysixteen/header.php new file mode 100644 index 0000000..d28debf --- /dev/null +++ b/wp-content/themes/twentysixteen/header.php @@ -0,0 +1,106 @@ + + class="no-js"> + + + + + + + + + + +> + +
            +
            + + + + +
            diff --git a/wp-content/themes/twentysixteen/image.php b/wp-content/themes/twentysixteen/image.php new file mode 100644 index 0000000..492f40b --- /dev/null +++ b/wp-content/themes/twentysixteen/image.php @@ -0,0 +1,118 @@ + + +
            +
            + + + +
            > + + + +
            + ', '' ); ?> +
            + +
            + +
            + + + + +
            + + '', + 'link_before' => '', + 'link_after' => '', + 'pagelink' => '' . __( 'Page', 'twentysixteen' ) . ' %', + 'separator' => ', ', + ) + ); + ?> +
            + +
            + + %1$s %3$s × %4$s', + esc_html_x( 'Full size', 'Used before full size attachment link.', 'twentysixteen' ), + esc_url( wp_get_attachment_url() ), + absint( $metadata['width'] ), + absint( $metadata['height'] ) + ); + } + ?> + "%s"', 'twentysixteen' ), + get_the_title() + ), + '', + '' + ); + ?> +
            +
            + + _x( 'Published in%title', 'Parent post link', 'twentysixteen' ), + ) + ); + // End the loop. + endwhile; + ?> + +
            +
            + + + diff --git a/wp-content/themes/twentysixteen/inc/back-compat.php b/wp-content/themes/twentysixteen/inc/back-compat.php new file mode 100644 index 0000000..84b51c4 --- /dev/null +++ b/wp-content/themes/twentysixteen/inc/back-compat.php @@ -0,0 +1,78 @@ +

            %s

            ', $message ); +} + +/** + * Prevents the Customizer from being loaded on WordPress versions prior to 4.4. + * + * @since Twenty Sixteen 1.0 + * + * @global string $wp_version WordPress version. + */ +function twentysixteen_customize() { + wp_die( + /* translators: %s: The current WordPress version. */ + sprintf( __( 'Twenty Sixteen requires at least WordPress version 4.4. You are running version %s. Please upgrade and try again.', 'twentysixteen' ), $GLOBALS['wp_version'] ), + '', + array( + 'back_link' => true, + ) + ); +} +add_action( 'load-customize.php', 'twentysixteen_customize' ); + +/** + * Prevents the Theme Preview from being loaded on WordPress versions prior to 4.4. + * + * @since Twenty Sixteen 1.0 + * + * @global string $wp_version WordPress version. + */ +function twentysixteen_preview() { + if ( isset( $_GET['preview'] ) ) { + /* translators: %s: The current WordPress version. */ + wp_die( sprintf( __( 'Twenty Sixteen requires at least WordPress version 4.4. You are running version %s. Please upgrade and try again.', 'twentysixteen' ), $GLOBALS['wp_version'] ) ); + } +} +add_action( 'template_redirect', 'twentysixteen_preview' ); diff --git a/wp-content/themes/twentysixteen/inc/customizer.php b/wp-content/themes/twentysixteen/inc/customizer.php new file mode 100644 index 0000000..677a5f8 --- /dev/null +++ b/wp-content/themes/twentysixteen/inc/customizer.php @@ -0,0 +1,1259 @@ + $default_background_color, + ) + ) + ); + + /** + * Filter the arguments used when adding 'custom-header' support in Twenty Sixteen. + * + * @since Twenty Sixteen 1.0 + * + * @param array $args { + * An array of custom-header support arguments. + * + * @type string $default-text-color Default color of the header text. + * @type int $width Width in pixels of the custom header image. Default 1200. + * @type int $height Height in pixels of the custom header image. Default 280. + * @type bool $flex-height Whether to allow flexible-height header images. Default true. + * @type callable $wp-head-callback Callback function used to style the header image and text + * displayed on the blog. + * } + */ + add_theme_support( + 'custom-header', + apply_filters( + 'twentysixteen_custom_header_args', + array( + 'default-text-color' => $default_text_color, + 'width' => 1200, + 'height' => 280, + 'flex-height' => true, + 'wp-head-callback' => 'twentysixteen_header_style', + ) + ) + ); +} +add_action( 'after_setup_theme', 'twentysixteen_custom_header_and_background' ); + +if ( ! function_exists( 'twentysixteen_header_style' ) ) : + /** + * Styles the header text displayed on the site. + * + * Create your own twentysixteen_header_style() function to override in a child theme. + * + * @since Twenty Sixteen 1.0 + * + * @see twentysixteen_custom_header_and_background(). + */ + function twentysixteen_header_style() { + // If the header text option is untouched, let's bail. + if ( display_header_text() ) { + return; + } + + // If the header text has been hidden. + ?> + + get_setting( 'blogname' )->transport = 'postMessage'; + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + + if ( isset( $wp_customize->selective_refresh ) ) { + $wp_customize->selective_refresh->add_partial( + 'blogname', + array( + 'selector' => '.site-title a', + 'container_inclusive' => false, + 'render_callback' => 'twentysixteen_customize_partial_blogname', + ) + ); + $wp_customize->selective_refresh->add_partial( + 'blogdescription', + array( + 'selector' => '.site-description', + 'container_inclusive' => false, + 'render_callback' => 'twentysixteen_customize_partial_blogdescription', + ) + ); + } + + // Add color scheme setting and control. + $wp_customize->add_setting( + 'color_scheme', + array( + 'default' => 'default', + 'sanitize_callback' => 'twentysixteen_sanitize_color_scheme', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'color_scheme', + array( + 'label' => __( 'Base Color Scheme', 'twentysixteen' ), + 'section' => 'colors', + 'type' => 'select', + 'choices' => twentysixteen_get_color_scheme_choices(), + 'priority' => 1, + ) + ); + + // Add page background color setting and control. + $wp_customize->add_setting( + 'page_background_color', + array( + 'default' => $color_scheme[1], + 'sanitize_callback' => 'sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'page_background_color', + array( + 'label' => __( 'Page Background Color', 'twentysixteen' ), + 'section' => 'colors', + ) + ) + ); + + // Remove the core header textcolor control, as it shares the main text color. + $wp_customize->remove_control( 'header_textcolor' ); + + // Add link color setting and control. + $wp_customize->add_setting( + 'link_color', + array( + 'default' => $color_scheme[2], + 'sanitize_callback' => 'sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'link_color', + array( + 'label' => __( 'Link Color', 'twentysixteen' ), + 'section' => 'colors', + ) + ) + ); + + // Add main text color setting and control. + $wp_customize->add_setting( + 'main_text_color', + array( + 'default' => $color_scheme[3], + 'sanitize_callback' => 'sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'main_text_color', + array( + 'label' => __( 'Main Text Color', 'twentysixteen' ), + 'section' => 'colors', + ) + ) + ); + + // Add secondary text color setting and control. + $wp_customize->add_setting( + 'secondary_text_color', + array( + 'default' => $color_scheme[4], + 'sanitize_callback' => 'sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'secondary_text_color', + array( + 'label' => __( 'Secondary Text Color', 'twentysixteen' ), + 'section' => 'colors', + ) + ) + ); +} +add_action( 'customize_register', 'twentysixteen_customize_register', 11 ); + +/** + * Render the site title for the selective refresh partial. + * + * @since Twenty Sixteen 1.2 + * @see twentysixteen_customize_register() + * + * @return void + */ +function twentysixteen_customize_partial_blogname() { + bloginfo( 'name' ); +} + +/** + * Render the site tagline for the selective refresh partial. + * + * @since Twenty Sixteen 1.2 + * @see twentysixteen_customize_register() + * + * @return void + */ +function twentysixteen_customize_partial_blogdescription() { + bloginfo( 'description' ); +} + +/** + * Registers color schemes for Twenty Sixteen. + * + * Can be filtered with {@see 'twentysixteen_color_schemes'}. + * + * The order of colors in a colors array: + * 1. Main Background Color. + * 2. Page Background Color. + * 3. Link Color. + * 4. Main Text Color. + * 5. Secondary Text Color. + * + * @since Twenty Sixteen 1.0 + * + * @return array An associative array of color scheme options. + */ +function twentysixteen_get_color_schemes() { + /** + * Filter the color schemes registered for use with Twenty Sixteen. + * + * The default schemes include 'default', 'dark', 'gray', 'red', and 'yellow'. + * + * @since Twenty Sixteen 1.0 + * + * @param array $schemes { + * Associative array of color schemes data. + * + * @type array $slug { + * Associative array of information for setting up the color scheme. + * + * @type string $label Color scheme label. + * @type array $colors HEX codes for default colors prepended with a hash symbol ('#'). + * Colors are defined in the following order: Main background, page + * background, link, main text, secondary text. + * } + * } + */ + return apply_filters( + 'twentysixteen_color_schemes', + array( + 'default' => array( + 'label' => __( 'Default', 'twentysixteen' ), + 'colors' => array( + '#1a1a1a', + '#ffffff', + '#007acc', + '#1a1a1a', + '#686868', + ), + ), + 'dark' => array( + 'label' => __( 'Dark', 'twentysixteen' ), + 'colors' => array( + '#262626', + '#1a1a1a', + '#9adffd', + '#e5e5e5', + '#c1c1c1', + ), + ), + 'gray' => array( + 'label' => __( 'Gray', 'twentysixteen' ), + 'colors' => array( + '#616a73', + '#4d545c', + '#c7c7c7', + '#f2f2f2', + '#f2f2f2', + ), + ), + 'red' => array( + 'label' => __( 'Red', 'twentysixteen' ), + 'colors' => array( + '#ffffff', + '#ff675f', + '#640c1f', + '#402b30', + '#402b30', + ), + ), + 'yellow' => array( + 'label' => __( 'Yellow', 'twentysixteen' ), + 'colors' => array( + '#3b3721', + '#ffef8e', + '#774e24', + '#3b3721', + '#5b4d3e', + ), + ), + ) + ); +} + +if ( ! function_exists( 'twentysixteen_get_color_scheme' ) ) : + /** + * Retrieves the current Twenty Sixteen color scheme. + * + * Create your own twentysixteen_get_color_scheme() function to override in a child theme. + * + * @since Twenty Sixteen 1.0 + * + * @return array An associative array of either the current or default color scheme HEX values. + */ + function twentysixteen_get_color_scheme() { + $color_scheme_option = get_theme_mod( 'color_scheme', 'default' ); + $color_schemes = twentysixteen_get_color_schemes(); + + if ( array_key_exists( $color_scheme_option, $color_schemes ) ) { + return $color_schemes[ $color_scheme_option ]['colors']; + } + + return $color_schemes['default']['colors']; + } +endif; // twentysixteen_get_color_scheme() + +if ( ! function_exists( 'twentysixteen_get_color_scheme_choices' ) ) : + /** + * Retrieves an array of color scheme choices registered for Twenty Sixteen. + * + * Create your own twentysixteen_get_color_scheme_choices() function to override + * in a child theme. + * + * @since Twenty Sixteen 1.0 + * + * @return array Array of color schemes. + */ + function twentysixteen_get_color_scheme_choices() { + $color_schemes = twentysixteen_get_color_schemes(); + $color_scheme_control_options = array(); + + foreach ( $color_schemes as $color_scheme => $value ) { + $color_scheme_control_options[ $color_scheme ] = $value['label']; + } + + return $color_scheme_control_options; + } +endif; // twentysixteen_get_color_scheme_choices() + + +if ( ! function_exists( 'twentysixteen_sanitize_color_scheme' ) ) : + /** + * Handles sanitization for Twenty Sixteen color schemes. + * + * Create your own twentysixteen_sanitize_color_scheme() function to override + * in a child theme. + * + * @since Twenty Sixteen 1.0 + * + * @param string $value Color scheme name value. + * @return string Color scheme name. + */ + function twentysixteen_sanitize_color_scheme( $value ) { + $color_schemes = twentysixteen_get_color_scheme_choices(); + + if ( ! array_key_exists( $value, $color_schemes ) ) { + return 'default'; + } + + return $value; + } +endif; // twentysixteen_sanitize_color_scheme() + +/** + * Enqueues front-end CSS for color scheme. + * + * @since Twenty Sixteen 1.0 + * + * @see wp_add_inline_style() + */ +function twentysixteen_color_scheme_css() { + $color_scheme_option = get_theme_mod( 'color_scheme', 'default' ); + + // Don't do anything if the default color scheme is selected. + if ( 'default' === $color_scheme_option ) { + return; + } + + $color_scheme = twentysixteen_get_color_scheme(); + + // Convert main text hex color to rgba. + $color_textcolor_rgb = twentysixteen_hex2rgb( $color_scheme[3] ); + + // If the rgba values are empty return early. + if ( empty( $color_textcolor_rgb ) ) { + return; + } + + // If we get this far, we have a custom color scheme. + $colors = array( + 'background_color' => $color_scheme[0], + 'page_background_color' => $color_scheme[1], + 'link_color' => $color_scheme[2], + 'main_text_color' => $color_scheme[3], + 'secondary_text_color' => $color_scheme[4], + 'border_color' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.2)', $color_textcolor_rgb ), + + ); + + $color_scheme_css = twentysixteen_get_color_scheme_css( $colors ); + + wp_add_inline_style( 'twentysixteen-style', $color_scheme_css ); +} +add_action( 'wp_enqueue_scripts', 'twentysixteen_color_scheme_css' ); + +/** + * Binds the JS listener to make Customizer color_scheme control. + * + * Passes color scheme data as colorScheme global. + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_customize_control_js() { + wp_enqueue_script( 'color-scheme-control', get_template_directory_uri() . '/js/color-scheme-control.js', array( 'customize-controls', 'iris', 'underscore', 'wp-util' ), '20170530', true ); + wp_localize_script( 'color-scheme-control', 'colorScheme', twentysixteen_get_color_schemes() ); +} +add_action( 'customize_controls_enqueue_scripts', 'twentysixteen_customize_control_js' ); + +/** + * Binds JS handlers to make the Customizer preview reload changes asynchronously. + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_customize_preview_js() { + wp_enqueue_script( 'twentysixteen-customize-preview', get_template_directory_uri() . '/js/customize-preview.js', array( 'customize-preview' ), '20170530', true ); +} +add_action( 'customize_preview_init', 'twentysixteen_customize_preview_js' ); + +/** + * Returns CSS for the color schemes. + * + * @since Twenty Sixteen 1.0 + * + * @param array $colors Color scheme colors. + * @return string Color scheme CSS. + */ +function twentysixteen_get_color_scheme_css( $colors ) { + $colors = wp_parse_args( + $colors, + array( + 'background_color' => '', + 'page_background_color' => '', + 'link_color' => '', + 'main_text_color' => '', + 'secondary_text_color' => '', + 'border_color' => '', + ) + ); + + return << .page-links-title, + .comment-author, + .comment-reply-title small a:hover, + .comment-reply-title small a:focus { + color: {$colors['main_text_color']}; + } + + blockquote, + .menu-toggle.toggled-on, + .menu-toggle.toggled-on:hover, + .menu-toggle.toggled-on:focus, + .post-navigation, + .post-navigation div + div, + .pagination, + .widget, + .page-header, + .page-links a, + .comments-title, + .comment-reply-title { + border-color: {$colors['main_text_color']}; + } + + button, + button[disabled]:hover, + button[disabled]:focus, + input[type="button"], + input[type="button"][disabled]:hover, + input[type="button"][disabled]:focus, + input[type="reset"], + input[type="reset"][disabled]:hover, + input[type="reset"][disabled]:focus, + input[type="submit"], + input[type="submit"][disabled]:hover, + input[type="submit"][disabled]:focus, + .menu-toggle.toggled-on, + .menu-toggle.toggled-on:hover, + .menu-toggle.toggled-on:focus, + .pagination:before, + .pagination:after, + .pagination .prev, + .pagination .next, + .page-links a { + background-color: {$colors['main_text_color']}; + } + + /* Secondary Text Color */ + + /** + * IE8 and earlier will drop any block with CSS3 selectors. + * Do not combine these styles with the next block. + */ + body:not(.search-results) .entry-summary { + color: {$colors['secondary_text_color']}; + } + + blockquote, + .post-password-form label, + a:hover, + a:focus, + a:active, + .post-navigation .meta-nav, + .image-navigation, + .comment-navigation, + .widget_recent_entries .post-date, + .widget_rss .rss-date, + .widget_rss cite, + .site-description, + .author-bio, + .entry-footer, + .entry-footer a, + .sticky-post, + .taxonomy-description, + .entry-caption, + .comment-metadata, + .pingback .edit-link, + .comment-metadata a, + .pingback .comment-edit-link, + .comment-form label, + .comment-notes, + .comment-awaiting-moderation, + .logged-in-as, + .form-allowed-tags, + .site-info, + .site-info a, + .wp-caption .wp-caption-text, + .gallery-caption, + .widecolumn label, + .widecolumn .mu_register label { + color: {$colors['secondary_text_color']}; + } + + .widget_calendar tbody a:hover, + .widget_calendar tbody a:focus { + background-color: {$colors['secondary_text_color']}; + } + + /* Border Color */ + fieldset, + pre, + abbr, + acronym, + table, + th, + td, + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="week"], + input[type="month"], + input[type="text"], + input[type="email"], + input[type="url"], + input[type="password"], + input[type="search"], + input[type="tel"], + input[type="number"], + textarea, + .main-navigation li, + .main-navigation .primary-menu, + .menu-toggle, + .dropdown-toggle:after, + .social-navigation a, + .image-navigation, + .comment-navigation, + .tagcloud a, + .entry-content, + .entry-summary, + .page-links a, + .page-links > span, + .comment-list article, + .comment-list .pingback, + .comment-list .trackback, + .comment-reply-link, + .no-comments, + .widecolumn .mu_register .mu_alert { + border-color: {$colors['main_text_color']}; /* Fallback for IE7 and IE8 */ + border-color: {$colors['border_color']}; + } + + hr, + code { + background-color: {$colors['main_text_color']}; /* Fallback for IE7 and IE8 */ + background-color: {$colors['border_color']}; + } + + @media screen and (min-width: 56.875em) { + .main-navigation li:hover > a, + .main-navigation li.focus > a { + color: {$colors['link_color']}; + } + + .main-navigation ul ul, + .main-navigation ul ul li { + border-color: {$colors['border_color']}; + } + + .main-navigation ul ul:before { + border-top-color: {$colors['border_color']}; + border-bottom-color: {$colors['border_color']}; + } + + .main-navigation ul ul li { + background-color: {$colors['page_background_color']}; + } + + .main-navigation ul ul:after { + border-top-color: {$colors['page_background_color']}; + border-bottom-color: {$colors['page_background_color']}; + } + } + +CSS; +} + + +/** + * Outputs an Underscore template for generating CSS for the color scheme. + * + * The template generates the css dynamically for instant display in the + * Customizer preview. + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_color_scheme_css_template() { + $colors = array( + 'background_color' => '{{ data.background_color }}', + 'page_background_color' => '{{ data.page_background_color }}', + 'link_color' => '{{ data.link_color }}', + 'main_text_color' => '{{ data.main_text_color }}', + 'secondary_text_color' => '{{ data.secondary_text_color }}', + 'border_color' => '{{ data.border_color }}', + ); + ?> + + a, + .main-navigation li.focus > a { + color: %1$s; + } + } + '; + + wp_add_inline_style( 'twentysixteen-style', sprintf( $css, $link_color ) ); +} +add_action( 'wp_enqueue_scripts', 'twentysixteen_link_color_css', 11 ); + +/** + * Enqueues front-end CSS for the main text color. + * + * @since Twenty Sixteen 1.0 + * + * @see wp_add_inline_style() + */ +function twentysixteen_main_text_color_css() { + $color_scheme = twentysixteen_get_color_scheme(); + $default_color = $color_scheme[3]; + $main_text_color = get_theme_mod( 'main_text_color', $default_color ); + + // Don't do anything if the current color is the default. + if ( $main_text_color === $default_color ) { + return; + } + + // Convert main text hex color to rgba. + $main_text_color_rgb = twentysixteen_hex2rgb( $main_text_color ); + + // If the rgba values are empty return early. + if ( empty( $main_text_color_rgb ) ) { + return; + } + + // If we get this far, we have a custom color scheme. + $border_color = vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.2)', $main_text_color_rgb ); + + $css = ' + /* Custom Main Text Color */ + body, + blockquote cite, + blockquote small, + .main-navigation a, + .menu-toggle, + .dropdown-toggle, + .social-navigation a, + .post-navigation a, + .pagination a:hover, + .pagination a:focus, + .widget-title a, + .site-branding .site-title a, + .entry-title a, + .page-links > .page-links-title, + .comment-author, + .comment-reply-title small a:hover, + .comment-reply-title small a:focus { + color: %1$s + } + + blockquote, + .menu-toggle.toggled-on, + .menu-toggle.toggled-on:hover, + .menu-toggle.toggled-on:focus, + .post-navigation, + .post-navigation div + div, + .pagination, + .widget, + .page-header, + .page-links a, + .comments-title, + .comment-reply-title { + border-color: %1$s; + } + + button, + button[disabled]:hover, + button[disabled]:focus, + input[type="button"], + input[type="button"][disabled]:hover, + input[type="button"][disabled]:focus, + input[type="reset"], + input[type="reset"][disabled]:hover, + input[type="reset"][disabled]:focus, + input[type="submit"], + input[type="submit"][disabled]:hover, + input[type="submit"][disabled]:focus, + .menu-toggle.toggled-on, + .menu-toggle.toggled-on:hover, + .menu-toggle.toggled-on:focus, + .pagination:before, + .pagination:after, + .pagination .prev, + .pagination .next, + .page-links a { + background-color: %1$s; + } + + /* Border Color */ + fieldset, + pre, + abbr, + acronym, + table, + th, + td, + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="week"], + input[type="month"], + input[type="text"], + input[type="email"], + input[type="url"], + input[type="password"], + input[type="search"], + input[type="tel"], + input[type="number"], + textarea, + .main-navigation li, + .main-navigation .primary-menu, + .menu-toggle, + .dropdown-toggle:after, + .social-navigation a, + .image-navigation, + .comment-navigation, + .tagcloud a, + .entry-content, + .entry-summary, + .page-links a, + .page-links > span, + .comment-list article, + .comment-list .pingback, + .comment-list .trackback, + .comment-reply-link, + .no-comments, + .widecolumn .mu_register .mu_alert { + border-color: %1$s; /* Fallback for IE7 and IE8 */ + border-color: %2$s; + } + + hr, + code { + background-color: %1$s; /* Fallback for IE7 and IE8 */ + background-color: %2$s; + } + + @media screen and (min-width: 56.875em) { + .main-navigation ul ul, + .main-navigation ul ul li { + border-color: %2$s; + } + + .main-navigation ul ul:before { + border-top-color: %2$s; + border-bottom-color: %2$s; + } + } + '; + + wp_add_inline_style( 'twentysixteen-style', sprintf( $css, $main_text_color, $border_color ) ); +} +add_action( 'wp_enqueue_scripts', 'twentysixteen_main_text_color_css', 11 ); + +/** + * Enqueues front-end CSS for the secondary text color. + * + * @since Twenty Sixteen 1.0 + * + * @see wp_add_inline_style() + */ +function twentysixteen_secondary_text_color_css() { + $color_scheme = twentysixteen_get_color_scheme(); + $default_color = $color_scheme[4]; + $secondary_text_color = get_theme_mod( 'secondary_text_color', $default_color ); + + // Don't do anything if the current color is the default. + if ( $secondary_text_color === $default_color ) { + return; + } + + $css = ' + /* Custom Secondary Text Color */ + + /** + * IE8 and earlier will drop any block with CSS3 selectors. + * Do not combine these styles with the next block. + */ + body:not(.search-results) .entry-summary { + color: %1$s; + } + + blockquote, + .post-password-form label, + a:hover, + a:focus, + a:active, + .post-navigation .meta-nav, + .image-navigation, + .comment-navigation, + .widget_recent_entries .post-date, + .widget_rss .rss-date, + .widget_rss cite, + .site-description, + .author-bio, + .entry-footer, + .entry-footer a, + .sticky-post, + .taxonomy-description, + .entry-caption, + .comment-metadata, + .pingback .edit-link, + .comment-metadata a, + .pingback .comment-edit-link, + .comment-form label, + .comment-notes, + .comment-awaiting-moderation, + .logged-in-as, + .form-allowed-tags, + .site-info, + .site-info a, + .wp-caption .wp-caption-text, + .gallery-caption, + .widecolumn label, + .widecolumn .mu_register label { + color: %1$s; + } + + .widget_calendar tbody a:hover, + .widget_calendar tbody a:focus { + background-color: %1$s; + } + '; + + wp_add_inline_style( 'twentysixteen-style', sprintf( $css, $secondary_text_color ) ); +} +add_action( 'wp_enqueue_scripts', 'twentysixteen_secondary_text_color_css', 11 ); diff --git a/wp-content/themes/twentysixteen/inc/template-tags.php b/wp-content/themes/twentysixteen/inc/template-tags.php new file mode 100644 index 0000000..da15431 --- /dev/null +++ b/wp-content/themes/twentysixteen/inc/template-tags.php @@ -0,0 +1,286 @@ +%1$s%2$s %4$s', + get_avatar( get_the_author_meta( 'user_email' ), $author_avatar_size ), + _x( 'Author', 'Used before post author name.', 'twentysixteen' ), + esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), + get_the_author() + ); + } + + if ( in_array( get_post_type(), array( 'post', 'attachment' ) ) ) { + twentysixteen_entry_date(); + } + + $format = get_post_format(); + if ( current_theme_supports( 'post-formats', $format ) ) { + printf( + '%1$s%3$s', + sprintf( '%s ', _x( 'Format', 'Used before post format.', 'twentysixteen' ) ), + esc_url( get_post_format_link( $format ) ), + get_post_format_string( $format ) + ); + } + + if ( 'post' === get_post_type() ) { + twentysixteen_entry_taxonomies(); + } + + if ( ! is_singular() && ! post_password_required() && ( comments_open() || get_comments_number() ) ) { + echo ''; + /* translators: %s: Post title. */ + comments_popup_link( sprintf( __( 'Leave a comment on %s', 'twentysixteen' ), get_the_title() ) ); + echo ''; + } + } +endif; + +if ( ! function_exists( 'twentysixteen_entry_date' ) ) : + /** + * Prints HTML with date information for current post. + * + * Create your own twentysixteen_entry_date() function to override in a child theme. + * + * @since Twenty Sixteen 1.0 + */ + function twentysixteen_entry_date() { + $time_string = ''; + + if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { + $time_string = ''; + } + + $time_string = sprintf( + $time_string, + esc_attr( get_the_date( 'c' ) ), + get_the_date(), + esc_attr( get_the_modified_date( 'c' ) ), + get_the_modified_date() + ); + + printf( + '%1$s %3$s', + _x( 'Posted on', 'Used before publish date.', 'twentysixteen' ), + esc_url( get_permalink() ), + $time_string + ); + } +endif; + +if ( ! function_exists( 'twentysixteen_entry_taxonomies' ) ) : + /** + * Prints HTML with category and tags for current post. + * + * Create your own twentysixteen_entry_taxonomies() function to override in a child theme. + * + * @since Twenty Sixteen 1.0 + */ + function twentysixteen_entry_taxonomies() { + $categories_list = get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentysixteen' ) ); + if ( $categories_list && twentysixteen_categorized_blog() ) { + printf( + '%1$s %2$s', + _x( 'Categories', 'Used before category names.', 'twentysixteen' ), + $categories_list + ); + } + + $tags_list = get_the_tag_list( '', _x( ', ', 'Used between list items, there is a space after the comma.', 'twentysixteen' ) ); + if ( $tags_list && ! is_wp_error( $tags_list ) ) { + printf( + '%1$s %2$s', + _x( 'Tags', 'Used before tag names.', 'twentysixteen' ), + $tags_list + ); + } + } +endif; + +if ( ! function_exists( 'twentysixteen_post_thumbnail' ) ) : + /** + * Displays an optional post thumbnail. + * + * Wraps the post thumbnail in an anchor element on index views, or a div + * element when on single views. + * + * Create your own twentysixteen_post_thumbnail() function to override in a child theme. + * + * @since Twenty Sixteen 1.0 + */ + function twentysixteen_post_thumbnail() { + if ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) { + return; + } + + if ( is_singular() ) : + ?> + +
            + +
            + + + + + + +
            + +
            + %2$s', + esc_url( get_permalink( get_the_ID() ) ), + /* translators: %s: Post title. */ + sprintf( __( 'Continue reading "%s"', 'twentysixteen' ), get_the_title( get_the_ID() ) ) + ); + return ' … ' . $link; + } + add_filter( 'excerpt_more', 'twentysixteen_excerpt_more' ); +endif; + +if ( ! function_exists( 'twentysixteen_categorized_blog' ) ) : + /** + * Determines whether blog/site has more than one category. + * + * Create your own twentysixteen_categorized_blog() function to override in a child theme. + * + * @since Twenty Sixteen 1.0 + * + * @return bool True if there is more than one category, false otherwise. + */ + function twentysixteen_categorized_blog() { + $all_the_cool_cats = get_transient( 'twentysixteen_categories' ); + if ( false === $all_the_cool_cats ) { + // Create an array of all the categories that are attached to posts. + $all_the_cool_cats = get_categories( + array( + 'fields' => 'ids', + // We only need to know if there is more than one category. + 'number' => 2, + ) + ); + + // Count the number of categories that are attached to the posts. + $all_the_cool_cats = count( $all_the_cool_cats ); + + set_transient( 'twentysixteen_categories', $all_the_cool_cats ); + } + + if ( $all_the_cool_cats > 1 || is_preview() ) { + // This blog has more than 1 category so twentysixteen_categorized_blog() should return true. + return true; + } else { + // This blog has only 1 category so twentysixteen_categorized_blog() should return false. + return false; + } + } +endif; + +/** + * Flushes out the transients used in twentysixteen_categorized_blog(). + * + * @since Twenty Sixteen 1.0 + */ +function twentysixteen_category_transient_flusher() { + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { + return; + } + // Like, beat it. Dig? + delete_transient( 'twentysixteen_categories' ); +} +add_action( 'edit_category', 'twentysixteen_category_transient_flusher' ); +add_action( 'save_post', 'twentysixteen_category_transient_flusher' ); + +if ( ! function_exists( 'twentysixteen_the_custom_logo' ) ) : + /** + * Displays the optional custom logo. + * + * Does nothing if the custom logo is not available. + * + * @since Twenty Sixteen 1.2 + */ + function twentysixteen_the_custom_logo() { + if ( function_exists( 'the_custom_logo' ) ) { + the_custom_logo(); + } + } +endif; + +if ( ! function_exists( 'wp_body_open' ) ) : + /** + * Fire the wp_body_open action. + * + * Added for backward compatibility to support pre-5.2.0 WordPress versions. + * + * @since Twenty Sixteen 2.0 + */ + function wp_body_open() { + /** + * Triggered after the opening tag. + * + * @since Twenty Sixteen 2.0 + */ + do_action( 'wp_body_open' ); + } +endif; diff --git a/wp-content/themes/twentysixteen/index.php b/wp-content/themes/twentysixteen/index.php new file mode 100644 index 0000000..f0f7b94 --- /dev/null +++ b/wp-content/themes/twentysixteen/index.php @@ -0,0 +1,66 @@ + + +
            +
            + + + + +
            +

            +
            + + + __( 'Previous page', 'twentysixteen' ), + 'next_text' => __( 'Next page', 'twentysixteen' ), + 'before_page_number' => '' . __( 'Page', 'twentysixteen' ) . ' ', + ) + ); + + // If no content, include the "No posts found" template. + else : + get_template_part( 'template-parts/content', 'none' ); + + endif; + ?> + +
            +
            + + + diff --git a/wp-content/themes/twentysixteen/js/color-scheme-control.js b/wp-content/themes/twentysixteen/js/color-scheme-control.js new file mode 100644 index 0000000..e65b5bd --- /dev/null +++ b/wp-content/themes/twentysixteen/js/color-scheme-control.js @@ -0,0 +1,96 @@ +/* global colorScheme, Color */ +/** + * Add a listener to the Color Scheme control to update other color controls to new values/defaults. + * Also trigger an update of the Color Scheme CSS when a color is changed. + */ + +( function( api ) { + var cssTemplate = wp.template( 'twentysixteen-color-scheme' ), + colorSchemeKeys = [ + 'background_color', + 'page_background_color', + 'link_color', + 'main_text_color', + 'secondary_text_color' + ], + colorSettings = [ + 'background_color', + 'page_background_color', + 'link_color', + 'main_text_color', + 'secondary_text_color' + ]; + + api.controlConstructor.select = api.Control.extend( { + ready: function() { + if ( 'color_scheme' === this.id ) { + this.setting.bind( 'change', function( value ) { + var colors = colorScheme[value].colors; + + // Update Background Color. + var color = colors[0]; + api( 'background_color' ).set( color ); + api.control( 'background_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Page Background Color. + color = colors[1]; + api( 'page_background_color' ).set( color ); + api.control( 'page_background_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Link Color. + color = colors[2]; + api( 'link_color' ).set( color ); + api.control( 'link_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Main Text Color. + color = colors[3]; + api( 'main_text_color' ).set( color ); + api.control( 'main_text_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Secondary Text Color. + color = colors[4]; + api( 'secondary_text_color' ).set( color ); + api.control( 'secondary_text_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + } ); + } + } + } ); + + // Generate the CSS for the current Color Scheme. + function updateCSS() { + var scheme = api( 'color_scheme' )(), + css, + colors = _.object( colorSchemeKeys, colorScheme[ scheme ].colors ); + + // Merge in color scheme overrides. + _.each( colorSettings, function( setting ) { + colors[ setting ] = api( setting )(); + } ); + + // Add additional color. + // jscs:disable + colors.border_color = Color( colors.main_text_color ).toCSS( 'rgba', 0.2 ); + // jscs:enable + + css = cssTemplate( colors ); + + api.previewer.send( 'update-color-scheme-css', css ); + } + + // Update the CSS whenever a color setting is changed. + _.each( colorSettings, function( setting ) { + api( setting, function( setting ) { + setting.bind( updateCSS ); + } ); + } ); +} )( wp.customize ); diff --git a/wp-content/themes/twentysixteen/js/customize-preview.js b/wp-content/themes/twentysixteen/js/customize-preview.js new file mode 100644 index 0000000..fc99333 --- /dev/null +++ b/wp-content/themes/twentysixteen/js/customize-preview.js @@ -0,0 +1,41 @@ +/** + * Live-update changed settings in real time in the Customizer preview. + */ + +( function( $ ) { + var style = $( '#twentysixteen-color-scheme-css' ), + api = wp.customize; + + if ( ! style.length ) { + style = $( 'head' ).append( ''; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Extends the built-in list of html5 elements + * @memberOf html5 + * @param {String|Array} newElements whitespace separated list or array of new element names to shiv + * @param {Document} ownerDocument The context document. + */ + function addElements(newElements, ownerDocument) { + var elements = html5.elements; + if(typeof elements != 'string'){ + elements = elements.join(' '); + } + if(typeof newElements != 'string'){ + newElements = newElements.join(' '); + } + html5.elements = elements +' '+ newElements; + shivDocument(ownerDocument); + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document|DocumentFragment} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i -1, + isOpera = navigator.userAgent.toLowerCase().indexOf( 'opera' ) > -1, + isIE = navigator.userAgent.toLowerCase().indexOf( 'msie' ) > -1; + + if ( ( isWebkit || isOpera || isIE ) && document.getElementById && window.addEventListener ) { + window.addEventListener( 'hashchange', function() { + var id = location.hash.substring( 1 ), + element; + + if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) { + return; + } + + element = document.getElementById( id ); + + if ( element ) { + if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) { + element.tabIndex = -1; + } + + element.focus(); + + // Repositions the window on jump-to-anchor to account for admin bar and border height. + window.scrollBy( 0, -53 ); + } + }, false ); + } +} )(); diff --git a/wp-content/themes/twentysixteen/page.php b/wp-content/themes/twentysixteen/page.php new file mode 100644 index 0000000..582c3a1 --- /dev/null +++ b/wp-content/themes/twentysixteen/page.php @@ -0,0 +1,42 @@ + + +
            +
            + + +
            + + + +
            + + + diff --git a/wp-content/themes/twentysixteen/readme.txt b/wp-content/themes/twentysixteen/readme.txt new file mode 100644 index 0000000..0de9136 --- /dev/null +++ b/wp-content/themes/twentysixteen/readme.txt @@ -0,0 +1,120 @@ +=== Twenty Sixteen === +Contributors: wordpressdotorg +Tested up to: 5.0 +Version: 2.1 +License: GPLv2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Tags: one-column, two-columns, right-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, flexible-header, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready, blog + +== Description == +Twenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make your WordPress look beautiful everywhere. + +* Mobile-first, Responsive Layout +* Custom Colors +* Custom Header +* Social Links +* Post Formats +* The GPL v2.0 or later license. :) Use it to make something cool. + +For more information about Twenty Sixteen please go to https://wordpress.org/support/article/twenty-sixteen/. + +== Installation == + +1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +2. Type in Twenty Sixteen in the search form and press the 'Enter' key on your keyboard. +3. Click on the 'Activate' button to use your new theme right away. +4. Go to https://wordpress.org/support/article/twenty-sixteen/ for a guide on how to customize this theme. +5. Navigate to Appearance > Customize in your admin panel and customize to taste. + +== Copyright == + +Twenty Sixteen WordPress Theme, Copyright 2014-2020 WordPress.org +Twenty Sixteen is distributed under the terms of the GNU GPL + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Twenty Sixteen Theme bundles the following third-party resources: + +HTML5 Shiv v3.7.0, Copyright 2014 Alexander Farkas +Licenses: MIT/GPL2 +Source: https://github.com/aFarkas/html5shiv + +Genericons icon font, Copyright 2013-2017 Automattic.com +License: GNU GPL, Version 2 (or later) +Source: http://www.genericons.com + +Image used in screenshot.png: A photo by Austin Schmid (https://unsplash.com/schmidy/), licensed under Creative Commons Zero(http://creativecommons.org/publicdomain/zero/1.0/) + +== Changelog == + += 2.1 = +* Released: March 31, 2020 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_2.1 + += 2.0 = +* Released: May 7, 2019 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_2.0 + += 1.9 = +* Released: February 21, 2019 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.9 + += 1.8 = +* Released: January 9, 2019 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.8 + += 1.7 = +* Released: December 19, 2018 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.7 + += 1.6 = +* Released: December 6, 2018 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.6 + += 1.5 = +* Released: May 17, 2018 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.5 + += 1.4 = +* Released: November 14, 2017 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.4 + += 1.3 = +* Released: August 16, 2016 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.3 + += 1.2 = +* Released: April 12, 2016 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.2 + += 1.1 = +* Released: January 6, 2016 + +https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_1.1 + += 1.0 = +* Released: December 8, 2015 + +Initial release + +== Notes == + +Only the default and dark color schemes are accessibility ready. diff --git a/wp-content/themes/twentysixteen/rtl.css b/wp-content/themes/twentysixteen/rtl.css new file mode 100644 index 0000000..84d1a8b --- /dev/null +++ b/wp-content/themes/twentysixteen/rtl.css @@ -0,0 +1,756 @@ +/* +Theme Name: Twenty Sixteen +Description: Adds support for languages written in a Right To Left (RTL) direction. +It's easy, just a matter of overwriting all the horizontal positioning attributes +of your CSS stylesheet in a separate stylesheet file named rtl.css. + +See: https://codex.wordpress.org/Right_to_Left_Language_Support +*/ + +/** + * Table of Contents: + * + * 1.0 - Normalize + * 2.0 - Typography + * 3.0 - Elements + * 4.0 - Forms + * 5.0 - Navigations + * 6.0 - Accessibility + * 7.0 - Widgets + * 8.0 - Content + * 8.1 - Header + * 8.2 - Posts and pages + * 8.3 - Comments + * 8.4 - Footer + * 9.0 - Multisites + * 10.0 - Media Queries + * 10.1 - >= 710px + * 10.2 - >= 910px + * 10.3 - >= 985px + * 10.4 - >= 1200px + */ + + +/** + * 1.0 - Normalize + */ + +body { + direction: rtl; + unicode-bidi: embed; +} + +input[type="checkbox"], +input[type="radio"] { + margin-right: auto; + margin-left: 0.4375em; +} + + +/** + * 2.0 - Typography + */ + +body, +button, +button[disabled]:hover, +button[disabled]:focus, +input[type="button"], +input[type="button"][disabled]:hover, +input[type="button"][disabled]:focus, +input[type="reset"], +input[type="reset"][disabled]:hover, +input[type="reset"][disabled]:focus, +input[type="submit"], +input[type="submit"][disabled]:hover, +input[type="submit"][disabled]:focus, +input, +select, +textarea, +.post-password-form label, +.main-navigation, +.post-navigation, +.post-navigation .post-title, +.pagination, +.image-navigation, +.comment-navigation, +.site .skip-link, +.logged-in .site .skip-link, +.widget .widget-title, +.widget_recent_entries .post-date, +.widget_rss .rss-date, +.widget_rss cite, +.tagcloud a, +.site-title, +.entry-title, +.entry-footer, +.sticky-post, +.page-title, +.page-links, +.comments-title, +.comment-reply-title, +.comment-metadata, +.pingback .edit-link, +.comment-reply-link, +.comment-form label, +.no-comments, +.required, +.site-footer .site-title, +.site-footer .site-title:after, +.widecolumn label, +.widecolumn .mu_register label, +.site-footer span[role=separator] { + font-family: Arial, Tahoma, sans-serif; +} + +::-webkit-input-placeholder { + font-family: Arial, Tahoma, sans-serif; +} + +:-moz-placeholder { + font-family: Arial, Tahoma, sans-serif; +} + +::-moz-placeholder { + font-family: Arial, Tahoma, sans-serif; +} + +:-ms-input-placeholder { + font-family: Arial, Tahoma, sans-serif; +} + +blockquote { + border-right-width: 4px; + border-left-width: 0; + padding-right: 1.263157895em; + padding-left: 0; +} + +.entry-content h1, +.entry-content h2, +.entry-content h3, +.entry-content h4, +.entry-content h5, +.entry-content h6, +.entry-summary h1, +.entry-summary h2, +.entry-summary h3, +.entry-summary h4, +.entry-summary h5, +.entry-summary h6, +.comment-content h1, +.comment-content h2, +.comment-content h3, +.comment-content h4, +.comment-content h5, +.comment-content h6, +.textwidget h1, +.textwidget h2, +.textwidget h3, +.textwidget h4, +.textwidget h5, +.textwidget h6, +.entry-content .author-title, +.widget_calendar caption, +.widecolumn h2 { + font-weight: 700; +} + + +/** + * 3.0 - Elements + */ + +ul, +ol { + margin: 0 1.25em 1.75em 0; +} + +ol { + margin-right: 1.5em; + margin-left: 0; +} + +caption, +th, +td { + text-align: right; +} + + +/** + * 4.0 - Forms + */ + +input[type="search"].search-field { + border-radius: 0 2px 2px 0; +} + +.search-submit:before { + left: 1px; +} + +.search-submit { + border-radius: 2px 0 0 2px; + left: 0; + right: auto; +} + + +/** + * 5.0 - Navigation + */ + +.main-navigation ul ul { + margin-right: 0.875em; + margin-left: auto; +} + +.main-navigation .menu-item-has-children > a { + margin-right: auto; + margin-left: 56px; +} + +.dropdown-toggle { + left: 0; + right: auto; +} + +.dropdown-toggle:after { + border-right-width: 1px; + border-left-width: 0; + left: auto; + right: 1px; +} + +.social-navigation li { + float: right; + margin: 0 0 0.4375em 0.4375em; +} + +.pagination:before { + left: 0; + right: auto; +} + +.pagination:after { + left: 54px; + right: auto; +} + +.pagination .nav-links { + padding-right: 0; + padding-left: 106px; +} + +.pagination .nav-links:before { + content: "\f430"; + left: -1px; + right: auto; +} + +.pagination .nav-links:after { + content: "\f429"; + left: 55px; + right: auto; +} + +.pagination .page-numbers { + margin: 0 -0.7368421053em 0 0.7368421053em; +} + +.pagination .prev, +.pagination .next { + margin: 0; +} + +.pagination .prev { + left: 54px; + right: auto; +} + +.pagination .prev:before { + content: "\f429"; + left: auto; + right: -1px; +} + +.pagination .next { + left: 0; + right: auto; +} + +.pagination .next:before { + content: "\f430"; + left: -1px; + right: auto; +} + +.comment-navigation { + margin-right: 0; + margin-left: 0; +} + + +/** + * 6.0 - Accessibility + */ + +.site .skip-link { + left: auto; + right: -9999em; +} + +.site .skip-link:focus { + left: auto; + right: 6px; +} + + +/** + * 7.0 - Widgets + */ + +.tagcloud a { + margin-right: 0; + margin-left: 0.1875em; +} + +.tagcloud ul { + margin-right: 0; +} + + +/** + * 8.0 - Content + */ + + +/** + * 8.1 - Header + */ + +.site-branding { + margin-right: 0; + margin-left: auto; +} + + +/** + * 8.2 - Posts and pages + */ + +.author-avatar .avatar { + float: right; + margin-right: 0; + margin-left: 1.75em; +} + +.entry-footer .avatar { + margin-right: 0; + margin-left: 0.5384615385em; +} + +.page-links a, +.page-links > span { + margin-right: auto; + margin-left: 0.3076923077em; +} + +.page-links > .page-links-title { + padding-right: 0; + padding-left: 0.6153846154em; +} + +body:not(.search-results) .entry-summary .alignright { + margin: 0.2631578947em 0 1.4736842105em 1.4736842105em; +} + +body:not(.search-results) .entry-summary .alignleft { + margin: 0.2631578947em 1.4736842105em 1.4736842105em 0; +} + + +/** + * 8.3 - Comments + */ + +.comment-list .children > li { + padding-right: 0.875em; + padding-left: 0; +} + +.comment-author .avatar { + float: right; + margin-right: auto; + margin-left: 0.875em; +} + +.bypostauthor > article .fn:after { + left: auto; + right: 3px; +} + +.comment-content ul, +.comment-content ol { + margin: 0 1.25em 1.5em 0; +} + +.comment-reply-title small a { + float: left; +} + +.comment-form #wp-comment-cookies-consent { + margin: 0 0 0 10px; +} + +.comment-form .comment-form-cookies-consent label { + font-family: Arial, Tahoma, sans-serif; +} + +/** + * 9.0 - Multisites + */ + +.widecolumn .mu_register label { + margin-right: 0; + margin-left: 0.7692307692em; +} + + +/** + * 10.0 - Media Queries + */ + + +/** + * 10.1 - >= 710px + */ + +@media screen and (min-width: 44.375em) { + .pagination { + margin: 0 7.6923% 4.421052632em 23.0769%; + } + + .entry-header, + .post-thumbnail, + .entry-content, + .entry-summary, + .entry-footer, + .comments-area, + .image-navigation, + .post-navigation, + .page-header, + .page-content, + .content-bottom-widgets { + margin-right: 7.6923%; + margin-left: 23.0769%; + } + + .entry-content blockquote:not(.alignright):not(.alignleft), + .entry-summary blockquote, + .comment-content blockquote { + margin-right: -1.473684211em; + margin-left: auto; + } + + .entry-content blockquote blockquote:not(.alignright):not(.alignleft), + .entry-summary blockquote blockquote, + .comment-content blockquote blockquote { + margin-right: 0; + margin-left: auto; + } + + .entry-content ul, + .entry-summary ul, + .comment-content ul, + .entry-content ol, + .entry-summary ol, + .comment-content ol { + margin-right: 0; + margin-left: auto; + } + + .entry-content li > ul, + .entry-summary li > ul, + .comment-content li > ul, + .entry-content blockquote > ul, + .entry-summary blockquote > ul, + .comment-content blockquote > ul { + margin-right: 1.25em; + margin-left: auto; + } + + .entry-content li > ol, + .entry-summary li > ol, + .comment-content li > ol, + .entry-content blockquote > ol, + .entry-summary blockquote > ol, + .comment-content blockquote > ol { + margin-right: 1.5em; + margin-left: auto; + } + + .comment-list .children > li { + padding-right: 1.75em; + padding-left: 0; + } + + .sidebar, + .widecolumn { + padding-right: 7.6923%; + padding-left: 23.0769%; + } + + body:not(.search-results) .entry-summary li > ul, + body:not(.search-results) .entry-summary blockquote > ul { + margin-right: 1.157894737em; + margin-left: auto; + } + + body:not(.search-results) .entry-summary li > ol, + body:not(.search-results) .entry-summary blockquote > ol { + margin-right: 1.473684211em; + margin-left: auto; + } +} + + +/** + * 10.2 - >= 910px + */ + +@media screen and (min-width: 56.875em) { + .main-navigation .primary-menu > li { + float: right; + } + + .main-navigation ul ul { + left: auto; + margin: 0; + right: -999em; + } + + .main-navigation ul ul:before { + left: 9px; + right: auto; + } + + .main-navigation ul ul:after { + left: 11px; + right: auto; + } + + .main-navigation li:hover > ul, + .main-navigation li.focus > ul { + left: 0; + right: auto; + } + + .main-navigation ul ul li:hover > ul, + .main-navigation ul ul li.focus > ul { + left: 100%; + right: auto; + } + + .main-navigation .menu-item-has-children > a { + margin: 0; + padding-right: 0.875em; + padding-left: 2.25em; + } + + .main-navigation .menu-item-has-children > a:after { + left: 0.625em; + right: auto; + } + + .main-navigation ul ul .menu-item-has-children > a { + padding-right: 0.875em; + padding-left: 2.0625em; + } + + .main-navigation ul ul .menu-item-has-children > a:after { + left: 0.5625em; + right: auto; + top: 0.8125em; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + } + + .content-area { + float: right; + margin-right: auto; + margin-left: -100%; + } + + .entry-header, + .post-thumbnail, + .entry-content, + .entry-summary, + .entry-footer, + .comments-area, + .image-navigation, + .post-navigation, + .pagination, + .page-header, + .page-content, + .content-bottom-widgets { + margin-right: 0; + margin-left: 0; + } + + .sidebar { + float: right; + margin-right: 75%; + margin-left: auto; + padding: 0; + } + + .widget blockquote { + padding-right: 1.0625em; + padding-left: 0; + } + + .widget .alignright { + margin: 0.2307692308em 0 1.6153846154em 1.6153846154em; + } + + .widget .alignleft { + margin: 0.2307692308em 1.6153846154em 1.6153846154em 0; + } + + .tagcloud a { + margin: 0 0 0.5384615385em 0.2307692308em; + } + + .content-bottom-widgets .widget-area:nth-child(1):nth-last-child(2), + .content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1) { + float: right; + margin-right: auto; + margin-left: 7.1428571%; + } + + .content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1):last-of-type { + margin-right: auto; + margin-left: 0; + } + + .site-info { + margin: 0.538461538em 0 0.538461538em auto; + } + + .no-sidebar .entry-header, + .no-sidebar .entry-content, + .no-sidebar .entry-summary, + .no-sidebar .entry-footer, + .no-sidebar .comments-area, + .no-sidebar .image-navigation, + .no-sidebar .post-navigation, + .no-sidebar .pagination, + .no-sidebar .page-header, + .no-sidebar .page-content, + .no-sidebar .content-bottom-widgets { + margin-right: 15%; + margin-left: 15%; + } + + .no-sidebar .post-thumbnail { + margin-right: 0; + margin-left: 0; + } + + .widecolumn { + padding-right: 15%; + padding-left: 15%; + } +} + + +/** + * 10.3 - >= 985px + */ + +@media screen and (min-width: 61.5625em) { + body:not(.search-results) article:not(.type-page) .entry-content { + float: left; + } + + body:not(.search-results) article:not(.type-page) .entry-content > blockquote.alignleft.below-entry-meta { + margin-right: 1.473684211em; + margin-left: 0; + width: -webkit-calc(50% - 0.736842105em); + width: calc(50% - 0.736842105em); + } + + body:not(.search-results) article:not(.type-page) .entry-content > blockquote.alignright.below-entry-meta { + margin-right: -40%; + margin-left: 1.473684211em; + width: -webkit-calc(60% - 1.4736842105em); + width: calc(60% - 1.4736842105em); + } + + body:not(.search-results) article:not(.type-page) img.below-entry-meta, + body:not(.search-results) article:not(.type-page) figure.below-entry-meta { + margin-right: -40%; + margin-left: 0; + } + + body:not(.search-results) article:not(.type-page) .entry-footer { + float: right; + } + + body.no-sidebar:not(.search-results) article:not(.type-page) .entry-content { + float: right; + margin-right: 34.99999999%; + margin-left: -100%; + } + + body.no-sidebar:not(.search-results) article:not(.type-page) .entry-footer { + margin-right: 15%; + margin-left: -100%; + } +} + + +/** + * 10.4 - >= 1200px + */ + +@media screen and (min-width: 75em) { + body:not(.search-results) .entry-summary li > ul, + body:not(.search-results) .entry-summary blockquote > ul { + margin-right: 0.956521739em; + margin-left: auto; + } + + body:not(.search-results) .entry-summary li > ol, + body:not(.search-results) .entry-summary blockquote > ol { + margin-right: 1.52173913em; + margin-left: auto; + } + + body:not(.search-results) .entry-summary blockquote { + padding-right: 1.347826087em; + padding-left: 0; + } + + body:not(.search-results) .entry-summary blockquote:not(.alignright):not(.alignleft) { + margin-right: -1.52173913em; + margin-left: auto; + } + + body:not(.search-results) .entry-summary blockquote blockquote:not(.alignright):not(.alignleft) { + margin-right: 0; + margin-left: auto; + } + + body:not(.search-results) .entry-summary .alignright { + margin: 0.2608695652em 0 1.5217391304em 1.5217391304em; + } + + body:not(.search-results) .entry-summary .alignleft { + margin: 0.2608695652em 1.5217391304em 1.5217391304em 0; + } +} diff --git a/wp-content/themes/twentysixteen/screenshot.png b/wp-content/themes/twentysixteen/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f2b25df4f3dba97ed97a358ee7b50330e828f0 GIT binary patch literal 463555 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%0AeJHk{2mf54v2*oOkki8R6=q*U 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�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�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

            nen5h&@w$6wZE4<}VKYqc&_MB;Mp%|XA` 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 + +

            +
            + + + + + + __( 'Previous page', 'twentysixteen' ), + 'next_text' => __( 'Next page', 'twentysixteen' ), + 'before_page_number' => '' . __( 'Page', 'twentysixteen' ) . ' ', + ) + ); + + // If no content, include the "No posts found" template. + else : + get_template_part( 'template-parts/content', 'none' ); + + endif; + ?> + +
            +
            + + + diff --git a/wp-content/themes/twentysixteen/searchform.php b/wp-content/themes/twentysixteen/searchform.php new file mode 100644 index 0000000..2fb75d4 --- /dev/null +++ b/wp-content/themes/twentysixteen/searchform.php @@ -0,0 +1,17 @@ + + + diff --git a/wp-content/themes/twentysixteen/sidebar-content-bottom.php b/wp-content/themes/twentysixteen/sidebar-content-bottom.php new file mode 100644 index 0000000..c232164 --- /dev/null +++ b/wp-content/themes/twentysixteen/sidebar-content-bottom.php @@ -0,0 +1,28 @@ + + diff --git a/wp-content/themes/twentysixteen/sidebar.php b/wp-content/themes/twentysixteen/sidebar.php new file mode 100644 index 0000000..31cb16d --- /dev/null +++ b/wp-content/themes/twentysixteen/sidebar.php @@ -0,0 +1,15 @@ + + + + + diff --git a/wp-content/themes/twentysixteen/single.php b/wp-content/themes/twentysixteen/single.php new file mode 100644 index 0000000..ade82e1 --- /dev/null +++ b/wp-content/themes/twentysixteen/single.php @@ -0,0 +1,59 @@ + + +
            +
            + _x( 'Published in%title', 'Parent post link', 'twentysixteen' ), + ) + ); + } elseif ( is_singular( 'post' ) ) { + // Previous/next post navigation. + the_post_navigation( + array( + 'next_text' => ' ' . + '' . __( 'Next post:', 'twentysixteen' ) . ' ' . + '%title', + 'prev_text' => ' ' . + '' . __( 'Previous post:', 'twentysixteen' ) . ' ' . + '%title', + ) + ); + } + + // End the loop. + endwhile; + ?> + +
            + + + +
            + + + diff --git a/wp-content/themes/twentysixteen/style.css b/wp-content/themes/twentysixteen/style.css new file mode 100644 index 0000000..33bcace --- /dev/null +++ b/wp-content/themes/twentysixteen/style.css @@ -0,0 +1,4026 @@ +/* +Theme Name: Twenty Sixteen +Theme URI: https://wordpress.org/themes/twentysixteen/ +Author: the WordPress team +Author URI: https://wordpress.org/ +Description: Twenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make your WordPress look beautiful everywhere. +Version: 2.1 +Requires at least: 4.4 +Requires PHP: 5.2.4 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Tags: one-column, two-columns, right-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, flexible-header, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready, blog +Text Domain: twentysixteen + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. +*/ + + +/** + * Table of Contents + * + * 1.0 - Normalize + * 2.0 - Genericons + * 3.0 - Typography + * 4.0 - Elements + * 5.0 - Forms + * 6.0 - Navigation + * 6.1 - Links + * 6.2 - Menus + * 7.0 - Accessibility + * 8.0 - Alignments + * 9.0 - Clearings + * 10.0 - Widgets + * 11.0 - Content + * 11.1 - Header + * 11.2 - Posts and pages + * 11.3 - Post Formats + * 11.4 - Comments + * 11.5 - Sidebar + * 11.6 - Footer + * 12.0 - Media + * 12.1 - Captions + * 12.2 - Galleries + * 13.0 - Multisite + * 14.0 - Media Queries + * 14.1 - >= 710px + * 14.2 - >= 783px + * 14.3 - >= 910px + * 14.4 - >= 985px + * 14.5 - >= 1200px + * 15.0 - Print + */ + + +/** + * 1.0 - Normalize + * + * Normalizing styles have been helped along thanks to the fine work of + * Nicolas Gallagher and Jonathan Neal http://necolas.github.com/normalize.css/ + */ + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +a { + background-color: transparent; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: 700; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +code, +kbd, +pre, +samp { + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +select { + text-transform: none; +} + +button { + overflow: visible; +} + +button, +input, +select, +textarea { + max-width: 100%; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; + opacity: .5; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-right: 0.4375em; + padding: 0; +} + +input[type="date"]::-webkit-inner-spin-button, +input[type="date"]::-webkit-outer-spin-button, +input[type="time"]::-webkit-inner-spin-button, +input[type="time"]::-webkit-outer-spin-button, +input[type="datetime-local"]::-webkit-inner-spin-button, +input[type="datetime-local"]::-webkit-outer-spin-button, +input[type="week"]::-webkit-inner-spin-button, +input[type="week"]::-webkit-outer-spin-button, +input[type="month"]::-webkit-inner-spin-button, +input[type="month"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +input[type="search"] { + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +fieldset { + border: 1px solid #d1d1d1; + margin: 0 0 1.75em; + min-width: inherit; + padding: 0.875em; +} + +fieldset > :last-child { + margin-bottom: 0; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +optgroup { + font-weight: bold; +} + + +/** + * 2.0 - Genericons + */ + +.menu-item-has-children a:after, +.social-navigation a:before, +.dropdown-toggle:after, +.bypostauthor > article .fn:after, +.comment-reply-title small a:before, +.pagination .prev:before, +.pagination .next:before, +.pagination .nav-links:before, +.pagination .nav-links:after, +.search-submit:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-family: "Genericons"; + font-size: 16px; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: 1; + speak: none; + text-align: center; + text-decoration: inherit; + text-transform: none; + vertical-align: top; +} + + +/** + * 3.0 - Typography + */ + +body, +button, +input, +select, +textarea { + color: #1a1a1a; + font-family: Merriweather, Georgia, serif; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + font-weight: 700; + margin: 0; + text-rendering: optimizeLegibility; +} + +p { + margin: 0 0 1.75em; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + border: 0 solid #1a1a1a; + border-left-width: 4px; + color: #686868; + font-size: 19px; + font-size: 1.1875rem; + font-style: italic; + line-height: 1.4736842105; + margin: 0 0 1.4736842105em; + overflow: hidden; + padding: 0 0 0 1.263157895em; +} + +blockquote, +q { + quotes: none; +} + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; +} + +blockquote p { + margin-bottom: 1.4736842105em; +} + +blockquote cite, +blockquote small { + color: #1a1a1a; + display: block; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +blockquote cite:before, +blockquote small:before { + content: "\2014\00a0"; +} + +blockquote em, +blockquote i, +blockquote cite { + font-style: normal; +} + +blockquote strong, +blockquote b { + font-weight: 400; +} + +blockquote > :last-child { + margin-bottom: 0; +} + +address { + font-style: italic; + margin: 0 0 1.75em; +} + +code, +kbd, +tt, +var, +samp, +pre { + font-family: Inconsolata, monospace; +} + +pre { + border: 1px solid #d1d1d1; + font-size: 16px; + font-size: 1rem; + line-height: 1.3125; + margin: 0 0 1.75em; + max-width: 100%; + overflow: auto; + padding: 1.75em; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +code { + background-color: #d1d1d1; + padding: 0.125em 0.25em; +} + +abbr, +acronym { + border-bottom: 1px dotted #d1d1d1; + cursor: help; +} + +mark, +ins { + background: #007acc; + color: #fff; + padding: 0.125em 0.25em; + text-decoration: none; +} + +big { + font-size: 125%; +} + + +/** + * 4.0 - Elements + */ + +html { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*, +*:before, +*:after { + /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ + -webkit-box-sizing: inherit; + -moz-box-sizing: inherit; + box-sizing: inherit; +} + +body { + background: #1a1a1a; + /* Fallback for when there is no custom background color defined. */ +} + +hr { + background-color: #d1d1d1; + border: 0; + height: 1px; + margin: 0 0 1.75em; +} + +ul, +ol { + margin: 0 0 1.75em 1.25em; + padding: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; + margin-left: 1.5em; +} + +li > ul, +li > ol { + margin-bottom: 0; +} + +dl { + margin: 0 0 1.75em; +} + +dt { + font-weight: 700; +} + +dd { + margin: 0 0 1.75em; +} + +img { + height: auto; + /* Make sure images are scaled correctly. */ + max-width: 100%; + /* Adhere to container width. */ + vertical-align: middle; +} + +del { + opacity: 0.8; +} + +table, +th, +td { + border: 1px solid #d1d1d1; +} + +table { + border-collapse: separate; + border-spacing: 0; + border-width: 1px 0 0 1px; + margin: 0 0 1.75em; + table-layout: fixed; + /* Prevents HTML tables from becoming too wide */ + width: 100%; +} + +caption, +th, +td { + font-weight: normal; + text-align: left; +} + +th { + border-width: 0 1px 1px 0; + font-weight: 700; +} + +td { + border-width: 0 1px 1px 0; +} + +th, +td { + padding: 0.4375em; +} + +/* Placeholder text color -- selectors need to be separate to work. */ +::-webkit-input-placeholder { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; +} + +:-moz-placeholder { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; +} + +::-moz-placeholder { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; + opacity: 1; + /* Since FF19 lowers the opacity of the placeholder by default */ +} + +:-ms-input-placeholder { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; +} + + +/** + * 5.0 - Forms + */ + +input { + line-height: normal; +} + +button, +button[disabled]:hover, +button[disabled]:focus, +input[type="button"], +input[type="button"][disabled]:hover, +input[type="button"][disabled]:focus, +input[type="reset"], +input[type="reset"][disabled]:hover, +input[type="reset"][disabled]:focus, +input[type="submit"], +input[type="submit"][disabled]:hover, +input[type="submit"][disabled]:focus { + background: #1a1a1a; + border: 0; + border-radius: 2px; + color: #fff; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-weight: 700; + letter-spacing: 0.046875em; + line-height: 1; + padding: 0.84375em 0.875em 0.78125em; + text-transform: uppercase; +} + +button:hover, +button:focus, +input[type="button"]:hover, +input[type="button"]:focus, +input[type="reset"]:hover, +input[type="reset"]:focus, +input[type="submit"]:hover, +input[type="submit"]:focus { + background: #007acc; +} + +button:focus, +input[type="button"]:focus, +input[type="reset"]:focus, +input[type="submit"]:focus { + outline: thin dotted; + outline-offset: -4px; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="week"], +input[type="month"], +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="tel"], +input[type="number"], +textarea { + background: #f7f7f7; + background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0)); + border: 1px solid #d1d1d1; + border-radius: 2px; + color: #686868; + padding: 0.625em 0.4375em; + width: 100%; +} + +input[type="date"]:focus, +input[type="time"]:focus, +input[type="datetime-local"]:focus, +input[type="week"]:focus, +input[type="month"]:focus, +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="number"]:focus, +textarea:focus { + background-color: #fff; + border-color: #007acc; + color: #1a1a1a; + outline: 0; +} + +.post-password-form { + margin-bottom: 1.75em; +} + +.post-password-form label { + color: #686868; + display: block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + letter-spacing: 0.076923077em; + line-height: 1.6153846154; + margin-bottom: 1.75em; + text-transform: uppercase; +} + +.post-password-form input[type="password"] { + margin-top: 0.4375em; +} + +.post-password-form > :last-child { + margin-bottom: 0; +} + +.search-form { + position: relative; +} + +input[type="search"].search-field { + border-radius: 2px 0 0 2px; + width: -webkit-calc(100% - 42px); + width: calc(100% - 42px); +} + +.search-submit:before { + content: "\f400"; + font-size: 24px; + left: 2px; + line-height: 42px; + position: relative; + width: 40px; +} + +.search-submit { + border-radius: 0 2px 2px 0; + bottom: 0; + overflow: hidden; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 42px; +} + + +/** + * 6.0 - Navigation + */ + +/** + * 6.1 - Links + */ + +a { + color: #007acc; + text-decoration: none; +} + +a:hover, +a:focus, +a:active { + color: #686868; +} + +a:focus { + outline: thin dotted; +} + +a:hover, +a:active { + outline: 0; +} + +.entry-content a, +.entry-summary a, +.taxonomy-description a, +.logged-in-as a, +.comment-content a, +.pingback .comment-body > a, +.textwidget a, +.entry-footer a:hover, +.site-info a:hover { + box-shadow: 0 1px 0 0 currentColor; +} + +.entry-content a:hover, +.entry-content a:focus, +.entry-summary a:hover, +.entry-summary a:focus, +.taxonomy-description a:hover, +.taxonomy-description a:focus, +.logged-in-as a:hover, +.logged-in-as a:focus, +.comment-content a:hover, +.comment-content a:focus, +.pingback .comment-body > a:hover, +.pingback .comment-body > a:focus, +.textwidget a:hover, +.textwidget a:focus { + box-shadow: none; +} + + +/** + * 6.2 - Menus + */ + +.site-header-menu { + display: none; + -webkit-flex: 0 1 100%; + -ms-flex: 0 1 100%; + flex: 0 1 100%; + margin: 0.875em 0; +} + +.site-header-menu.toggled-on, +.no-js .site-header-menu { + display: block; +} + +.main-navigation { + font-family: Montserrat, "Helvetica Neue", sans-serif; +} + +.site-footer .main-navigation { + margin-bottom: 1.75em; +} + +.main-navigation ul { + list-style: none; + margin: 0; +} + +.main-navigation li { + border-top: 1px solid #d1d1d1; + position: relative; +} + +.main-navigation a { + color: #1a1a1a; + display: block; + line-height: 1.3125; + outline-offset: -1px; + padding: 0.84375em 0; +} + +.main-navigation a:hover, +.main-navigation a:focus { + color: #007acc; +} + +.main-navigation .current-menu-item > a, +.main-navigation .current-menu-ancestor > a { + font-weight: 700; +} + +.main-navigation ul ul { + display: none; + margin-left: 0.875em; +} + +.no-js .main-navigation ul ul { + display: block; +} + +.main-navigation ul .toggled-on { + display: block; +} + +.main-navigation .primary-menu { + border-bottom: 1px solid #d1d1d1; +} + +.main-navigation .menu-item-has-children > a { + margin-right: 56px; +} + +.dropdown-toggle { + background-color: transparent; + border: 0; + border-radius: 0; + color: #1a1a1a; + content: ""; + height: 48px; + padding: 0; + position: absolute; + right: 0; + text-transform: none; + top: 0; + width: 48px; +} + +.dropdown-toggle:after { + border: 0 solid #d1d1d1; + border-left-width: 1px; + content: "\f431"; + font-size: 24px; + left: 1px; + position: relative; + width: 48px; +} + +.dropdown-toggle:hover, +.dropdown-toggle:focus { + background-color: transparent; + color: #007acc; +} + +.dropdown-toggle:focus { + outline: thin dotted; + outline-offset: -1px; +} + +.dropdown-toggle:focus:after { + border-color: transparent; +} + +.dropdown-toggle.toggled-on:after { + content: "\f432"; +} + +.site-header .main-navigation + .social-navigation { + margin-top: 1.75em; +} + +.site-footer .social-navigation { + margin-bottom: 1.75em; +} + +.social-navigation ul { + list-style: none; + margin: 0 0 -0.4375em; +} + +.social-navigation li { + float: left; + margin: 0 0.4375em 0.4375em 0; +} + +.social-navigation a { + border: 1px solid #d1d1d1; + border-radius: 50%; + color: #1a1a1a; + display: block; + height: 35px; + position: relative; + width: 35px; +} + +.social-navigation a:before { + content: "\f415"; + height: 33px; + line-height: 33px; + text-align: center; + width: 33px; +} + +.social-navigation a:hover:before, +.social-navigation a:focus:before { + color: #007acc; +} + +.social-navigation a[href*="codepen.io"]:before { + content: "\f216"; +} + +.social-navigation a[href*="digg.com"]:before { + content: "\f221"; +} + +.social-navigation a[href*="dribbble.com"]:before { + content: "\f201"; +} + +.social-navigation a[href*="dropbox.com"]:before { + content: "\f225"; +} + +.social-navigation a[href*="facebook.com"]:before { + content: "\f203"; +} + +.social-navigation a[href*="flickr.com"]:before { + content: "\f211"; +} + +.social-navigation a[href*="foursquare.com"]:before { + content: "\f226"; +} + +.social-navigation a[href*="plus.google.com"]:before { + content: "\f206"; +} + +.social-navigation a[href*="github.com"]:before { + content: "\f200"; +} + +.social-navigation a[href*="instagram.com"]:before { + content: "\f215"; +} + +.social-navigation a[href*="linkedin.com"]:before { + content: "\f208"; +} + +.social-navigation a[href*="path.com"]:before { + content: "\f219"; +} + +.social-navigation a[href*="pinterest.com"]:before { + content: "\f210"; +} + +.social-navigation a[href*="getpocket.com"]:before { + content: "\f224"; +} + +.social-navigation a[href*="polldaddy.com"]:before { + content: "\f217"; +} + +.social-navigation a[href*="reddit.com"]:before { + content: "\f222"; +} + +.social-navigation a[href*="skype.com"]:before { + content: "\f220"; +} + +.social-navigation a[href*="stumbleupon.com"]:before { + content: "\f223"; +} + +.social-navigation a[href*="tumblr.com"]:before { + content: "\f214"; +} + +.social-navigation a[href*="twitter.com"]:before { + content: "\f202"; +} + +.social-navigation a[href*="vimeo.com"]:before { + content: "\f212"; +} + +.social-navigation a[href*="wordpress.com"]:before, +.social-navigation a[href*="wordpress.org"]:before { + content: "\f205"; +} + +.social-navigation a[href*="youtube.com"]:before { + content: "\f213"; +} + +.social-navigation a[href^="mailto:"]:before { + content: "\f410"; +} + +.social-navigation a[href*="spotify.com"]:before { + content: "\f515"; +} + +.social-navigation a[href*="twitch.tv"]:before { + content: "\f516"; +} + +.social-navigation a[href$="/feed/"]:before { + content: "\f413"; +} + +.post-navigation { + border-top: 4px solid #1a1a1a; + border-bottom: 4px solid #1a1a1a; + clear: both; + font-family: Montserrat, "Helvetica Neue", sans-serif; + margin: 0 7.6923% 3.5em; +} + +.post-navigation a { + color: #1a1a1a; + display: block; + padding: 1.75em 0; +} + +.post-navigation span { + display: block; +} + +.post-navigation .meta-nav { + color: #686868; + font-size: 13px; + font-size: 0.8125rem; + letter-spacing: 0.076923077em; + line-height: 1.6153846154; + margin-bottom: 0.5384615385em; + text-transform: uppercase; +} + +.post-navigation .post-title { + display: inline; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 23px; + font-size: 1.4375rem; + font-weight: 700; + line-height: 1.2173913043; + text-rendering: optimizeLegibility; +} + +.post-navigation a:hover .post-title, +.post-navigation a:focus .post-title { + color: #007acc; +} + +.post-navigation div + div { + border-top: 4px solid #1a1a1a; +} + +.pagination { + border-top: 4px solid #1a1a1a; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 19px; + font-size: 1.1875rem; + margin: 0 7.6923% 2.947368421em; + min-height: 56px; + position: relative; +} + +.pagination:before, +.pagination:after { + background-color: #1a1a1a; + content: ""; + height: 52px; + position: absolute; + top:0; + width: 52px; + z-index: 0; +} + +.pagination:before { + right: 0; +} + +.pagination:after { + right: 54px; +} + +.pagination a:hover, +.pagination a:focus { + color: #1a1a1a; +} + +.pagination .nav-links { + padding-right: 106px; + position: relative; +} + +.pagination .nav-links:before, +.pagination .nav-links:after { + color: #fff; + font-size: 32px; + line-height: 51px; + opacity: 0.3; + position: absolute; + width: 52px; + z-index: 1; +} + +.pagination .nav-links:before { + content: "\f429"; + right: -1px; +} + +.pagination .nav-links:after { + content: "\f430"; + right: 55px; +} + +/* reset screen-reader-text */ +.pagination .current .screen-reader-text { + position: static !important; +} + +.pagination .page-numbers { + display: none; + letter-spacing: 0.013157895em; + line-height: 1; + margin: 0 0.7368421053em 0 -0.7368421053em; + padding: 0.8157894737em 0.7368421053em 0.3947368421em; + text-transform: uppercase; +} + +.pagination .current { + display: inline-block; + font-weight: 700; +} + +.pagination .prev, +.pagination .next { + background-color: #1a1a1a; + color: #fff; + display: inline-block; + height: 52px; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + top: 0; + width: 52px; + z-index: 2; +} + +.pagination .prev:before, +.pagination .next:before { + font-size: 32px; + height: 53px; + line-height: 52px; + position: relative; + width: 53px; +} + +.pagination .prev:hover, +.pagination .prev:focus, +.pagination .next:hover, +.pagination .next:focus { + background-color: #007acc; + color: #fff; +} + +.pagination .prev:focus, +.pagination .next:focus { + outline: 0; +} + +.pagination .prev { + right: 54px; +} + +.pagination .prev:before { + content: "\f430"; + left: -1px; + top: -1px; +} + +.pagination .next { + right: 0; +} + +.pagination .next:before { + content: "\f429"; + right: -1px; + top: -1px; +} + +.image-navigation, +.comment-navigation { + border-top: 1px solid #d1d1d1; + border-bottom: 1px solid #d1d1d1; + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + margin: 0 7.6923% 2.1538461538em; + padding: 1.0769230769em 0; +} + +.comment-navigation { + margin-right: 0; + margin-left: 0; +} + +.comments-title + .comment-navigation { + border-bottom: 0; + margin-bottom: 0; +} + +.image-navigation .nav-previous:not(:empty), +.image-navigation .nav-next:not(:empty), +.comment-navigation .nav-previous:not(:empty), +.comment-navigation .nav-next:not(:empty) { + display: inline-block; +} + +.image-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before, +.comment-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before { + content: "\002f"; + display: inline-block; + opacity: 0.7; + padding: 0 0.538461538em; +} + + +/** + * 7.0 - Accessibility + */ + +/* Text meant only for screen readers */ +.says, +.screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute !important; + width: 1px; + /* many screen reader and browser combinations announce broken words as they would appear visually */ + word-wrap: normal !important; +} + +/* must have higher specificity than alternative color schemes inline styles */ +.site .skip-link { + background-color: #f1f1f1; + box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.2); + color: #21759b; + display: block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 700; + left: -9999em; + outline: none; + padding: 15px 23px 14px; + text-decoration: none; + text-transform: none; + top: -9999em; +} + +.logged-in .site .skip-link { + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.2); + font-family: "Open Sans", sans-serif; +} + +.site .skip-link:focus { + clip: auto; + height: auto; + left: 6px; + top: 7px; + width: auto; + z-index: 100000; +} + + +/** + * 8.0 - Alignments + */ + +.alignleft { + float: left; + margin: 0.375em 1.75em 1.75em 0; +} + +.alignright { + float: right; + margin: 0.375em 0 1.75em 1.75em; +} + +.aligncenter { + clear: both; + display: block; + margin: 0 auto 1.75em; +} + +blockquote.alignleft { + margin: 0.3157894737em 1.4736842105em 1.473684211em 0; +} + +blockquote.alignright { + margin: 0.3157894737em 0 1.473684211em 1.4736842105em; +} + +blockquote.aligncenter { + margin-bottom: 1.473684211em; +} + + +/** + * 9.0 - Clearings + */ + +.clear:before, +.clear:after, +blockquote:before, +blockquote:after, +.entry-content:before, +.entry-content:after, +.entry-summary:before, +.entry-summary:after, +.comment-content:before, +.comment-content:after, +.site-content:before, +.site-content:after, +.site-main > article:before, +.site-main > article:after, +.primary-menu:before, +.primary-menu:after, +.social-links-menu:before, +.social-links-menu:after, +.textwidget:before, +.textwidget:after, +.content-bottom-widgets:before, +.content-bottom-widgets:after { + content: ""; + display: table; +} + +.clear:after, +blockquote:after, +.entry-content:after, +.entry-summary:after, +.comment-content:after, +.site-content:after, +.site-main > article:after, +.primary-menu:after, +.social-links-menu:after, +.textwidget:after, +.content-bottom-widgets:after { + clear: both; +} + + +/** + * 10.0 - Widgets + */ + +.widget { + border-top: 4px solid #1a1a1a; + margin-bottom: 3.5em; + padding-top: 1.75em; +} + +.widget-area > :last-child, +.widget > :last-child { + margin-bottom: 0; +} + +.widget .widget-title { + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 16px; + font-size: 1rem; + letter-spacing: 0.046875em; + line-height: 1.3125; + margin: 0 0 1.75em; + text-transform: uppercase; +} + +.widget .widget-title:empty { + margin-bottom: 0; +} + +.widget-title a { + color: #1a1a1a; +} + +/* Calendar widget */ +.widget.widget_calendar table { + margin: 0; +} + +.widget_calendar .wp-calendar-nav { + display: table; + width: 100%; +} + +.widget_calendar .wp-calendar-nav span { + display: table-cell; +} + +.widget_calendar .wp-calendar-nav-prev, +.widget_calendar .wp-calendar-nav-next { + width: 40%; +} + +.widget_calendar td, +.widget_calendar th, +.widget_calendar .wp-calendar-nav span { + line-height: 2.5625; + padding: 0; + text-align: center; +} + +.widget_calendar caption { + font-weight: 900; + margin-bottom: 1.75em; +} + +.widget_calendar tbody a { + background-color: #007acc; + color: #fff; + display: block; + font-weight: 700; +} + +.widget_calendar tbody a:hover, +.widget_calendar tbody a:focus { + background-color: #686868; + color: #fff; +} + +/* Recent Posts widget */ +.widget_recent_entries .post-date { + color: #686868; + display: block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.615384615; + margin-bottom: 0.538461538em; +} + +.widget_recent_entries li:last-child .post-date { + margin-bottom: 0; +} + +/* RSS widget */ +.widget_rss .rsswidget img { + margin-top: -0.375em; +} + +.widget_rss .rss-date, +.widget_rss cite { + color: #686868; + display: block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + font-style: normal; + line-height: 1.615384615; + margin-bottom: 0.538461538em; +} + +.widget_rss .rssSummary:last-child { + margin-bottom: 2.1538461538em; +} + +.widget_rss li:last-child :last-child { + margin-bottom: 0; +} + +/* Tag Cloud widget */ +.tagcloud a { + border: 1px solid #d1d1d1; + border-radius: 2px; + display: inline-block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + line-height: 1; + margin: 0 0.1875em 0.4375em 0; + padding: 0.5625em 0.4375em 0.5em; +} + +.tagcloud ul { + list-style-type: none; + margin-left: 0; +} + +.tagcloud ul li { + display: inline-block; +} + +.tagcloud a:hover, +.tagcloud a:focus { + border-color: #007acc; + color: #007acc; + outline: 0; +} + + +/** + * 11.0 - Content + */ + +.site { + background-color: #fff; +} + +.site-inner { + margin: 0 auto; + max-width: 1320px; + position: relative; +} + +.site-content { + word-wrap: break-word; +} + +/* Do not show the outline on the skip link target. */ +#content[tabindex="-1"]:focus { + outline: 0; +} + +.site-main { + margin-bottom: 3.5em; +} + +.site-main > :last-child { + margin-bottom: 0; +} + + +/** + * 11.1 - Header + */ + +.site-header { + padding: 2.625em 7.6923%; +} + +.site-header-main { + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.site-branding { + margin: 0.875em auto 0.875em 0; + /* Avoid overflowing wide custom logo in small screens in Firefox and IEs */ + max-width: 100%; + min-width: 0; + overflow: hidden; +} + +.custom-logo-link { + display: block; +} + +.custom-logo { + max-width: 180px; +} + +.site-title { + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 23px; + font-size: 1.4375rem; + font-weight: 700; + line-height: 1.2173913043; + margin: 0; +} + +.site-branding .site-title a { + color: #1a1a1a; +} + +.site-branding .site-title a:hover, +.site-branding .site-title a:focus { + color: #007acc; +} + +.wp-custom-logo .site-title { + margin-top: 0.608695652em; +} + +.site-description { + color: #686868; + display: none; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 400; + line-height: 1.0769230769; + margin: 0.538461538em 0 0; +} + +.menu-toggle { + background-color: transparent; + border: 1px solid #d1d1d1; + color: #1a1a1a; + font-size: 13px; + font-size: 0.8125rem; + margin: 1.076923077em 0; + padding: 0.769230769em; +} + +.no-js .menu-toggle { + display: none; +} + +.menu-toggle:hover, +.menu-toggle:focus { + background-color: transparent; + border-color: #007acc; + color: #007acc; +} + +.menu-toggle.toggled-on, +.menu-toggle.toggled-on:hover, +.menu-toggle.toggled-on:focus { + background-color: #1a1a1a; + border-color: #1a1a1a; + color: #fff; +} + +.menu-toggle:focus { + outline: 0; +} + +.menu-toggle.toggled-on:focus { + outline: thin dotted; +} + +.header-image { + clear: both; + margin: 0.875em 0; +} + +.header-image a { + display: block; +} + +.header-image a:hover img, +.header-image a:focus img { + opacity: 0.85; +} + +/** + * 11.2 - Posts and pages + */ + +.site-main > article { + margin-bottom: 3.5em; + position: relative; +} + +.entry-header, +.entry-summary, +.entry-content, +.entry-footer, +.page-content { + margin-right: 7.6923%; + margin-left: 7.6923%; +} + +.entry-title { + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 28px; + font-size: 1.75rem; + font-weight: 700; + line-height: 1.25; + margin-bottom: 1em; +} + +.entry-title a { + color: #1a1a1a; +} + +.entry-title a:hover, +.entry-title a:focus { + color: #007acc; +} + +.post-thumbnail { + display: block; + margin: 0 7.6923% 1.75em; +} + +.post-thumbnail img { + display: block; +} + +.no-sidebar .post-thumbnail img { + margin: 0 auto; +} + +a.post-thumbnail:hover, +a.post-thumbnail:focus { + opacity: 0.85; +} + +.entry-content, +.entry-summary { + border-color: #d1d1d1; +} + +.entry-content h1, +.entry-summary h1, +.comment-content h1, +.textwidget h1 { + font-size: 28px; + font-size: 1.75rem; + line-height: 1.25; + margin-top: 2em; + margin-bottom: 1em; +} + +.entry-content h2, +.entry-summary h2, +.comment-content h2, +.textwidget h2 { + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.2173913043; + margin-top: 2.4347826087em; + margin-bottom: 1.2173913043em; +} + +.entry-content h3, +.entry-summary h3, +.comment-content h3, +.textwidget h3 { + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.1052631579; + margin-top: 2.9473684211em; + margin-bottom: 1.4736842105em; +} + +.entry-content h4, +.entry-content h5, +.entry-content h6, +.entry-summary h4, +.entry-summary h5, +.entry-summary h6, +.comment-content h4, +.comment-content h5, +.comment-content h6, +.textwidget h4, +.textwidget h5, +.textwidget h6 { + font-size: 16px; + font-size: 1rem; + line-height: 1.3125; + margin-top: 3.5em; + margin-bottom: 1.75em; +} + +.entry-content h4, +.entry-summary h4, +.comment-content h4, +.textwidget h4 { + letter-spacing: 0.140625em; + text-transform: uppercase; +} + +.entry-content h6, +.entry-summary h6, +.comment-content h6, +.textwidget h6 { + font-style: italic; +} + +.entry-content h1, +.entry-content h2, +.entry-content h3, +.entry-content h4, +.entry-content h5, +.entry-content h6, +.entry-summary h1, +.entry-summary h2, +.entry-summary h3, +.entry-summary h4, +.entry-summary h5, +.entry-summary h6, +.comment-content h1, +.comment-content h2, +.comment-content h3, +.comment-content h4, +.comment-content h5, +.comment-content h6, +.textwidget h1, +.textwidget h2, +.textwidget h3, +.textwidget h4, +.textwidget h5, +.textwidget h6 { + font-weight: 900; +} + +.entry-content h1:first-child, +.entry-content h2:first-child, +.entry-content h3:first-child, +.entry-content h4:first-child, +.entry-content h5:first-child, +.entry-content h6:first-child, +.entry-summary h1:first-child, +.entry-summary h2:first-child, +.entry-summary h3:first-child, +.entry-summary h4:first-child, +.entry-summary h5:first-child, +.entry-summary h6:first-child, +.comment-content h1:first-child, +.comment-content h2:first-child, +.comment-content h3:first-child, +.comment-content h4:first-child, +.comment-content h5:first-child, +.comment-content h6:first-child, +.textwidget h1:first-child, +.textwidget h2:first-child, +.textwidget h3:first-child, +.textwidget h4:first-child, +.textwidget h5:first-child, +.textwidget h6:first-child { + margin-top: 0; +} + +.post-navigation .post-title, +.entry-title, +.comments-title { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; +} + +body:not(.search-results) .entry-summary { + color: #686868; + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.4736842105; + margin-bottom: 1.4736842105em; +} + +body:not(.search-results) .entry-header + .entry-summary { + margin-top: -0.736842105em; +} + +body:not(.search-results) .entry-summary p, +body:not(.search-results) .entry-summary address, +body:not(.search-results) .entry-summary hr, +body:not(.search-results) .entry-summary ul, +body:not(.search-results) .entry-summary ol, +body:not(.search-results) .entry-summary dl, +body:not(.search-results) .entry-summary dd, +body:not(.search-results) .entry-summary table { + margin-bottom: 1.4736842105em; +} + +body:not(.search-results) .entry-summary li > ul, +body:not(.search-results) .entry-summary li > ol { + margin-bottom: 0; +} + +body:not(.search-results) .entry-summary th, +body:not(.search-results) .entry-summary td { + padding: 0.3684210526em; +} + +body:not(.search-results) .entry-summary fieldset { + margin-bottom: 1.4736842105em; + padding: 0.3684210526em; +} + +body:not(.search-results) .entry-summary blockquote { + border-color: currentColor; +} + +body:not(.search-results) .entry-summary blockquote > :last-child { + margin-bottom: 0; +} + +body:not(.search-results) .entry-summary .alignleft { + margin: 0.2631578947em 1.4736842105em 1.4736842105em 0; +} + +body:not(.search-results) .entry-summary .alignright { + margin: 0.2631578947em 0 1.4736842105em 1.4736842105em; +} + +body:not(.search-results) .entry-summary .aligncenter { + margin-bottom: 1.4736842105em; +} + +.entry-content > :last-child, +.entry-summary > :last-child, +body:not(.search-results) .entry-summary > :last-child, +.page-content > :last-child, +.comment-content > :last-child, +.textwidget > :last-child { + margin-bottom: 0; +} + +.more-link { + white-space: nowrap; +} + +.author-info { + border-color: inherit; + border-style: solid; + border-width: 1px 0 1px 0; + clear: both; + padding-top: 1.75em; + padding-bottom: 1.75em; +} + +.author-avatar .avatar { + float: left; + height: 42px; + margin: 0 1.75em 1.75em 0; + width: 42px; +} + +.author-description > :last-child { + margin-bottom: 0; +} + +.entry-content .author-title { + clear: none; + font-size: 16px; + font-size: 1rem; + font-weight: 900; + line-height: 1.75; + margin: 0; +} + +.author-bio { + color: #686868; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + margin-bottom: 1.6153846154em; + overflow: hidden; +} + +.author-link { + white-space: nowrap; +} + +.entry-footer { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + margin-top: 2.1538461538em; +} + +.entry-footer:empty { + margin: 0; +} + +.entry-footer a { + color: #686868; +} + +.entry-footer a:hover, +.entry-footer a:focus { + color: #007acc; +} + +.entry-footer > span:not(:last-child):after { + content: "\002f"; + display: inline-block; + opacity: 0.7; + padding: 0 0.538461538em; +} + +.entry-footer .avatar { + height: 21px; + margin: -0.1538461538em 0.5384615385em 0 0; + width: 21px; +} + +.sticky-post { + color: #686868; + display: block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + letter-spacing: 0.076923077em; + line-height: 1.6153846154; + margin-bottom: 0.5384615385em; + text-transform: uppercase; +} + +/** + * IE8 and earlier will drop any block with CSS3 selectors. + * Do not combine these styles with the next block. + */ +.updated:not(.published) { + display: none; +} + +.sticky .posted-on, +.byline { + display: none; +} + +.single .byline, +.group-blog .byline { + display: inline; +} + +.page-header { + border-top: 4px solid #1a1a1a; + margin: 0 7.6923% 3.5em; + padding-top: 1.75em; +} + +body.error404 .page-header, +body.search-no-results .page-header { + border-top: 0; + padding-top: 0; +} + +.page-title { + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.2173913043; +} + +.taxonomy-description { + color: #686868; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; +} + +.taxonomy-description p { + margin: 0.5384615385em 0 1.6153846154em; +} + +.taxonomy-description > :last-child { + margin-bottom: 0; +} + +.page-links { + clear: both; + font-family: Montserrat, "Helvetica Neue", sans-serif; + margin: 0 0 1.75em; +} + +.page-links a, +.page-links > span { + border: 1px solid #d1d1d1; + border-radius: 2px; + display: inline-block; + font-size: 13px; + font-size: 0.8125rem; + height: 1.8461538462em; + line-height: 1.6923076923em; + margin-right: 0.3076923077em; + text-align: center; + width: 1.8461538462em; +} + +.page-links a { + background-color: #1a1a1a; + border-color: #1a1a1a; + color: #fff; +} + +.page-links a:hover, +.page-links a:focus { + background-color: #007acc; + border-color: transparent; + color: #fff; +} + +.page-links > .page-links-title { + border: 0; + color: #1a1a1a; + height: auto; + margin: 0; + padding-right: 0.6153846154em; + width: auto; +} + +.entry-attachment { + margin-bottom: 1.75em; +} + +.entry-caption { + color: #686868; + font-size: 13px; + font-size: 0.8125rem; + font-style: italic; + line-height: 1.6153846154; + padding-top: 1.0769230769em; +} + +.entry-caption > :last-child { + margin-bottom: 0; +} + +.content-bottom-widgets { + margin: 0 7.6923%; +} + +.content-bottom-widgets .widget-area { + margin-bottom: 3.5em; +} + + +/** + * 11.3 - Post Formats + */ + +.format-aside .entry-title, +.format-image .entry-title, +.format-video .entry-title, +.format-quote .entry-title, +.format-gallery .entry-title, +.format-status .entry-title, +.format-link .entry-title, +.format-audio .entry-title, +.format-chat .entry-title { + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.473684211; + margin-bottom: 1.473684211em; +} + +.blog .format-status .entry-title, +.archive .format-status .entry-title { + display: none; +} + + +/** + * 11.4 - Comments + */ + +.comments-area { + margin: 0 7.6923% 3.5em; +} + +.comment-list + .comment-respond, +.comment-navigation + .comment-respond { + padding-top: 1.75em; +} + +.comments-title, +.comment-reply-title { + border-top: 4px solid #1a1a1a; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 23px; + font-size: 1.4375rem; + font-weight: 700; + line-height: 1.3125; + padding-top: 1.217391304em; +} + +.comments-title { + margin-bottom: 1.217391304em; +} + +.comment-list { + list-style: none; + margin: 0; +} + +.comment-list article, +.comment-list .pingback, +.comment-list .trackback { + border-top: 1px solid #d1d1d1; + padding: 1.75em 0; +} + +.comment-list .children { + list-style: none; + margin: 0; +} + +.comment-list .children > li { + padding-left: 0.875em; +} + +.comment-author { + color: #1a1a1a; + margin-bottom: 0.4375em; +} + +.comment-author .avatar { + float: left; + height: 28px; + margin-right: 0.875em; + position: relative; + width: 28px; +} + +.bypostauthor > article .fn:after { + content: "\f304"; + left: 3px; + position: relative; + top: 5px; +} + +.comment-metadata, +.pingback .edit-link { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; +} + +.comment-metadata { + margin-bottom: 2.1538461538em; +} + +.comment-metadata a, +.pingback .comment-edit-link { + color: #686868; +} + +.comment-metadata a:hover, +.comment-metadata a:focus, +.pingback .comment-edit-link:hover, +.pingback .comment-edit-link:focus { + color: #007acc; +} + +.comment-metadata .edit-link, +.pingback .edit-link { + display: inline-block; +} + +.comment-metadata .edit-link:before, +.pingback .edit-link:before { + content: "\002f"; + display: inline-block; + opacity: 0.7; + padding: 0 0.538461538em; +} + +.comment-content ul, +.comment-content ol { + margin: 0 0 1.5em 1.25em; +} + +.comment-content li > ul, +.comment-content li > ol { + margin-bottom: 0; +} + +.comment-reply-link { + border: 1px solid #d1d1d1; + border-radius: 2px; + color: #007acc; + display: inline-block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1; + margin-top: 2.1538461538em; + padding: 0.5384615385em 0.5384615385em 0.4615384615em; +} + +.comment-reply-link:hover, +.comment-reply-link:focus { + border-color: currentColor; + color: #007acc; + outline: 0; +} + +.comment-form { + padding-top: 1.75em; +} + +.comment-form label { + color: #686868; + display: block; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + letter-spacing: 0.076923077em; + line-height: 1.6153846154; + margin-bottom: 0.5384615385em; + text-transform: uppercase; +} + +.comment-list .comment-form { + padding-bottom: 1.75em; +} + +.comment-notes, +.comment-awaiting-moderation, +.logged-in-as, +.form-allowed-tags { + color: #686868; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + margin-bottom: 2.1538461538em; +} + +.no-comments { + border-top: 1px solid #d1d1d1; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-weight: 700; + margin: 0; + padding-top: 1.75em; +} + +.comment-navigation + .no-comments { + border-top: 0; + padding-top: 0; +} + +.form-allowed-tags code { + font-family: Inconsolata, monospace; +} + +.form-submit { + margin-bottom: 0; +} + +.required { + color: #007acc; + font-family: Merriweather, Georgia, serif; +} + +.comment-reply-title small { + font-size: 100%; +} + +.comment-reply-title small a { + border: 0; + float: right; + height: 32px; + overflow: hidden; + width: 26px; +} + +.comment-reply-title small a:hover, +.comment-reply-title small a:focus { + color: #1a1a1a; +} + +.comment-reply-title small a:before { + content: "\f405"; + font-size: 32px; + position: relative; + top: -5px; +} + +.comment-form #wp-comment-cookies-consent { + margin: 0 10px 0 0; +} + +.comment-form .comment-form-cookies-consent label { + display: inline; + font-family: Merriweather, Georgia, serif; + letter-spacing: 0; + text-transform: none; +} + +/** + * 11.5 - Sidebar + */ + +.sidebar { + margin-bottom: 3.5em; + padding: 0 7.6923%; +} + + +/** + * 11.6 - Footer + */ + +.site-footer { + padding: 0 7.6923% 1.75em; +} + +.site-info { + color: #686868; + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; +} + +.site-info a { + color: #686868; +} + +.site-info a:hover, +.site-info a:focus { + color: #007acc; +} + +.site-footer .site-title { + font-family: inherit; + font-size: inherit; + font-weight: 400; +} + +.site-footer .site-title:after { + content: "\002f"; + display: inline-block; + font-family: Montserrat, sans-serif; + opacity: 0.7; + padding: 0 0.307692308em 0 0.538461538em; +} + +.site-footer span[role=separator] { + font-family: Montserrat, sans-serif; + opacity: 0.7; + padding: 0 0.307692308em 0 0.538461538em; +} + +.site-footer span[role=separator]::before { + content: '\002f'; +} + + +/** + * 12.0 - Media + */ + +.site .avatar { + border-radius: 50%; +} + +.entry-content .wp-smiley, +.entry-summary .wp-smiley, +.comment-content .wp-smiley, +.textwidget .wp-smiley { + border: none; + margin-top: 0; + margin-bottom: 0; + padding: 0; +} + +.entry-content a img, +.entry-summary a img, +.comment-content a img, +.textwidget a img { + display: block; +} + +/* Make sure embeds and iframes fit their containers. */ +embed, +iframe, +object, +video { + margin-bottom: 1.75em; + max-width: 100%; + vertical-align: middle; +} + +p > embed, +p > iframe, +p > object, +p > video { + margin-bottom: 0; +} + +.entry-content .wp-audio-shortcode a, +.entry-content .wp-playlist a { + box-shadow: none; +} + +.wp-audio-shortcode, +.wp-video, +.wp-playlist.wp-audio-playlist { + margin-top: 0; + margin-bottom: 1.75em; +} + +.wp-playlist.wp-audio-playlist { + padding-bottom: 0; +} + +.wp-playlist .wp-playlist-tracks { + margin-top: 0; +} + +.wp-playlist-item .wp-playlist-caption { + border-bottom: 0; + padding: 0.7142857143em 0; +} + +.wp-playlist-item .wp-playlist-item-length { + top: 0.7142857143em; +} + + +/** + * 12.1 - Captions + */ + +.wp-caption { + margin-bottom: 1.75em; + max-width: 100%; +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin: 0; +} + +.wp-caption .wp-caption-text { + color: #686868; + font-size: 13px; + font-size: 0.8125rem; + font-style: italic; + line-height: 1.6153846154; + padding-top: 0.5384615385em; +} + + +/** + * 12.2 - Galleries + */ + +.gallery { + margin: 0 -1.1666667% 1.75em; +} + +.gallery-item { + display: inline-block; + max-width: 33.33%; + padding: 0 1.1400652% 2.2801304%; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-columns-1 .gallery-item { + max-width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: 50%; +} + +.gallery-columns-4 .gallery-item { + max-width: 25%; +} + +.gallery-columns-5 .gallery-item { + max-width: 20%; +} + +.gallery-columns-6 .gallery-item { + max-width: 16.66%; +} + +.gallery-columns-7 .gallery-item { + max-width: 14.28%; +} + +.gallery-columns-8 .gallery-item { + max-width: 12.5%; +} + +.gallery-columns-9 .gallery-item { + max-width: 11.11%; +} + +.gallery-icon img { + margin: 0 auto; +} + +.gallery-caption { + color: #686868; + display: block; + font-size: 13px; + font-size: 0.8125rem; + font-style: italic; + line-height: 1.6153846154; + padding-top: 0.5384615385em; +} + +.gallery-columns-6 .gallery-caption, +.gallery-columns-7 .gallery-caption, +.gallery-columns-8 .gallery-caption, +.gallery-columns-9 .gallery-caption { + display: none; +} + + +/** + * 13.0 - Multisites + */ + +.widecolumn { + margin-bottom: 3.5em; + padding: 0 7.6923%; +} + +.widecolumn .mu_register { + width: auto; +} + +.widecolumn .mu_register .mu_alert { + background: transparent; + border-color: #d1d1d1; + color: inherit; + margin-bottom: 3.5em; + padding: 1.75em; +} + +.widecolumn form, +.widecolumn .mu_register form { + margin-top: 0; +} + +.widecolumn h2 { + font-size: 23px; + font-size: 1.4375rem; + font-weight: 900; + line-height: 1.2173913043; + margin-bottom: 1.2173913043em; +} + +.widecolumn p { + margin: 1.75em 0; +} + +.widecolumn p + h2 { + margin-top: 2.4347826087em; +} + +.widecolumn label, +.widecolumn .mu_register label { + color: #686868; + font-family: Montserrat, "Helvetica Neue", sans-serif; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 400; + letter-spacing: 0.076923077em; + line-height: 1.6153846154; + text-transform: uppercase; +} + +.widecolumn .mu_register label { + margin: 2.1538461538em 0.7692307692em 0.5384615385em 0; +} + +.widecolumn .mu_register label strong { + font-weight: 400; +} + +.widecolumn #key, +.widecolumn .mu_register #blog_title, +.widecolumn .mu_register #user_email, +.widecolumn .mu_register #blogname, +.widecolumn .mu_register #user_name { + font-size: 16px; + font-size: 1rem; + width: 100%; +} + +.widecolumn .mu_register #blogname { + margin: 0; +} + +.widecolumn .mu_register #blog_title, +.widecolumn .mu_register #user_email, +.widecolumn .mu_register #user_name { + margin: 0 0 0.375em; +} + +.widecolumn #submit, +.widecolumn .mu_register input[type="submit"] { + font-size: 16px; + font-size: 1rem; + margin: 0; + width: auto; +} + +.widecolumn .mu_register .prefix_address, +.widecolumn .mu_register .suffix_address { + font-size: inherit; +} + +.widecolumn .mu_register > :last-child, +.widecolumn form > :last-child { + margin-bottom: 0; +} + + +/** + * 14.0 - Media Queries + */ + +/** + * Does the same thing as , + * but in the future W3C standard way. -ms- prefix is required for IE10+ to + * render responsive styling in Windows 8 "snapped" views; IE10+ does not honor + * the meta tag. See https://core.trac.wordpress.org/ticket/25888. + */ +@-ms-viewport { + width: device-width; +} + +@viewport { + width: device-width; +} + + +/** + * 14.1 - >= 710px + */ + +@media screen and (min-width: 44.375em) { + body:not(.custom-background-image):before, + body:not(.custom-background-image):after { + background: inherit; + content: ""; + display: block; + height: 21px; + left: 0; + position: fixed; + width: 100%; + z-index: 99; + } + + body:not(.custom-background-image):before { + top: 0; + } + + body:not(.custom-background-image).admin-bar:before { + top: 46px; + } + + body:not(.custom-background-image):after { + bottom: 0; + } + + .site { + margin: 21px; + } + + .site-main { + margin-bottom: 5.25em; + } + + .site-header { + padding: 3.9375em 7.6923%; + } + + .site-branding { + margin-top: 1.3125em; + margin-bottom: 1.3125em; + } + + .custom-logo { + max-width: 210px; + } + + .site-title { + font-size: 28px; + font-size: 1.75rem; + line-height: 1.25; + } + + .wp-custom-logo .site-title { + margin-top: 0.5em; + } + + .site-description { + display: block; + } + + .menu-toggle { + font-size: 16px; + font-size: 1.0rem; + margin: 1.3125em 0; + padding: 0.8125em 0.875em 0.6875em; + } + + .site-header-menu { + margin: 1.3125em 0; + } + + .site-header .main-navigation + .social-navigation { + margin-top: 2.625em; + } + + .header-image { + margin: 1.3125em 0; + } + + .pagination { + margin: 0 23.0769% 4.421052632em 7.6923% + } + + .post-navigation { + margin-bottom: 5.25em; + } + + .post-navigation .post-title { + font-size: 28px; + font-size: 1.75rem; + line-height: 1.25; + } + + /* restore screen-reader-text */ + .pagination .current .screen-reader-text { + position: absolute !important; + } + + .pagination .page-numbers { + display: inline-block; + } + + .site-main > article { + margin-bottom: 5.25em; + } + + .entry-header, + .post-thumbnail, + .entry-content, + .entry-summary, + .entry-footer, + .comments-area, + .image-navigation, + .post-navigation, + .page-header, + .page-content, + .content-bottom-widgets { + margin-right: 23.0769%; + } + + .entry-title { + font-size: 33px; + font-size: 2.0625rem; + line-height: 1.2727272727; + margin-bottom: 0.8484848485em; + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + border-width: 4px 0 0 0; + padding: 0.9473684211em 0 0; + width: -webkit-calc(50% - 0.736842105em); + width: calc(50% - 0.736842105em); + } + + .entry-content blockquote:not(.alignleft):not(.alignright), + .entry-summary blockquote, + .comment-content blockquote { + margin-left: -1.473684211em; + } + + .entry-content blockquote blockquote:not(.alignleft):not(.alignright), + .entry-summary blockquote blockquote, + .comment-content blockquote blockquote { + margin-left: 0; + } + + .entry-content ul, + .entry-summary ul, + .comment-content ul, + .entry-content ol, + .entry-summary ol, + .comment-content ol { + margin-left: 0; + } + + .entry-content li > ul, + .entry-summary li > ul, + .comment-content li > ul, + .entry-content blockquote > ul, + .entry-summary blockquote > ul, + .comment-content blockquote > ul { + margin-left: 1.25em; + } + + .entry-content li > ol, + .entry-summary li > ol, + .comment-content li > ol, + .entry-content blockquote > ol, + .entry-summary blockquote > ol, + .comment-content blockquote > ol { + margin-left: 1.5em; + } + + .comment-author { + margin-bottom: 0; + } + + .comment-author .avatar { + height: 42px; + position: relative; + top: 0.25em; + width: 42px; + } + + .comment-list .children > li { + padding-left: 1.75em; + } + + .comment-list + .comment-respond, + .comment-navigation + .comment-respond { + padding-top: 3.5em; + } + + .comments-area, + .widget, + .content-bottom-widgets .widget-area { + margin-bottom: 5.25em; + } + + .sidebar, + .widecolumn { + margin-bottom: 5.25em; + padding-right: 23.0769%; + } + + body:not(.search-results) .entry-summary li > ul, + body:not(.search-results) .entry-summary blockquote > ul { + margin-left: 1.157894737em; + } + + body:not(.search-results) .entry-summary li > ol, + body:not(.search-results) .entry-summary blockquote > ol { + margin-left: 1.473684211em; + } +} + + +/** + * 14.2 - >= 783px + */ + +@media screen and (min-width: 48.9375em) { + body:not(.custom-background-image).admin-bar:before { + top: 32px; + } +} + + +/** + * 14.3 - >= 910px + */ + +@media screen and (min-width: 56.875em) { + .site-header { + padding-right: 4.5455%; + padding-left: 4.5455%; + } + + .site-header-main { + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; + } + + .wp-custom-logo .site-header-main { + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + + .site-header-menu { + display: block; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + } + + .main-navigation { + margin: 0 -0.875em; + } + + .main-navigation .primary-menu, + .main-navigation .primary-menu > li { + border: 0; + } + + .main-navigation .primary-menu > li { + float: left; + } + + .main-navigation a { + outline-offset: -8px; + padding: 0.65625em 0.875em; + white-space: nowrap; + } + + .main-navigation li:hover > a, + .main-navigation li.focus > a { + color: #007acc; + } + + .main-navigation ul ul { + border-bottom: 1px solid #d1d1d1; + display: block; + left: -999em; + margin: 0; + position: absolute; + z-index: 99999; + } + + .main-navigation ul ul ul { + top: -1px; + } + + .main-navigation ul ul ul:before, + .main-navigation ul ul ul:after { + border: 0; + } + + .main-navigation ul ul li { + background-color: #fff; + border: 1px solid #d1d1d1; + border-bottom-width: 0; + } + + .main-navigation ul ul a { + white-space: normal; + width: 12.6875em; + } + + .main-navigation ul ul:before, + .main-navigation ul ul:after { + border-style: solid; + content: ""; + position: absolute; + } + + .main-navigation ul ul:before { + border-color: #d1d1d1 transparent; + border-width: 0 10px 10px; + right: 9px; + top: -9px; + } + + .main-navigation ul ul:after { + border-color: #fff transparent; + border-width: 0 8px 8px; + right: 11px; + top: -7px; + } + + .main-navigation li:hover > ul, + .main-navigation li.focus > ul { + left: auto; + right: 0; + } + + .main-navigation ul ul li:hover > ul, + .main-navigation ul ul li.focus > ul { + left: auto; + right: 100%; + } + + .main-navigation .menu-item-has-children > a { + margin: 0; + padding-right: 2.25em; + } + + .main-navigation .menu-item-has-children > a:after { + content: "\f431"; + position: absolute; + right: 0.625em; + top: 0.8125em; + } + + .main-navigation ul ul .menu-item-has-children > a { + padding-right: 2.0625em; + } + + .main-navigation ul ul .menu-item-has-children > a:after { + right: 0.5625em; + top: 0.875em; + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + } + + .dropdown-toggle, + .main-navigation ul .dropdown-toggle.toggled-on, + .menu-toggle, + .site-header .social-navigation, + .site-footer .main-navigation { + display: none; + } + + .site-content { + padding: 0 4.5455%; + } + + .content-area { + float: left; + margin-right: -100%; + width: 70%; + } + + .entry-header, + .post-thumbnail, + .entry-content, + .entry-summary, + .entry-footer, + .comments-area, + .image-navigation, + .post-navigation, + .pagination, + .page-header, + .page-content, + .content-bottom-widgets { + margin-right: 0; + margin-left: 0; + } + + .sidebar { + float: left; + margin-left: 75%; + padding: 0; + width: 25%; + } + + .widget { + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + margin-bottom: 3.230769231em; + padding-top: 1.615384615em; + } + + .widget .widget-title { + margin-bottom: 1.3125em; + } + + .widget p, + .widget address, + .widget hr, + .widget ul, + .widget ol, + .widget dl, + .widget dd, + .widget table { + margin-bottom: 1.6153846154em; + } + + .widget li > ul, + .widget li > ol { + margin-bottom: 0; + } + + .widget blockquote { + font-size: 16px; + font-size: 1rem; + line-height: 1.3125; + margin-bottom: 1.3125em; + padding-left: 1.0625em; + } + + .widget blockquote cite, + .widget blockquote small { + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + } + + .widget th, + .widget td { + padding: 0.5384615385em; + } + + .widget pre { + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + margin-bottom: 1.6153846154em; + padding: 0.5384615385em; + } + + .widget fieldset { + margin-bottom: 1.6153846154em; + padding: 0.5384615385em; + } + + .widget button, + .widget input, + .widget select, + .widget textarea { + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + } + + .widget button, + .widget input[type="button"], + .widget input[type="reset"], + .widget input[type="submit"] { + line-height: 1; + padding: 0.846153846em; + } + + .widget input[type="date"], + .widget input[type="time"], + .widget input[type="datetime-local"], + .widget input[type="week"], + .widget input[type="month"], + .widget input[type="text"], + .widget input[type="email"], + .widget input[type="url"], + .widget input[type="password"], + .widget input[type="search"], + .widget input[type="tel"], + .widget input[type="number"], + .widget textarea { + padding: 0.4615384615em 0.5384615385em; + } + + .widget h1 { + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.2173913043; + margin-bottom: 0.9130434783em; + } + + .widget h2 { + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.1052631579; + margin-bottom: 1.1052631579em; + } + + .widget h3 { + font-size: 16px; + font-size: 1rem; + line-height: 1.3125; + margin-bottom: 1.3125em; + } + + .widget h4, + .widget h5, + .widget h6 { + font-size: 13px; + font-size: 0.8125rem; + line-height: 1.6153846154; + margin-bottom: 0.9130434783em; + } + + .widget .alignleft { + margin: 0.2307692308em 1.6153846154em 1.6153846154em 0; + } + + .widget .alignright { + margin: 0.2307692308em 0 1.6153846154em 1.6153846154em; + } + + .widget .aligncenter { + margin-bottom: 1.6153846154em; + } + + .widget_calendar td, + .widget_calendar th, + .widget_calendar .wp-calendar-nav span { + line-height: 2.6923076923; + padding: 0; + } + + .widget_rss .rssSummary:last-child { + margin-bottom: 1.615384615em; + } + + .widget input[type="search"].search-field { + width: -webkit-calc(100% - 35px); + width: calc(100% - 35px); + } + + .widget .search-submit:before { + font-size: 16px; + left: 1px; + line-height: 35px; + width: 34px; + } + + .widget button.search-submit { + padding: 0; + width: 35px; + } + + .tagcloud a { + margin: 0 0.2307692308em 0.5384615385em 0; + padding: 0.5384615385em 0.4615384615em 0.4615384615em; + } + + .textwidget h1 { + margin-top: 1.8260869565em; + } + + .textwidget h2 { + margin-top: 2.2105263158em; + } + + .textwidget h3 { + margin-top: 2.625em; + } + + .textwidget h4 { + letter-spacing: 0.153846154em; + } + + .textwidget h4, + .textwidget h5, + .textwidget h6 { + margin-top: 3.2307692308em; + } + + .content-bottom-widgets .widget-area:nth-child(1):nth-last-child(2), + .content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1) { + float: left; + margin-right: 7.1428571%; + width: 46.42857145%; + } + + .content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1):last-of-type { + margin-right: 0; + } + + .site-footer { + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0 4.5455% 3.5em; + } + + .site-footer .social-navigation { + margin: 0; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + } + + .site-info { + margin: 0.538461538em auto 0.538461538em 0; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + + .no-sidebar .content-area { + float: none; + margin: 0; + width: 100%; + } + + .no-sidebar .entry-header, + .no-sidebar .entry-content, + .no-sidebar .entry-summary, + .no-sidebar .entry-footer, + .no-sidebar .comments-area, + .no-sidebar .image-navigation, + .no-sidebar .post-navigation, + .no-sidebar .pagination, + .no-sidebar .page-header, + .no-sidebar .page-content, + .no-sidebar .content-bottom-widgets { + margin-right: 15%; + margin-left: 15%; + } + + .widecolumn { + padding-right: 15%; + padding-left: 15%; + } +} + + +/** + * 14.4 - >= 985px + */ + +@media screen and (min-width: 61.5625em) { + .site-main { + margin-bottom: 7.0em; + } + + .site-header { + padding: 5.25em 4.5455%; + } + + .site-branding, + .site-header-menu, + .header-image { + margin-top: 1.75em; + margin-bottom: 1.75em; + } + + .custom-logo { + max-width: 240px; + } + + .image-navigation { + margin-bottom: 3.230769231em; + } + + .post-navigation { + margin-bottom: 7.0em; + } + + .pagination { + margin-bottom: 5.894736842em; + } + + .widget { + margin-bottom: 4.307692308em; + } + + .site-main > article { + margin-bottom: 7.0em; + } + + .entry-title { + font-size: 40px; + font-size: 2.5rem; + line-height: 1.225; + margin-bottom: 1.05em; + } + + .format-aside .entry-title, + .format-image .entry-title, + .format-video .entry-title, + .format-quote .entry-title, + .format-gallery .entry-title, + .format-status .entry-title, + .format-link .entry-title, + .format-audio .entry-title, + .format-chat .entry-title { + font-size: 23px; + font-size: 1.4375em; + line-height: 1.304347826; + margin-bottom: 1.826086957em; + } + + .post-thumbnail { + margin-bottom: 2.625em; + } + + .entry-content h1, + .entry-summary h1, + .comment-content h1 { + font-size: 33px; + font-size: 2.0625rem; + line-height: 1.2727272727; + margin-top: 1.696969697em; + margin-bottom: 0.8484848485em; + } + + .entry-content h2, + .entry-summary h2, + .comment-content h2 { + font-size: 28px; + font-size: 1.75rem; + line-height: 1.25; + margin-top: 2em; + margin-bottom: 1em; + } + + .entry-content h3, + .entry-summary h3, + .comment-content h3 { + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.2173913043; + margin-top: 2.4347826087em; + margin-bottom: 1.2173913043em; + } + + .entry-content h4, + .entry-summary h4, + .entry-intro h4, + .comment-content h4 { + letter-spacing: 0.131578947em; + } + + .entry-content h4, + .entry-content h5, + .entry-content h6, + .entry-summary h4, + .entry-summary h5, + .entry-summary h6, + .comment-content h4, + .comment-content h5, + .comment-content h6 { + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.1052631579; + margin-top: 2.9473684211em; + margin-bottom: 1.473684211em; + } + + .author-info { + border-bottom-width: 0; + padding-bottom: 0; + } + + .comment-list + .comment-respond, + .comment-navigation + .comment-respond { + padding-top: 5.25em; + } + + .comments-area, + .sidebar, + .content-bottom-widgets .widget-area, + .widecolumn { + margin-bottom: 7.0em; + } + + body:not(.search-results) .entry-summary { + margin-bottom: 2.210526316em; + } + + body:not(.search-results) .entry-header + .entry-summary { + margin-top: -1.105263158em; + } + + body:not(.search-results) article:not(.type-page) .entry-content { + float: right; + width: 71.42857144%; + } + + body:not(.search-results) article:not(.type-page) .entry-content > blockquote.alignleft.below-entry-meta { + margin-left: -40%; + width: -webkit-calc(60% - 1.4736842105em); + width: calc(60% - 1.4736842105em); + } + + body:not(.search-results) article:not(.type-page) img.below-entry-meta, + body:not(.search-results) article:not(.type-page) figure.below-entry-meta { + clear: both; + display: block; + float: none; + margin-right: 0; + margin-left: -40%; + max-width: 140%; + } + + body:not(.search-results) article:not(.type-page) figure.below-entry-meta img.below-entry-meta, + body:not(.search-results) article:not(.type-page) table figure.below-entry-meta, + body:not(.search-results) article:not(.type-page) table img.below-entry-meta { + margin: 0; + max-width: 100%; + } + + body:not(.search-results) article:not(.type-page) .entry-footer { + float: left; + margin-top: 0.1538461538em; + width: 21.42857143%; + } + + body:not(.search-results) article:not(.type-page) .entry-footer > span:not(:last-child):after { + display: none; + } + + .single .byline, + .full-size-link, + body:not(.search-results).group-blog .byline, + body:not(.search-results) .entry-format, + body:not(.search-results) .cat-links, + body:not(.search-results) .tags-links, + body:not(.search-results) article:not(.sticky) .posted-on, + body:not(.search-results) article:not(.type-page) .comments-link, + body:not(.search-results) article:not(.type-page) .entry-footer .edit-link { + display: block; + margin-bottom: 0.5384615385em; + } + + body:not(.search-results) article:not(.type-page) .entry-footer > span:last-child { + margin-bottom: 0; + } + + body:not(.search-results) article:not(.type-page) .entry-footer .avatar { + display: block; + height: auto; + margin: 0 0 0.5384615385em; + width: 49px; + } + + body.no-sidebar:not(.search-results) article:not(.type-page) .entry-content { + float: left; + margin-right: -100%; + margin-left: 34.99999999%; + width: 50.00000001%; + } + + body.no-sidebar:not(.search-results) article:not(.type-page) .entry-footer { + margin-right: -100%; + margin-left: 15%; + width: 15%; + } +} + + +/** + * 14.5 - >= 1200px + */ + +@media screen and (min-width: 75em) { + body:not(.search-results) .entry-summary { + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.5217391304; + margin-bottom: 1.826086957em; + } + + body:not(.search-results) .entry-header + .entry-summary { + margin-top: -0.913043478em; + } + + body:not(.search-results) .entry-summary p, + body:not(.search-results) .entry-summary address, + body:not(.search-results) .entry-summary hr, + body:not(.search-results) .entry-summary ul, + body:not(.search-results) .entry-summary ol, + body:not(.search-results) .entry-summary dl, + body:not(.search-results) .entry-summary dd, + body:not(.search-results) .entry-summary table { + margin-bottom: 1.5217391304em; + } + + body:not(.search-results) .entry-summary li > ul, + body:not(.search-results) .entry-summary blockquote > ul { + margin-left: 0.956521739em; + } + + body:not(.search-results) .entry-summary li > ol, + body:not(.search-results) .entry-summary blockquote > ol { + margin-left: 1.52173913em; + } + + body:not(.search-results) .entry-summary blockquote { + font-size: 23px; + font-size: 1.4375rem; + line-height: 1.5217391304; + margin: 0 0 1.5217391304em; + padding-left: 1.347826087em; + } + + body:not(.search-results) .entry-summary blockquote:not(.alignleft):not(.alignright) { + margin-left: -1.52173913em; + } + + body:not(.search-results) .entry-summary blockquote blockquote:not(.alignleft):not(.alignright) { + margin-left: 0; + } + + body:not(.search-results) .entry-summary blockquote cite, + body:not(.search-results) .entry-summary blockquote small { + font-size: 19px; + font-size: 1.1875rem; + line-height: 1.8421052632; + } + + body:not(.search-results) .entry-summary th, + body:not(.search-results) .entry-summary td { + padding: 0.3043478261em; + } + + body:not(.search-results) .entry-summary pre { + font-size: 16px; + font-size: 1rem; + line-height: 1.75; + margin-bottom: 1.75em; + padding: 1.75em; + } + + body:not(.search-results) .entry-summary fieldset { + margin-bottom: 1.5217391304em; + padding: 0.3043478261em; + } + + body:not(.search-results) .entry-summary h1 { + margin-top: 2.121212121em; + margin-bottom: 1.060606061em; + } + + body:not(.search-results) .entry-summary h2 { + margin-top: 2.5em; + margin-bottom: 1.25em; + } + + body:not(.search-results) .entry-summary h3 { + margin-top: 3.043478261em; + margin-bottom: 1.52173913em; + } + + body:not(.search-results) .entry-summary h4, + body:not(.search-results) .entry-summary h5, + body:not(.search-results) .entry-summary h6 { + margin-top: 3.684210526em; + margin-bottom: 1.842105263em; + } + + body:not(.search-results) .entry-summary h1:first-child, + body:not(.search-results) .entry-summary h2:first-child, + body:not(.search-results) .entry-summary h3:first-child, + body:not(.search-results) .entry-summary h4:first-child, + body:not(.search-results) .entry-summary h5:first-child, + body:not(.search-results) .entry-summary h6:first-child { + margin-top: 0; + } + + body:not(.search-results) .entry-summary .alignleft { + margin: 0.2608695652em 1.5217391304em 1.5217391304em 0; + } + + body:not(.search-results) .entry-summary .alignright { + margin: 0.2608695652em 0 1.5217391304em 1.5217391304em; + } + + body:not(.search-results) .entry-summary .aligncenter { + margin-bottom: 1.5217391304em; + } +} + + +/** + * 15.0 - Print + */ + +@media print { + form, + button, + input, + select, + textarea, + .navigation, + .main-navigation, + .social-navigation, + .sidebar, + .content-bottom-widgets, + .header-image, + .page-links, + .edit-link, + .comment-respond, + .comment-edit-link, + .comment-reply-link, + .comment-metadata .edit-link, + .pingback .edit-link { + display: none; + } + + body, + blockquote cite, + blockquote small, + pre, + .entry-content h4, + .entry-content h5, + .entry-content h6, + .entry-summary h4, + .entry-summary h5, + .entry-summary h6, + .comment-content h4, + .comment-content h5, + .comment-content h6, + .entry-content .author-title { + font-size: 12pt; + } + + blockquote { + font-size: 14.25pt; + } + + .site-title, + .page-title, + .comments-title, + .entry-content h2, + .entry-summary h2, + .comment-content h2, + .widecolumn h2 { + font-size: 17.25pt; + } + + .site-description { + display: block; + } + + .entry-title { + font-size: 24.75pt; + line-height: 1.2727272727; + margin-bottom: 1.696969697em; + } + + .format-aside .entry-title, + .format-image .entry-title, + .format-video .entry-title, + .format-quote .entry-title, + .format-gallery .entry-title, + .format-status .entry-title, + .format-link .entry-title, + .format-audio .entry-title, + .format-chat .entry-title { + font-size: 17.25pt; + line-height: 1.304347826; + margin-bottom: 1.826086957em; + } + + .entry-content h1, + .entry-summary h1, + .comment-content h1 { + font-size: 21pt; + } + + .entry-content h3, + .entry-summary h3, + .comment-content h3, + body:not(.search-results) .entry-summary { + font-size: 14.25pt; + } + + .site-description, + .author-bio, + .entry-footer, + .sticky-post, + .taxonomy-description, + .entry-caption, + .comment-metadata, + .comment-notes, + .comment-awaiting-moderation, + .site-info, + .wp-caption .wp-caption-text, + .gallery-caption { + font-size: 9.75pt; + } + + body, + .site { + background: none !important; /* Brute force since user agents all print differently. */ + } + + body, + blockquote cite, + blockquote small, + .site-branding .site-title a, + .entry-title a, + .comment-author { + color: #1a1a1a !important; /* Make sure color schemes don't affect to print */ + } + + blockquote, + .page-header, + .comments-title { + border-color: #1a1a1a !important; /* Make sure color schemes don't affect to print */ + } + + blockquote, + .site-description, + body:not(.search-results) .entry-summary, + body:not(.search-results) .entry-summary blockquote, + .author-bio, + .entry-footer, + .entry-footer a, + .sticky-post, + .taxonomy-description, + .entry-caption, + .comment-author, + .comment-metadata a, + .comment-notes, + .comment-awaiting-moderation, + .site-info, + .site-info a, + .wp-caption .wp-caption-text, + .gallery-caption { + color: #686868 !important; /* Make sure color schemes don't affect to print */ + } + + code, + hr { + background-color: #d1d1d1 !important; /* Make sure color schemes don't affect to print */ + } + + pre, + abbr, + acronym, + table, + th, + td, + .author-info, + .comment-list article, + .comment-list .pingback, + .comment-list .trackback, + .no-comments { + border-color: #d1d1d1 !important; /* Make sure color schemes don't affect to print */ + } + + a { + color: #007acc !important; /* Make sure color schemes don't affect to print */ + } + + .entry-content a, + .entry-summary a, + .taxonomy-description a, + .comment-content a, + .pingback .comment-body > a { + box-shadow: none; + border-bottom: 1px solid #007acc !important; /* Make sure color schemes don't affect to print */ + } + + .site { + margin: 5%; + } + + .site-inner { + max-width: none; + } + + .site-header { + padding: 0 0 1.75em; + } + + .site-branding { + margin-top: 0; + margin-bottom: 1.75em; + } + + .site-main { + margin-bottom: 3.5em; + } + + .entry-header, + .entry-footer, + .page-header, + .page-content, + .entry-content, + .entry-summary, + .post-thumbnail, + .comments-area { + margin-right: 0; + margin-left: 0; + } + + .post-thumbnail, + .site-main > article { + margin-bottom: 3.5em; + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + border-width: 4px 0 0 0; + padding: 0.9473684211em 0 0; + width: -webkit-calc(50% - 0.736842105em); + width: calc(50% - 0.736842105em); + } + + body:not(.search-results) .entry-header + .entry-summary { + margin-top: -1.473684211em; + } + + .site-footer, + .widecolumn { + padding: 0; + } +} diff --git a/wp-content/themes/twentysixteen/template-parts/biography.php b/wp-content/themes/twentysixteen/template-parts/biography.php new file mode 100644 index 0000000..5430f2b --- /dev/null +++ b/wp-content/themes/twentysixteen/template-parts/biography.php @@ -0,0 +1,40 @@ + + +
            diff --git a/wp-content/themes/twentysixteen/template-parts/content-none.php b/wp-content/themes/twentysixteen/template-parts/content-none.php new file mode 100644 index 0000000..28077f4 --- /dev/null +++ b/wp-content/themes/twentysixteen/template-parts/content-none.php @@ -0,0 +1,38 @@ + + +
            + + +
            + + +

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

            + + + +

            + + + + +

            + + + +
            +
            diff --git a/wp-content/themes/twentysixteen/template-parts/content-page.php b/wp-content/themes/twentysixteen/template-parts/content-page.php new file mode 100644 index 0000000..a4c4a2c --- /dev/null +++ b/wp-content/themes/twentysixteen/template-parts/content-page.php @@ -0,0 +1,47 @@ + + +
            > +
            + ', '' ); ?> +
            + + + +
            + '', + 'link_before' => '', + 'link_after' => '', + 'pagelink' => '' . __( 'Page', 'twentysixteen' ) . ' %', + 'separator' => ', ', + ) + ); + ?> +
            + + "%s"', 'twentysixteen' ), + get_the_title() + ), + '
            ', + '
            ' + ); + ?> + +
            diff --git a/wp-content/themes/twentysixteen/template-parts/content-search.php b/wp-content/themes/twentysixteen/template-parts/content-search.php new file mode 100644 index 0000000..79307ae --- /dev/null +++ b/wp-content/themes/twentysixteen/template-parts/content-search.php @@ -0,0 +1,53 @@ + + +
            > +
            + ', esc_url( get_permalink() ) ), '' ); ?> +
            + + + + + + + +
            + + "%s"', 'twentysixteen' ), + get_the_title() + ), + '', + '' + ); + ?> +
            + + + + "%s"', 'twentysixteen' ), + get_the_title() + ), + '
            ', + '
            ' + ); + ?> + + +
            + diff --git a/wp-content/themes/twentysixteen/template-parts/content-single.php b/wp-content/themes/twentysixteen/template-parts/content-single.php new file mode 100644 index 0000000..5b54398 --- /dev/null +++ b/wp-content/themes/twentysixteen/template-parts/content-single.php @@ -0,0 +1,55 @@ + + +
            > +
            + ', '' ); ?> +
            + + + + + +
            + '', + 'link_before' => '', + 'link_after' => '', + 'pagelink' => '' . __( 'Page', 'twentysixteen' ) . ' %', + 'separator' => ', ', + ) + ); + + if ( '' !== get_the_author_meta( 'description' ) ) { + get_template_part( 'template-parts/biography' ); + } + ?> +
            + +
            + + "%s"', 'twentysixteen' ), + get_the_title() + ), + '', + '' + ); + ?> +
            +
            diff --git a/wp-content/themes/twentysixteen/template-parts/content.php b/wp-content/themes/twentysixteen/template-parts/content.php new file mode 100644 index 0000000..fda751f --- /dev/null +++ b/wp-content/themes/twentysixteen/template-parts/content.php @@ -0,0 +1,61 @@ + + +
            > +
            + + + + + ', esc_url( get_permalink() ) ), '' ); ?> +
            + + + + + +
            + "%s"', 'twentysixteen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + 'pagelink' => '' . __( 'Page', 'twentysixteen' ) . ' %', + 'separator' => ', ', + ) + ); + ?> +
            + +
            + + "%s"', 'twentysixteen' ), + get_the_title() + ), + '', + '' + ); + ?> +
            +
          • +HCwqqxPYEXyvxbMRs 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

            m*OQCRhy>u%uLdTs` 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/menu-icons/assets/screenshot-6.png b/wp-content/plugins/menu-icons/assets/screenshot-6.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc1760b3669f2c72bd063625630dfaa5b2bdcb9 GIT binary patch literal 103898 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 h0>l4Dt$7-B#>Xl1ylr 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

            +@<*)7`!LY~2% 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

            =8=-jpgz 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 G1NL9nst3vd literal 0 HcmV?d00001 diff --git a/wp-content/plugins/menu-icons/assets/screenshot-8.png b/wp-content/plugins/menu-icons/assets/screenshot-8.png new file mode 100644 index 0000000000000000000000000000000000000000..165b1a17ecb30b27c8cb095952b0ea1bb9108f2c GIT binary patch literal 43800 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/menu-icons/css/admin.css b/wp-content/plugins/menu-icons/css/admin.css new file mode 100644 index 0000000..87301d4 --- /dev/null +++ b/wp-content/plugins/menu-icons/css/admin.css @@ -0,0 +1,185 @@ +.menu-icons-wrap { + margin-top: 5px; + margin-bottom: 5px; +} + +.menu-icons-wrap p { + min-height: 2.2em; + margin-bottom: 0; +} + +.menu-icons-wrap p a, +.menu-icons-wrap p label { + display: inline-block; + height: 100%; + line-height: 2.2em; + vertical-align: middle; +} + +.menu-icons-wrap a { + text-decoration: none; + cursor: pointer; +} + +.menu-icons-wrap .submitdelete { + display: inline-block; + float: none; + height: 100%; + margin: 0; + padding: 0; + line-height: 2.2em; +} + +.menu-icons-wrap .hidden { + display: none; +} + +.menu-icons-wrap ._icon { + width: auto; + height: auto; + margin: -0.1em 0.2em 0 0.2em; + color: #666; + font-size: 1.9em; + vertical-align: middle; +} + +.menu-icons-wrap img._icon { + max-width: 24px; +} + +.menu-icons-wrap a._select:focus ._icon, +.menu-icons-wrap a._select:hover ._icon { + color: #101010; +} + +.mi-preview.menu-item { + min-height: 0; + font-size: 1.2em; +} + +.mi-preview.menu-item a { + text-decoration: none; +} + +.mi-preview.menu-item a > * { + display: inline-block; + height: 100%; + line-height: 100%; + vertical-align: middle; +} + +.mi-preview.menu-item ._icon { + margin-right: 0.25em; +} + +.rtl .mi-preview.menu-item ._icon { + margin-right: 0; +} + +.media-sidebar .mi-settings .setting input[type="number"], +.menu-icons-settings input[type="number"] { + float: none; + width: auto; + max-width: 5em; +} + +.media-sidebar .mi-settings .setting input, +.media-sidebar .mi-settings span.description { + float: none; +} + +/** Settings Meta Box **/ +.menu-icons-settings ._field { + padding: 0.5em 0; +} + +.menu-icons-settings ._field ._main { + display: block; + margin-bottom: 0.25em; + font-weight: bold; +} + +#menu-settings-column .menu-icons-settings .inside { + margin-top: 0; +} + +.menu-icons-settings .taxonomydiv .tabs-panel { + max-height: none; + margin-bottom: 0.75em; + padding-top: 0.3em; + padding-bottom: 0.4em; +} + +.js .menu-icons-settings .taxonomydiv .tabs-panel { + margin-bottom: 0; +} + +.menu-icons-settings h4 { + margin: 0; +} + +.menu-icons-settings ._menu span.description { + margin-left: 0.5em; +} + +.menu-icons-settings ._extensions ul { + margin-top: 0.75em; + padding-left: 1.5em; + list-style: disc; +} + +.menu-icons-settings ._extensions ul a { + text-decoration: none; +} + +.menu-icons-settings .spinner { + float: none; + margin: 0 5px 0 0; + vertical-align: middle; +} + +.attachment .svg-icon img { + max-width: 100%; +} + +.menu-icons-upgrade-hestia { + width: 90%; + margin-top: 0; + padding: 15px; +} + + +#menu-icons-sidebar div.new-card { + width: auto; + min-width: initial; + max-width: initial; + margin: 10px auto; +} + +.menu-icons-subscribe { + padding: 15px; +} + +.menu-icons-submit-mail { + width: auto; +} + +#success{ + display: none; +} + +#failure{ + display: none; +} + +.attachments-browser.iconpicker-fonts-browser .media-toolbar { + width: 62%; +} + +.attachments-browser.iconpicker-fonts-browser .attachments.iconpicker-items { + width: 64%; +} + +.attachments-browser.iconpicker-fonts-browser .media-sidebar { + width: 32%; +} \ No newline at end of file diff --git a/wp-content/plugins/menu-icons/css/admin.min.css b/wp-content/plugins/menu-icons/css/admin.min.css new file mode 100644 index 0000000..53eaa98 --- /dev/null +++ b/wp-content/plugins/menu-icons/css/admin.min.css @@ -0,0 +1 @@ +.menu-icons-settings ._extensions ul a,.menu-icons-wrap a,.mi-preview.menu-item a{text-decoration:none}.menu-icons-wrap{margin-top:5px;margin-bottom:5px}.menu-icons-wrap p{min-height:2.2em;margin-bottom:0}.menu-icons-wrap p a,.menu-icons-wrap p label{display:inline-block;height:100%;line-height:2.2em;vertical-align:middle}.menu-icons-wrap a{cursor:pointer}.menu-icons-wrap .submitdelete{display:inline-block;float:none;height:100%;margin:0;padding:0;line-height:2.2em}.menu-icons-wrap .hidden{display:none}.menu-icons-wrap ._icon{width:auto;height:auto;margin:-.1em .2em 0;color:#666;font-size:1.9em;vertical-align:middle}.menu-icons-wrap img._icon{max-width:24px}.menu-icons-wrap a._select:focus ._icon,.menu-icons-wrap a._select:hover ._icon{color:#101010}.mi-preview.menu-item{min-height:0;font-size:1.2em}.mi-preview.menu-item a>*{display:inline-block;height:100%;line-height:100%;vertical-align:middle}.mi-preview.menu-item ._icon{margin-right:.25em}.rtl .mi-preview.menu-item ._icon{margin-right:0}.media-sidebar .mi-settings .setting input[type=number],.menu-icons-settings input[type=number]{float:none;width:auto;max-width:5em}.media-sidebar .mi-settings .setting input,.media-sidebar .mi-settings span.description{float:none}.menu-icons-settings ._field{padding:.5em 0}.menu-icons-settings ._field ._main{display:block;margin-bottom:.25em;font-weight:700}#menu-settings-column .menu-icons-settings .inside{margin-top:0}.menu-icons-settings .taxonomydiv .tabs-panel{max-height:none;margin-bottom:.75em;padding-top:.3em;padding-bottom:.4em}.js .menu-icons-settings .taxonomydiv .tabs-panel{margin-bottom:0}.menu-icons-settings h4{margin:0}.menu-icons-settings ._menu span.description{margin-left:.5em}.menu-icons-settings ._extensions ul{margin-top:.75em;padding-left:1.5em;list-style:disc}.menu-icons-settings .spinner{float:none;margin:0 5px 0 0;vertical-align:middle}.attachment .svg-icon img{max-width:100%}.menu-icons-upgrade-hestia{width:90%;margin-top:0;padding:15px}#menu-icons-sidebar div.new-card{width:auto;min-width:initial;max-width:initial;margin:10px auto}.menu-icons-subscribe{padding:15px}.menu-icons-submit-mail{width:auto}#failure,#success{display:none}.attachments-browser.iconpicker-fonts-browser .media-toolbar{width:62%}.attachments-browser.iconpicker-fonts-browser .attachments.iconpicker-items{width:64%}.attachments-browser.iconpicker-fonts-browser .media-sidebar{width:32%} \ No newline at end of file diff --git a/wp-content/plugins/menu-icons/css/extra.css b/wp-content/plugins/menu-icons/css/extra.css new file mode 100644 index 0000000..ec8b2a6 --- /dev/null +++ b/wp-content/plugins/menu-icons/css/extra.css @@ -0,0 +1,74 @@ +.menu-item i._mi, +.menu-item img._mi { + display: inline-block; + vertical-align: middle; +} + +.menu-item i._mi { + width: auto; + height: auto; + margin-top: -0.265em; + font-size: 1.2em; + line-height: 1; +} + +.menu-item i._before, +.rtl .menu-item i._after { + margin-right: 0.25em; +} + +.menu-item i._after, +.rtl .menu-item i._before { + margin-left: 0.25em; +} + +.menu-item img._before, +.rtl .menu-item img._after { + margin-right: 0.5em; +} + +.menu-item img._after, +.rtl .menu-item img._before { + margin-left: 0.5em; +} + +.menu-item ._svg { + width: 1em; +} + +.rtl .menu-item i._before { + margin-right: 0; +} + +.rtl .menu-item i._after { + margin-left: 0; +} + +.visuallyhidden { + overflow: hidden; + clip: rect(0 0 0 0); + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + border: 0; +} + +.menu-item i.elusive { + margin-top: -0.3em; +} + +/** + * Force the icons' styles + * + * Some themes -- notably 2014 -- has nasty rules that + * could override the icons' styles so we need to force them here. + */ +.dashicons-admin-site:before { + content: "\f319" !important; +} + +.dashicons-welcome-view-site:before { + content: "\f115" !important; +} diff --git a/wp-content/plugins/menu-icons/css/extra.min.css b/wp-content/plugins/menu-icons/css/extra.min.css new file mode 100644 index 0000000..7ff02d8 --- /dev/null +++ b/wp-content/plugins/menu-icons/css/extra.min.css @@ -0,0 +1 @@ +.menu-item i._mi,.menu-item img._mi{display:inline-block;vertical-align:middle}.menu-item i._mi{width:auto;height:auto;margin-top:-.265em;font-size:1.2em;line-height:1}.menu-item i._before,.rtl .menu-item i._after{margin-right:.25em}.menu-item i._after,.rtl .menu-item i._before{margin-left:.25em}.menu-item img._before,.rtl .menu-item img._after{margin-right:.5em}.menu-item img._after,.rtl .menu-item img._before{margin-left:.5em}.menu-item ._svg{width:1em}.rtl .menu-item i._before{margin-right:0}.rtl .menu-item i._after{margin-left:0}.visuallyhidden{overflow:hidden;clip:rect(0 0 0 0);position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0}.menu-item i.elusive{margin-top:-.3em}.dashicons-admin-site:before{content:"\f319"!important}.dashicons-welcome-view-site:before{content:"\f115"!important} \ No newline at end of file diff --git a/wp-content/plugins/menu-icons/includes/front.php b/wp-content/plugins/menu-icons/includes/front.php new file mode 100644 index 0000000..8667ba2 --- /dev/null +++ b/wp-content/plugins/menu-icons/includes/front.php @@ -0,0 +1,430 @@ + + */ +final class Menu_Icons_Front_End { + + /** + * Icon types + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $icon_types = array(); + + /** + * Default icon style + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $default_style = array( + 'font_size' => array( + 'property' => 'font-size', + 'value' => '1.2', + 'unit' => 'em', + ), + 'vertical_align' => array( + 'property' => 'vertical-align', + 'value' => 'middle', + 'unit' => null, + ), + 'svg_width' => array( + 'property' => 'width', + 'value' => '1', + 'unit' => 'em', + ), + ); + + /** + * Hidden label class + * + * @since 0.9.0 + * @access protected + * @var string + */ + protected static $hidden_label_class = 'visuallyhidden'; + + + /** + * Add hooks for front-end functionalities + * + * @since 0.9.0 + */ + public static function init() { + $active_types = Menu_Icons_Settings::get( 'global', 'icon_types' ); + + if ( empty( $active_types ) ) { + return; + } + + foreach ( Menu_Icons::get( 'types' ) as $type ) { + if ( in_array( $type->id, $active_types, true ) ) { + self::$icon_types[ $type->id ] = $type; + } + } + + /** + * Allow themes/plugins to override the hidden label class + * + * @since 0.8.0 + * @param string $hidden_label_class Hidden label class. + * @return string + */ + self::$hidden_label_class = apply_filters( 'menu_icons_hidden_label_class', self::$hidden_label_class ); + + /** + * Allow themes/plugins to override default inline style + * + * @since 0.9.0 + * @param array $default_style Default inline style. + * @return array + */ + self::$default_style = apply_filters( 'menu_icons_default_style', self::$default_style ); + + add_action( 'wp_enqueue_scripts', array( __CLASS__, '_enqueue_styles' ), 7 ); + add_filter( 'wp_nav_menu_args', array( __CLASS__, '_add_menu_item_title_filter' ) ); + add_filter( 'wp_nav_menu', array( __CLASS__, '_remove_menu_item_title_filter' ) ); + } + + + /** + * Get nav menu ID based on arguments passed to wp_nav_menu() + * + * @since 0.3.0 + * @param array $args wp_nav_menu() Arguments + * @return mixed Nav menu ID or FALSE on failure + */ + public static function get_nav_menu_id( $args ) { + $args = (object) $args; + $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, array( 'update_post_term_cache' => false ) ) ) { + $menu = $menu_maybe; + break; + } + } + } + + if ( is_object( $menu ) && ! is_wp_error( $menu ) ) { + return $menu->term_id; + } else { + return false; + } + } + + + /** + * Enqueue stylesheets + * + * @since 0.1.0 + * @wp_hook action wp_enqueue_scripts + * @link http://codex.wordpress.org/Plugin_API/Action_Reference/wp_enqueue_scripts + */ + public static function _enqueue_styles() { + foreach ( self::$icon_types as $type ) { + if ( wp_style_is( $type->stylesheet_id, 'registered' ) ) { + wp_enqueue_style( $type->stylesheet_id ); + } + } + + /** + * Allow plugins/themes to override the extra stylesheet location + * + * @since 0.9.0 + * @param string $extra_stylesheet_uri Extra stylesheet URI. + */ + $extra_stylesheet_uri = apply_filters( + 'menu_icons_extra_stylesheet_uri', + sprintf( '%scss/extra%s.css', Menu_Icons::get( 'url' ), kucrut_get_script_suffix() ) + ); + + wp_enqueue_style( + 'menu-icons-extra', + $extra_stylesheet_uri, + false, + Menu_Icons::VERSION + ); + } + + + /** + * Add filter to 'the_title' hook + * + * We need to filter the menu item title but **not** regular post titles. + * Thus, we're adding the filter when `wp_nav_menu()` is called. + * + * @since 0.1.0 + * @wp_hook filter wp_nav_menu_args + * @param array $args Not used. + * + * @return array + */ + public static function _add_menu_item_title_filter( $args ) { + add_filter( 'the_title', array( __CLASS__, '_add_icon' ), 999, 2 ); + + return $args; + } + + + /** + * Remove filter from 'the_title' hook + * + * Because we don't want to filter post titles, we need to remove our + * filter when `wp_nav_menu()` exits. + * + * @since 0.1.0 + * @wp_hook filter wp_nav_menu + * @param array $nav_menu Not used. + * @return array + */ + public static function _remove_menu_item_title_filter( $nav_menu ) { + remove_filter( 'the_title', array( __CLASS__, '_add_icon' ), 999, 2 ); + + return $nav_menu; + } + + + /** + * Add icon to menu item title + * + * @since 0.1.0 + * @since 0.9.0 Renamed the method to `add_icon()`. + * @wp_hook filter the_title + * @param string $title Menu item title. + * @param int $id Menu item ID. + * + * @return string + */ + public static function _add_icon( $title, $id ) { + $meta = Menu_Icons_Meta::get( $id ); + $icon = self::get_icon( $meta ); + + if ( empty( $icon ) ) { + return $title; + } + + $title_class = ! empty( $meta['hide_label'] ) ? self::$hidden_label_class : ''; + $title_wrapped = sprintf( + '%s', + ( ! empty( $title_class ) ) ? sprintf( ' class="%s"', esc_attr( $title_class ) ) : '', + $title + ); + + if ( 'after' === $meta['position'] ) { + $title_with_icon = "{$title_wrapped}{$icon}"; + } else { + $title_with_icon = "{$icon}{$title_wrapped}"; + } + + /** + * Allow plugins/themes to override menu item markup + * + * @since 0.8.0 + * + * @param string $title_with_icon Menu item markup after the icon is added. + * @param integer $id Menu item ID. + * @param array $meta Menu item metadata values. + * @param string $title Original menu item title. + * + * @return string + */ + $title_with_icon = apply_filters( 'menu_icons_item_title', $title_with_icon, $id, $meta, $title ); + + return $title_with_icon; + } + + + /** + * Get icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_icon( $meta ) { + $icon = ''; + + // Icon type is not set. + if ( empty( $meta['type'] ) ) { + return $icon; + } + + // Icon is not set. + if ( empty( $meta['icon'] ) ) { + return $icon; + } + + // Icon type is not registered/enabled. + if ( ! isset( self::$icon_types[ $meta['type'] ] ) ) { + return $icon; + } + + $type = self::$icon_types[ $meta['type'] ]; + + $callbacks = array( + array( $type, 'get_icon' ), + array( __CLASS__, "get_{$type->id}_icon" ), + array( __CLASS__, "get_{$type->template_id}_icon" ), + ); + + foreach ( $callbacks as $callback ) { + if ( is_callable( $callback ) ) { + $icon = call_user_func( $callback, $meta ); + break; + } + } + + return $icon; + } + + + /** + * Get icon style + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @param array $keys Style properties. + * @param bool $as_attribute Optional. Whether to output the style as HTML attribute or value only. + * Defaults to TRUE. + * @return string + */ + public static function get_icon_style( $meta, $keys, $as_attribute = true ) { + $style_a = array(); + $style_s = ''; + + foreach ( $keys as $key ) { + if ( ! isset( self::$default_style[ $key ] ) ) { + continue; + } + + $rule = self::$default_style[ $key ]; + + if ( ! isset( $meta[ $key ] ) || $meta[ $key ] === $rule['value'] ) { + continue; + } + + $value = $meta[ $key ]; + if ( ! empty( $rule['unit'] ) ) { + $value .= $rule['unit']; + } + + $style_a[ $rule['property'] ] = $value; + } + + if ( empty( $style_a ) ) { + return $style_s; + } + + foreach ( $style_a as $key => $value ) { + $style_s .= "{$key}:{$value};"; + } + + $style_s = esc_attr( $style_s ); + + if ( $as_attribute ) { + $style_s = sprintf( ' style="%s"', $style_s ); + } + + return $style_s; + } + + + /** + * Get icon classes + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @param string $output Whether to output the classes as string or array. Defaults to string. + * @return string|array + */ + public static function get_icon_classes( $meta, $output = 'string' ) { + $classes = array( '_mi' ); + + if ( empty( $meta['hide_label'] ) ) { + $classes[] = "_{$meta['position']}"; + } + + if ( 'string' === $output ) { + $classes = implode( ' ', $classes ); + } + + return $classes; + } + + + /** + * Get font icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_font_icon( $meta ) { + $classes = sprintf( '%s %s %s', self::get_icon_classes( $meta ), $meta['type'], $meta['icon'] ); + $style = self::get_icon_style( $meta, array( 'font_size', 'vertical_align' ) ); + + return sprintf( '', esc_attr( $classes ), $style ); + } + + + /** + * Get image icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_image_icon( $meta ) { + $args = array( + 'class' => sprintf( '%s _image', self::get_icon_classes( $meta ) ), + 'aria-hidden' => 'true', + ); + + $style = self::get_icon_style( $meta, array( 'vertical_align' ), false ); + if ( ! empty( $style ) ) { + $args['style'] = $style; + } + + return wp_get_attachment_image( $meta['icon'], $meta['image_size'], false, $args ); + } + + + /** + * Get SVG icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_svg_icon( $meta ) { + $classes = sprintf( '%s _svg', self::get_icon_classes( $meta ) ); + $style = self::get_icon_style( $meta, array( 'svg_width', 'vertical_align' ) ); + + return sprintf( + '', + esc_url( wp_get_attachment_url( $meta['icon'] ) ), + esc_attr( $classes ), + $style + ); + } +} diff --git a/wp-content/plugins/menu-icons/includes/library/compat.php b/wp-content/plugins/menu-icons/includes/library/compat.php new file mode 100644 index 0000000..cf7ca6b --- /dev/null +++ b/wp-content/plugins/menu-icons/includes/library/compat.php @@ -0,0 +1,23 @@ + + */ + +/** + * Form Fields + */ +abstract class Kucrut_Form_Field { + + /** + * Holds field & argument defaults + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected static $defaults = array( + 'field' => array( + 'id' => '', + 'type' => 'text', + 'value' => null, + 'default' => null, + 'attributes' => array(), + 'description' => '', + 'choices' => array(), + ), + 'args' => array( + 'keys' => array(), + 'inline_description' => false, + ), + ); + + /** + * Holds field attributes + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected static $types = array( + 'text' => 'Kucrut_Form_Field_Text', + 'number' => 'Kucrut_Form_Field_Text', + 'url' => 'Kucrut_Form_Field_Text', + 'color' => 'Kucrut_Form_Field_Text', + 'date' => 'Kucrut_Form_Field_Text', + 'hidden' => 'Kucrut_Form_Field_Text', + 'checkbox' => 'Kucrut_Form_Field_Checkbox', + 'radio' => 'Kucrut_Form_Field_Radio', + 'textarea' => 'Kucrut_Form_Field_Textarea', + 'select' => 'Kucrut_Form_Field_Select', + 'select_multiple' => 'Kucrut_Form_Field_Select_Multiple', + 'select_pages' => 'Kucrut_Form_Field_Select_Pages', + 'special' => 'Kucrut_Form_Field_Special', + ); + + /** + * Holds forbidden attributes + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected static $forbidden_attributes = array( + 'id', + 'name', + 'value', + 'checked', + 'multiple', + ); + + /** + * Holds allowed html tags + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected $allowed_html = array( + 'a' => array( + 'href' => true, + 'target' => true, + 'title' => true, + ), + 'code' => true, + 'em' => true, + 'p' => array( 'class' => true ), + 'span' => array( 'class' => true ), + 'strong' => true, + ); + + /** + * Holds constructed field + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected $field; + + + /** + * Holds field attributes + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected $attributes = array(); + + + /** + * Loader + * + * @param string URL path to this directory + */ + final public static function load( $url_path = null ) { + // Set URL path for assets + if ( ! is_null( $url_path ) ) { + self::$url_path = $url_path; + } else { + self::$url_path = plugin_dir_url( __FILE__ ); + } + + // Supported field types + self::$types = apply_filters( + 'form_field_types', + self::$types + ); + } + + + /** + * Create field + * + * @param array $field Field array + * @param array $args Extra field arguments + */ + final public static function create( array $field, $args = array() ) { + $field = wp_parse_args( $field, self::$defaults['field'] ); + if ( ! isset( self::$types[ $field['type'] ] ) + || ! is_subclass_of( self::$types[ $field['type'] ], __CLASS__ ) + ) { + trigger_error( + sprintf( + esc_html__( '%1$s: Type %2$s is not supported, reverting to text.', 'menu-icons' ), + __CLASS__, + esc_html( $field['type'] ) + ), + E_USER_WARNING + ); + $field['type'] = 'text'; + } + + if ( is_null( $field['value'] ) && ! is_null( $field['default'] ) ) { + $field['value'] = $field['default']; + } + + foreach ( self::$forbidden_attributes as $key ) { + unset( $field['attributes'][ $key ] ); + } + + $args = (object) wp_parse_args( $args, self::$defaults['args'] ); + $class = self::$types[ $field['type'] ]; + + return new $class( $field, $args ); + } + + + /** + * Constructor + * + * @since 0.1.0 + * @param array $field Field array + * @param object $args Extra field arguments + */ + public function __construct( $field, $args ) { + $this->field = $field; + $this->args = $args; + + if ( ! is_array( $this->args->keys ) ) { + $this->args->keys = array(); + } + $this->args->keys[] = $field['id']; + + $this->attributes['id'] = $this->create_id(); + $this->attributes['name'] = $this->create_name(); + + $this->attributes = wp_parse_args( + $this->attributes, + (array) $field['attributes'] + ); + + $this->set_properties(); + } + + + /** + * Attribute + * + * @since 0.1.0 + * @param string $key Attribute key + * @return mixed NULL if attribute doesn't exist + */ + public function __get( $key ) { + foreach ( array( 'attributes', 'field' ) as $group ) { + if ( isset( $this->{$group}[ $key ] ) ) { + return $this->{$group}[ $key ]; + } + } + + return null; + } + + + /** + * Create id/name attribute + * + * @since 0.1.0 + * @param string $format Attribute format + */ + protected function create_id_name( $format ) { + return call_user_func_array( + 'sprintf', + array_merge( + array( $format ), + $this->args->keys + ) + ); + } + + + /** + * Create id attribute + * + * @since 0.1.0 + * @access protected + * @return string + */ + protected function create_id() { + $format = implode( '-', $this->args->keys ); + + return $this->create_id_name( $format ); + } + + + /** + * Create name attribute + * + * @since 0.1.0 + * @access protected + * @return string + */ + protected function create_name() { + $format = '%s'; + $format .= str_repeat( '[%s]', ( count( $this->args->keys ) - 1 ) ); + + return $this->create_id_name( $format ); + } + + + /** + * Set field properties + * + * @since 0.1.0 + */ + protected function set_properties() {} + + + /** + * Build field attributes + * + * @since 0.1.0 + * @param array $excludes Attributes to be excluded + * @return string + */ + protected function build_attributes( $excludes = array() ) { + $excludes = array_filter( (array) $excludes ); + $attributes = ''; + + foreach ( $this->attributes as $key => $value ) { + if ( in_array( $key, $excludes, true ) ) { + continue; + } + + if ( 'class' === $key ) { + $value = implode( ' ', (array) $value ); + } + + $attributes .= sprintf( + ' %s="%s"', + esc_attr( $key ), + esc_attr( $value ) + ); + } + + return $attributes; + } + + + /** + * Print field + * + * @since 0.1.0 + */ + abstract public function render(); + + + /** + * Print field description + * + * @since 0.1.0 + */ + public function description() { + if ( ! empty( $this->field['description'] ) ) { + $tag = ( ! empty( $this->args->inline_description ) ) ? 'span' : 'p'; + + printf( // WPCS: XSS ok. + '<%1$s class="description">%2$s', + $tag, + wp_kses( $this->field['description'], $this->allowed_html ) + ); + } + } +} + + +/** + * Field: text + */ +class Kucrut_Form_Field_Text extends Kucrut_Form_Field { + + protected $template = ''; + + + protected function set_properties() { + if ( ! is_string( $this->field['value'] ) ) { + $this->field['value'] = ''; + } + + if ( in_array( $this->field['type'], array( 'text', 'url' ), true ) ) { + if ( ! isset( $this->attributes['class'] ) ) { + $this->attributes['class'] = array(); + } + $this->attributes['class'] = array_unique( + array_merge( + array( 'regular-text' ), + $this->attributes['class'] + ) + ); + } + } + + + public function render() { + printf( // WPCS: xss ok + $this->template, + esc_attr( $this->field['type'] ), + esc_attr( $this->field['value'] ), + $this->build_attributes() + ); + $this->description(); + } +} + + +/** + * Field: Textarea + */ +class Kucrut_Form_Field_Textarea extends Kucrut_Form_Field { + + protected $template = '%s'; + + protected $attributes = array( + 'class' => 'widefat', + 'cols' => 50, + 'rows' => 5, + ); + + + public function render() { + printf( // WPCS: XSS ok. + $this->template, + $this->build_attributes(), + esc_textarea( $this->field['value'] ) + ); + } +} + + +/** + * Field: Checkbox + */ +class Kucrut_Form_Field_Checkbox extends Kucrut_Form_Field { + + protected $template = '
            '; + + + protected function set_properties() { + $this->field['value'] = array_filter( (array) $this->field['value'] ); + $this->attributes['name'] .= '[]'; + } + + + protected function checked( $value ) { + return checked( in_array( $value, $this->field['value'], true ), true, false ); + } + + + public function render() { + foreach ( $this->field['choices'] as $value => $label ) { + printf( // WPCS: XSS ok. + $this->template, + $this->field['type'], + esc_attr( $value ), + $this->checked( $value ), + $this->build_attributes( 'id' ), + esc_html( $label ) + ); + } + } +} + + +/** + * Field: Radio + */ +class Kucrut_Form_Field_Radio extends Kucrut_Form_Field_Checkbox { + + protected function set_properties() { + if ( ! is_string( $this->field['value'] ) ) { + $this->field['value'] = ''; + } + } + + + protected function checked( $value ) { + return checked( $value, $this->field['value'], false ); + } +} + + +/** + * Field: Select + */ +class Kucrut_Form_Field_Select extends Kucrut_Form_Field { + + protected $template = ''; + + + protected function set_properties() { + if ( ! is_string( $this->field['value'] ) ) { + $this->field['value'] = ''; + } + } + + + protected function selected( $value ) { + return selected( ( $value === $this->field['value'] ), true, false ); + } + + + public function render() { + ?> + build_attributes() // xss ok ?>> + field['choices'] as $index => $choice ) : ?> + + template, + esc_attr( $value ), + $this->selected( $value ), + esc_html( $label ) + ); + ?> + + + field['value'] = array_filter( (array) $this->field['value'] ); + $this->attributes['name'] .= '[]'; + $this->attributes['multiple'] = 'multiple'; + } + + + protected function selected( $value ) { + return selected( in_array( $value, $this->field['value'], true ), true, false ); + } +} + + +/** + * Field: Select Pages + */ +class Kucrut_Form_Field_Select_Pages extends Kucrut_Form_Field_Select { + + protected $wp_dropdown_pages_args = array( + 'depth' => 0, + 'child_of' => 0, + 'option_none_value' => '', + ); + + + public function __construct( $field, $args ) { + $this->wp_dropdown_pages_args['show_option_none'] = __( '— Select —', 'menu-icons' ); + parent::__construct( $field, $args ); + } + + + public function set_properties() { + parent::set_properties(); + + if ( empty( $this->args->wp_dropdown_pages_args ) ) { + $this->args->wp_dropdown_pages_args = array(); + } + + // Apply defeaults + $this->args->wp_dropdown_pages_args = wp_parse_args( + $this->args->wp_dropdown_pages_args, + $this->wp_dropdown_pages_args + ); + + // Force some args + $this->args->wp_dropdown_pages_args = array_merge( + $this->args->wp_dropdown_pages_args, + array( + 'echo' => true, + 'name' => $this->attributes['name'], + 'id' => $this->attributes['id'], + 'selected' => $this->field['value'], + ) + ); + } + + + public function render() { + wp_dropdown_pages( $this->args->wp_dropdown_pages_args ); // WPCS: XSS ok. + } +} + + +/** + * Field: Special (Callback) + */ +class Kucrut_Form_Field_Special extends Kucrut_Form_Field { + public function render() { + call_user_func_array( + $this->field['render_cb'], + array( $this ) + ); + } +} diff --git a/wp-content/plugins/menu-icons/includes/library/functions.php b/wp-content/plugins/menu-icons/includes/library/functions.php new file mode 100644 index 0000000..7985369 --- /dev/null +++ b/wp-content/plugins/menu-icons/includes/library/functions.php @@ -0,0 +1,111 @@ + + */ + + +if ( ! function_exists( 'kucrut_get_array_value_deep' ) ) { + /** + * Get value of a multidimensional array + * + * @since 0.1.0 + * @param array $array Haystack + * @param array $keys Needles + * @return mixed + */ + function kucrut_get_array_value_deep( array $array, array $keys ) { + if ( empty( $array ) || empty( $keys ) ) { + return $array; + } + + foreach ( $keys as $idx => $key ) { + unset( $keys[ $idx ] ); + + if ( ! isset( $array[ $key ] ) ) { + return null; + } + + if ( ! empty( $keys ) ) { + $array = $array[ $key ]; + } + } + + if ( ! isset( $array[ $key ] ) ) { + return null; + } + + return $array[ $key ]; + } +} + + +if ( ! function_exists( 'kucrut_validate' ) ) { + /** + * Validate settings values + * + * @param array $values Settings values + * @return array + */ + function kucrut_validate( $values, $sanitize_cb = 'wp_kses_data' ) { + foreach ( $values as $key => $value ) { + if ( is_array( $value ) ) { + $values[ $key ] = kucrut_validate( $value ); + } else { + $values[ $key ] = call_user_func_array( + $sanitize_cb, + array( $value ) + ); + } + } + + return $values; + } +} + + +if ( ! function_exists( 'kucrut_get_image_sizes' ) ) { + /** + * Get image sizes + * + * @since 0.9.0 + * @access protected + * @return array + */ + function kucrut_get_image_sizes() { + $_sizes = array( + 'thumbnail' => __( 'Thumbnail', 'menu-icons' ), + 'medium' => __( 'Medium', 'menu-icons' ), + 'large' => __( 'Large', 'menu-icons' ), + 'full' => __( 'Full Size', 'menu-icons' ), + ); + + $_sizes = apply_filters( 'image_size_names_choose', $_sizes ); + + $sizes = array(); + foreach ( $_sizes as $value => $label ) { + $sizes[] = array( + 'value' => $value, + 'label' => $label, + ); + } + + return $sizes; + } +} + + +if ( ! function_exists( 'kucrut_get_script_suffix' ) ) { + /** + * Get script & style suffix + * + * When SCRIPT_DEBUG is defined true, this will return '.min'. + * + * @return string + */ + function kucrut_get_script_suffix() { + return ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; + } +} diff --git a/wp-content/plugins/menu-icons/includes/media-template.php b/wp-content/plugins/menu-icons/includes/media-template.php new file mode 100644 index 0000000..abe7f16 --- /dev/null +++ b/wp-content/plugins/menu-icons/includes/media-template.php @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ +final class Menu_Icons_Meta { + + const KEY = 'menu-icons'; + + /** + * Default meta value + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $defaults = array( + 'type' => '', + 'icon' => '', + 'url' => '', + ); + + + /** + * Initialize metadata functionalities + * + * @since 0.9.0 + */ + public static function init() { + add_filter( 'is_protected_meta', array( __CLASS__, '_protect_meta_key' ), 10, 3 ); + } + + + /** + * Protect meta key + * + * This prevents our meta key from showing up on Custom Fields meta box. + * + * @since 0.3.0 + * @wp_hook filter is_protected_meta + * @param bool $protected Protection status. + * @param string $meta_key Meta key. + * @param string $meta_type Meta type. + * @return bool Protection status. + */ + public static function _protect_meta_key( $protected, $meta_key, $meta_type ) { + if ( self::KEY === $meta_key ) { + $protected = true; + } + + return $protected; + } + + + /** + * Get menu item meta value + * + * @since 0.3.0 + * @since 0.9.0 Add $defaults parameter. + * @param int $id Menu item ID. + * @param array $defaults Optional. Default value. + * @return array + */ + public static function get( $id, $defaults = array() ) { + $defaults = wp_parse_args( $defaults, self::$defaults ); + $value = get_post_meta( $id, self::KEY, true ); + $value = wp_parse_args( (array) $value, $defaults ); + + // Backward-compatibility. + if ( empty( $value['icon'] ) && + ! empty( $value['type'] ) && + ! empty( $value[ "{$value['type']}-icon" ] ) + ) { + $value['icon'] = $value[ "{$value['type']}-icon" ]; + } + + if ( ! empty( $value['width'] ) ) { + $value['svg_width'] = $value['width']; + } + unset( $value['width'] ); + + if ( isset( $value['position'] ) && + ! in_array( $value['position'], array( 'before', 'after' ), true ) + ) { + $value['position'] = $defaults['position']; + } + + if ( isset( $value['size'] ) && ! isset( $value['font_size'] ) ) { + $value['font_size'] = $value['size']; + unset( $value['size'] ); + } + + // The values below will NOT be saved + if ( ! empty( $value['icon'] ) && + in_array( $value['type'], array( 'image', 'svg' ), true ) + ) { + $value['url'] = wp_get_attachment_image_url( $value['icon'], 'thumbnail', false ); + } + + return $value; + } + + + /** + * Update menu item metadata + * + * @since 0.9.0 + * + * @param int $id Menu item ID. + * @param mixed $value Metadata value. + * + * @return void + */ + public static function update( $id, $value ) { + /** + * Allow plugins/themes to filter the values + * + * Deprecated. + * + * @since 0.1.0 + * @param array $value Metadata value. + * @param int $id Menu item ID. + */ + $_value = apply_filters( 'menu_icons_values', $value, $id ); + + if ( $_value !== $value && WP_DEBUG ) { + _deprecated_function( 'menu_icons_values', '0.8.0', 'menu_icons_item_meta_values' ); + } + + /** + * Allow plugins/themes to filter the values + * + * @since 0.8.0 + * @param array $value Metadata value. + * @param int $id Menu item ID. + */ + $value = apply_filters( 'menu_icons_item_meta_values', $_value, $id ); + + // Don't bother saving if `type` or `icon` is not set. + if ( empty( $value['type'] ) || empty( $value['icon'] ) ) { + $value = false; + } + + // Update + if ( ! empty( $value ) ) { + update_post_meta( $id, self::KEY, $value ); + } else { + delete_post_meta( $id, self::KEY ); + } + } +} diff --git a/wp-content/plugins/menu-icons/includes/picker.php b/wp-content/plugins/menu-icons/includes/picker.php new file mode 100644 index 0000000..35709be --- /dev/null +++ b/wp-content/plugins/menu-icons/includes/picker.php @@ -0,0 +1,302 @@ + + */ + + +/** + * Nav menu admin + */ +final class Menu_Icons_Picker { + + /** + * Initialize class + * + * @since 0.1.0 + */ + public static function init() { + add_action( 'load-nav-menus.php', array( __CLASS__, '_load_nav_menus' ) ); + add_filter( 'wp_edit_nav_menu_walker', array( __CLASS__, '_filter_wp_edit_nav_menu_walker' ), 99 ); + add_filter( 'wp_nav_menu_item_custom_fields', array( __CLASS__, '_fields' ), 10, 4 ); + add_filter( 'manage_nav-menus_columns', array( __CLASS__, '_columns' ), 99 ); + add_action( 'wp_update_nav_menu_item', array( __CLASS__, '_save' ), 10, 3 ); + add_filter( 'icon_picker_type_props', array( __CLASS__, '_add_extra_type_props_data' ), 10, 3 ); + } + + + /** + * Load Icon Picker + * + * @since 0.9.0 + * @wp_hook action load-nav-menus.php + */ + public static function _load_nav_menus() { + Icon_Picker::instance()->load(); + + add_action( 'print_media_templates', array( __CLASS__, '_media_templates' ) ); + } + + + + /** + * Custom walker + * + * @since 0.3.0 + * @access protected + * @wp_hook filter wp_edit_nav_menu_walker + */ + public static function _filter_wp_edit_nav_menu_walker( $walker ) { + // Load menu item custom fields plugin + if ( ! class_exists( 'Menu_Item_Custom_Fields_Walker' ) ) { + require_once Menu_Icons::get( 'dir' ) . 'includes/library/menu-item-custom-fields/walker-nav-menu-edit.php'; + } + $walker = 'Menu_Item_Custom_Fields_Walker'; + + return $walker; + } + + + /** + * Get menu item setting fields + * + * @since 0.9.0 + * @access protected + * @param array $meta Menu item meta value. + * @return array + */ + protected static function _get_menu_item_fields( $meta ) { + $fields = array_merge( + array( + array( + 'id' => 'type', + 'label' => __( 'Type', 'menu-icons' ), + 'value' => $meta['type'], + ), + array( + 'id' => 'icon', + 'label' => __( 'Icon', 'menu-icons' ), + 'value' => $meta['icon'], + ), + ), + Menu_Icons_Settings::get_settings_fields( $meta ) + ); + + return $fields; + } + + + /** + * Print fields + * + * @since 0.1.0 + * @access protected + * @uses add_action() Calls 'menu_icons_before_fields' hook + * @uses add_action() Calls 'menu_icons_after_fields' hook + * @wp_hook action menu_item_custom_fields + * + * @param object $item Menu item data object. + * @param int $depth Nav menu depth. + * @param array $args Menu item args. + * @param int $id Nav menu ID. + * + * @return string Form fields + */ + public static function _fields( $id, $item, $depth, $args ) { + $input_id = sprintf( 'menu-icons-%d', $item->ID ); + $input_name = sprintf( 'menu-icons[%d]', $item->ID ); + $menu_settings = Menu_Icons_Settings::get_menu_settings( Menu_Icons_Settings::get_current_menu_id() ); + $meta = Menu_Icons_Meta::get( $item->ID, $menu_settings ); + $fields = self::_get_menu_item_fields( $meta ); + ?> +

            + id ) { + return; + } + + check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); + + // Sanitize + if ( ! empty( $_POST['menu-icons'][ $menu_item_db_id ] ) ) { + $value = array_map( + 'sanitize_text_field', + wp_unslash( (array) $_POST['menu-icons'][ $menu_item_db_id ] ) + ); + } else { + $value = array(); + } + + Menu_Icons_Meta::update( $menu_item_db_id, $value ); + } + + + /** + * Get and print media templates from all types + * + * @since 0.2.0 + * @since 0.9.0 Deprecate menu_icons_media_templates filter. + * @wp_hook action print_media_templates + */ + public static function _media_templates() { + $id_prefix = 'tmpl-menu-icons'; + + // Deprecated. + $templates = apply_filters( 'menu_icons_media_templates', array() ); + + if ( ! empty( $templates ) ) { + if ( WP_DEBUG ) { + _deprecated_function( 'menu_icons_media_templates', '0.9.0', 'menu_icons_js_templates' ); + } + + foreach ( $templates as $key => $template ) { + $id = sprintf( '%s-%s', $id_prefix, $key ); + self::_print_tempate( $id, $template ); + } + } + + require_once dirname( __FILE__ ) . '/media-template.php'; + } + + + /** + * Print media template + * + * @since 0.2.0 + * @param string $id Template ID. + * @param string $template Media template HTML. + */ + protected static function _print_tempate( $id, $template ) { + ?> + + + */ + +/** + * Menu Icons Settings module + */ +final class Menu_Icons_Settings { + + const UPDATE_KEY = 'menu-icons-settings-update'; + + const RESET_KEY = 'menu-icons-settings-reset'; + + const TRANSIENT_KEY = 'menu_icons_message'; + + /** + * Default setting values + * + * @since 0.3.0 + * @var array + * @access protected + */ + protected static $defaults = array( + 'global' => array( + 'icon_types' => array( 'dashicons' ), + ), + ); + + /** + * Setting values + * + * @since 0.3.0 + * @var array + * @access protected + */ + protected static $settings = array(); + + /** + * Script dependencies + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $script_deps = array( 'jquery' ); + + /** + * Settings init + * + * @since 0.3.0 + */ + public static function init() { + /** + * Allow themes/plugins to override the default settings + * + * @since 0.9.0 + * + * @param array $default_settings Default settings. + */ + self::$defaults = apply_filters( 'menu_icons_settings_defaults', self::$defaults ); + + self::$settings = get_option( 'menu-icons', self::$defaults ); + + foreach ( self::$settings as $key => &$value ) { + if ( 'global' === $key ) { + // Remove unregistered icon types. + $value['icon_types'] = array_values( + array_intersect( + array_keys( Menu_Icons::get( 'types' ) ), + array_filter( (array) $value['icon_types'] ) + ) + ); + } else { + // Backward-compatibility. + if ( isset( $value['width'] ) && ! isset( $value['svg_width'] ) ) { + $value['svg_width'] = $value['width']; + } + + unset( $value['width'] ); + } + } + + unset( $value ); + + /** + * Allow themes/plugins to override the settings + * + * @since 0.9.0 + * + * @param array $settings Menu Icons settings. + */ + self::$settings = apply_filters( 'menu_icons_settings', self::$settings ); + + if ( self::is_menu_icons_disabled_for_menu() ) { + return; + } + + if ( ! empty( self::$settings['global']['icon_types'] ) ) { + require_once Menu_Icons::get( 'dir' ) . 'includes/picker.php'; + Menu_Icons_Picker::init(); + self::$script_deps[] = 'icon-picker'; + } + + add_action( 'load-nav-menus.php', array( __CLASS__, '_load_nav_menus' ), 1 ); + add_action( 'wp_ajax_menu_icons_update_settings', array( __CLASS__, '_ajax_menu_icons_update_settings' ) ); + } + + /** + * Check if menu icons is disabled for a menu + * + * @since 0.8.0 + * + * @param int $menu_id Menu ID. Defaults to current menu being edited. + * + * @return bool + */ + public static function is_menu_icons_disabled_for_menu( $menu_id = 0 ) { + if ( empty( $menu_id ) ) { + $menu_id = self::get_current_menu_id(); + } + + // When we're creating a new menu or the recently edited menu + // could not be found. + if ( empty( $menu_id ) ) { + return true; + } + + $menu_settings = self::get_menu_settings( $menu_id ); + $is_disabled = ! empty( $menu_settings['disabled'] ); + + return $is_disabled; + } + + /** + * Get ID of menu being edited + * + * @since 0.7.0 + * @since 0.8.0 Get the recently edited menu from user option. + * + * @return int + */ + public static function get_current_menu_id() { + global $nav_menu_selected_id; + + if ( ! empty( $nav_menu_selected_id ) ) { + return $nav_menu_selected_id; + } + + if ( is_admin() && isset( $_REQUEST['menu'] ) ) { + $menu_id = absint( $_REQUEST['menu'] ); + } else { + $menu_id = absint( get_user_option( 'nav_menu_recently_edited' ) ); + } + + return $menu_id; + } + + /** + * Get menu settings + * + * @since 0.3.0 + * + * @param int $menu_id + * + * @return array + */ + public static function get_menu_settings( $menu_id ) { + $menu_settings = self::get( sprintf( 'menu_%d', $menu_id ) ); + $menu_settings = apply_filters( 'menu_icons_menu_settings', $menu_settings, $menu_id ); + + if ( ! is_array( $menu_settings ) ) { + $menu_settings = array(); + } + + return $menu_settings; + } + + /** + * Get setting value + * + * @since 0.3.0 + * @return mixed + */ + public static function get() { + $args = func_get_args(); + + return kucrut_get_array_value_deep( self::$settings, $args ); + } + + /** + * Prepare wp-admin/nav-menus.php page + * + * @since 0.3.0 + * @wp_hook action load-nav-menus.php + */ + public static function _load_nav_menus() { + add_action( 'admin_enqueue_scripts', array( __CLASS__, '_enqueue_assets' ), 99 ); + + /** + * Allow settings meta box to be disabled. + * + * @since 0.4.0 + * + * @param bool $disabled Defaults to FALSE. + */ + $settings_disabled = apply_filters( 'menu_icons_disable_settings', false ); + if ( true === $settings_disabled ) { + return; + } + + self::_maybe_update_settings(); + self::_add_settings_meta_box(); + + add_action( 'admin_notices', array( __CLASS__, '_admin_notices' ) ); + } + + /** + * Update settings + * + * @since 0.3.0 + */ + public static function _maybe_update_settings() { + if ( ! empty( $_POST['menu-icons']['settings'] ) ) { + check_admin_referer( self::UPDATE_KEY, self::UPDATE_KEY ); + + $redirect_url = self::_update_settings( $_POST['menu-icons']['settings'] ); // Input var okay. + wp_redirect( $redirect_url ); + } elseif ( ! empty( $_REQUEST[ self::RESET_KEY ] ) ) { + check_admin_referer( self::RESET_KEY, self::RESET_KEY ); + wp_redirect( self::_reset_settings() ); + } + } + + /** + * Update settings + * + * @since 0.7.0 + * @access protected + * + * @param array $values Settings values. + * + * @return string Redirect URL. + */ + protected static function _update_settings( $values ) { + update_option( + 'menu-icons', + wp_parse_args( + kucrut_validate( $values ), + self::$settings + ) + ); + set_transient( self::TRANSIENT_KEY, 'updated', 30 ); + + $redirect_url = remove_query_arg( + array( 'menu-icons-reset' ), + wp_get_referer() + ); + + return $redirect_url; + } + + /** + * Reset settings + * + * @since 0.7.0 + * @access protected + * @return string Redirect URL. + */ + protected static function _reset_settings() { + delete_option( 'menu-icons' ); + set_transient( self::TRANSIENT_KEY, 'reset', 30 ); + + $redirect_url = remove_query_arg( + array( self::RESET_KEY, 'menu-icons-updated' ), + wp_get_referer() + ); + + return $redirect_url; + } + + /** + * Settings meta box + * + * @since 0.3.0 + * @access private + */ + private static function _add_settings_meta_box() { + add_meta_box( + 'menu-icons-settings', + __( 'Menu Icons Settings', 'menu-icons' ), + array( __CLASS__, '_meta_box' ), + 'nav-menus', + 'side', + 'low', + array() + ); + } + + /** + * Update settings via ajax + * + * @since 0.7.0 + * @wp_hook action wp_ajax_menu_icons_update_settings + */ + public static function _ajax_menu_icons_update_settings() { + check_ajax_referer( self::UPDATE_KEY, self::UPDATE_KEY ); + + if ( empty( $_POST['menu-icons']['settings'] ) ) { + wp_send_json_error(); + } + + $redirect_url = self::_update_settings( $_POST['menu-icons']['settings'] ); // Input var okay. + wp_send_json_success( array( 'redirectUrl' => $redirect_url ) ); + } + + /** + * Print admin notices + * + * @since 0.3.0 + * @wp_hook action admin_notices + */ + public static function _admin_notices() { + $messages = array( + 'updated' => __( 'Menu Icons Settings have been successfully updated.', 'menu-icons' ), + 'reset' => __( 'Menu Icons Settings have been successfully reset.', 'menu-icons' ), + ); + + $message_type = get_transient( self::TRANSIENT_KEY ); + + if ( ! empty( $message_type ) && ! empty( $messages[ $message_type ] ) ) { + printf( + '

            %s

            ', + wp_kses( $messages[ $message_type ], array( 'strong' => true ) ) + ); + } + + delete_transient( self::TRANSIENT_KEY ); + } + + /** + * Settings meta box + * + * @since 0.3.0 + */ + public static function _meta_box() { + ?> +
            + + $section ) : ?> + + + +
            +

            + + + %s', + esc_url( + wp_nonce_url( + admin_url( '/nav-menus.php' ), + self::RESET_KEY, + self::RESET_KEY + ) + ), + esc_attr__( 'Discard all changes and reset to default state', 'menu-icons' ), + esc_html__( 'Reset', 'menu-icons' ) + ); + ?> + + + + + + +

            + array( + 'id' => 'global', + 'title' => __( 'Global', 'menu-icons' ), + 'description' => __( 'Global settings', 'menu-icons' ), + 'fields' => array( + array( + 'id' => 'icon_types', + 'type' => 'checkbox', + 'label' => __( 'Icon Types', 'menu-icons' ), + 'choices' => $icon_types, + 'value' => self::get( 'global', 'icon_types' ), + ), + ), + 'args' => array(), + ), + ); + + if ( ! empty( $menu_id ) ) { + $menu_term = get_term( $menu_id, 'nav_menu' ); + $menu_key = sprintf( 'menu_%d', $menu_id ); + $menu_settings = self::get_menu_settings( $menu_id ); + + $sections['menu'] = array( + 'id' => $menu_key, + 'title' => __( 'Current Menu', 'menu-icons' ), + 'description' => sprintf( + __( '"%s" menu settings', 'menu-icons' ), + apply_filters( 'single_term_title', $menu_term->name ) + ), + 'fields' => self::get_settings_fields( $menu_settings ), + 'args' => array( 'inline_description' => true ), + ); + } + + return apply_filters( 'menu_icons_settings_sections', $sections, $menu_id ); + } + + /** + * Get settings fields + * + * @since 0.4.0 + * + * @param array $values Values to be applied to each field. + * + * @uses apply_filters() Calls 'menu_icons_settings_fields'. + * @return array + */ + public static function get_settings_fields( array $values = array() ) { + $fields = array( + 'hide_label' => array( + 'id' => 'hide_label', + 'type' => 'select', + 'label' => __( 'Hide Label', 'menu-icons' ), + 'default' => '', + 'choices' => array( + array( + 'value' => '', + 'label' => __( 'No', 'menu-icons' ), + ), + array( + 'value' => '1', + 'label' => __( 'Yes', 'menu-icons' ), + ), + ), + ), + 'position' => array( + 'id' => 'position', + 'type' => 'select', + 'label' => __( 'Position', 'menu-icons' ), + 'default' => 'before', + 'choices' => array( + array( + 'value' => 'before', + 'label' => __( 'Before', 'menu-icons' ), + ), + array( + 'value' => 'after', + 'label' => __( 'After', 'menu-icons' ), + ), + ), + ), + 'vertical_align' => array( + 'id' => 'vertical_align', + 'type' => 'select', + 'label' => __( 'Vertical Align', 'menu-icons' ), + 'default' => 'middle', + 'choices' => array( + array( + 'value' => 'super', + 'label' => __( 'Super', 'menu-icons' ), + ), + array( + 'value' => 'top', + 'label' => __( 'Top', 'menu-icons' ), + ), + array( + 'value' => 'text-top', + 'label' => __( 'Text Top', 'menu-icons' ), + ), + array( + 'value' => 'middle', + 'label' => __( 'Middle', 'menu-icons' ), + ), + array( + 'value' => 'baseline', + 'label' => __( 'Baseline', 'menu-icons' ), + ), + array( + 'value' => 'text-bottom', + 'label' => __( 'Text Bottom', 'menu-icons' ), + ), + array( + 'value' => 'bottom', + 'label' => __( 'Bottom', 'menu-icons' ), + ), + array( + 'value' => 'sub', + 'label' => __( 'Sub', 'menu-icons' ), + ), + ), + ), + 'font_size' => array( + 'id' => 'font_size', + 'type' => 'number', + 'label' => __( 'Font Size', 'menu-icons' ), + 'default' => '1.2', + 'description' => 'em', + 'attributes' => array( + 'min' => '0.1', + 'step' => '0.1', + ), + ), + 'svg_width' => array( + 'id' => 'svg_width', + 'type' => 'number', + 'label' => __( 'SVG Width', 'menu-icons' ), + 'default' => '1', + 'description' => 'em', + 'attributes' => array( + 'min' => '.5', + 'step' => '.1', + ), + ), + 'image_size' => array( + 'id' => 'image_size', + 'type' => 'select', + 'label' => __( 'Image Size', 'menu-icons' ), + 'default' => 'thumbnail', + 'choices' => kucrut_get_image_sizes(), + ), + ); + + $fields = apply_filters( 'menu_icons_settings_fields', $fields ); + + foreach ( $fields as &$field ) { + if ( isset( $values[ $field['id'] ] ) ) { + $field['value'] = $values[ $field['id'] ]; + } + + if ( ! isset( $field['value'] ) && isset( $field['default'] ) ) { + $field['value'] = $field['default']; + } + } + + unset( $field ); + + return $fields; + } + + /** + * Get processed settings fields + * + * @since 0.3.0 + * @access private + * @return array + */ + private static function _get_fields() { + if ( ! class_exists( 'Kucrut_Form_Field' ) ) { + require_once Menu_Icons::get( 'dir' ) . 'includes/library/form-fields.php'; + } + + $keys = array( 'menu-icons', 'settings' ); + $sections = self::get_fields(); + + foreach ( $sections as &$section ) { + $_keys = array_merge( $keys, array( $section['id'] ) ); + $_args = array_merge( array( 'keys' => $_keys ), $section['args'] ); + + foreach ( $section['fields'] as &$field ) { + $field = Kucrut_Form_Field::create( $field, $_args ); + } + + unset( $field ); + } + + unset( $section ); + + return $sections; + } + + /** + * Enqueue scripts & styles for Appearance > Menus page + * + * @since 0.3.0 + * @wp_hook action admin_enqueue_scripts + */ + public static function _enqueue_assets() { + $url = Menu_Icons::get( 'url' ); + $suffix = kucrut_get_script_suffix(); + + if ( defined( 'MENU_ICONS_SCRIPT_DEBUG' ) && MENU_ICONS_SCRIPT_DEBUG ) { + $script_url = '//localhost:8081/'; + } else { + $script_url = $url; + } + + wp_enqueue_style( + 'menu-icons', + "{$url}css/admin{$suffix}.css", + false, + Menu_Icons::VERSION + ); + + wp_enqueue_script( + 'menu-icons', + "{$script_url}js/admin{$suffix}.js", + self::$script_deps, + Menu_Icons::VERSION, + true + ); + + $customizer_url = add_query_arg( + array( + 'autofocus[section]' => 'custom_css', + 'return' => admin_url( 'nav-menus.php' ), + ), + admin_url( 'customize.php' ) + ); + + /** + * Allow plugins/themes to filter the settings' JS data + * + * @since 0.9.0 + * + * @param array $js_data JS Data. + */ + $menu_current_theme = ''; + $theme = wp_get_theme(); + if ( ! empty( $theme ) ) { + if ( is_child_theme() ) { + $menu_current_theme = $theme->parent()->get( 'Name' ); + } else { + $menu_current_theme = $theme->get( 'Name' ); + } + } + $box_data = ' + + + + diff --git a/wp-content/plugins/static-html-output-plugin/views/s3_settings_block.phtml b/wp-content/plugins/static-html-output-plugin/views/s3_settings_block.phtml new file mode 100644 index 0000000..a2c1312 --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/s3_settings_block.phtml @@ -0,0 +1,112 @@ + diff --git a/wp-content/plugins/static-html-output-plugin/views/tab_advanced.phtml b/wp-content/plugins/static-html-output-plugin/views/tab_advanced.phtml new file mode 100644 index 0000000..f362479 --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/tab_advanced.phtml @@ -0,0 +1,139 @@ + + diff --git a/wp-content/plugins/static-html-output-plugin/views/tab_crawling.phtml b/wp-content/plugins/static-html-output-plugin/views/tab_crawling.phtml new file mode 100644 index 0000000..43a5600 --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/tab_crawling.phtml @@ -0,0 +1,138 @@ + diff --git a/wp-content/plugins/static-html-output-plugin/views/tab_export.phtml b/wp-content/plugins/static-html-output-plugin/views/tab_export.phtml new file mode 100644 index 0000000..3a8e1ee --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/tab_export.phtml @@ -0,0 +1,47 @@ +
            + + + + + + + + + +
            + + + +
            + + + + + + + + + +
            + diff --git a/wp-content/plugins/static-html-output-plugin/views/tab_help.phtml b/wp-content/plugins/static-html-output-plugin/views/tab_help.phtml new file mode 100644 index 0000000..ce3c89e --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/tab_help.phtml @@ -0,0 +1,67 @@ + + diff --git a/wp-content/plugins/static-html-output-plugin/views/tab_logs.phtml b/wp-content/plugins/static-html-output-plugin/views/tab_logs.phtml new file mode 100644 index 0000000..20ebe18 --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/tab_logs.phtml @@ -0,0 +1,30 @@ + + diff --git a/wp-content/plugins/static-html-output-plugin/views/tab_love.phtml b/wp-content/plugins/static-html-output-plugin/views/tab_love.phtml new file mode 100644 index 0000000..3a700dc --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/tab_love.phtml @@ -0,0 +1,81 @@ + + diff --git a/wp-content/plugins/static-html-output-plugin/views/tab_processing.phtml b/wp-content/plugins/static-html-output-plugin/views/tab_processing.phtml new file mode 100644 index 0000000..8246ebd --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/tab_processing.phtml @@ -0,0 +1,109 @@ + diff --git a/wp-content/plugins/static-html-output-plugin/views/zip_settings_block.phtml b/wp-content/plugins/static-html-output-plugin/views/zip_settings_block.phtml new file mode 100644 index 0000000..e5a4bb4 --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/views/zip_settings_block.phtml @@ -0,0 +1,46 @@ + diff --git a/wp-content/plugins/static-html-output-plugin/wp2static.css b/wp-content/plugins/static-html-output-plugin/wp2static.css new file mode 100644 index 0000000..f216c2c --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/wp2static.css @@ -0,0 +1,164 @@ +@CHARSET "UTF-8"; + +.postbox p, li { + font-size: 1em; + line-height: 1.375em; + + +} + +#downloadZIP { + display: none; +} + +.intro-text { + font-size: large; +} + +div.postbox-container { + float: none; + padding: 0; + min-width: 650px; + width: 100%; +} + +div.postbox div.inside { + margin: 14px 18px 18px; + position: relative; +} + +.wpsho-report ul { + list-style: disc; + list-style-position: inside; +} + +.wpsho-report ul li { + padding-left: 2em; +} + +.wpsho-export-log { + height: 200px; + overflow: auto; + border: 1px solid #DFDFDF; + color: #000; + background: #fff; + margin: 0 0 15px; + padding: 3px 4px; + width: 95%; +} + +#exportStatus { + width: 100%; +} + +#progress { + display: none; +} + +#progress-container { + min-height: 40px; + position: absolute; + top: 0; + left: 0; + z-index: 99999; + width: 100%; +} + +.error-help-text { + display: none; + padding-bottom: 25px; +} + +.warning { + background-color: #ffe7b7; +} + + +@-webkit-keyframes pulsate { + 0% {-webkit-transform: scale(0.1, 0.1); opacity: 0.0;} + 50% {opacity: 1.0;} + 100% {-webkit-transform: scale(1.2, 1.2); opacity: 0.0;} +} + +.pulsate-css { + animation: pulsate 1s ease-out; + animation-iteration-count: infinite; + opacity: 0.0; + + border: 3px solid #999; + border-radius: 30px; + height: 18px; + width: 18px; + position: relative; + display: inline-block; + margin-top: 0px; + margin-right: 10px; + text-align: center; + float: left; +} + +#current_action { + padding-top: 3px; + font-size: 14px; + +} + +.button-call-to-action { + background-color: greenyellow !important; +} + +.cancelExportButton{ + background-color: orange !important; +} + +p.submit{ + margin-top: 0px !important; +} + +#netlify_test_results { + line-height: 28px; + margin-left: 10px; +} + +.spinner { + float:none;width:auto;height:auto;padding:10px 0 10px 50px; +} + +/* 86% when full sidebar, needs to grow otherwise */ +#wp2static-footer { + background: rgba(255, 255, 255, 0.9); + width: 100%; + position: fixed; + bottom: 0; + border-top: 1px solid black; + min-height: 110px; + margin-left: -20px; + padding-left: 20px; + +} + +.wrap.wp2static { + padding-bottom: 100px; +} + +#wpfooter { + display: none; +} + +#pbar-container { + background-color: #F7F7F7; + width: 100%; + display: block; + min-height: 30px; + margin-bottom: 20px; + position: relative; +} + +#pbar-fill { + background-color: #C1C1C1; + width: 0%; + min-height: 30px; + position: absolute; + top: 0; + left: 0; +} diff --git a/wp-content/plugins/static-html-output-plugin/wp2static.php b/wp-content/plugins/static-html-output-plugin/wp2static.php new file mode 100644 index 0000000..a1fe31a --- /dev/null +++ b/wp-content/plugins/static-html-output-plugin/wp2static.php @@ -0,0 +1,98 @@ +' . __( 'Settings', 'static-html-output-plugin' ) . ''; + array_unshift( $links, $settings_link ); + + return $links; +} + + +function wp_static_html_output_server_side_export() { + $plugin = WP2Static_Controller::getInstance(); + $plugin->doExportWithoutGUI(); + wp_die(); + return null; +} + +add_action( 'wp_static_html_output_server_side_export_hook', 'wp_static_html_output_server_side_export', 10, 0 ); + + +function plugins_have_been_loaded() { + load_plugin_textdomain( 'static-html-output-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); + return null; +} + +add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'plugin_action_links' ); +add_action( 'plugins_loaded', 'plugins_have_been_loaded' ); +add_action( 'wp_ajax_wp_static_html_output_ajax', 'wp_static_html_output_ajax' ); + +function wp_static_html_output_ajax() { + check_ajax_referer( 'wpstatichtmloutput', 'nonce' ); + $instance_method = filter_input( INPUT_POST, 'ajax_action' ); + + if ( '' !== $instance_method && is_string( $instance_method ) ) { + $plugin_instance = WP2Static_Controller::getInstance(); + call_user_func( array( $plugin_instance, $instance_method ) ); + } + + wp_die(); + return null; +} + +remove_action( 'wp_head', 'print_emoji_detection_script', 7 ); +remove_action( 'wp_print_styles', 'print_emoji_styles' ); + +function wp_static_html_output_add_dashboard_widgets() { + + wp_add_dashboard_widget( + 'wp_static_html_output_dashboard_widget', + 'Static HTML Output', + 'wp_static_html_output_dashboard_widget_function' + ); +} +// add_action( 'wp_dashboard_setup', 'wp_static_html_output_add_dashboard_widgets' ); +function wp_static_html_output_dashboard_widget_function() { + + echo '

            Publish whole site as static HTML

            '; + echo ""; +} + +function wp_static_html_output_deregister_scripts() { + wp_deregister_script( 'wp-embed' ); + wp_deregister_script( 'comment-reply' ); +} +add_action( 'wp_footer', 'wp_static_html_output_deregister_scripts' ); +remove_action( 'wp_head', 'wlwmanifest_link' ); + +// WP CLI support +if ( defined( 'WP_CLI' ) ) { + require_once dirname( __FILE__ ) . '/plugin/wp2static-wp-cli-commands.php'; +} diff --git a/wp-content/plugins/wp-mail-smtp/assets/css/smtp-about.min.css b/wp-content/plugins/wp-mail-smtp/assets/css/smtp-about.min.css new file mode 100644 index 0000000..533a17d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/css/smtp-about.min.css @@ -0,0 +1,3 @@ +.wp-mail-smtp-page-about{padding:0 !important}.wp-mail-smtp-page-about *,.wp-mail-smtp-page-about *::before,.wp-mail-smtp-page-about *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins{padding:0 10px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container{margin-left:-20px;margin-right:-20px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-container{padding:0 10px;float:left;width:33.333333%;margin-bottom:20px}@media (max-width: 1249px){.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-container{width:50%}}@media (max-width: 781px){.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-container{width:100%;margin-bottom:20px}}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container h5{font-size:17px;font-weight:700}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item{background-color:#fff;border:1px solid #ddd;border-radius:3px;margin:0}@media (max-width: 781px){.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item{margin:0 0}}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item img{border:1px solid #eee;float:left;max-width:75px;padding:10px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item img[src*="-mi"]{padding:13px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item h5{margin:0 0 10px 100px;font-size:16px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item p{margin:0 0 0 100px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .details{padding:20px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .actions{background-color:#f7f7f7;border-top:1px solid #ddd;padding:20px;position:relative}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .actions .msg{background-color:#f7f7f7;position:absolute;text-align:center;font-weight:600;top:0;left:0;height:100%;width:100%;z-index:99;padding:20px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-ms-align-items:center;align-items:center;justify-content:center}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .actions .msg.success{color:#2a9b39}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .actions .msg.error{color:red}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .status{float:left;padding-top:8px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .status .status-inactive{color:red}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .status .status-download{color:#666}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .status .status-active{color:#2a9b39}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button{float:right}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button{background:none;cursor:pointer;width:140px;text-align:center;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;-webkit-appearance:none;border-radius:3px;border:1px solid #cccccc;background:#f7f7f7;box-shadow:0 1px 0 #cccccc;font-weight:normal}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button:hover,.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button:focus,.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.loading{background:#fafafa;border-color:#999;color:#23282d}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button .fa{margin-right:8px}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button .fa.fa-spinner{margin-right:0}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.button-primary{background:#0085ba;border-color:#0073aa #006799 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-shadow:0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.button-primary:hover,.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.button-primary:focus{background:#008ec2;border-color:#006799;color:#fff}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.button-primary .fa-spinner{color:#fff}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.button-secondary{color:#555;border-color:#cccccc;background:#f7f7f7;box-shadow:0 1px 0 #cccccc}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.button-secondary:hover,.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.button-secondary:focus{background:#fafafa;border-color:#999;color:#23282d}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.status-active .fa{color:#2a9b39}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.status-inactive .fa{color:red}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.status-download .fa{color:#999}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.loading .fa{color:#666}.wp-mail-smtp-page-about.wp-mail-smtp-tab-about-about .wp-mail-smtp-admin-about-plugins .plugins-container .plugin-item .action-button button.disabled{cursor:default}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section{margin:0 0 20px;padding:30px;background:#fff;border:1px solid #E5E6E6;line-height:2}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section h1,.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section h2,.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section h3,.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section h4,.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section h5{margin-top:0;padding-top:0;line-height:1.6}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section h2{font-size:24px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section h3{font-size:18px;margin-bottom:30px;color:#23282C}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section ul,.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section p{font-size:16px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section p{margin-bottom:20px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section p.bigger{font-size:18px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section p.smaller{font-size:14px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section p:last-child{margin-bottom:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section hr{margin:30px 0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section figure{margin:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section figure img{width:100%}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section figure figcaption{font-size:14px;color:#888888;margin-top:5px;text-align:center;line-height:initial}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .wp-mail-smtp-admin-column-40{padding-left:15px}@media (max-width: 781px){.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .wp-mail-smtp-admin-column-40{width:100%;padding-left:0;padding-top:20px}}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .wp-mail-smtp-admin-column-60{padding-right:15px}@media (max-width: 781px){.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .wp-mail-smtp-admin-column-60{width:100%;padding-right:0}}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section ul.list-plain{margin-top:0;margin-bottom:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section ul.list-plain li{margin-bottom:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section ul.list-features li .fa{color:#2a9b39;margin:0 8px 0 0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .fa-star{color:gold}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .no-margin{margin:0 !important}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .no-padding{padding:0 !important}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section .centered{text-align:center !important}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero{padding:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero .wp-mail-smtp-admin-about-section-hero-main,.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero .wp-mail-smtp-admin-about-section-hero-extra{padding:30px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero .wp-mail-smtp-admin-about-section-hero-extra table{width:100%}@media (max-width: 781px){.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero .wp-mail-smtp-admin-about-section-hero-extra .wp-mail-smtp-admin-column-50{float:none;width:100%}}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero .wp-mail-smtp-admin-about-section-hero-main{background-color:#FAFAFA;border-bottom:1px solid #E5E6E6}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero .wp-mail-smtp-admin-about-section-hero-main.no-border{border-bottom:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero .wp-mail-smtp-admin-about-section-hero-main p{color:#666}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero h3.call-to-action{margin-bottom:-10px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-hero span.price-off{color:#6AB255}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-squashed{margin-bottom:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-squashed:not(:last-of-type){border-bottom:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post h2{margin-bottom:-10px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post h3{margin-bottom:15px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post p:last-of-type{margin-bottom:30px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-column-20{padding-right:20px;width:auto}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-column-20 img{width:270px}@media (max-width: 781px){.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-column-20{width:20%}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-column-20 img{width:auto;max-width:100%}}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-column-80{padding-left:20px;width:calc(100% - 20px - 270px)}@media (max-width: 781px){.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-column-80{width:80%}}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-about-section-post-link{padding:10px 15px;background-color:#DF7739;color:#fff;border-radius:3px;text-decoration:none;margin-top:15px;font-size:14px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-about-section-post-link:hover{background-color:#B85A1B}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-post .wp-mail-smtp-admin-about-section-post-link .fa{color:#EDBA9E;vertical-align:middle;margin-left:8px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table{border-collapse:collapse}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table tr td{border-bottom:1px solid #E5E6E6;border-right:1px solid #E5E6E6;padding:30px;vertical-align:top}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table tr td:last-of-type{border-right:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table tr:last-child td{border-bottom:none}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table p{background-repeat:no-repeat;background-size:15px auto;background-position:0 6px;margin:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table p.features-full{padding-left:30px;background-image:url(../images/about/icon-full.svg)}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table p.features-none{padding-left:30px;background-image:url(../images/about/icon-none.svg)}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table table p.features-partial{padding-left:30px;background-position:-3px 0;background-size:23px auto;background-image:url(../images/about/icon-partial.svg)}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table .wp-mail-smtp-admin-about-section-hero-main{padding:0}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table .wp-mail-smtp-admin-about-section-hero-main h3{padding:30px 30px 30px 60px}.wp-mail-smtp-page-about .wp-mail-smtp-admin-about-section-table .wp-mail-smtp-admin-about-section-hero-main .wp-mail-smtp-admin-column-33:first-child h3{padding:30px} + +/*# sourceMappingURL=smtp-about.min.css.map */ diff --git a/wp-content/plugins/wp-mail-smtp/assets/css/smtp-admin.min.css b/wp-content/plugins/wp-mail-smtp/assets/css/smtp-admin.min.css new file mode 100644 index 0000000..9b905a4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/css/smtp-admin.min.css @@ -0,0 +1,3 @@ +#wpcontent{padding-left:0 !important;position:relative}@media (max-width: 600px){#wpcontent{padding-top:46px}}@media (max-width: 600px){#wpbody{padding-top:0}}body.toplevel_page_wp-mail-smtp div.jconfirm *,body.toplevel_page_wp-mail-smtp div.jconfirm *::before,body.toplevel_page_wp-mail-smtp div.jconfirm *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box-container div.jconfirm-box{border-radius:0;box-shadow:0 2px 6px rgba(0,0,0,0.2)}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box-container div.jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.4);top:8px;right:8px}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box-container div.jconfirm-box div.jconfirm-closeIcon:hover{color:rgba(0,0,0,0.8)}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-title-c{margin:0 0 26px 0 !important;padding:0 !important}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin:0 !important;color:#c4c4c4 !important;-webkit-transition:none !important;transition:none !important;-webkit-transform:none !important;-ms-transform:none !important;transform:none !important;font-size:45px !important}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i:empty{display:none}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-title-c .jconfirm-icon-c svg{height:35px}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-title-c .jconfirm-title{display:block;color:#333}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-title-c .jconfirm-icon-c+span.jconfirm-title{margin-top:20px !important}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content-pane{margin-bottom:0;display:block}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content-pane .jconfirm-content{overflow:inherit}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content{font-size:16px;color:#555;line-height:1.4}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content.lite-upgrade p{font-size:18px;padding:0 20px}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content p{margin:0 0 16px;font-size:18px;line-height:1.5}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content p:last-of-type{margin:0}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content p.large{font-size:18px}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content p.small{font-size:14px}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content .already-purchased{font-size:12px;color:#ccc;text-decoration:none}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-content .already-purchased:hover{text-decoration:underline}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-buttons .already-purchased{display:block;font-size:12px;color:#aaa;text-decoration:none;padding-top:20px}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box div.jconfirm-buttons .already-purchased:hover{color:#999;text-decoration:underline}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box .discount-note{text-align:center;margin:30px 0 0}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box .discount-note p{background-color:#faffac;margin:0 -30px;padding:24px 60px 20px;font-size:15px;color:#4d4d4d;position:relative}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box .discount-note p:after{content:'\f058';display:inline-block;font:normal normal normal 14px/1 FontAwesome;background-color:#fff;font-size:26px;border-radius:50%;padding:5px 6px;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:-20px;right:50%;margin-right:-18px;color:#3abc01}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box .discount-note span{font-weight:700;color:#3abc01}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box .discount-note a{color:#aaa;display:block;margin-top:12px}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box input[type=text]{display:block;width:99%;border:1px solid #d6d6d6;padding:10px;box-shadow:none;margin:20px auto 0 auto}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box button.btn-confirm{background-color:#FF982D;color:#fff;outline:none}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box button.btn-confirm:hover{background-color:#f97f00;border-color:#f97f00}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box button,body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box button.btn-default{color:#666}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box button.btn-block{display:block;text-align:center;width:100%;margin:0 0 10px 0 !important}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box button.btn-normal-case{text-transform:none !important}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box .error{display:none;color:red}body.toplevel_page_wp-mail-smtp div.jconfirm div.jconfirm-box .wpforms-error{border:1px solid #ebccd1 !important}#screen-meta-links,#screen-meta{display:none}#wp-mail-smtp-header-temp{position:absolute;margin:0;top:-1px;left:20px;right:20px;z-index:99}#wp-mail-smtp-header{border-top:3px solid #FF982D;padding:20px}#wp-mail-smtp-header img{display:block;margin:0;max-width:242px}@media (max-width: 782px){#wp-mail-smtp-header img{max-width:200px}}#wp-mail-smtp{margin:0}#wp-mail-smtp .wp-mail-smtp-hide{display:none}#wp-mail-smtp .wp-mail-smtp-page-title{background-color:#fff;font-size:14px;margin:0 0 20px 0;padding:0 20px}#wp-mail-smtp .wp-mail-smtp-page-title a.tab{border-bottom:2px solid #fff;box-shadow:none;color:#666;display:inline-block;margin-right:30px;padding:20px 0 18px 0;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-title a.tab.active{border-bottom:2px solid #FF982D}#wp-mail-smtp .wp-mail-smtp-page-title a.tab:hover{border-color:#999}#wp-mail-smtp .wp-mail-smtp-page-title a.action{padding:5px;border:0;min-height:auto;color:#fff;margin:-10px 0 0 20px}#wp-mail-smtp .wp-mail-smtp-page-title .page-title{background-color:#fff;display:inline-block;font-size:23px;margin:0;padding:15px 20px 15px 0}#wp-mail-smtp .wp-mail-smtp-page-content{padding:0 20px}#wp-mail-smtp .wp-mail-smtp-page-content *,#wp-mail-smtp .wp-mail-smtp-page-content *::before,#wp-mail-smtp .wp-mail-smtp-page-content *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-clear:before{content:" ";display:table}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-clear:after{clear:both;content:" ";display:table}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row{border-bottom:1px solid #e4e4e4;padding:30px 0;font-size:14px;line-height:1.3}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row:first-of-type{padding-top:10px !important}@media (max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row{padding:20px 0}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.inactive{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row .wp-mail-smtp-setting-mid-row-sep{background:#e4e4e4;height:1px;border:0;margin:15px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading{padding:20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading.no-desc h2,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading.no-desc h4{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.section-heading .wp-mail-smtp-setting-field{margin:0;max-width:1005px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]{float:left;margin:1px 0 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]+label{margin:0 0 0 8px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox .desc{margin:0 0 0 30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox input[type=checkbox]+label+.desc{margin:8px 0 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-text .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-password .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-number .wp-mail-smtp-setting-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-email .wp-mail-smtp-setting-label{padding-top:8px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-select .wp-mail-smtp-setting-label{padding-top:8px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-radio .wp-mail-smtp-setting-field input[type=radio]{margin:-3px 10px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-radio .wp-mail-smtp-setting-field label{margin-right:30px;display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field label{vertical-align:middle;display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field label:hover .wp-mail-smtp-setting-toggle-switch{background-color:#999}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch{background-color:#46B450}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch:before{-webkit-transform:translateX(19px);-ms-transform:translateX(19px);transform:translateX(19px)}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch{background-color:#69c471;cursor:default}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label{display:inline-block}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:checked+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label+.wp-mail-smtp-setting-toggle-unchecked-label{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-checked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field input[type=checkbox]:disabled+.wp-mail-smtp-setting-toggle-switch+.wp-mail-smtp-setting-toggle-unchecked-label{color:#aaa}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-unchecked-label,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label{text-transform:uppercase;font-weight:400;color:#777;font-size:13px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-checked-label{display:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-switch{position:relative;cursor:pointer;background-color:#ccc;border-radius:15px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-ms-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;vertical-align:middle;position:relative;display:inline-block;margin:0 5px 0 0;width:40px;height:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-checkbox-toggle .wp-mail-smtp-setting-field .wp-mail-smtp-setting-toggle-switch:before{position:absolute;content:"";height:14px;width:14px;left:3px;top:3px;background-color:#fff;border-radius:50%;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-ms-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer{padding-bottom:20px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer{display:inline-block;width:140px;margin-right:12px;margin-bottom:12px;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image{background:#fff;text-align:center;border:2px solid #E5E5E5;border-radius:4px;cursor:pointer;height:76px;position:relative;margin-bottom:10px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-ms-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image.is-recommended{background-image:url(../images/recommended.svg);background-repeat:no-repeat;background-size:60%;background-position:top right -2px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer .wp-mail-smtp-mailer-image img{max-width:90%;max-height:40px;display:block;position:relative;top:50%;left:50%;transform:translate(-50%, -50%);opacity:0.6;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-ms-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.wp-mail-smtp-mailer-smtp .wp-mail-smtp-mailer-image img{max-height:30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.suggest-new a.wp-mail-smtp-mailer-image{min-width:140px;display:table-cell;color:#777777;text-decoration:underline;vertical-align:middle;bottom:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.suggest-new .wp-mail-smtp-mailer-text{visibility:hidden}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.active .wp-mail-smtp-mailer-image{border-color:#FF982D}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer.active .wp-mail-smtp-mailer-image img{opacity:1}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer:hover .wp-mail-smtp-mailer-image{border-color:#ccc}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row.wp-mail-smtp-setting-row-mailer .wp-mail-smtp-mailers .wp-mail-smtp-mailer:hover .wp-mail-smtp-mailer-image img{opacity:1}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h2,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h4{color:#444;font-size:20px;font-weight:700;margin:0 0 6px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h2{margin-bottom:15px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row h3{color:#444;font-size:24px;font-weight:600;margin:0 0 20px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p{margin:12px 0 0;font-size:14px;line-height:1.5em}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p:first-of-type{margin:8px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.desc{font-style:italic;color:#777}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.buttonned{margin-top:30px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice{margin:5px 0 15px;box-sizing:border-box;background:#fff;border-left:4px solid transparent;box-shadow:0 1px 1px 0 rgba(0,0,0,0.1)}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice.inline-error{border-color:#dc3232;margin-bottom:5px;padding:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice.inline-edu-notice{border-color:#809EB0;line-height:1.5em;padding:10px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice a.wp-mail-smtp-mailer-notice-dismiss{float:right;color:#999DA1;margin:0 0 10px 10px;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row p.inline-notice a.wp-mail-smtp-mailer-notice-dismiss:hover{color:#666a6e}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row ul{margin:8px 0 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row ul.list li{margin-left:20px;list-style-type:disc}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list th{padding:5px 5px 5px 0;text-align:left}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.email{padding-right:2em}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.status{width:100px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a{border-bottom:1px solid;display:inline-block;margin-right:5px;text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]{color:#a00}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:hover,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:active,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row table.actions-list td.actions a[class*=delete]:focus{color:#400}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]{background-color:#fff;border:1px solid #ddd;border-radius:3px;box-shadow:none;color:#333;display:inline-block;vertical-align:middle;padding:7px 12px;margin:0 10px 0 0;width:400px;min-height:35px;line-height:1.3}@media (max-width: 959px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]{width:300px}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number][readonly],#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password][readonly]{background-color:#f9f9f9}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number].small-text,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password].small-text{width:75px}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]:focus,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]:focus{border-color:#bbb}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=text]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=email]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=number]:disabled,#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-row input[type=password]:disabled{opacity:0.6}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label{display:block;float:left;width:205px;padding:0 20px 0 0}@media (max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label{float:none;width:100%;padding-bottom:15px}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-label label{display:block;font-weight:600;font-size:1.1em}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field{display:block;margin:0 0 0 205px;max-width:800px}@media (max-width: 781px){#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-setting-field{margin:0}}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-submit{margin:0;padding:25px 0}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-submit .help-text{margin-left:10px;vertical-align:middle}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-mailer-options .wp-mail-smtp-mailer-option .wp-mail-smtp-setting-row.section-heading{padding:20px 0 !important}#wp-mail-smtp .wp-mail-smtp-page-content .wp-mail-smtp-mailer-options .wp-mail-smtp-mailer-option blockquote{background:#E5E5E5;border-radius:4px;color:#666;font-size:14px;margin:20px 0;padding:15px;width:1005px}#wp-mail-smtp .wp-mail-smtp-page-content.wp-mail-smtp-page-general p{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline{background:#fff;border-left:4px solid #fff;box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin:5px 0 15px;padding:1px 12px}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-success{border-left-color:#46b450}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-warning{border-left-color:#ffb900}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-error{border-left-color:#dc3232}#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline.notice-info{border-left-color:#00a0d2}#wp-mail-smtp .wp-mail-smtp-page-content .notice p,#wp-mail-smtp .wp-mail-smtp-page-content .notice-inline p{margin:0.5em 0;padding:2px}#wp-mail-smtp .wp-mail-smtp-page-content pre{white-space:pre-line}#wp-mail-smtp .wp-mail-smtp-page-content.active{display:block}#wp-mail-smtp .wp-mail-smtp-page-content .connected-as{margin-left:30px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug{background-color:#fff;padding:25px 20px 1px 25px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug h2{color:#444;margin:1.4em 0 0.8em;font-size:16px;font-weight:700}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug p{font-size:14px;color:#555;margin-bottom:1.1em}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ul,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ol{font-size:14px;color:#555;margin:0 0 1.1em 1.8em}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ul li,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ol li{margin:0 0 8px 0;line-height:1.5}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ul li:last-of-type,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ol li:last-of-type{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ul li ul,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug ol li ul{list-style-type:disc}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug a{color:#FF982D}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug a:hover{color:#f97f00}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .dashicons-star-filled{color:#FF982D;width:16px;height:16px;font-size:16px;vertical-align:text-top}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .price-off{color:green;font-weight:bold}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .error-log-toggle{text-decoration:none;color:#444}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .error-log-toggle:hover{color:#FF982D}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .error-log-toggle .dashicons{font-size:15px;height:15px;width:15px;padding-top:3px;border:0;outline:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .error-log{border-left:3px solid #ffb900;padding:0 0 0 20px;margin:0 0 10px 0;font-size:12px;display:none}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .error-log pre{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-debug .error-log-note{display:none}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner{background-color:#fff;padding:25px 20px;border:1px solid #dadada;margin:10px 0 0 0;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .wp-mail-smtp-pro-banner-dismiss{position:absolute;right:10px;top:10px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .wp-mail-smtp-pro-banner-dismiss button{background:none;border:none;color:#a9a9a9;cursor:pointer;margin:0;padding:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner h2{color:#444;margin-top:0;font-size:16px;font-weight:700}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner p{font-size:14px;color:#555;margin-bottom:1.1em}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner p:last-of-type{margin:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits{margin:0 0 16px 0;overflow:auto;max-width:1000px}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul{margin:0;padding:0;width:50%;float:left}@media (max-width: 600px){#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul{width:100%;float:none}}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li{margin:0;padding:0 0 2px 16px;color:#555;font-size:14px;position:relative}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li:before{content:'+';position:absolute;top:-1px;left:0}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .benefits ul li.arrow-right:before{content:'→'}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a{color:#FF982D}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:hover,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:active,#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner a:focus{color:#f97f00}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .stars{text-decoration:none}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .stars .dashicons{width:16px;height:16px;font-size:16px;vertical-align:text-top}#wp-mail-smtp .wp-mail-smtp-page-content #wp-mail-smtp-pro-banner .price-off{color:green;font-weight:bold}#wp-mail-smtp .wp-mail-smtp-admin-columns>div[class*="-column-"]{float:left}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-20{width:20%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-33{width:33.33333%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-40{width:40%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-50{width:50%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-60{width:60%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-80{width:80%}#wp-mail-smtp .wp-mail-smtp-admin-columns .wp-mail-smtp-admin-column-last{float:right !important}#wp-mail-smtp .wp-mail-smtp-admin-columns:after{content:"";display:table;clear:both}#wp-mail-smtp .wp-mail-smtp-page-upsell{display:flex;align-items:center;justify-content:center;height:auto;flex-direction:column}#wp-mail-smtp .wp-mail-smtp-page-upsell>*{width:800px}#wp-mail-smtp .wp-mail-smtp-page-upsell *,#wp-mail-smtp .wp-mail-smtp-page-upsell *::before,#wp-mail-smtp .wp-mail-smtp-page-upsell *::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#wp-mail-smtp .wp-mail-smtp-page-upsell h2{font-size:24px;color:#444444;text-align:center}#wp-mail-smtp .wp-mail-smtp-page-upsell h3{font-size:16px;font-weight:normal;color:#72777C;line-height:1.5em;margin-top:0;margin-bottom:25px;text-align:center}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features{margin-bottom:40px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;align-content:flex-start}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature{display:flex;flex-direction:row;width:360px;align-items:flex-start;align-content:flex-start;margin-right:60px;margin-top:40px}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature:nth-of-type(1){margin-top:20px}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature:nth-of-type(2){margin-top:20px}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature:nth-of-type(even){margin-right:0}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature .wp-mail-smtp-page-upsell-feature-image{width:65px;text-align:center}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature .wp-mail-smtp-page-upsell-feature-image img{display:block;margin:5px auto 0}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature .wp-mail-smtp-page-upsell-feature-content{margin-left:20px}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature .wp-mail-smtp-page-upsell-feature-content h4{font-size:15px;margin:0 0 0.5em}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-content .wp-mail-smtp-page-upsell-features .wp-mail-smtp-page-upsell-feature .wp-mail-smtp-page-upsell-feature-content p{color:#72777C;margin:0}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-images{margin-bottom:20px;text-align:center}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-images img{width:380px;height:auto;margin-right:20px;border:5px solid #fff;border-radius:5px;box-shadow:0 0 10px 5px rgba(0,0,0,0.15)}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-images img:last-child{margin-right:0}#wp-mail-smtp .wp-mail-smtp-page-upsell .wp-mail-smtp-page-upsell-button{text-align:center}.wp-mail-smtp-btn{border:0;border-radius:3px;cursor:pointer;display:inline-block;margin:0;text-decoration:none;text-align:center;vertical-align:middle;white-space:nowrap;text-shadow:none;box-shadow:none;outline:none}.wp-mail-smtp-btn .dashicons{font-size:16px;width:16px;height:16px}.wp-mail-smtp-btn:disabled{opacity:0.5;cursor:not-allowed}.wp-mail-smtp-btn.wp-mail-smtp-btn-md{font-size:13px;font-weight:600;padding:8px 12px;min-height:35px}.wp-mail-smtp-btn.wp-mail-smtp-btn-lg{font-size:16px;font-weight:600;padding:16px 28px}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange{background-color:#FF982D;border-color:#FF982D;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-orange:focus{background-color:#f97f00;border-color:#f97f00}.wp-mail-smtp-btn.wp-mail-smtp-btn-red{background-color:#DC3232;border-color:#DC3232;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-red:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-red:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-red:focus{background-color:darkred;border-color:darkred}.wp-mail-smtp-btn.wp-mail-smtp-btn-grey{background-color:#f5f5f5;border:1px solid #ccc;color:#666}.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-grey:focus{background-color:#d7d7d7;border-color:#ccc;color:#444}.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey{background-color:#f5f5f5;border:1px solid #ccc;color:#666}.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-light-grey:focus{background-color:#eee;color:#444}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish{background-color:#738e9e;border:1px solid #738e9e;color:#fff}.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:hover,.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:active,.wp-mail-smtp-btn.wp-mail-smtp-btn-blueish:focus{background-color:#395360;border-color:#395360;color:#fff} + +/*# sourceMappingURL=smtp-admin.min.css.map */ diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-full.svg b/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-full.svg new file mode 100644 index 0000000..db99774 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-none.svg b/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-none.svg new file mode 100644 index 0000000..4f874e4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-none.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-partial.svg b/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-partial.svg new file mode 100644 index 0000000..8901e8f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/about/icon-partial.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-mi.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-mi.png new file mode 100644 index 0000000000000000000000000000000000000000..31ea261d83dba13736a4b29fe65d1ea8cb975e47 GIT binary patch literal 7244 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

            sR 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 G68b;gg3bc~ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-rp.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-rp.png new file mode 100644 index 0000000000000000000000000000000000000000..2c85a21328e53f1e8470582456c89c707faebc49 GIT binary patch literal 2190 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/team.jpg b/wp-content/plugins/wp-mail-smtp/assets/images/about/team.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fae1b31e591634dd05a9d7fcf623a96d887abd0f GIT binary patch literal 302513 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⁡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 lqx1%Lxt4*;!#D4; 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

            >X?JxSJ8(W)e#H##E%`$qaDz)BK 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 ~PHva(K8GUYQ>@2d_ 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 S@4>`#EK}H0{2T%apa0qC=a`!S literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/control/admin.png b/wp-content/plugins/wp-mail-smtp/assets/images/control/admin.png new file mode 100644 index 0000000000000000000000000000000000000000..243b3d0ffd9b4122eb27fa01ba66d2a69fe88b1f GIT binary patch literal 1402 zcmeAS@N?(olHy`uVBq!ia0vp^4nSQ* z1sKx{OM?7@85o(ESy>Zq(U0mJVJv_aV&mcy5|ffsQq$72^NK1e ztEy{i>zdm;x_bI2O`E-7(b5$wSFPKyY4eURs?33p@8gcWoMo&k z+NJqQ#BxvIvOdox8Z1i>{V1(Ym|0mCC^;Kv= zI-l+1n!^u%1joLZU;9J#=;T97KF|Ag_s$t6&yPzCyyncm*0i!eJK{j5==pORX`Oeb zZ%-@v_5Cz+sYvOYc*fW4OCQYb6@2u&%yq*SPnGSux^;JRm6f75PL`OMu=s0)rGnbt zDO+lba+8Wat@cr6E&cm=viYVBUT35}xZMBk{M`1}uQRu+%S(BCYt7ego|Ult2hTU2 z4uA1=)8el#;oB5+<-62|P3~R4W*A#6c9RXbI#2lgM6G8Qkso{Btw_9f!PxY-8Iz8@ zV7TqPA1ii*87=?Y*|u{|!-^ej8ZQLHdm^uHH@Q=~LNt6@lV73gjIRsZX5ZkL`pC-5 zar=%qMy+>QE9Pf6tV%3Y{cxqPBU^I9wSvr!oQiOpyL{{RKC+xxWU>C?qY2X%HJ@&n z<)>+NgkLI;x5Ud+Z@0R!j;dr{_Kw5|A9)`!z2gnrrzk&ri{JgGK^sdWxQb*0!{qHk7@usNv(oL^)puh4;XR9HM_ucc z_&n*6XJC=z>EEf`Yj#g*Tv8D=Zt(XRji literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/control/comments.png b/wp-content/plugins/wp-mail-smtp/assets/images/control/comments.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9eaf02494c670e931dd7d95ecc6bfab29f4e8a GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^4nSQbS8e-^kd^%Es2-(be6<)63h(Hy|)L zG%_kWCN@4HDLExIEh958zp$jbxn;t{$unm!SiEHEvgIpQZ`ys}@X5BWj)xRnTQDJ?r7E&HvUBN-+56<9CQ5ks z2R2rA?wm4r)BGtGTmcOR{1X;2aLPFpl`?7SC6qAmH0)!XmJ&HFb!T9`<;L$UI+Me` zb|^UPQ*L5dd6SiKlQ!3#4yN-SMT~L^3z_b1IKdjxAS?QTPyc)!2Ud0H)|ssg$7f8-hps-iyDRx@1r z${3KuwyI>o0UnzRjiqS|JlN;V@A-Xy!a4c+*@7!x+_TEre`v4s|7&N%c%R3!YVWeO zd31c~rcJxQec2YX&*too12^a0VOjJ-_y1%ChU-%m7@kNsG1T-oG0YKfIpetE$-=d@ aKbS40=5YRcF5C=^cm_{bKbLh*2~7aN{%q*;I>>OO&JiPpZ!Xl#Ll2X#La`FmF$||br8rr)028Kq)W>&WL z4vx+)u5Mo5KE8hb0f9lmA)(=sQPDAR@d=4Z$tkI6=^2?>**Up+g(aos6_r)hHMR8( zO)af$9ld@16Q<5xuyE0mWy@EsTfbrB=B<179z1;H=i*GCp?X4>0q zye2VigL%TjJG=I2UQ1k+FYD!JlR9_aJconFDzD}4j^;`2vM69i>$wPA5+p zE3Y|xV&>Ep8!RhL=Pus< zpZ!RwGu!yd8~#PL=Dz3t%o6Ba-+21?_Mnv^0ymVs9^Fyr)byBRJ6j-?|3jJ9)L);q zxm}}+LoR7w5D;5jz#O*ZWretFevmcakHtv>Uzv}uYz;K>J6>XZK}>XdhV%s+-{bXX zH7woN3OCs6gdWmo{Lyjie8hz>`m!^{7qMAA=9Z z@A*SG{+`{VZSbSB@_$RfGX3L=!YsbY-q@Rb{2lY}2NkWZJM{yLI=SmMFEBag+G*~z zk!|M#A+B?q?}%CObr(tW>FSirMJ4n-&C_qZq~WDJMRj{*o*u(d^Fv!Sbm^wWaEs%=jtcYRHs!?scF;;bYSiQ~djDa?ylHk literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/control/update.png b/wp-content/plugins/wp-mail-smtp/assets/images/control/update.png new file mode 100644 index 0000000000000000000000000000000000000000..4e20269012baf7a2bae645b6b80bc815ffefce3f GIT binary patch literal 1257 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$>nyQi18Pe5Q$a7b8qL}XNSOk8|IVp4KSYFc4UZCy)ePjCOES+nOXU9ocY znhhJbZr`zM&))r~PG7iu?Z(a9ckbPP@aXZ2_a8of`uyehpTGZp&nstPU|{O>ba4#v zIR5tf+vrOH66_C*1y3j?DI~Ri6k8JD(k-(12&fm*ZEVO_+Bf<9N%BNcgf;&S?ZT?)cCwW zS$f&#Q#@<_FyBr#y&01AZC~g^;rFSNZ%+GqgYU-Qv%S4%RFq54t{h02fUotSI=*+6@Rz)_HToAtG?B6Pqs3@ z(NYjmdU^ix6SeV;1+xA7t4@AXEV(WCM{cW=@(txZZS6+`bHuH0oqBQCV_P@(k6uop zx3*60YqgujU9A5J9~0YiP4$Gg(v92q14C}!TcnfA%VFH1@^&*9%uZm+94OpmyRYT+DV>(er1FicUVDiPwx}kyZD^Pl;#w)) zqnatV!(w$MtBbr+;>tO*u3XaeyCQN#K=QwDURl*5`=ghO_q_UKO*J2&TPNWDea2azK#$y&#*2v-K1*6!Og@$B!m`;!m8%;9`>^k|Fk z_aEoa=+6l?b)J=TdCkL3Z~V9>h)l{0UcKw;dC^k;IiI7?){9E`E6h9hsg-H|UNQa( cj`&9VWaaJe)jr>mdKI;Vst04}S0bN~PV literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/control/user_new.png b/wp-content/plugins/wp-mail-smtp/assets/images/control/user_new.png new file mode 100644 index 0000000000000000000000000000000000000000..f63bffcf123d9b400392153567e333bee0161502 GIT binary patch literal 1143 zcmV--1c>{IP)9?G{Zg=`=GL$B^$abB&)gcN=Sn0rsu9MBIqK5n#u~I zsAjREFAFLVqIMyYD&goO7Oe+l78`ZqAwcKhHd8=FH49 zrw1j(`3zVBECUt+bAfSSFEAq3e4}Mclb)sm;`}0DBd`uQrKIR?;91~tv1Wf$yIRx^ zfH>a^+@D|l6{_wB?h|XCtZQ47S^*H}2Y_Kr0BJEPD1mL!0UUWylEl~jw=jQ{LCHCdI#QJTC?Ex18 z$E9=xI8~fKIkAmt#0Fq6sTbY1)1o)B+?=FdG_;d1%dg_tkMtz)xmfdKS>4zG9H`@1 z4eHuC54fPs{rSL)WffzG!0xIZ)nEenp=RCVE8cGr8-QKFzG!#qF(TGXCblt+xM|Ru zBfuMpeR(~xep{+6gi`L`4*{DK>K76n0I}v%;LSvSJR#Qnl1RIhs=L9Bz;DVv>;)cF z){Lf3LgW_URjLQC9lrzDiZ!2gu-OZ&0u~k&=_e#%r*Z`NwV=)fu)T64#F}B?Zs6~# zb*C^6tnJkJoO1|s{lbE)UE?9V;G#N%z^YnrQLNcaNR0ekr#|p4uu`mfKeBwPm1uA6 zZYNZEEQ|MsB2r3#^(aiN|fFT+(b01)Rd0*dkl0|n0x13L@qOafocngEm`&MyU4 zw0ZPb{=qIJYC9~>uOM{6O9 zCoKwlfH*$~xC__>oZCU?0PrC&O6YR?2n&rq!hz}ez~zL+Os8|iQQ%?VwR{uS5%nG* z&Mya^Bc!WiI1#uxznZcfcm?=aoL?{2e6OHc$h38UIDb2^jrhi=Vl^--&R>(#$T0yB z=hp!*5W4P6U;*%!IDd621FZmv^H&f)XfthQ=m&e9*Q+P3Bz{BzpgKVt(}B>0L1xCz#|%-CT6Wzvqe)d%lF#%Xo@D}UTwjQa3*(} zws0a=it}e{3TA{I+-%|oO|cBPR8z1EEYlRrfHO1&yFl4=SeXnsK~t~`%+nOp$n16- z)&CS`V*ph7KLG!=12u@s5yX#tEX>ZXkuz+ zZfRw0W9Q)L?C#;^%JH5}aS}y6vR`&Jwbv1t% zq<616ckym6qx z?G<~D;gt__1f97yTr)W|i*?D70yh6hr(lykS2*-DXG{u^JfFuYyY%5Iw;f)G13BL& zI)~Qy&1(Bne)mzdIB%wVO=!(G%a3QCeDHZCHo2n6_>pD0@P=dQE-Bwi#O@3KJ)T^1 z^YUgTqv9KfQr>Dmx!kfQeb>q0?f|R!8|fF%{h7sf?b%QMzx`obGM^^StJryIV$tOv z30%(4Kh7?HcV|sWk_T_!^x1t=iYm%tCtR4Cn8X`D@j`3tj;eLtnOfdGZ>G#x_uU~q z)<-=z=9|acM;dJxySEBTPp=K~`RaG+-tHHSxbGwRfnzCJc=EtdtPx`lgO=s!r%%9cuqw3*4wF3F7 zqu~eFb*5iyQuR&X4BGr?<;?@<{x!D!oe+7Q<(lz^`UMN?)n|*EOk`RsVmeU?nE;7J zoSt=HldJc3)5hCd()2T;xy=l%^!EPvVtH)2_;jlqPxLv3r<{tHD$fFD4F*qFKbLh* G2~7ZyKVJj@ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email/icon-check.png b/wp-content/plugins/wp-mail-smtp/assets/images/email/icon-check.png new file mode 100644 index 0000000000000000000000000000000000000000..aeeec4cda674e03521c9ca477466a12a070b336b GIT binary patch literal 2291 zcmeHI`8(7LAN^X!SSz7x2F0Dh$c%NeC)>zwY#A=HjL8&kwo=*2wT8hUjeW|N#u!;9 zW6PDs61RoW3;|B?V1%-q~M8%FB zKOufnLQ?9~FVYaGjI7-0Gx7?*!r+QZ$_SOSsz{WYx`w8fHu{{7u7RPE@dZ;ei;Fh4 zcJ>aASXZ}8Ufw>J{rm&)geyVBYr!GEUk{6jjJg?p>rPBud_q$4-PE-7%&dDkd8C5E zqT>6dl(LGdYU;z<`i93(XmmzvTSw>eSzYJ; zy}7-!w|~fHz7Yce(44h}scZDq$b&s|S2xMQF&V;ph-ey*Y?vj<(q!7%=V7DSY>I zuB=zuekS-lqyJi>HPtOOeF~dO-&3=>rr|DR6RvyKDS~9g24~ht%-WM0~tbXC7kEvx+1#ER(FXw5{%7&Z<>?U>3er2zq$eudh!9^O(^8Q~4LBS-u#nxt%W=fad#m3# z%09gn@~Xm^tlC@#AJ=SuW&n3PWBc0yXUbf>Vmy2?86<+dTuXkSyJ_O z@S}F1Vp>lG&@3~oOQe>Na(-nY<6XwW%Sbne6j=JTnj!m7x3ZkewEEf@aBO}T*wWL^ zDbZqsn)r>TMMkBhpW1zZ>c*)q?LmmOE8G}oeUwDK9O`FjOK3_qM+TaigPRiRQFb6N z=?q9ZK!QdyT70tu(hiLbo3doy4khhVCRi=A(JmOjO1y}Sh>o6~_E_*$!YKL?6-Sf! z)4GVDwKgoJ|Cvx4ganNSuJ9DYy-JiAH*<;5I%ENSQ)4I*w?(oe1=V*2R07bt8TP;#0rrfeR{$G zYAf#2OekiI@#{a$lDLYy4uno!-lfFy88)SXm=)&ouhS-{a-2MHGjz-FiTaXk4x%+6 za}r}DSbp+}w{N9>)jiN$(s_hKe)ldYB(0nRO2*2c&fux3!}lVsEFsWBWDpNBBb8h4 zp#=C!M~w%6^zS_e1XuT@ucnLW-$2k~$;Ti%sates^7ZEw87DhfUy?g4f2Y#O~;9> z=*TGXkwW(&!&KDI6p2{q?ZbzY!mR0jM5qusI)Cjabj@{yPFJ||UiBiZ*FT>&Vg|YY z4vsS`%kExB4j!o8Mede(+nyg=VK!*Gw6SS+?>W?ZY_4SnNN7+79333_#9p=V%LZ&9 zkmwaM5t|qH=Bx_YLzj4bh8?&R)(S?Js8e6*}Z`SUNm^6Nr9QZ}5nGya?{fkHEfa8xd*qDaC z-`TG*;e&4U>Cs#yM9!7-5%~-}VdKJBjJ$1f*G6)>!4OknbIv6kArV-Ceap;WKzw4F zw!Y-QP!Okr0COA3na+9vdch&*;7vzk!=jBHB(VGIS MF%A|@X1+=P1J5hwp#T5? literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email/signature.png b/wp-content/plugins/wp-mail-smtp/assets/images/email/signature.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc8db0971b04c016aefdda76a498b0a8b89de7a GIT binary patch literal 11399 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 ZA8AXWGA}*-|GTOHT52y \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/logs/archive.png b/wp-content/plugins/wp-mail-smtp/assets/images/logs/archive.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee32541fc28535611e3ad3ec589b9b038d8a6ad GIT binary patch literal 69843 zcma%jWmFq$w01*qFBD2}iWDaVcPkF1h2k#3wYXE97I&ATEgp)y6btSy#ogU5r{~=J z^IKp3B$=6a)~xOO+0Q#+AKpu2p%bIOc<};DR_2}Zix)u37cUSrP?4XHq`LUqzX0H- z%Dxl(wllGjg8v&N+XD|qB8cb47Tl?Xl$SK8VomnGez zn4;36l%d@s8zb?ZZje!Ok28*Ai2;&rO9iQN_xO2;<7YD{$jj07I zq_GNhhbIWC?)4?fLge#J$<|i`Q1H&TsYE{gyV6`#kL?aXCiwYNEFnFUhzT<#L2B*m z@?4bl-hBK&zK<1{seB(H@jn@tEu>5i2$d3zUjC<^Q;&s7g0gI3>bG*|>$9}pVLxF; zcZ9RPn-$iJM=Vy&g3#DI(jSxc-`?G@RGkwE4_QZjE=}XH_&>FVy%_$rbANl$N@F*P zj7JS+wV1W5AQkle#C>;|nDNC2X1=Eds&|9M+f2#*fzngl6&Rv3n@=lGycx?KfCF4yoPpp2m z$a>nVS?JE3qUo~0z5V}c5-sYcuDlaD$0zq~-)mWj><_6@le>2BKRd0{CL)BknkHmoa6)ThpeAY<}-rl32cW0cA zOa5^tGvD61-ZtC$C#RWWugSGHaKjP0Q-ei^|EI;Os$`*AZ})1Os?~(Wl6VTkT*_qb z`^Fs3X>Sacq2uk7(&0}~^~%Lx%gzCysk#L9ZFUw8#EP6I#RT$w?HkrahxgVyMgV4a zw`hx9>=Lj%UBC7K>{4n+b?Hiz-^Qs8#dSB|%FP+6(!?C%vl;t@6~|kSXkC({f_s|F zy{UX_(Zr%Xm6EWL?KoDNbFprw9F8npP<=zZ6t_g@|72$H2qiVT+LS+WmklmEA7qq= zU3fPb>-V4HazyTeQ1Ea9l}lA$ho!Ja-N%-O(hO;e|ExWDLvnQxdjPmIsT#KB zqVjYiU}l@m8{F1DzdCrl`^5}b&$^0%lBea(_p--UDeKB6Hz#-XMJxHhwdFQTb*v(v zj#mR(2Lo5?hBJk*2#=TQ@m)55E4bBSY;Kzpe>P`+n63hb$NK3O`x61o#4u}Yh6zj@FsKWXqNK<;mF zi6R#YA8B!29_jjPEp^RIn``}(R?2mz_+c5sS$#$(OzQF+6pkiGCjpjVuW+<>bdB~8 z5-_xFM=AZvstHd6_aQD^b!x<5h?Qn7`=ki?#_&;)c2@szr)zXMim|NTl?k95%yVf*{STLAQyTztcK~foFNSqnH;=IYG!<-LKjDxF} zB|mgFmOCClY!$I97uy2s9oD1*72Du`J7<%7Gr4AVnl&AZ>1=xV(+6Yu@~53_VO@iR zif?>Dx(EnBY7+##ywdtg&c8!NjWh`{VKs1|=PC<8g$@@HY%JpVen-k~6HDQ+v z+L6bwNn`+@DpjtQDh0QSD5loNPT2_bW>HJ`Ej8bfN(IvWjl4(s05RM%9bj)GF*wm; zMvH^+X430bQY@BMKY#fFp8aaF+qEZ20HEq+zh51MrlE9t^Z_qh3Nc^X;;UM0Ruv&T zR1;&tCMCMju09=+4)`;F^F@2vJjzp?zR!b1nQr4|-5$l5muS$}M9%qgy{akb2iNH( zg(!jR%{mI{#G>WjvANPw{0Qx_(EhZo@9(}*WqFh7zVUvk_{RIjzqh~e(9I%aStzTnA z&~s(B5Exc-6g9i0eRoA?S#gAWeO*<)-pG5B?@*PvSylKqME81Hh?36%uPz^+;x%?o zEr+EY80PaL_W9SDS_%=k8dpsOz4UB^OO`8_xd%f@8{BjX%5`iNdZSV>Ecn!9#}^)J z0^TxdEY?}Xd0iY_;q8TFZ8%~nB(Z9f?^c)C01*&q4wdQzo^tBp)=WqBuNm8uKj)D;2Y~%MFdS`6lAtZki49Uu!N2MgfdHd#BXJx^6B@t*R-k);eRe$d+`Jw**1Bv zt;fxVSZ5u#;%NF*`jR|sPG-GG?ohZgvwAC5sY&zYrub~njwgosbLzaWf5fxukDlB# z4+JJVj@U%^F=)ZU>mN^i-qS2yG9zNj?4G9#n4Q{`Q0#ZbC7<{xSDiM}eCRx_(sNA? zwmWyQBGI8X8DLhN9v}*Tg*g=E5i#H@eRZ?6bBBM>$a^aJ>&W_U?+QgTyY;cba46zG zkBR|QA{8By)b``>?@^1@7@1x$GFR_8o@OV0JittvMI9o4i*K~|@(UV>!#9&=P<<{r zeJs_&J-eCGoYE()Jx=vDj#k<>jF>tR`L}*Dgs|9*+GIu0`da4ZLv0v2M<$J8f?Aom zdz@oU7y3%A^`a@l!VK}X)FWdm^T=m47T#=N#`##BLbSkm61}}}% zaS_en2}h;GxF*E*HhWywMlgJfNo&$i#vyHshN6%e%-*P%U`n-F4LJ9~1gF<`s7~16 z&6*vBzP`$wvnmJZtx`rTt$dQ~RJ!}R)x$t*1lh3H`!59(d+uN$-d&IWK=sqg_^_f# zKb%ksOzVC*T$`IXTNhw@*ClQT? zHlbXW_<*tpX_oxeLsLGW@#{W<*uPVY3T=0xv=I%``qB8y%4;DU^G`K30VnN?NB&wq z1i#6Ns9&Vl8W@5l47hBs_7{gq*@Bl0Lq3Xqu<_8`2joFTap`f$xdjI{S5b&dUXKdw z&`*BND_769XIBZn`00ZQ_w&jY1H+hm3s&CWkLLF15EE?`To9Jdr|!28hxsO%6E_9- z_-PbFs49@yv_I}om8Nap2aqF$B~9xY|0!|wzy}&#P8!q7Ck!R`vE}-j38Tn^zs_`z zMUe22ZG6ZMSu{Z8piC7DyHi0p!#8zU{gZE)%DY#U#o_yf;p*$1vG_O~0pA!DU6DHS za7h8y#5MV&{9Ke=>jlTFE(Kwtw)nb5Ny^20SO9NvAAG!D3I&tvb5J|@#5dnvHedKk z|C3~L05_f$%Zpi!Ue%hcug?UuaEQKplk{*}oqUBbWi77mp*S%1h%2GOsNH`~CC#KF zF?=5%w_9#8Rv4LQ?VKx7Y(~|3iTI{SyZTnrH>7%yoXyUd-oB7HpY3V<_LjJMk1srk zozcTqY>p{bngbQ}R%DD>{5iRkxn@X!aJf*0?#`V-xLW1kOl{(4-c2_yq6R+P-|K-y z`7uLNv-KxrXg=Ye%Ep&ZD6Dg(E8Sb6*6bBl7-1ZeQQP(#PY#{RGF_2!JTXHT%{Oyc9Y0 zB!cD86~W|(db9xL~)q1eCv`68!E!)9r25`_ae6} zA9g2dB;HCZ`4N;{?#?eGZlT)04E0BpjZO7I+e^0=JJy?DH08nqgT5s(I|@>~1R6op zqgi?r%A?=i+-l<^YWHB21H|+Jhh0y}E9z&i61oZSlKVWVzWN>Fc7c9pQLn|Rf2s${ zA^7(9z@oy-!cS#tD(D1E7XI${OO^6GDTT8ym~;2QRF}#OI^&Y^iK(WRh>xgsrJ7`k zfUr|yWRt9@s4nT9gw*PzbK9p!Ad0_tWSKe~&-1A-&S1K8*6%)ko5zur9tw}94KXGm zB7rNcnpq0jaYk#;uQlS$|3KVJK&Fw}p9WL@)+NR@{tjb+&{W!k)Z};qe zg%w)uKZJ%=qhdL$+JuRe_c5wvuGm4m#yrvJfLw{g1h=3air-LN;FLAuYd4ye$xm$( za2Z>2w#4c)H_>8RTWG?dtb|9KUzxWto!6$K zsBwO6L|=qzo^I2UA)bf#$0WEmE>ht8;<7vf`Qg_9E*Ql8LoI?MYV%9qJOwKlHfo)r z8s2>{rp*2aS`D?8NWVsxhhREK#PQ9|%b47BG{xI(sv8|eeE;K*9<1AJ?S6t*xCXK7 zKWyfAxinfGRF3J+F<;t=hiEpspCv9fb%CXRn*V@&{6EKaMn=4vNb5Y4ybGTGec>n_TkYE=m8uMu;&Ty;tKIR$oY7a247 zC0mu)PCQ3#BwBLTkO#Q2>r+k%wm_WRPa3@uo5*LH&ga%pZt6)gug`x+@@op%KcQ{=~tBq#^#wNxW~fh>H6Vn*0w^` z9r!zxY&pK{VtOy6p4!|#3ZDw-k5_WOI^g%tJ0DOlpAg(oekNXy)fKIG2_8jiUS7^GC1{@BMn#?mhjQL;b# zGSHJML_X%(Prt+Mlk7w)^kFV)mkob$OU8^?dGz+U;=e+B_HH?~K`=@elPb5ba?WCz0Vqei&&uNqCV_+i5>X2|a=Ha9E z8B56ucRXO!^l0e;nOEU!kfZ%V;S;4wBZY1RVtDWGZ%H~s3}|q_ccb|lOrL((k{1_k zqE=B=z^0BoGL!At#W}cbO*LoSHk&C#96E?t7g~x0ZM!qirP9$N0L=7@EQFTHj7X zEihz?YYqm#el&eAH}Va{G=z*uhaiu)-0Z1D_de4o99aRijG+Hugd~veh{#eW#xR-P zs;1B5A)Pm@zF?JyQbe9J4iJ_MV9@wgSD&fD*?x0}Z}KEK;zTZ8#S7-Wem^uxg7Tm9 zynS|_2I2IKE9| zMx{%aE;`YvohR6S%Q4xu!kf{J9lJqJvVN*RZSr&?y2EK%#4ZeyQ{$kcw>jy@bKAex z-b1N8%)A<5n56hQDvF$|5F{6gyyKJtBkuI`n|Lzt^R6zs?2gagH!Wfv#%Q#Y4O*9lk zxyMOuAt8!B=FVyD^$V;;Wct~sks~;KYaJa_<>Pz0UfFk%^_x#T!Pu6K9oi9 z4`|veU?{3kRq?=jAIOJ6o5-C}sCE`pqXCuGt1B7MYUZ3-JWR+;%iG9mR%9TA5s{}3 zqFM-#kib4xUW6iM#YQ5#n22_>Wf;TA1I(1-%`Qbr`5g~RUX4;-J_8~OAVT7?s-$w3 z*R0y|bxU5xRU4?O&Pdb?^*xMIN?C$jQB*`yvZ}LR6P%U19Hli05kwaZrTa#|NnOyJ z&YQB#2SPBYo{eY$Q`1qV{;O)W!jJC^s*JiVu=tN)UL0DL8RS`1#8?d&w_w2fbBGyw zxn%}r8{vF(4o}`>6%H*n?J!~3<#N(F3X3b;Wz^RXW^9M4_51UQ$wooP$U`&;i8|zr zMq8t-%6j&QqC>fJ1k!M~F!64+4PGobvm%G9ig0;V|DwUjS4O=aC0X0NtjuMjGeJg_ z!U~34nzyOoe z#RVN<%K=UvDt(64i;8R{SsyULI7q?2y(cZ-OT7I@7maCvFWheXPVu@>R$U1W$^=^1 z$p+;D2PP2M_Gc=hHrVI5>!k$`EbBZ~P(0CY*~Ej7*|^g12%C#`-sEBF0M_T41X8P; zf~%a^6GfN$=mp1M6v{JkK`^+>J|jkJyLigi7ue*x1r)@#yd#K1`hpe~N0s%-c4;&| zbk+7K4Oz90DID@$ho7A|7$~;EeGo?^xUV!`49NY`HoTxa)wn;y?fNKQ(6kkT81{R4 zS^wv!awvl1xnzmGJ^|wlhJ`4el_M{ms&7%gF6u5>5mjhjF(DOxz-iGlc+?k@E8R&Z z*Z`rt;=Ha+gl2#(VC={m2aK>pI_M{Sr}<1I{}By4xZiW1I5pPbeT&1n_3hyq6Wf4% z2%aj@wY!z6&?S3~Ow*&y+75$gQl<50nECQDiK5^bt-OJ~p_lCxeMf|993rosWpPW>?|akh~8B6 zJz^H`yG!^6GdvNis6s%P__;$n0TUr zCJ2{#$Lhk8a|&%=BM4m{86}xvg)I>;7$Ek+imAQd3Nv&D3-y)>cZHv4Bt(!cjzGJ* zKba!FXcD{AudU>_hbEdDqNk|%WzGtRGndn7fAs!B^L#QQa|$M~!Zj<(c=@#uWesL1 zRJ7y>O~G#-B`X!u@LVn+dtxKg`~gL0QO^XD4|3iDiC&ud+zei3bXeN5Xw{C(o_%4< z`1AgsDZ^R$!IhZmNOxXg{ zOB!7)0Yw$p9wvX!f2;M8Ade@Bf@%2tOQGCK3J0Bl|2_(4Zz$4uI6$+?v6vdydeJp> z2*AJ$I(I&q1IepbrA6=3am3M^IhA(&O= z_~PDc=&||?EFrVCdsrv_Y_@=bP!k=um<&>XXB2v(4EuF`P6ZkIK6oYrda38!z|*QrKaG?u^%Uv-MrHYMM)h(Fxe}?_ z*BJJ~wb5H{QmwwSvH6_&rprG@MeB8CfOyn_0EbNCDAiWtnXR9^S5dqq(Y&i<@66fS zlC}c|yOD}^z}=(2!7_hc#I@UxmoC6=*+#B>>{YP| zf;ZC&5Ar(>oIdpU$%G2aek@N>r}Y8Z9YL3h^K?#ewf&jA2U5?7N?ym`iB$E44(H9% zY<0zg9!4BgOVS961&9%QxvvMK2|GRdVK#eYUsR%AuF+(^*X!XksUXP-cj54dRs1tu znk3Blr4Ll;rD!n(CE6V8XWj=Xu0+zABW7KD2Y9Om5p)UtN<+h3lmHPPzBAS~A)PAG z-WtQLw-m2cYe%?hBcuM? zlqxd`5K&R`dm?FuRCY!zl6p?cG6CR9%y@u??@ z!c|AQSP(;m#W*ANKsR}#wBN%BbN z|R?umB@j@;g=ciz#&D9q!EdwjZ5qKfj0ixpit_hnuh)w$Fc^soBIcR+7!&#YFT zPE4{c%1#G)GkLgSGxV}yBa+hc`qwO;kR-RPKJ4pyQC|6xi6|uH?B{n{LnKm_F}qf= z3TVQ}`3}!WyrJP&UNzbNm_k1^&J1-N*uY%6`&k4)>=GE)ISw5%&GaPve&3$}5TnbH zuO)9sxUQXSHRhnq0s)n20s)mnBJ|ra)VXU-N9$lr)FqK24hc2wfcw`THeVB1&4`;b zChgiN$Gak5kh|{g@z`E|caveRlr7(4CpS3WEthaL-!{1!{ES zS7aGIAljE+KiGs{?ECv=a`C9<>Y*)h9s3y)laV3Uj}RP+6suDhIqsIJtJhoc)UIhR z%1XWGaE18itdiyZar_e>-apcQfKaN5Hn$sxFu02w9HraHsQik3RXY8SvD)&j{zIlD zvSRY3(TA+7_ZGr=ADk0xQ01|6_e(s>g_S>XP|!DjEzY;H`1P7DwX7pv zEs0&P$|YlA)CvLr&qCm#j(^Y|ud>acLZGba z^F)jbcO>^CDJXlhbWW~^bulmOvc({X{`|U4r;XD{?z%f7E#RU(a1w}@x%avW?I8*E z@^3+!>W=eYV_=8X3mo6R*CBR2D1<5oDHt3rT*WlV(8_AVzL(6@d=$L8?br1*=H&Do zgv0^Fa8L%iv}{;Kd{)2fOfiQXwKsn@{QaU{BsWtqMN5~Q>B^KR!I6ZnHw>Pnpk`8N zDla(UH!xcv&L0V)Z~hg(H&;r+rbfnZ|Dg%tQvQHdcVk+ImJGQI0S?T4-6f$u;4!X; zi?|aNK%TaFhQrw_W#9&0$%d~jHJVwO+AfymCO&!@^aq#7Zj=qRLnzHPddAA>Uw5?l zh5$eXRkGF_GBJuZ0Aw1$GYUNgd{-5Ti+c9gHL4YvNF4rpx5JFZxVrwd(RmukaN8{vu z!bm7fCrRdB$ZBwJ8)cP0wDv5BpUyKw$boy=uD1gGen zp4H9*M5`3;3S)+4wN6iX8Bn-gZ|i)cDmEuQQ@i~%GV|4zg3LnrP2S$fs2x<2*(!($ zaa=>|wa5CKsy~7v>&957<7RyYt~WMVqh%!bHm=v&yZ!IBL1OMheqs_&gg}3HGSo8s zy@?}BF3YrR5&EvC$coDh4%e2Y3nk{(oskY@C{r>)bEdHOA9^8J@WWs_R}T?ad={08 zU$<4s!bTZ~=)mc~oXQvL&fz(DjKbRJ=xgx^fD1KIG-GLbxsy@*FsAb<>UiyvhqkqG#$HYu#~1rG{}&F=`Lxn@<@b z{@|>8qK0Z!{R9z`qLu?@3yUob-DuU`2YflZn1521s5IVsKkgN|mr*PFa-5W6>X)Z^ zdxzv^>RZ`FIl0}f0Os_Io4<6MCTZk%CUYIof~+^jeLo}HmJG$uE0@m_V?LK^_y3SL z)5D}XpD{P}bDCDI*tBut!5`$=zZ$)v$oy>f5hWrqRd(dh<*B_76BkA4M$99o){I&v z%eZpBrn7>J$pJuQ*25sndgQe9i&pof!?`Gk-z-+}*YujmSWA3P)mzzy*n|P**k}-L z`qt5nocx#Fh=D~9&b(Gx5TXC5Rl}!>5aMr+Tf+isyq~LuYLJqF4(HqKo}Fj#I|bGq zvc0OgCT}VA)`rg;yV_ZU1{orezL)!a^=>DzYt^0A<%#^O_Z3G-x;xD4EvV4&_7ob6WDlfuzR-w3T*hY&cjkZ6_F%bT~g+l7a+*dW@xZ`0>BHx}y8A^{=g4L&p7 z`^C#?j*;GWf%R-lQES!q&1^dMO(7LE(hPH;y|a3I_Ju5#e>-Sn(GNaBc#)ezC~{sI z5Zh8W0%myj;Fj#?q*$qD5BLm}!{ngM1|}DRtpz{2%o3KG+VK;M0(wHLS%JH)-j#xB zYT9MtCG=OOTnRnj=0U(yjX@NJ-h@%r_0{v+&vtS)Hm~#;ND%I!(thO%8r;*#DMM?> z@Vt#Plf9Nji0KI?=*NccMp{jh$ql@LlTxE{@2V-^WS+GgRdERW?0tiGJ`E>Nt2Np} zbX=_ja#b0^de8e}Lca3s^BQ~XKhzDxu~qdIY6a+4`t$n{A%jrv!oWBf6K!uKS9sinFUozWGagb2Lb@$P9!@>T7NiUkNv z`pzJpckuGfzDQC1Duk(2;N5StX-0SM+OYIJ{ZEk>17;i)-{$(p^T{?AqLptoeB3#k zGt)^m#JLYN*hp~5!Axd`pk?y7$9Q2CX%Mx4-!_qb=+5p%<9Xup=a54{CDi=q&O+=x z#AVZ;hxf$n%*VTM!0h%G%ijHEf2k_}n$dd+zI-}F&FHuC{N~7c8R;L#PYhff>pAj5_sQpV zruHi82V3~Vap70U*S+Ul@&lFZy3Nz;G5ibm&7}2C%37BsG-$Bb7<$B;@knBq1vagQ zn?uJBwK`Mp{$o`2YI9OD@mMF&XmteAIjMt!DIrs96gXfhwk0Bprng1K9kkr0xd=L;)9TQ-n4GAQmJaYz;K#8 zd)YAlv3yjjqo0738vFW`!kC}FNLu2zgd@ZgTFoGD<^SamQK z-nX7>RZ_cigWt>^RKHxD0^Q z#U`Cs8AK(&5+I|eHXY`M8ti~`yHZCEJ$EBX}ID`sz8Y4 z9O*$$@9TzNeM`}go=aoOIqm`{6ZPb6v(|wKDY#sCR?ZjHQK~8%m&eMdP9L?=#s*O2 zDu-N#sQ_eE{e(w0Fe=>Hc-{6ZXNQ62o_lD+9eNchSgxIP>sddtY8B}wZ2HzNt;6GIsQ#4Woel{ZZC^Qlt{i^*XKZ!BAz;zW(Q;=pej{#>@xTplGjTY~SUCgU8* zIFj|EJ9QmEA@r;v2sd zN(#~iy^-N)%}ErjYN8!KWnGu;6aQt)Q5{79(71r_WTQ)qoQSw}?uW^_2mjNqg^DGvY=@-FLwCodBYBw>@!6i!nGhB*=@0pbcn zpX#a0hkOu?qe{jVdRkJ1))kuTKEvGcW-EOnOQvOa(!4v&g#8Mi^u|4vDzXrE1VkTjf3!eq4R9XP<8HJ#Y^P0lHd}Fr1RG^etr-TRU}I-c`2x*#nbx~>DBX?@jm#4qnVoJaM%-~tyoh&w$<8D3wKSA8%kg=yk zev)K-=A|&8CnTjO?DozHWx_Z{dXfRm&3i3YjYBVHEyDdfISp`gQZeRXO`iUsuUL03 zL0V<6?`)lX7Pfw`?KQdd^V^ZxnhFeUZ~j#ZU_iv58yQf44Wa2{

            ix*iB#o*3$1MYLSspx+G+%)2!b9)%sFKSFl{RM&8h@%VV%g7Fb1(ax9^jU+rw8haD#dNI7d>59D=Ej#DRiK^C=u= z>uq0vpVzu0cvz)5vU14ryQBW4{;camC~FL^>VF;ZDEN#pix-Twt9QtiopGU0+rDv} zDovQwYcyHi92|3*d9@>GTELD%PX8N55>56zNbak#ftg;pq_I1gNQs;9?`MZ&n09*? z7M3|xt8*I?<@|B(QZFpCi@R;^=^dH<2K|k##0B=u8xHJ?)k<2$;;SU968neC+<1A@ zoCv5q{MyP)@0|y@XBZ}cHJsYPitU{19iP6q@1KSRz)E#ro@5DVkPCX#MP&&k8Sk0G zzbc18pTdRl>df;BSm|=K#8RqV z!&&}it5~&^F_WCUJFtl{0C&pSv0Cw6S#>ojJA`*{sx*#V$RioXS+UOK56C59h$|C>B+?bvp=KT;c#ym)Y-rKY{GSX=W(PP>4W_(BNZ#T z(JV;@U=;7g)YUpjb?H{g^%98RVy-lc798|J3M)%<-yyj98>O;t*sd8?0 zqRpY?fem6H=uhH6&dVW=eijP6&S5Q2X0=1P=mQm~@PSIm^O6&5mw@RLc&plN^o?vB zfAy>0EPY1xGUf}efH9STbK=Qj`Jw&Ue4W{6iopn_#ni7Kvvj^KUZ%@{hdcQUerFoR zpPwLlSOXjIq=Afg+dWkZt4in!*0U~C~tx_B$TEZZ{IN`ngy|w10$D4SO5_G}uMm|@9+>k~L zCW>~Y9hdkUmY(|kl7(@xx`xsP$^#xPQ^P~5n^+LMI17whq|Uyq1> zY&MuObcOkDYvwnqPwa7uexRi>V(XBVtM$G(n9*d?yWqDG1hoe$y7OWn-Q^N)-7Gp!I#K!H;?1B!*O5 zVB9)tOQQ%!&_67aNX4N5X>& znk;J*%@2h4nJ_px#wvz2cKBTq6OG+1lu*d8Vm9V$f3znvlsacgdG~B{a}!^HSTec? zVwO164 z(m&rFl6eb%V;&;W9J+B&J;-8^R(qdVZ?VvoE9p}2aPX7UdP*7Hs(bBMq9h<0IbJU3 z2>_KDfkELkx~ZHHuWNgJom>kt5SF|f8<*7t82Tv$0XS$3e$nf-qJg?XWoKtMZZ{?e zFGIj4kGIr1O?c~S3o8A>R~9y@{%4n8T)_2^6NH!?`s~Ui5)(@BMuT^_*Al4b4rDRV z6kdn#>}qw1*Ph2K?J$oEOBKdo>*1fO#o-oyFWX#r35DahEF%rtDsV7?5W;JPU@Q_- z1*FUNWjFojv=NgppOiY?&1m!-o{7G3Y6oJXhvR$58ps)lZw_TxVPZ$NKWY4JE*=em zMqJcK=a=m8+3)N9j1F?TbxrGKb00k3Ytwm~l`2bAD0rBge&3qd7?T*3@nnIEo8~PZ z?^wPkBq6>aW76#&h^DF{v|yM-uwb|M|3wOstRlwGU+dk0m|VUA6-CvOa(>j>UTZF7 zOM0KWYJRu%37X1I;g*r9qSrLFazm15xIDV)1=()G(@rc1?iyD9usDqIS9u>680L?KbH zK`H6vEI;frdg6#{&g6Y+G5b#0Y{Zg>&c2zzrt&=d3BQW<%E_bSl(`G^CnzzL&WRIV z$f7oj`C*|3&eYMKr)nBxY8QXEf-Nlf8FzsiRZ8}w4Dj?r+{@Qoj#VYc)39n)VLotG z)+4#%eZfUMmug(^&{9H|ot$e*+K}RVJ69fL6WxP&IsqdP?o1f6U&+ z{7FWN<*wthH=Oe9PrskR(_^Z8d%w0?7Sb)#hp|BG0H|m%Cg>09X(bzs_&HGit`14@ z>+5t$T53vYsdFd1Pb&X* zP)V4f2}oiLDt{JeY4S~pqoFd1mbPW_>PGc5M4wVF}Z8mMj<&m(;f12xE2HBHDJ6 zh+FEEqLLNM@&Rt~h^wr8{c#3TA5H@VHmR_Bo28YUE{a27KQys5HTfe;N)r}LM9MOS zsI=z^U_xpfKkAaA*m%nH67Q6p2@3gtSRxd5;rGo#%?;(XnOoodlbCK^V}+K! z?&3~qoDMy~W6~ub-;Pi%l;b*}33zSIN%y@co|X+W0E(xRjAzVTps5)HWvj`!e4}Cn zBUh0~ix^>MM=okk1(oy%;gvjZZW|50IsLqT-G^!>QnErQ=B=M0Y|CY!oi9#*;{X)} z&jV>c-E~(dAmN6LB=EiCCtPw^8CIi$-qceSCGa$&_&Pr=Wh>2-X1T z_V>X8ed^?sa=Wc%K*M1hP|df{rS&+|Q1UUx>wDyWVH17qIEr zVtmp!E+X~+BWg26&TF5oDT&t3Ay@H1E>Pf^b%@UO7D3|0sCK37md*OT#wN7l!b3D9 zF^UJiH#EFY_gIC3eo9EhTbJYG5eJxE%JolQs(I&fUP4n9*Z6~7mLckJA$p#lp!uh% zz{sb_#s^&D4wV8Ks%ooAh!AmAH4j3uo?(~{Gm#(V-4%^&o^c2^Ht_RD;BNn|VB+e< zB`hJ&F#jjs?{8_e-lI4O2O}1H^vjlWd11`c-7fcCchZDKKZv6~-8LAX6ARXo_(dZl zngTZwBJRK_8VBgz2obAO+`UFl2Xm7|XjWl*CX5E8BfejhnM-(s9}G~L;}EF*t#CTO zSffKg*Mb#MP&xZdu)qvO3N9(WZ!TyF^8KH*yv_7wRkX97O9JVc`?yU{5D?=&4hZ>M zdvQ|Q<-CITh_sckB8^!MBYBAJUJx7dP%$a+#j|6$q(?|7y*BNdHK^mHRtYc@vldB8 zo-F_1lhA7FD4WZpg!qvr42aLx7=}i8ekzC^vP(HA@3IPYhX8?@i)q^MHyY zjIuaQlWMOYZT_dO2H#J~v(0Xul?#U?au9JmX9Dxb4(60^!DptHucE2G;974DCBWmq z8G71lV##zOV+|-ok6%&+xY=<$)mBcH|C4^U)gfqa9{nr^Vs~$*Y8w1W|wi z!^BYzjQoH5)mHOonrVDu={&QDDFaO(7clny)|a-xi9_yB!K@2KOh)x20V|NS)i-;i zQ05|;aSAHKCs?lM#) zy8h-uh0kO^LtZ=7mYhwBDU&u>*@MP!fg9h4MB3xeJ)^RSfv_@LOER77AW~fp305SJ zABMAe`8rnvu`RWB^9cIMKu$^RxJHV-`s{Z*&+rNz$679+`67ikyq?RoYxb4auqF`gL?ANA5#1e=i1gkTl#$eoecAI*OUZ|p@t4Oz z#!iX)r=)LG<-+BR4dR`p zOgLavx%l@s;G`-+J!fmJEKzr{!5!}Ks3vNSv_IA5Pz+e)oSg?+Goki44vn`~mJ>K> zXHi9d*+-3x>M40a8l@QrFU4amW~0udLbVW$zSz#r*EdhDjr@0ix4G!jS2TBXyP?cV zx1h^_SBcA~@v-4^h>^-gURTYWqtXL(JDg4GQtJMok zN*^X}fe+)RN<04-@5buY22<52^fr{v)2haxn;vIzQ6Q>}!E5(zgHgY$13@np*l>zp zcd4SOu?=RQXEo22z$T@yepj?NO%kVtZPBeM7d3T_1)m{jcnb7KFNLf+T#?U0UheJf zP%gz1tS5Ej6b0&a4KP$+`y; zv~)vcmUb1xE7`|~E|O2GpJ-&4l%HQfAXqH3{eb2%I^(rfrX%bj%8GnAdDdd#A#zRo zFPO(kSq`D9)h~&>Sno4V0ej}Kqi*-fl>HBH?*Y_Q*S3w)qzFO)X@U?sN-t8R3xa}x zVgaOgkR~9#g(^kqy(3Mf*U&qJj)D>(^o|f(Xd#q;`-t!J&V1iF^Us`_Gm{A`VeOr@ z*S^=i?&~hsrn_!-_gf+MQgo3D?wy(9D(hDcqE-Rbbb|UfdKfnH0*NFee=Y>whkz)D z=zrxM+(lwk78**P_$gnn@{=%qL$S>DCUvf;=GUhp$7@rm8A#Ro7BQy887>_kW&tJv z<}->v+y=LzcW;sN)Z9Agr41Of97*#J=7NQ1)n~H}>gbKGtLO+Y-?^SxVJ;LtQSimo z(<3tc@QH%QxKquCJ~;=1T5N4&?i7m`Z_^beA|9hTkY*bVY7PBApTo+<6EXh;vqAfp zgOG_2Z4tJF@Ae0E=p=3YUsz2UVD9zz@lQsih8%X)t2`2-CGp`&NTrCLx}ZcDw}eiL z>KZ?eFREMq{8V}B;P%~3s2w~Zg>h2L*V9PXIGjo9AFGr3Quaouvjd^;o79fvV1lXQ z762nZNoiGleN4wfmF61V^pgIOXK`x&sC!# zNjZuWKiJw(eSdkyN?;||fu}=Kar`!D+}Yz){1K<~+{$~Ee}Lxy--H@}X6Ik_j(>k2 z|Bvv49{dkNj_6AV{N>f5v_Ek-Lgq_6`{SKCnyZg!&bO4|pSb>cefE1K0>1h1**~xE zkf(o}xDWn(1-$>;yg_)?@!8FPoB!+K|MzG5_wZ-`HvjAJ|7!kU59HZpDz=30S&)eR ztY&Jh6|b6ZZN>RJ`I!*4yc8L~!>Jm#MU$h(tS``50)%rQ#ONzP(+#E4gV=ZxHz^gYX{qs@hVq!AMn zvz~205-SKgCwdgCMj0&JSNeGWaOg-O0kXII;kE1P}y5r3mXsh?`hUH?>iq4V<-W$SdpiaEtGT^~si^Z)MDl3Mb1jdP-JAg**X=3ZNz}3!oDklQ zTzW(yZK0>L(4x}wAH6?(UwYVX9ADfeI&aBF{=I{-4G6>---0 znQ2!n4>?c!uQ7*gYxR*7D5MK5=#M|AZ`N5bBxG@>cw_i7dS~gJjq0ve(#~R6l10gs zRjpC3g&ehN42AiVZ-zN4heoj9*~T7H4^v5m>^s;dn_SZRcz%d{Tx6mRJXrsp`xHO# zay}=Aq&FK#o_L4+j@Y8ySyL1;`UcWzv=2;ts}?gT;gkj=-o!Mz@w;<$4j^8w;^&Sk zYTeYWHObH1G`aJvw&`f@3_R(y5@$6Bi{U-Z%n`O6>1Vn#_O%}UV9Ir!2PkNZ|Ck1S z6gBJf@jH5J;Ijplz?Dw%B)idT0F(wlK(oGly)j)<_-=C&hBw*1!G1`8FTpM|Gx8jN zv;P^>Mg}_hjmTTKIUV4(C2=);rLM%~5_6(ffi7~My+o^BjE=Id0|Y`1J|siw-kk7K zeKMEGZk2=tjaQpgo!+?*^l{A`MkhyO-L%a%8z ze{KI>L?RFOoE7@}Gp{+kQ*j{S&h}JU?~8h1PpWjNZRL#xLGS`^`x`2GT+NC%E;APj z0KrJkz}mA{)T|Z^kI$5^*L!Rxdf39ZrT6>R3{`SW*!8!aF-N!2_pI;6VFTU+m4qUz z!IY|R%9ZXLl}0PC|0)6lx@cPM5HZtNyqlA`D-XN^D`2FzI{EdQ)+Ze1qm4NpDJ^+e z;W|BP8Luo2XYMcNNf>WCMQF?RhEZ~M681Z!nc9w4vYHW^SkY;1owWA$sOdhSi)Q8% z1~2Gd<7UBM{vz5@sFL;A#JYYme;}!Iy7W=lXaQ5tFCDs~6*KpbvdWR9&RKWw{i0p6 zq>FZ58&;hfoE-9XSBp2uX&QPtM{>1sG`rz<@pPtfYXlw9XE)OjMz3wCykuVS6Od~e zHGTD2Z)l~3y+2;805%CR$}h5>n%38*{}IQg!TY-msFG{_yf>A*Opv*hq<3CS08DR@doBm26F_SG^rQ0O5AEm7qU~s9PNYt+w7#FfZLu%) zfhO`j$q=;?`!Qi_c~j1tZ3#c;5f=>#YK8c~p(L z-1f$P)yj|Jd3S4J%QzWa{JvlJHV3g3;~89#Up~$;J=DalL{s6L?akF*AE&y9$Msw_ z@qV+^yEh?ZUm9NX9W4}Q4Ky6qI#tLYJ^5Z27S}Od_^KJdU~p&>qJ7`z^h2>;jZ(w$ zFIJE1H$}M}utf@$&3+19Evi!u`sgx4V>uIXy66pI%QVxMUtcR^N|W7w0eypL=h4Ny z!QDUR>r7*|QLi$Ys91t^PIDBMT3tiA^v>qV*bGadZk0^cI@h1aacT@Yww`hn>&MeoSIguPtt)fY{+Jcn=dWf|63lz8v% z6*h=C%A4|Jo5D1#Hhzr!=C&D(?v75Cu!%g=u*}SE8gPDZ_sBHs0+-!ltFFL*CgIJv z4VOLB*$9bS-rwO2L%iv^GxJ7bXW}vG@QrD!0Mfpcs(RXh%hJS@-&1+SujE8(o3uq=y?R7M`7Lh1Ixs+phU*7l2tx)YZ>g9M2 zXNJB%&3&Z@ot+O;O)yf|B6=O~2@F4Q#_+dZ7^j|f3j1VSZT+)%a2M-+3cXLwMZzd} zL-655Lm4OH_i4IVN;B3Qp71=uJr&AU*Y`>Wdwf#APj&~O!a(VjdI#&Z6xabu*lD@< z8R{6Q(o%bh1WK{Z1{0qHJT@g9`2p4sl#g=lJ9`QqV;bvZ@82pf94a5`Y)hw59kUp$ zlpb%^s+*Oxur~5ypy2@9haP{JYklT?q&DcjxCx!xs`BmRX#DJKO`SVsALm!@zI^s| z^2?jT)SK|)hhLnimQRQfw>@b6w)M535~2hU9cqwzP7nS(Ci3e6jIE zs#yuLU}zP$cN=DBWx?%L{W2FBj?u^2jucR`y&Zk zMAi*geZujB!lR?><>_cnCEon_!jCyWzc=RiTnkImE=2rO*=nZ-%YZ#UzX8vcI>8U} zbe?Iwl)H7$j+sd*oF%4ufk~RRVu@2gZDSp&U1vtePjRKPaUV468?*D0NZZbRDI!5T z*QL-0Fj8Ed=M(mo_T&Oaa3$#f-Mj_*+Yz{ozfCK-zoY*2U(NrIXZrW>f5-I8M;Ht+ ztx^4pdm3Ff6aOGtAg#k6fkZ%quRdN7{SOrNFNflPXchm%q4>X`u)iFP%zx@A0NnN; z4#xj^{C|Ed=szg#|K<4qjl^(`S3+%T491vY!2FThXvzD{E(WgtOav{x98L?zCytRvqi^a`N8{Z2WarfQq z6EwQ-;vBP5)_Nht5p;R-k2mOo6~F8H+mdW}LlNmkgt_z%ZrzcX!>mXaL7U}GAxabT zVjNstb}(2jARu6QZwa=#h9R9L5O>{57G!>?jq`FyPL z4|<G3x3vesjKyb$bWZjf)` zA2v^bInxd|plu(ZZ3Bumm1{lR`$b2P00A9MjvPHVeT^+be%xW&>>?8|CIPxV&JJvh z%Z;96_Z=T@X=+|XbzJT3`}>2~m9osMx^Y81Gp$p&OsW8Dk~9wh6Co5vo+J4szRHM(_;jLLq4reREr9AlgdUtE`%NkA&Q|^-$2F z!AHHD+hi*Ti}e$2O-H+uJJK|^NepTWswU%RUsqcA^xWYZ1ub6T@R?tR0Zb%-#eRNye zK(pzcL|-~9G@eK6*<6GJZT?Gn&3sSZp=Ix4IKO|_2TUB=2cQB3s@D9=eUMW%?0y$# zqvgg5&KHScZBP4!Er*lmfK|*xFJ}LamP{&SO&|$3szev6UTcR~6`+0!q)z7RR9UQg z3*_8hvr`j?X^s$(G6-N=zbZ!jXVMnmpnn3KE+Wz1V0hW3d4OFqwiLdx$#J2fVjTJn z1y9Z#>puK@&G)HS1uM34_gyzi+4VezcId?%$f0C1F+D@Ct;;=R2T@#4^MZbSMSMGp zM5PGXg)G$rOmC?a6(V$10BxaC(PJ(Ll^SZE*DN&EKR$aD)$ZGj#%osD<054%=)N>v zi+Gf?$Ud~Qc5vo6Sbdt=6Pd;J^G9f%&shr3>xOA5GStfIk!)XfPcFa`Iojf^OI!Aa+zyEjGXl310af<2imM>3L1-&njwhD6A^dCT~&K zSKG)j`By^7{Iaz_q9$2cQr61mM#4H0rHI6_c(H!A7Sia8!E1Z7bDlBd%{f%-{1BG32 zV+W1p?z?R==ZmP8o2R|^X4>K0C|S|x9|H_*wva?`MzQx9ZJ_hXaEY_ybliigdIn&SN^x zT3pYS!p_X!IkzPK`r*K{A!G@qk4N`pgNaS8k*7D_hz>VX4(z_(DUuJwAI()JLwU_K zxa4b<(cIYOepMWeM?{hQ1pi3F>!^5n5MWJm`DK=wCF|G1_9Xc!hkCk|5EBp_juo*U z?d^?W9YO(_CD9yesmXJ|w|DbZ5}e|l7ihUg9@MV9^x?ePss|y-a!rn?!~#6)V9Z^e za`&)hzNgyz)OX+D7~ypg?#^hHxoo{x+EZ-3Wb(4aHt(*nLw>M4ZpO@>#~nL4NQrH4 zXM&F9r2Om1IlE?N!nm;mB>m^Nx3}?#wr52)%N*RwI=2_!jeQfr7Fwfq2KJp=8?B$O zy-I6bGfY{rEBSEuA1Cm4G*NIEHxhDP2iOrakOxuH9Ty(-a2tmfJIMDq`_QR#GFfVwtPC^LO!w7#97Oe-vGI$T!4adj56R;5-&pM) ziqI@pv3WU~X^vk55fyS!9$dCyW?cu6Zn}qAHdNoURBh!)4M}?FdKDtu4@1`sZPl?U zDy70`A3PPYpB5+CZ9P9iL|-$8ko^`w^Zs}ujN9&Q1YXR`#@YmKt@@Jl3+~%T~0?_ z10s*5fyhdDi#$X1<6*~Evkq~NyrxZb?(*chd)2t?(KJk5BKL#ZuP|3hQKkM9XKAy#){7x>crRVtY}!h5D+Tiu)o!Q~o? zy}>jFw5vFFpU+fq6#qDNaM%nXTUmp4pLOTG6gyil*5-ubnlBxo%^f>l;=X5J8jwwh zSz}VA*AM}Me!1qR4UoYY_nCCBLaQt9$@H(7q;uRs0NITCi#pR^es7p(xEfdb^k2rdeL=dtxIST0Gi=^EeBJE6kmOV^nqxgPe9 z^xV_bU9ijT2FrE$Xeus6|3WMe0ZI%=On*L4tClKKp+F`rLbBiJwqp-t^eUe5#URIl ztrrX?l|9>yM!&^&8We<0l+VFAG z)oMJ8BL?9E%KPMPueM$+$<&?Ocb(hWkA4V`SoXhpKy5U-ynBi;RhMFavRnEpw?O*E zm&&0NX@|_7dt&iq4*57FbxZY3xk?{NWnHy%E!yiT&DL>&5VN%)qQ@6Ek3$qVTwQSoyG zeVQtyob2eMyOD2*rQ+F6u})R7Nq4xh;qCkH2vHL52&zenF5IkUo~_267Gk=OWi6+7 zPMJIY{JQ2%avNjTfb)nnjSyFLU?uN4=nCWF_2OUa?P0n2-th6^StG>; zQ!_VTV#551jB*Z}HiO#YEQsr25xo4_m)2_oWsaWuG{k4@V~!j7o3lKtabxGV1Qw?K ztfDuU;giRGGTQK{VE1{Kri(nI=bCyKV*b znxzNmW_9}xS&*Wh$;!YO3=7DiuVjsq5;9Yu_xhcQ08 z+$(2Kvm+n}PQElja~DQB&n8L6&82khAds-)YXXj-(8`P=W34JR+pnK5V-8y>vb>9XjVP=Ga=%7xAH54Nw%xDHw; zcQxL`g$K_q@7g3#gGs)jeZ6ji&w$zgj2HS3?q57&kptsO8g$;bpRS{5u2RBx3ax#2RnHt6grCR+t6bUDjGb?>!h+yV9zTk`!PPGrD=f^$a0% z6|O#tOKqpydL%vhTGk8VF27!EPSx0)B%m^-z3j!7X(k)rZI}T0dxUE`+Dw0RPdFkQ zD{R1XQH(dtk0HXDmo~nUkWSQAJDIE_Jq#HPcvr`z@BEnzX=0EgA~yoW^w~k<#j3)U zR#%)35AHou(%1UqB_aY{d5dncU)>5|fBd%@f3-q^gU%lDw z@Sj!y*cO9h23Y&Q^yNW#|Ge1b{`|$0kH#YZ+r&}CQM~#;9uer@uKy36|I;;^msu|M zB{jd!8|Sqljk>ng;gPkbWE7lN!v|LTcLe- zDHrK5*Nn!=GQ0Z|Wyt$F>chA6A71@>G}dG}mQIUFaLvZIp9LeyF}AJWsCl%bN6=`! z=wMW5MS*&nMG2*GrPI%^b_G?456KoxwYT3Gy3v_eQI~NYxfa2fr`A)5?IypbKY#;S z8x`j*R`uIf!0C;1A#;GYq4Fb>>@3HVWRSSUAZ?nAPs4p>P!RGdgvXG)k{%W7^!1*N zQ|yP{uPk*!Sw%czoG^=#6#7bbL;#jfxpzXw@j_Yc+VdLZ;BhKqp-iOu(l`6-Po!9m zHbNr>+U4reRN!(OL)la}j&Dq-10M&Vq9%Hl^Lf0XoH8_0_6&iOiDSUieQ@uRSM8mcG=3RDpq(9nq=n zud_c}wnQr1T23`GO(`jID3+SX6*?MZ4`~}`E4!*2h2AEi!tB3Fp*OT7NJ; zspRsK(Lro~8SifRnD&Je5J_W6SeiqNHLySSHIR@Cne|5R)&t(Z@dlU8T?x)FidNr0 z1^)yLF#s^UFiHagUsFH6Jh$7Pu76c#AZ_z4Ti${W5vM~Zw`A_iVwQIClLr=fUUj+2;jPBYHT&A7+{&m*p(wyF1B4CuGQY>6f9xqOL3E;x24|~|=+Q8!) zhP{<**$k9Hz>tZeheG?DlO{;Td@X8DOJ%bbx6M8s@0E#>W~G=hTFNEAxPTKBO--<| z${Sv=d)V!e%_z}KTr?>*#bboZcs37?eJh~4q}Q{eR4VV3)zE4i&4{uVBBGZ+>fTmT zgZineKogZ(?~JxmbaV{ zCEdhBEU2KwP7OAb1E!cAn}x8WmS3(mfufiocC_%eJ-S~;6%U{NB`c-xH;d26w=n3d z*14{7^?EZWw0hJlsLbOOs@7x2b{MbSdqivPUKQ$e)iBPfq68%G_74T5fET0N)^Za(zYL(2X&rY1OU8=euccJq zXDP0qi*{N=X<}rTjcuP_7QO2IDo)K&Hf0&vTW;JbGzWacOUNV-XgfAJ6>s1 zq-y=Sq>pE{U3w#KPzVajRHgg-rLYlK?2Nf=ZIQ)l(I4HSF^EycXX8Y(znj%Qe1r1O zss5Es^D7vcMv@*sdGUh{ci*WBJLS^m;FisM4u_%pJmmBQ9GjQZUi!`32iFF+V$EV3 zpus-;x(Q+gY-08HgY=V<i+fL($w1a7Uiby(t5uLPbWFBM z6}Bdulhe31G}A}n&P!OSbcupsUxS^bYt?o$M#tX1wDi+e$48Ljmpj-08bN^AT{ZDS zuR0J?fd94A9zp*8AB@fNpUxfB)c>*M2z3=9fD48d9lW1Vdlwxe_t(gLxMl$u3N(Dx z8)Jn8g%tuakkqS%|Eh1s1r%PMnvjIjHu6S z!9{Nuzib??wViYt7#jN7ePt{^B#QoYt+(T0M2X9LK2f{Vce=^8VtyA*K`6V~CJ&5;SE(gocN=3zieh(Ers@x{?TEWgY~Uf6(A6~mBZ=Ch z+QdAh?!FXsMTY93Bc=eeu{gn%xU#%_ws65y`$e$!g_rnn>OBu!{0npl@v9ve)S1a2(M{6}f|VDf&XR z*&DrI&UfLfiV2-Bqg=o(pF7-yLxH9B8Ym)r;1$56fv0IL+nFx*lb(`Oox~4HZTMIc zD8i&aOH~;ICin(Xba2Fj$5hS|QeQP0a1@CV_Fu7xdU*IHj5A=h)$l2)H)Ns>!;Ejd z6;7t_p!vXVV+58)KvAgcejlgq&TO-AOjt=wq$*#1mw^|urlg@{l7!!VEyHbVSaN5O zgd^fU{O-%I6Tm}yvg&tKa`iLM7sWMX&}JutsJ*2q*(sn}`tsYTJi|R$nJ%={WoOo> z@s8=TRL@6x8hnm}!;s;K6#yynADw=xlO_jCsY~rC{x-+S}p)e<+h>sG2w zX`k8GcTo`(;D^_v?U^YnE0VJq3fXYX)YNC^%a0%qTMfSo5l9z4l`hz!KlEq)x6&d< zPi<=aDv5e_3NUBJJIx%NywC5PYR%J&=#v(UnTQ){8PVYcds|6I6q9|f9}X%^7Ge!D zWz_Fa8LWE^X(9)yzu(=`oAWuInGe;2-25pDSp0DPBngY!!-%wPe%sqSW5%5!lfON% zZi=9Krk=>#Y4=c1CtAW^uRh>JoKDu}sLhUu7mdhZcx`?YLou$wPlHm@vzv3VmgbwEnQ>L={K4F0lt+`QvlU zFD;k@q`jYF+k1F#xSWwv z($GX65RCb4oYEM2e?L7!HX7vh5)9D3i1hCS3q^L)2^c||_j>4$ zx@io9HtFe2M)%AZC(7vkrsOAe5VdxJ&P#rwbsN8(3?DjK_XjWLJU2_eiNXN+qCA2F zF4AIhURlv&x(AE-Ne0)E7Z;cvBw(5IzRd#t%+1nPl1LA9u1Bw?5f`f(I`d_D?>}Bw zkfrIu@#(QVjcYmf;)@&v?0cSS3}E$=oi9cvA@9)5(;1gX;rcBE({$8?@94K~+bYEG ztRxwdB6G6Nyrv#y30iSH@AicJzyKDdEfBr;eA}~k@6!{=#foqCrH>&{QeVkk)-<{e z0E?$RpdgQUiG8F*%TA*%)P7Uq#LySrZQyhG67#F5ti$Kmx#+v~r}Pp|W+&T#|MB{9 z88QD{X3Mga&MM1L65vLsv2rU^&k#bo7Q&0P%E~{;EQ-s37H)y^R{%apVUDGD8xG@z z{OkN}PTNf5YYZOa<)#PkEfuATMuCkVCoqYc_jQoW!sMYBq-7f@9I}!e839mDS`(LP ziV*kWD{i?uEuz?`9lwqR>83Pf&qbt?E(USEJAY~!-rfQoU;g&$Re~-CQD-2m`Ap8S zh>uPci!u<)$S2oF*1UF_lPVHI!vU4?ULw;m`{Np^*Pv^Xp|3|dnN$>BG>CNq0hFiX zr$zFjp6lg4Fr6 zGkznLP0Ug#dQ}pTVJvG+-|N_l*={W7UHj!aoaC%G)hkiwb7($scbGg4wpX!nQd5l; z2D^1~$D5^PEI559$_uhIAGbG0TFU9uvuDk^)*(?pWbRYSj&KO$iRZ$uq%xBeRf81k zSBa)5SN6r#|ulU(@-pxYwDZr1WY8y1jyx6C+T%(8ClF$)q;Tp@H4_JL8#`% zaP9|bR;&XcQ;1E^(Nbl2Y9WtV77_j`TC8n z@&|8A)>{$wjl9lTtUn~Qw#Bw>w#7ab5=!6;75i1Y;!|Xm&KvK*%21c~Q|3E!W{u=&E;E(4NqZbek}KuQQP7!9GjK zF!g9dK!&<;$%hWXdlYd4rj8aQ5?Y*_$h4c8b0irFFC6d(B9aWYcLIWub;BQ?>8%@O z(b>#%*YO>cV4jb|YAbnzi>bxT5|}heOHpU zT>5l9H>Fqf`&aQzx%jR%D=-%ApoyXnqWNg5NRA^2J7D0|&KM_bwTqRuFHVzM~G+aLg7?o5Zf{@Ko+D;3=wd0W9h^DMq&+)ATZhFhuwg zxM&5Q-0}z-?7OP7dMae~HhQJwJH^A|=Y{I)teI{E@E~jnIU~UnFk+=m{yP-1snI9L zbNB4j`4S_2qb{m$hfYsG+xXj(4tXo|%#-w%2-iV{q1SMN^U+pL(&qQ1z0=GY1@Y1M znb%O*M8oir2n;`d#|S3OoPmE>v2QX|7sUXwy)GKmD}n2aLqVE3cOuclDS+hy#ycTR zlQ#-=@yRBoZK6!a0s>zO+Ugu#?b%a-#CT%68l*={`IUHgCP*cpebLMxy#KREYlI|T z=lxnF7A@{x9S@l1=yp6O8&h>;M6Dao${XaYl}L>QL~-}EWC2GKB5bg00TIc=B7WGI9SN}9j)awh?@cWzffz{$Mk~D05cSC!>MtOa7 zmjB$4y(jN?I?H}7O8f{Q30r1=XeQztJFHdwinIW-DV2tHSB<9MI)n4+E9$pF)?Fr8@>Q2zv-JluR^(L zE3NpF1NB3h3~(Su;4F+R`*tYNr(fG;w2(%3&aXQ%q1e)KbA5cLK^|ngMhJ4O6BaUx zdS1Egc}hA4uWBaxEo@e({sh(VkZj{_SUVPzZm`<2uxpaPbW1>Myk<;$djUBpmv@4R zEOLQnW*9A_on$wWxI`gmMqkOM7vbJ|LNgr5BfK_muIWpf&VA8l=aPP&JtzH{a^%`V zgE5NMxh{0yj!?)mJF4xoWhIs=*>O$_lWo>=n$gyKHL)zsMuCP)<|Ex z(Tcg;ekD^v+Kh=9oX0fF#fLXEYC3&-h)+&Hj+WN%vkz8(1Fgt#MEh%o1f$)hmDhws zi81Us_~Qd_yuXotF0vG$A=@Hn%De;McF@o6>~1?#qYpXz9z^2&QxAe7{7aw-&Y#i; zge5bnc0X4o&4_~@iC2gV^`IAQM{)2t!{YX_KlzQwO&#}PjS?VdUGZVIuu~F7>AT8) z##Up_^l$qWokK%Sy?vq$ldal}%lRYKJW`S_r~NL^>97|c3YG9IS|6dqkxCVOUHQflPS2@XFr~6Y+9utpi2UE^Aj7j zA&TbbN+;B@njUadLd`!86tql(>Wq1 zzRr&c&7%9{JB_GL!-O45D?FHci4!Bb(lmx4*)=uralBSsY0@?}8;~8ol%IDY3Jgd$ zfjUlze|ekeeiDimD^z+{Q+rGLs9QB!U;MipAz>wyFsANc0?9B5KI8Uj^WC5i3fxJ; zmbpl`+rXSKfW+}E^`g7tx+E<7O~#f$a*2UP2~c>FF??FX1fDFrn5|(d7=~Pu+28vB z$P^A6g8O`*sZ>z-{UmSA2()OLft;Bg=Z4#wsKA9W% zxr(Ny0?|i8-1txSAU9akBFBZ-QPrH7aA9IX(5k;tw%9AkyhzgvZoY>L-n48KK4D{> zp@b?iq4&w3Ez}7<>TX1}r_3`f+6jKnqyvO*UVyHcA}n0~BM(Zf3F(+Rn{j=S2&A?j zd;8Pkw)^5B`7>_(9C2NSC`+8tPuRdsH^gS~%uFzWAaR1uyH})T9NKONYh*|I?4J;NjxqcRHpp1o~>ADZisUL`c(fG)`7Mz35(?4r%ErDCWb3Fw-PL_w{fq9r?IS z$wLBHyx+EMkPyP-TIM|q%9sL)O1T3W`ZJ^scjoWEEo0>wGY?IVBX-!9Wypzm+(ml{ zo2R`P#rsrG@@_gzIJAQfmTw;a#GQ!xIG=dDPS1a7)Q#kwH(x~hhq@9%P^Md^1Iw;s z&-6fEQ(n9!J0F^jn~^wL9J7A(lc0hSG!j6=A;;y{5gFJ0(M}w|^2VSKSxdsWZ*cD6 zu}?rPyDP#R!NVii#yI5_j$oJ%h21d(*S}Ldt>YxbBT{P3OqU$|!K?f{w3K$6iHIxT z2N&l$eP7Gc2YK6pT}tnf6CeOq&O0G`_UM#>aN=8{twSS=coL%|*lB{GHqz-e*%OI% zignT~XO1T5yyEOeQ`L0WDa38#w;aOW||$14{N48&_*p6qI5#uZkC>Ng+l- zvcCi+(7%_aB<|o>lmHzg_(kh@q`?-}&eRiK585t&OTj>f ztC}U4Z0_^vWlJ-?8-qXx-a=19C|D&*3a95Dv-6_)waM9!8g{&EiZ?SZB{ZT=nQ!SS z3iXj=zwbPNe(a8G2@7J@vm!VTaW=Xjf+rn@b~GmM^-}3ni!X-e?mo^H_d8ASioyh+ z3lfd)5KM(W0)JXP-|Psl{qBlSW7bkfz@?haUuT#c`Z&v}^_xMdEa}t^(-cVgxjq|9 z<%Ag0B)Y8)Crv&ms@97LZ(x!Wxq6?`b3JDv`GCr9{$d^|-XM?QYjXTV$k`=y9`LqH z(8&Q@P$x?#bs`t)6^WtF={TJxGgupL?v@L%S;Yxz*>@5+fr=u3$hme^04r=!Em z+62;dnBnM-8l&eiX;GYJ%XDNMaU zR1*?sl*qPOPY6YpI=uuLj>?4D$W!50yUy8Uw5na_s@YxV_fibTIorZ!I!ciM=1al4 zd6ZQ9)W6*WyieOWKO$~vTbdMs;f^s~2kfRgrvU592+_Lz50<*M> z8x%c4x%#0`!`S|`j1~1w$f~n#Kl{`M_i?aE*SY*5;q_;(BqGZZcAyEzr`BT>yU=5wzD`ZqjrvIou6DcI_!^HirzfNbs!< zX3xTp>qQP?j*BA55?N0Kwp#db)flKZop{#?`0Gt%#m(_6H<)<=BT@NWuF zMjdXj{mK4DsD3sXF837w65yjYLgd3%3a!Ph>N zbeKpGvV`hG@K}Nu9P;;$y9(!`JB4cBSMx^N$0p1hD2l(m?d_C*EO<_P8OjBRai$Bk z$v;I4w;x8amQC|t=*^!<7tIGGNN_PEp;-1|ZNa8*GwPUV2|W^V->V)(*(gZ%b9 zMvYmZgUK+1r!SuR-fXptKCF1SMMl51@}&BjZZOhOl4c~SE7LS?BC(b4la%Q;#-*`a zdtl89#L&fW3YXxhO>pAf(XEx=b(dwie=>}$v8*|(fgO-zOeE|MWA6ps^jEbl-$|1Q z_tj@!8>mqh=|2k7g<|y$(SS1=sFFFK>IL1jEL5Wb^F4S~_F4Hg z*E*_(8I@J)vBZC3|3c?IVc2o7a?km_vKBQdW&gwT1h)-%hlQlClw(7=;q@p^4NCS7 zP^16HHM*|DTyc8*-Pxl$y>Lv2AJ5&4zKI{MJt)2jzcbg|YJpu38a|F`fr2Qe<1ek@ zg09~54KN0hcT4rSzKoeVyRK-=F)gR}}$k;i4pjwN1cuoTS~Zze zS1g94A9WqRrad*Bf4o_?cUAF21phTKzTO;VUmf zO}F7PiqD2Xcb8dz{1{*fUbYA4T0>*V-lM<(Yl2(+ z+;>f=43})}W+!CSkJY3qnm=0>){V$D@oc}>*0Xd@50;MOOAT*;E-rboX^|>Tr}jx} z7zL2vp=6r23O`%QkY<}zMeRjxnpfclPg+5V`sWcQSB0yMcEi!+9%_>7p~c}&CtbH zcjTO$;S-f?zox$EI@pZmMAYm|HxnL(CLil>nx*kcpR&ausDhPH-D<4oVc!>DLNc9R zwgM@4_J%83ia+lt>`SQnEzf@+a82Q1966szhqWce*kxCT*BefH)6YFC2q*kMyuD{w z6KmW4O8_DCP^3r;U6hU>y$h&RvCyO=AiV{U-a)z`MFJ>@Sm+?Vh29Yq2n6X>dhf7r zp0(EdtpA7i`0xE?d+;G9lY1tUxhFH%dH&AJ+4%G6J*rAJ2*qtreqZ#>MaOSZx;3Qo ziCsW8tki5L-*ZdbVn&H!8|$w}4pfUZY{qR+YA0cFb3lSn+yw6A5ARZD%TV9bo@iJ< z8=>gkEzKNq7zpbZ$DHAT0fhf0T1Na^;WX=7H6AAWTffBZM0CErov8nlfwPXINP~p( z4 zn)k&?jlW~`3;ABX#hNZ`BA2jfWt?$&qir%y>SaCitB;+o`iXVMzS=uc-ze!t%dbbU z);sTXN#UXELP&0t%!N7Gd}%`}q`#y7lWs?0*5QJ*SaTK*g_ z|6Ve6X|m2&JK?9+kUq(>sge!TvDGPfo{^aH)7pD7bmRoNyF2o5JSAO!V8HZ6(d1Ld zj>|p^h0+3pwITk0zKHpONz`=x)8HVe=?}-_T(v28Iva24=b)OaGLY)nIADzA8R%h( zP8IE7DjNN1WIHlI&G($CVO88A>^rTHc#{2gPku{Y|952^&X8)hGg+Gh1=}BvKBbLs z=~#5YdE%JB_H5vsHzsz}(8~R?BC$Zf;?7y4RQ1NWkp5!tdyQvFe{c^-~km>^!$SqW+-qq<((&z#zpr0s0SW zk$^Q8kELg;v&d6^`Rq&0cjj$_7jk|Z;k@~?1J7HQf{i{q8oS?MlDW$$Hi+>5TJc-2 zAnN&!%|prgwiD62Xb}wSPG9yw5^j$(;Tv%I?vy~Mx&pS?pX2e@`5H^w{k-Q z;<7M2vpah~F@M|d)F6GAUv=a*^GN!5T`2FnJA?1obDw{|*m-8_^~Xlku@!2NyjHn= zfv;;j!aGoNX*y^7OE-mJQ1SL($2D+5JQDM5=+N6dH}iPhce~|XMnu?i;GOerAAnvm zpX-}{`)y^n)1J>DIelC+;x{kxVMngd0kInA#i5BWWjruW+GFr^0|cSRb&Duc<08}6 zF2Q%d+mrghC}?<-0Jl?iv>tN%@-&o^OaC|HC6f^4bB96`>5Uq$pCjD72Kx0G7yN3) zn|>V`Bgf+aDJD}Y54tB)89mVr5lyM6ZAY@ zVh~SH8$HT7?$?ec&oa>cbNE@*-fB7F>~dN=SIgKs&fCaQc){lQy5olAOdsb6$S9|m zb!}KTJhrM`2#vL064sOO1}7z24Wvy}zMyg822X#I_DXD+~}Jv+)TfUANNkm+k}f zT3lnVr658aX+%P!2;b~a_2;W{-oi7sje8F{zr>Y_wtNb4x8-!~uDQS*Jk9;Bbt8t6u&MtrcV&g?PZ-z+EJ0`c! z?gdWYNW50AuO9Z6iLTWj+MAt+RlHgm+VUMuckF}47cSgJPZv+Rir&$4RQUa>;^j7L z`bdeZ(5Qv1LBa&Mk)PS{=EA(KMDaJitK6vdTIGA7q^?134}Lwa948#WP9jRp zY;jX!TzvCxrK^m!Lonw+ce)cJuBy(rDGwi^4i+voHD)oJ7oTvyv`ybX&|p<=3gQ6n zs9ObVRd;U~>}LYy{w{ma{O4!%V|kG`x%1CnCUSm|JqQsQ^Pa+{{9%Pyxlu}fp5@0` zWZ#hy?={S)D++3yRl6HobdaIr8v5N4$qS{`^CrdBk@UL*HB){nFb18(yLKXI%gWwT zV@26U<*t)R?Rg&GQx@*FlhN0*PvCfv{wU}P2RXfcw;?z~*R_KFl(EBSMUDEE1`d67oF0hFi>H#uh5LF| z28Z*fFE0-^yXxXrTS`Z)-j+~vA>TZ!5V4LQK3?@V_$J&>hT`N4xH{jR*P=?-Up zmd6o|t+RAm* z^Ot+WYpOv|wDkK&Q98}Dfa0ub#qja>x1PKi-Ik$SbS3sZluj3cZ|+xDZ-3mopIEST zPNv&2AM?cg>l30W!8E@IJIUX;dHwp3KeM|M3sQ=n?dR3)zY)zR(2Exx$#Jnv7rvtz zqU|tz+v^(tYHXpth~w{%U?!~mb+K_}32W;MVm~hty^PVl2=*@0%Ub_^3_Qd$T7r@)q zWS9BNVs&)@KS;2U61BRtSHrW&>1v4TY_QvVMPFO^cXY$m0pjj5R%%(ndfZ2{ANoH} zJ0w)!tog^z_3!JXe|y3HW+|?mVE?|X`g@T7#Wq&84uxHoNQV5^f%Z4hARhqCr|mAT zu796g0P4Ua@;|<~pm^mk1o7W(N56Vpx&E&H{tueruc!XwO8pnj@DJ?}kCpIm^x?k? z|2@=|Q9J-^CIzMveZv-X#ja?;3D<25R3s{Pl-ZRbnrEr7FSC*djvN$2)FYSL454* zH}=5OEIR7q;_|x9!ZKabWAepyIFUhR2_3VKg|N&?D>Zx8L!95W9+g&^UYvVRq6N*{ z(N`W!nK(wt5nw>6w{I?f;|uK7dW)CZIm%-IoidoNRd2g8l=JGB-*oc=U0Vt?G9+?c zm<;Hzh+Jl1)P6cz_)f%D|NLa%^4>L5`u4A_;eJ~vd{NJ>X_7*K);u~rSuL`kZH@G| zPH#M3r1!q^cE5dQM3DcqV4Pa|Vr{H!J&M1fSlo5d?#XDW<5a`b?=PSH{uP9)x{a$k z%8pZd#UJpK^MZ?yeB_<3c0=C`lC!0Y5&ueQ%8lzXaoipS1rxo>2aDjMgAsu?l{O!% zayFM-Of_#trUJLSJ}^F1{DG9rjT-xZm)xjg+w})2V+DY^?%Frho%Njp``{@+h80p| z0kMc!c>ByDd3PCIlJgtbb`0!gFM<616o~5uh0ism_mi%iKc(40#Uwb!uKUB!3~CYU zqE#EcX~OHBY;olP(7Rx<&k(iOFCOM^Jad6g9KSyW{_bL6To8kPq+fq_RCM~VgB<!?Gz2^1GpuhL!gQ_=l;n85rlvO+pL!!p8MbDl z_`}xCgN?yqq-GKJrjYRZE!-S8faio$2n-a)N1FP7e>q&bTGTknSGy)eFXIDt*93qy zQB4#J{i0|);E;dIt<&BweQ0<^5eGroCH5y=2d?3S31(-M#~e8M-JSHzQGXz$5j*8~ z+P6`++Yj@tJ(`UoN}|)I0OrNu-ph}*D>$W!%)Wct%RO9~o~%4M=bMd}et`$|yZw^# zaL9wuo6ffA;t#)_T1XI+UQ407cowoSW*?PPJW__L$!ZV=bC)5@g>3`{DKl#HJ6|iT z-5|90-y2jR5=*%u@-oEr!0*Z=dz9(-K{K3~?v0)Y$X5A)#3BY_KEpQv*dS&jxx!>< z0R-1x!m8?2vqv}IaO)*Zz@!PQb|Kk7p|-1Of8)2Lk7gwEp@L7t6|T4LWR*;vUaS~S ziU2DLKLEmY=htUNnbiYVF0&tv$U^|DzIAS8_B%4IQYK}X0u7)X0b5OU364zh2$zcb zD_nR~9TqZ#f50fKz{ygPg{HAP#UYc5FCl=!)(8Uc*tK1mo9v>9D7veP2LO^l3SqTd z0OV{EU6Z*m42HHiqqvv@P6?tOnB);oDUo3DF4!OvI*)Pe;_xHvHJPbF&Naa-X><@H zYRU9jF$(R^Y@)NMMqjLmWD|`NmF&cGW;#+`<7`+e>0s(P(&(qTjDR`I#$>g`4mzU! z@fThKvwP=wBXA8~3wnNpcZO>reU=?;Lb|khdJed%kzMt*L`y@(Li%BxP{?Kfaj^`l z#jTo}j_TyC`)3EIz)&%_tTW)N17@nD>0s31w84s^kG0(rV01ph^3}7^IsA>?c#N-< zGN&W1sWw3Ae3lbL|CHWtso{Y5y0+6wRAJthQ|)*-=5U`Ml*@t<6TP-;NK!h9Lre`%v20&)z%$fr8+%I4>l5w>={BHj1$ z{1DY--b*GvA8(>cu3CP$)k0PY7}}ThuFV20NltQNct~9kthSbdISIA=uDzk zxLdGJEREJK?gKusI!3O8a}a7!aJt=k6a4Ockaf;4sz1e;flB}f_@lG6YfSJ69C}$j$$Y!62l_Y9Na9flt)1O2vXW*bbfb}?hfOu`? zE(5M_;OCYVxC>UU6;vBZr4cW)klBgHAg%#P5CCA6Q^tVAYCas>2LDiR&8@n_T7`## z5qKXhZ`R8>4U!>=mf~>mC-5UQSlNteb>tT3m zw(rqBJDQ4N9BYQC_ms0F2_gJ!V)$F+R$0CX>rLRY4wlaKmtIz>rdw+D+b%NXqG5@s z#vv7hqc!^JYSr{~r79xi)3i+!cXjUkowUg=k-dG8m{*Ea3DV%7184)P(zGJyNez1u2mZ!?+5LJ=sTor zOeU4|)!K{tt`=sSB2`wNj60WlJK&!RBo66Ens8 z!-P7FKvo9sM(gYv5{+~WRx7@)T#yhBICQ@}9`L8`d`WKV(h=^8l5ev#w#y<>T9Yc9 zeQ$hz;;OMNmxaPxk6?4!mX3CfN^v%>Vq2(rqrEK;IlK`}Dfh9rEsY4aLBHX?c8!#d z>kl2}S_iXq*Av(UPgA3b4)o(R4(;Pt7E{iPX;xuYR07c0bwNb1{2iGr6c;4)=(x?V zIt%qFaX&&{s|AOO*n#}6QEcdQ_sd{L)Av1RWVniUS-+pfS98S&lDT>l9jU=Og$IZ~ znWy8zWF|F2$b&aM`8ZJ&CwR4C)`|he3?JH-++GAt!E}z4cc>e zEHU^nlb&Q;%)KN3xC7VpAuTC-E&o2&-t5N|OfvdM)HwxQK!p?P6njz1AltF$LpgG2 z*9f<(#I|T4idW}FJs9tp-$mgwW=6#FaOie<0N>PvvavgfIEKPq$mU5luTm&2me3K$ zt{feu9J>W2TuDNzlqxvl7hr*qd|yf+;se5ViV z4wF&Pst(;W0>#Qg-x7EBeoPa?k9%vnkZ$NwUUID79lH zUSevQQoxC58f0R4p-<&%->F~Vy*Co(es<9TnSJd13))lV2xuiC>=2ar0UU!xogT>B zQZbh`>%zN6g9uxCH$eP#uJpN3@x>dm?1dE*@<8_PR|+NqW3mTv){Xf0eVQc?-bO

            X_y!bHu(OHjCVhDpg)X6 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 g_paCZ+5!QJ8I-o5uZ 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

            *eHX(Ei?vpE8-@84D4arlM>T43-ep*$9 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 a+xjNQMbWyn_$I(kI`=j7OtVYacmD#BEs2%@ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/menu-icon.svg b/wp-content/plugins/wp-mail-smtp/assets/images/menu-icon.svg new file mode 100644 index 0000000..a646b1a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/menu-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg new file mode 100644 index 0000000..0cdc80e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg new file mode 100644 index 0000000..756c3c3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg new file mode 100644 index 0000000..566c4da --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg new file mode 100644 index 0000000..a26688b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost-smtp.png b/wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost-smtp.png new file mode 100644 index 0000000000000000000000000000000000000000..6f67bcda68afd5887bd2f2486d7a1d89f79c27bc GIT binary patch literal 3236 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 Hts?#p9fcU; literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg new file mode 100644 index 0000000..415c3b4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg new file mode 100644 index 0000000..a0693d8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendinblue.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendinblue.svg new file mode 100644 index 0000000..7bfa3e7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendinblue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg new file mode 100644 index 0000000..acde0ef --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg b/wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg new file mode 100644 index 0000000..de58b1f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.js b/wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.js new file mode 100644 index 0000000..993aa94 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.js @@ -0,0 +1,388 @@ +/** +* jquery-match-height 0.7.2 by @liabru +* http://brm.io/jquery-match-height/ +* License: MIT +*/ + +;(function(factory) { // eslint-disable-line no-extra-semi + 'use strict'; + if (typeof define === 'function' && define.amd) { + // AMD + define(['jquery'], factory); + } else if (typeof module !== 'undefined' && module.exports) { + // CommonJS + module.exports = factory(require('jquery')); + } else { + // Global + factory(jQuery); + } +})(function($) { + /* + * internal + */ + + var _previousResizeWidth = -1, + _updateTimeout = -1; + + /* + * _parse + * value parse utility function + */ + + var _parse = function(value) { + // parse value and convert NaN to 0 + return parseFloat(value) || 0; + }; + + /* + * _rows + * utility function returns array of jQuery selections representing each row + * (as displayed after float wrapping applied by browser) + */ + + var _rows = function(elements) { + var tolerance = 1, + $elements = $(elements), + lastTop = null, + rows = []; + + // group elements by their top position + $elements.each(function(){ + var $that = $(this), + top = $that.offset().top - _parse($that.css('margin-top')), + lastRow = rows.length > 0 ? rows[rows.length - 1] : null; + + if (lastRow === null) { + // first item on the row, so just push it + rows.push($that); + } else { + // if the row top is the same, add to the row group + if (Math.floor(Math.abs(lastTop - top)) <= tolerance) { + rows[rows.length - 1] = lastRow.add($that); + } else { + // otherwise start a new row group + rows.push($that); + } + } + + // keep track of the last row top + lastTop = top; + }); + + return rows; + }; + + /* + * _parseOptions + * handle plugin options + */ + + var _parseOptions = function(options) { + var opts = { + byRow: true, + property: 'height', + target: null, + remove: false + }; + + if (typeof options === 'object') { + return $.extend(opts, options); + } + + if (typeof options === 'boolean') { + opts.byRow = options; + } else if (options === 'remove') { + opts.remove = true; + } + + return opts; + }; + + /* + * matchHeight + * plugin definition + */ + + var matchHeight = $.fn.matchHeight = function(options) { + var opts = _parseOptions(options); + + // handle remove + if (opts.remove) { + var that = this; + + // remove fixed height from all selected elements + this.css(opts.property, ''); + + // remove selected elements from all groups + $.each(matchHeight._groups, function(key, group) { + group.elements = group.elements.not(that); + }); + + // TODO: cleanup empty groups + + return this; + } + + if (this.length <= 1 && !opts.target) { + return this; + } + + // keep track of this group so we can re-apply later on load and resize events + matchHeight._groups.push({ + elements: this, + options: opts + }); + + // match each element's height to the tallest element in the selection + matchHeight._apply(this, opts); + + return this; + }; + + /* + * plugin global options + */ + + matchHeight.version = '0.7.2'; + matchHeight._groups = []; + matchHeight._throttle = 80; + matchHeight._maintainScroll = false; + matchHeight._beforeUpdate = null; + matchHeight._afterUpdate = null; + matchHeight._rows = _rows; + matchHeight._parse = _parse; + matchHeight._parseOptions = _parseOptions; + + /* + * matchHeight._apply + * apply matchHeight to given elements + */ + + matchHeight._apply = function(elements, options) { + var opts = _parseOptions(options), + $elements = $(elements), + rows = [$elements]; + + // take note of scroll position + var scrollTop = $(window).scrollTop(), + htmlHeight = $('html').outerHeight(true); + + // get hidden parents + var $hiddenParents = $elements.parents().filter(':hidden'); + + // cache the original inline style + $hiddenParents.each(function() { + var $that = $(this); + $that.data('style-cache', $that.attr('style')); + }); + + // temporarily must force hidden parents visible + $hiddenParents.css('display', 'block'); + + // get rows if using byRow, otherwise assume one row + if (opts.byRow && !opts.target) { + + // must first force an arbitrary equal height so floating elements break evenly + $elements.each(function() { + var $that = $(this), + display = $that.css('display'); + + // temporarily force a usable display value + if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') { + display = 'block'; + } + + // cache the original inline style + $that.data('style-cache', $that.attr('style')); + + $that.css({ + 'display': display, + 'padding-top': '0', + 'padding-bottom': '0', + 'margin-top': '0', + 'margin-bottom': '0', + 'border-top-width': '0', + 'border-bottom-width': '0', + 'height': '100px', + 'overflow': 'hidden' + }); + }); + + // get the array of rows (based on element top position) + rows = _rows($elements); + + // revert original inline styles + $elements.each(function() { + var $that = $(this); + $that.attr('style', $that.data('style-cache') || ''); + }); + } + + $.each(rows, function(key, row) { + var $row = $(row), + targetHeight = 0; + + if (!opts.target) { + // skip apply to rows with only one item + if (opts.byRow && $row.length <= 1) { + $row.css(opts.property, ''); + return; + } + + // iterate the row and find the max height + $row.each(function(){ + var $that = $(this), + style = $that.attr('style'), + display = $that.css('display'); + + // temporarily force a usable display value + if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') { + display = 'block'; + } + + // ensure we get the correct actual height (and not a previously set height value) + var css = { 'display': display }; + css[opts.property] = ''; + $that.css(css); + + // find the max height (including padding, but not margin) + if ($that.outerHeight(false) > targetHeight) { + targetHeight = $that.outerHeight(false); + } + + // revert styles + if (style) { + $that.attr('style', style); + } else { + $that.css('display', ''); + } + }); + } else { + // if target set, use the height of the target element + targetHeight = opts.target.outerHeight(false); + } + + // iterate the row and apply the height to all elements + $row.each(function(){ + var $that = $(this), + verticalPadding = 0; + + // don't apply to a target + if (opts.target && $that.is(opts.target)) { + return; + } + + // handle padding and border correctly (required when not using border-box) + if ($that.css('box-sizing') !== 'border-box') { + verticalPadding += _parse($that.css('border-top-width')) + _parse($that.css('border-bottom-width')); + verticalPadding += _parse($that.css('padding-top')) + _parse($that.css('padding-bottom')); + } + + // set the height (accounting for padding and border) + $that.css(opts.property, (targetHeight - verticalPadding) + 'px'); + }); + }); + + // revert hidden parents + $hiddenParents.each(function() { + var $that = $(this); + $that.attr('style', $that.data('style-cache') || null); + }); + + // restore scroll position if enabled + if (matchHeight._maintainScroll) { + $(window).scrollTop((scrollTop / htmlHeight) * $('html').outerHeight(true)); + } + + return this; + }; + + /* + * matchHeight._applyDataApi + * applies matchHeight to all elements with a data-match-height attribute + */ + + matchHeight._applyDataApi = function() { + var groups = {}; + + // generate groups by their groupId set by elements using data-match-height + $('[data-match-height], [data-mh]').each(function() { + var $this = $(this), + groupId = $this.attr('data-mh') || $this.attr('data-match-height'); + + if (groupId in groups) { + groups[groupId] = groups[groupId].add($this); + } else { + groups[groupId] = $this; + } + }); + + // apply matchHeight to each group + $.each(groups, function() { + this.matchHeight(true); + }); + }; + + /* + * matchHeight._update + * updates matchHeight on all current groups with their correct options + */ + + var _update = function(event) { + if (matchHeight._beforeUpdate) { + matchHeight._beforeUpdate(event, matchHeight._groups); + } + + $.each(matchHeight._groups, function() { + matchHeight._apply(this.elements, this.options); + }); + + if (matchHeight._afterUpdate) { + matchHeight._afterUpdate(event, matchHeight._groups); + } + }; + + matchHeight._update = function(throttle, event) { + // prevent update if fired from a resize event + // where the viewport width hasn't actually changed + // fixes an event looping bug in IE8 + if (event && event.type === 'resize') { + var windowWidth = $(window).width(); + if (windowWidth === _previousResizeWidth) { + return; + } + _previousResizeWidth = windowWidth; + } + + // throttle updates + if (!throttle) { + _update(event); + } else if (_updateTimeout === -1) { + _updateTimeout = setTimeout(function() { + _update(event); + _updateTimeout = -1; + }, matchHeight._throttle); + } + }; + + /* + * bind events + */ + + // apply on DOM ready event + $(matchHeight._applyDataApi); + + // use on or bind where supported + var on = $.fn.on ? 'on' : 'bind'; + + // update heights on load and resize events + $(window)[on]('load', function(event) { + matchHeight._update(false, event); + }); + + // throttled update heights on resize events + $(window)[on]('resize orientationchange', function(event) { + matchHeight._update(true, event); + }); + +}); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.min.js new file mode 100644 index 0000000..ed8b0a6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/jquery.matchHeight.min.js @@ -0,0 +1 @@ +!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):t(jQuery)}(function(l){function h(t){return parseFloat(t)||0}function c(t){var e=l(t),n=null,a=[];return e.each(function(){var t=l(this),e=t.offset().top-h(t.css("margin-top")),o=0a&&(a=t.outerHeight(!1)),e?t.attr("style",e):t.css("display","")})}o.each(function(){var t=l(this),e=0;i.target&&t.is(i.target)||("border-box"!==t.css("box-sizing")&&(e+=h(t.css("border-top-width"))+h(t.css("border-bottom-width")),e+=h(t.css("padding-top"))+h(t.css("padding-bottom"))),t.css(i.property,a-e+"px"))})}),s.each(function(){var t=l(this);t.attr("style",t.data("style-cache")||null)}),u._maintainScroll&&l(window).scrollTop(a/r*l("html").outerHeight(!0)),this},u._applyDataApi=function(){var o={};l("[data-match-height], [data-mh]").each(function(){var t=l(this),e=t.attr("data-mh")||t.attr("data-match-height");o[e]=e in o?o[e].add(t):t}),l.each(o,function(){this.matchHeight(!0)})};function i(t){u._beforeUpdate&&u._beforeUpdate(t,u._groups),l.each(u._groups,function(){u._apply(this.elements,this.options)}),u._afterUpdate&&u._afterUpdate(t,u._groups)}u._update=function(t,e){if(e&&"resize"===e.type){var o=l(window).width();if(o===n)return;n=o}t?-1===a&&(a=setTimeout(function(){i(e),a=-1},u._throttle)):i(e)},l(u._applyDataApi);var t=l.fn.on?"on":"bind";l(window)[t]("load",function(t){u._update(!1,t)}),l(window)[t]("resize orientationchange",function(t){u._update(!0,t)})}); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.js new file mode 100644 index 0000000..f1e12d4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.js @@ -0,0 +1,190 @@ +/* global WPMailSMTP, jQuery, wp_mail_smtp_about */ + +var WPMailSMTP = window.WPMailSMTP || {}; +WPMailSMTP.Admin = WPMailSMTP.Admin || {}; + +/** + * WP Mail SMTP Admin area About module. + * + * @since 1.5.0 + */ +WPMailSMTP.Admin.About = WPMailSMTP.Admin.About || (function ( document, window, $ ) { + + 'use strict'; + + /** + * Private functions and properties. + * + * @since 1.5.0 + * + * @type {Object} + */ + var __private = {}; + + /** + * Public functions and properties. + * + * @since 1.5.0 + * + * @type {Object} + */ + var app = { + + /** + * Start the engine. DOM is not ready yet, use only to init something. + * + * @since 1.5.0 + */ + init: function () { + + // Do that when DOM is ready. + $( document ).ready( app.ready ); + }, + + /** + * DOM is fully loaded. + * + * @since 1.5.0 + */ + ready: function () { + + app.pageHolder = $( '.wp-mail-smtp-page-about' ); + + app.bindActions(); + + $( '.wp-mail-smtp-page' ).trigger( 'WPMailSMTP.Admin.About.ready' ); + }, + + /** + * Process all generic actions/events, mostly custom that were fired by our API. + * + * @since 1.5.0 + */ + bindActions: function () { + + /* + * Make plugins description the same height. + */ + jQuery('.wp-mail-smtp-admin-about-plugins .plugin-item .details').matchHeight(); + + /* + * Install/Active the plugins. + */ + $( document ).on( 'click', '.wp-mail-smtp-admin-about-plugins .plugin-item .action-button .button', function( e ) { + e.preventDefault(); + + var $btn = $( this ); + + if ( $btn.hasClass( 'disabled' ) || $btn.hasClass( 'loading' ) ) { + return false; + } + + var $plugin = $btn.closest( '.plugin-item' ), + plugin = $btn.attr( 'data-plugin' ), + task, + cssClass, + statusText, + buttonText, + errorText, + successText; + + $btn.addClass( 'loading disabled' ); + $btn.text( wp_mail_smtp_about.plugin_processing ); + + if ( $btn.hasClass( 'status-inactive' ) ) { + // Activate. + task = 'about_plugin_activate'; + cssClass = 'status-active button button-secondary disabled'; + statusText = wp_mail_smtp_about.plugin_active; + buttonText = wp_mail_smtp_about.plugin_activated; + errorText = wp_mail_smtp_about.plugin_activate; + + } else if ( $btn.hasClass( 'status-download' ) ) { + // Install & Activate. + task = 'about_plugin_install'; + cssClass = 'status-active button disabled'; + statusText = wp_mail_smtp_about.plugin_active; + buttonText = wp_mail_smtp_about.plugin_activated; + errorText = wp_mail_smtp_about.plugin_activate; + + } else { + return; + } + + // Setup ajax POST data. + var data = { + action: 'wp_mail_smtp_ajax', + task: task, + nonce : wp_mail_smtp_about.nonce, + plugin: plugin + }; + + $.post( wp_mail_smtp_about.ajax_url, data, function( res ) { + var is_install_successful; + + if ( res.success ) { + is_install_successful = true; + if ( 'about_plugin_install' === task ) { + $btn.attr( 'data-plugin', res.data.basename ); + successText = res.data.msg; + if ( ! res.data.is_activated ) { + cssClass = 'button'; + statusText = wp_mail_smtp_about.plugin_inactive; + buttonText = wp_mail_smtp_about.plugin_activate; + } + } else { + successText = res.data; + } + $plugin.find( '.actions' ).append( '

            ' ); + $plugin.find( 'span.status-label' ) + .removeClass( 'status-active status-inactive status-download' ) + .addClass( cssClass ) + .removeClass( 'button button-primary button-secondary disabled' ) + .text( statusText ); + $btn + .removeClass( 'status-active status-inactive status-download' ) + .removeClass( 'button button-primary button-secondary disabled' ) + .addClass( cssClass ).html( buttonText ); + } else { + is_install_successful = false; + + if ( + res.hasOwnProperty( 'data' ) && + res.data.hasOwnProperty( 0 ) && + res.data[ 0 ].hasOwnProperty( 'code' ) && + res.data[ 0 ].code === 'download_failed' + ) { + // Specific server-returned error. + $plugin.find( '.actions' ).append( '
            ' + wp_mail_smtp_about.plugin_install_error + '
            ' ); + } + else { + // Generic error. + $plugin.find( '.actions' ).append( '
            ' + res.data + '
            ' ); + } + + $btn.html( wp_mail_smtp_about.plugin_download_btn ); + } + + if ( ! is_install_successful ) { + $btn.removeClass( 'disabled' ); + } + $btn.removeClass( 'loading' ); + + // Automatically clear plugin messages after 3 seconds. + setTimeout( function () { + $( '.plugin-item .msg' ).remove(); + }, 3000 ); + + }).fail( function( xhr ) { + console.log( xhr.responseText ); + }); + }); + } + }; + + // Provide access to public functions/properties. + return app; +})( document, window, jQuery ); + +// Initialize. +WPMailSMTP.Admin.About.init(); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js new file mode 100644 index 0000000..611e373 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js @@ -0,0 +1 @@ +var WPMailSMTP=window.WPMailSMTP||{};WPMailSMTP.Admin=WPMailSMTP.Admin||{},WPMailSMTP.Admin.About=WPMailSMTP.Admin.About||function(a,t,p){"use strict";var i={init:function(){p(a).ready(i.ready)},ready:function(){i.pageHolder=p(".wp-mail-smtp-page-about"),i.bindActions(),p(".wp-mail-smtp-page").trigger("WPMailSMTP.Admin.About.ready")},bindActions:function(){jQuery(".wp-mail-smtp-admin-about-plugins .plugin-item .details").matchHeight(),p(a).on("click",".wp-mail-smtp-admin-about-plugins .plugin-item .action-button .button",function(a){a.preventDefault();var i=p(this);if(i.hasClass("disabled")||i.hasClass("loading"))return!1;var s,n,l,e,o,u=i.closest(".plugin-item"),t=i.attr("data-plugin");if(i.addClass("loading disabled"),i.text(wp_mail_smtp_about.plugin_processing),i.hasClass("status-inactive"))s="about_plugin_activate",n="status-active button button-secondary disabled",l=wp_mail_smtp_about.plugin_active,e=wp_mail_smtp_about.plugin_activated,wp_mail_smtp_about.plugin_activate;else{if(!i.hasClass("status-download"))return;s="about_plugin_install",n="status-active button disabled",l=wp_mail_smtp_about.plugin_active,e=wp_mail_smtp_about.plugin_activated,wp_mail_smtp_about.plugin_activate}var d={action:"wp_mail_smtp_ajax",task:s,nonce:wp_mail_smtp_about.nonce,plugin:t};p.post(wp_mail_smtp_about.ajax_url,d,function(a){var t;a.success?(t=!0,"about_plugin_install"===s?(i.attr("data-plugin",a.data.basename),o=a.data.msg,a.data.is_activated||(n="button",l=wp_mail_smtp_about.plugin_inactive,e=wp_mail_smtp_about.plugin_activate)):o=a.data,u.find(".actions").append('
            '+o+"
            "),u.find("span.status-label").removeClass("status-active status-inactive status-download").addClass(n).removeClass("button button-primary button-secondary disabled").text(l),i.removeClass("status-active status-inactive status-download").removeClass("button button-primary button-secondary disabled").addClass(n).html(e)):(t=!1,a.hasOwnProperty("data")&&a.data.hasOwnProperty(0)&&a.data[0].hasOwnProperty("code")&&"download_failed"===a.data[0].code?u.find(".actions").append('
            '+wp_mail_smtp_about.plugin_install_error+"
            "):u.find(".actions").append('
            '+a.data+"
            "),i.html(wp_mail_smtp_about.plugin_download_btn)),t||i.removeClass("disabled"),i.removeClass("loading"),setTimeout(function(){p(".plugin-item .msg").remove()},3e3)}).fail(function(a){console.log(a.responseText)})})}};return i}(document,window,jQuery),WPMailSMTP.Admin.About.init(); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js new file mode 100644 index 0000000..b9ecb0a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js @@ -0,0 +1,282 @@ +/* globals jQuery, wp_mail_smtp */ +var WPMailSMTP = window.WPMailSMTP || {}; +WPMailSMTP.Admin = WPMailSMTP.Admin || {}; + +/** + * WP Mail SMTP Admin area module. + * + * @since 1.6.0 + */ +WPMailSMTP.Admin.Settings = WPMailSMTP.Admin.Settings || (function ( document, window, $ ) { + + 'use strict'; + + /** + * Private functions and properties. + * + * @since 1.6.0 + * + * @type {Object} + */ + var __private = {}; + + /** + * Public functions and properties. + * + * @since 1.6.0 + * + * @type {Object} + */ + var app = { + /** + * State attribute showing if one of the plugin settings + * changed and was not yet saved. + * + * @since {VERSION} + * + * @type {boolean} + */ + pluginSettingsChanged: false, + + /** + * Start the engine. DOM is not ready yet, use only to init something. + * + * @since 1.6.0 + */ + init: function () { + + // Do that when DOM is ready. + $( document ).ready( app.ready ); + }, + + /** + * DOM is fully loaded. + * + * @since 1.6.0 + */ + ready: function () { + + app.pageHolder = $( '.wp-mail-smtp-tab-settings' ); + + // If there are screen options we have to move them. + $( '#screen-meta-links, #screen-meta' ).prependTo( '#wp-mail-smtp-header-temp' ).show(); + + app.bindActions(); + }, + + /** + * Process all generic actions/events, mostly custom that were fired by our API. + * + * @since 1.6.0 + */ + bindActions: function () { + + // Mailer selection. + $( '.wp-mail-smtp-mailer-image', app.pageHolder ).click( function () { + $( this ).parents( '.wp-mail-smtp-mailer' ).find( 'input' ).trigger( 'click' ); + } ); + + $( '.wp-mail-smtp-mailer input', app.pageHolder ).click( function () { + var $input = $( this ); + + if ( $input.prop( 'disabled' ) ) { + // Educational Popup. + if ( $input.hasClass( 'educate' ) ) { + app.education.upgradeMailer( $input ); + } + + return false; + } + + // Deselect the current mailer. + $( '.wp-mail-smtp-mailer', app.pageHolder ).removeClass( 'active' ); + // Select the correct one. + $( this ).parents( '.wp-mail-smtp-mailer' ).addClass( 'active' ); + + // Hide all mailers options and display for a currently clicked one. + $( '.wp-mail-smtp-mailer-option', app.pageHolder ).addClass( 'hidden' ).removeClass( 'active' ); + $( '.wp-mail-smtp-mailer-option-' + $( this ).val(), app.pageHolder ).addClass( 'active' ).removeClass( 'hidden' ); + } ); + + app.mailers.smtp.bindActions(); + + // Dismiss Pro banner at the bottom of the page. + $( '#wp-mail-smtp-pro-banner-dismiss', app.pageHolder ).on( 'click', function () { + $.ajax( { + url: ajaxurl, + dataType: 'json', + type: 'POST', + data: { + action: 'wp_mail_smtp_ajax', + task: 'pro_banner_dismiss' + } + } ) + .always( function () { + $( '#wp-mail-smtp-pro-banner', app.pageHolder ).fadeOut( 'fast' ); + } ); + } ); + + // Dismis educational notices for certain mailers. + $( '.js-wp-mail-smtp-mailer-notice-dismiss', app.pageHolder ).on( 'click', function ( e ) { + e.preventDefault(); + + var $btn = $( this ), + $notice = $btn.parents( '.inline-notice' ); + + if ( $btn.hasClass( 'disabled' ) ) { + return false; + } + + $.ajax( { + url: ajaxurl, + dataType: 'json', + type: 'POST', + data: { + action: 'wp_mail_smtp_ajax', + task: 'notice_dismiss', + notice: $notice.data( 'notice' ), + mailer: $notice.data( 'mailer' ) + }, + beforeSend: function () { + $btn.addClass( 'disabled' ); + } + } ) + .always( function () { + $notice.fadeOut( 'fast', function () { + $btn.removeClass( 'disabled' ); + } ); + } ); + } ); + + // Show/hide debug output. + $( '#wp-mail-smtp-debug .error-log-toggle' ).on( 'click', function ( e ) { + e.preventDefault(); + + $( '#wp-mail-smtp-debug .error-log-toggle' ).find( '.dashicons' ).toggleClass( 'dashicons-arrow-right-alt2 dashicons-arrow-down-alt2' ); + $( '#wp-mail-smtp-debug .error-log' ).slideToggle(); + $( '#wp-mail-smtp-debug .error-log-note' ).toggle(); + } ); + + // Remove mailer connection. + $( '.js-wp-mail-smtp-provider-remove', app.pageHolder ).on( 'click', function () { + return confirm( wp_mail_smtp.text_provider_remove ); + } ); + + // Copy input text to clipboard. + $( '.wp-mail-smtp-setting-copy', app.pageHolder ).click( function ( e ) { + e.preventDefault(); + + var target = $( '#' + $( this ).data( 'source_id' ) ).get( 0 ); + + target.select(); + + document.execCommand( 'Copy' ); + } ); + + app.triggerExitNotice(); + }, + + education: { + upgradeMailer: function ( $input ) { + + $.alert( { + backgroundDismiss: true, + escapeKey: true, + animationBounce: 1, + theme: 'modern', + animateFromElement: false, + draggable: false, + closeIcon: true, + useBootstrap: false, + title: wp_mail_smtp.education.upgrade_title.replace( /%name%/g, $input.siblings( 'label' ).text().trim() ), + icon: '">
            ' + wp_mail_smtp.education.upgrade_icon_lock + '' + wp_mail_smtp.education.upgrade_bonus + wp_mail_smtp.education.upgrade_doc + '' ); + }, + buttons: { + confirm: { + text: wp_mail_smtp.education.upgrade_button, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: function () { + window.open( wp_mail_smtp.education.upgrade_url + '&utm_content=' + encodeURI( $input.val() ), '_blank' ); + } + } + } + } ); + } + }, + + /** + * Individual mailers specific js code. + * + * @since 1.6.0 + */ + mailers: { + smtp: { + bindActions: function () { + + // Hide SMTP-specific user/pass when Auth disabled. + $( '#wp-mail-smtp-setting-smtp-auth' ).change( function () { + $( '#wp-mail-smtp-setting-row-smtp-user, #wp-mail-smtp-setting-row-smtp-pass' ).toggleClass( 'inactive' ); + } ); + + // Port default values based on encryption type. + $( '#wp-mail-smtp-setting-row-smtp-encryption input' ).change( function () { + + var $input = $( this ), + $smtpPort = $( '#wp-mail-smtp-setting-smtp-port', app.pageHolder ); + + if ( 'tls' === $input.val() ) { + $smtpPort.val( '587' ); + $( '#wp-mail-smtp-setting-row-smtp-autotls' ).addClass( 'inactive' ); + } + else if ( 'ssl' === $input.val() ) { + $smtpPort.val( '465' ); + $( '#wp-mail-smtp-setting-row-smtp-autotls' ).removeClass( 'inactive' ); + } + else { + $smtpPort.val( '25' ); + $( '#wp-mail-smtp-setting-row-smtp-autotls' ).removeClass( 'inactive' ); + } + } ); + } + } + }, + + /** + * Exit notice JS code when plugin settings are not saved. + * + * @since {VERSION} + */ + triggerExitNotice: function () { + + var $settingPages = $( '.wp-mail-smtp-page-general:not( .wp-mail-smtp-tab-test )' ); + + // Display an exit notice, if settings are not saved. + $( window ).on( 'beforeunload', function () { + if ( app.pluginSettingsChanged ) { + return wp_mail_smtp.text_settings_not_saved; + } + } ); + + // Set settings changed attribute, if any input was changed. + $( ':input:not( #wp-mail-smtp-setting-license-key )', $settingPages ).on( 'change', function () { + app.pluginSettingsChanged = true; + } ); + + // Clear the settings changed attribute, if the settings are about to be saved. + $( 'form', $settingPages ).on( 'submit', function () { + app.pluginSettingsChanged = false; + } ); + } + }; + + // Provide access to public functions/properties. + return app; +})( document, window, jQuery ); + +// Initialize. +WPMailSMTP.Admin.Settings.init(); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js new file mode 100644 index 0000000..83979f4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js @@ -0,0 +1 @@ +var WPMailSMTP=window.WPMailSMTP||{};WPMailSMTP.Admin=WPMailSMTP.Admin||{},WPMailSMTP.Admin.Settings=WPMailSMTP.Admin.Settings||function(i,e,a){"use strict";var n={pluginSettingsChanged:!1,init:function(){a(i).ready(n.ready)},ready:function(){n.pageHolder=a(".wp-mail-smtp-tab-settings"),a("#screen-meta-links, #screen-meta").prependTo("#wp-mail-smtp-header-temp").show(),n.bindActions()},bindActions:function(){a(".wp-mail-smtp-mailer-image",n.pageHolder).click(function(){a(this).parents(".wp-mail-smtp-mailer").find("input").trigger("click")}),a(".wp-mail-smtp-mailer input",n.pageHolder).click(function(){var t=a(this);if(t.prop("disabled"))return t.hasClass("educate")&&n.education.upgradeMailer(t),!1;a(".wp-mail-smtp-mailer",n.pageHolder).removeClass("active"),a(this).parents(".wp-mail-smtp-mailer").addClass("active"),a(".wp-mail-smtp-mailer-option",n.pageHolder).addClass("hidden").removeClass("active"),a(".wp-mail-smtp-mailer-option-"+a(this).val(),n.pageHolder).addClass("active").removeClass("hidden")}),n.mailers.smtp.bindActions(),a("#wp-mail-smtp-pro-banner-dismiss",n.pageHolder).on("click",function(){a.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",task:"pro_banner_dismiss"}}).always(function(){a("#wp-mail-smtp-pro-banner",n.pageHolder).fadeOut("fast")})}),a(".js-wp-mail-smtp-mailer-notice-dismiss",n.pageHolder).on("click",function(t){t.preventDefault();var i=a(this),e=i.parents(".inline-notice");if(i.hasClass("disabled"))return!1;a.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",task:"notice_dismiss",notice:e.data("notice"),mailer:e.data("mailer")},beforeSend:function(){i.addClass("disabled")}}).always(function(){e.fadeOut("fast",function(){i.removeClass("disabled")})})}),a("#wp-mail-smtp-debug .error-log-toggle").on("click",function(t){t.preventDefault(),a("#wp-mail-smtp-debug .error-log-toggle").find(".dashicons").toggleClass("dashicons-arrow-right-alt2 dashicons-arrow-down-alt2"),a("#wp-mail-smtp-debug .error-log").slideToggle(),a("#wp-mail-smtp-debug .error-log-note").toggle()}),a(".js-wp-mail-smtp-provider-remove",n.pageHolder).on("click",function(){return confirm(wp_mail_smtp.text_provider_remove)}),a(".wp-mail-smtp-setting-copy",n.pageHolder).click(function(t){t.preventDefault(),a("#"+a(this).data("source_id")).get(0).select(),i.execCommand("Copy")}),n.triggerExitNotice()},education:{upgradeMailer:function(t){a.alert({backgroundDismiss:!0,escapeKey:!0,animationBounce:1,theme:"modern",animateFromElement:!1,draggable:!1,closeIcon:!0,useBootstrap:!1,title:wp_mail_smtp.education.upgrade_title.replace(/%name%/g,t.siblings("label").text().trim()),icon:'">'+wp_mail_smtp.education.upgrade_icon_lock+''+wp_mail_smtp.education.upgrade_bonus+wp_mail_smtp.education.upgrade_doc+"")},buttons:{confirm:{text:wp_mail_smtp.education.upgrade_button,btnClass:"btn-confirm",keys:["enter"],action:function(){e.open(wp_mail_smtp.education.upgrade_url+"&utm_content="+encodeURI(t.val()),"_blank")}}}})}},mailers:{smtp:{bindActions:function(){a("#wp-mail-smtp-setting-smtp-auth").change(function(){a("#wp-mail-smtp-setting-row-smtp-user, #wp-mail-smtp-setting-row-smtp-pass").toggleClass("inactive")}),a("#wp-mail-smtp-setting-row-smtp-encryption input").change(function(){var t=a(this),i=a("#wp-mail-smtp-setting-smtp-port",n.pageHolder);"tls"===t.val()?(i.val("587"),a("#wp-mail-smtp-setting-row-smtp-autotls").addClass("inactive")):("ssl"===t.val()?i.val("465"):i.val("25"),a("#wp-mail-smtp-setting-row-smtp-autotls").removeClass("inactive"))})}}},triggerExitNotice:function(){var t=a(".wp-mail-smtp-page-general:not( .wp-mail-smtp-tab-test )");a(e).on("beforeunload",function(){if(n.pluginSettingsChanged)return wp_mail_smtp.text_settings_not_saved}),a(":input:not( #wp-mail-smtp-setting-license-key )",t).on("change",function(){n.pluginSettingsChanged=!0}),a("form",t).on("submit",function(){n.pluginSettingsChanged=!1})}};return n}(document,window,jQuery),WPMailSMTP.Admin.Settings.init(); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/languages/wp-mail-smtp.pot b/wp-content/plugins/wp-mail-smtp/assets/languages/wp-mail-smtp.pot new file mode 100644 index 0000000..4fb462c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/languages/wp-mail-smtp.pot @@ -0,0 +1,1771 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP Mail SMTP 1.9.0\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-mail-smtp\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-03-23T16:26:08+02:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.4.0\n" +"X-Domain: wp-mail-smtp\n" + +#. Plugin Name of the plugin +msgid "WP Mail SMTP Pro" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wpmailsmtp.com/" +msgstr "" + +#. Description of the plugin +msgid "Reconfigures the wp_mail() function to use Gmail/Mailgun/SendGrid/SMTP instead of the default mail() and creates an options page to manage the settings." +msgstr "" + +#. Author of the plugin +msgid "WPForms" +msgstr "" + +#. Author URI of the plugin +msgid "https://wpforms.com/" +msgstr "" + +#. translators: %s - error code, returned by Google API. +#: src/Admin/Area.php:112 +msgid "There was an error while processing the authentication request: %s. Please try again." +msgstr "" + +#: src/Admin/Area.php:120 +msgid "There was an error while processing the authentication request. Please try again." +msgstr "" + +#: src/Admin/Area.php:127 +msgid "There was an error while processing the authentication request. Please make sure that you have Client ID and Client Secret both valid and saved." +msgstr "" + +#: src/Admin/Area.php:136 +msgid "You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail." +msgstr "" + +#: src/Admin/Area.php:142 +msgid "You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook." +msgstr "" + +#. translators: %s - Mailer anchor link. +#: src/Admin/Area.php:174 +msgid "Thanks for using WP Mail SMTP! To complete the plugin setup and start sending emails, please select and configure your Mailer." +msgstr "" + +#: src/Admin/Area.php:197 +#: src/Admin/Area.php:198 +#: src/SiteHealth.php:40 +#: wp-mail-smtp-0.11.2.php:582 +msgid "WP Mail SMTP" +msgstr "" + +#: src/Admin/Area.php:208 +#: src/Admin/Area.php:209 +#: src/Admin/Area.php:795 +#: wp-mail-smtp-0.11.2.php:688 +msgid "Settings" +msgstr "" + +#: src/Admin/Area.php:216 +#: src/Admin/Area.php:217 +#: src/Admin/Area.php:796 +#: src/Admin/Pages/About.php:627 +#: src/Admin/Pages/Logs.php:40 +#: src/Admin/Pages/LogsTab.php:31 +msgid "Email Log" +msgstr "" + +#: src/Admin/Area.php:224 +#: src/Admin/Area.php:225 +#: src/Admin/Pages/About.php:105 +msgid "About Us" +msgstr "" + +#: src/Admin/Area.php:267 +msgid "Are you sure you want to reset the current provider connection? You will need to immediately create a new one to be able to send emails." +msgstr "" + +#: src/Admin/Area.php:268 +msgid "Changes that you made to the settings are not saved!" +msgstr "" + +#: src/Admin/Area.php:271 +msgid "%name% is a PRO Feature" +msgstr "" + +#: src/Admin/Area.php:272 +msgid "Upgrade to Pro" +msgstr "" + +#: src/Admin/Area.php:276 +msgid "Bonus: WP Mail SMTP users get 20% off regular price,
            applied at checkout." +msgstr "" + +#: src/Admin/Area.php:285 +msgid "Already purchased?" +msgstr "" + +#: src/Admin/Area.php:352 +#: src/Admin/Area.php:359 +#: src/Admin/Pages/About.php:308 +msgid "Activate" +msgstr "" + +#: src/Admin/Area.php:353 +#: src/Admin/Pages/About.php:300 +msgid "Activated" +msgstr "" + +#: src/Admin/Area.php:354 +#: src/Admin/Pages/About.php:297 +msgid "Active" +msgstr "" + +#: src/Admin/Area.php:355 +#: src/Admin/Pages/About.php:305 +msgid "Inactive" +msgstr "" + +#: src/Admin/Area.php:356 +msgid "Processing..." +msgstr "" + +#: src/Admin/Area.php:357 +msgid "Could not install a plugin. Please download from WordPress.org and install manually." +msgstr "" + +#: src/Admin/Area.php:358 +msgid "Install and Activate" +msgstr "" + +#: src/Admin/Area.php:360 +msgid "Download" +msgstr "" + +#. translators: %1$s - WP.org link; %2$s - same WP.org link. +#: src/Admin/Area.php:420 +msgid "Please rate WP Mail SMTP ★★★★★ on WordPress.org to help us spread the word. Thank you from the WP Mail SMTP team!" +msgstr "" + +#: src/Admin/Area.php:740 +msgid "WP Mail SMTP Pro related message was successfully dismissed." +msgstr "" + +#: src/Admin/Area.php:759 +msgid "Educational notice for this mailer was successfully dismissed." +msgstr "" + +#: src/Admin/PageAbstract.php:81 +msgid "Save Settings" +msgstr "" + +#. translators: %s - plugin current license type. +#: src/Admin/Pages/About.php:98 +#: src/Admin/Pages/About.php:526 +msgid "%s vs Pro" +msgstr "" + +#: src/Admin/Pages/About.php:170 +msgid "Hello and welcome to WP Mail SMTP, the easiest and most popular WordPress SMTP plugin. We build software that helps your site reliably deliver emails every time." +msgstr "" + +#: src/Admin/Pages/About.php:174 +msgid "Email deliverability has been a well-documented problem for all WordPress websites. However as WPForms grew, we became more aware of this painful issue that affects our users and the larger WordPress community. So we decided to solve this problem and make a solution that's beginner friendly." +msgstr "" + +#: src/Admin/Pages/About.php:177 +msgid "Our goal is to make reliable email deliverability easy for WordPress." +msgstr "" + +#. translators: %1$s - WPForms URL, %2$s - WPBeginner URL, %3$s - OptinMonster URL, %4$s - MonsterInsights URL, %5$s - RafflePress URL +#: src/Admin/Pages/About.php:184 +msgid "WP Mail SMTP is brought to you by the same team that's behind the most user friendly WordPress forms, WPForms, the largest WordPress resource site, WPBeginner, the most popular lead-generation software, OptinMonster, the best WordPress analytics plugin, MonsterInsights, and the most powerful WordPress contest plugin, RafflePress." +msgstr "" + +#: src/Admin/Pages/About.php:202 +msgid "Yup, we know a thing or two about building awesome products that customers love." +msgstr "" + +#: src/Admin/Pages/About.php:208 +msgid "The WPForms Team photo" +msgstr "" + +#: src/Admin/Pages/About.php:210 +msgid "The WPForms Team" +msgstr "" + +#. translators: %s - status HTML text. +#: src/Admin/Pages/About.php:250 +msgid "Status: %s" +msgstr "" + +#: src/Admin/Pages/About.php:316 +msgid "Not Installed" +msgstr "" + +#: src/Admin/Pages/About.php:319 +msgid "Install Plugin" +msgstr "" + +#: src/Admin/Pages/About.php:340 +msgid "MonsterInsights" +msgstr "" + +#: src/Admin/Pages/About.php:341 +#: src/Admin/Pages/About.php:347 +msgid "MonsterInsights makes it “effortless” to properly connect your WordPress site with Google Analytics, so you can start making data-driven decisions to grow your business." +msgstr "" + +#: src/Admin/Pages/About.php:346 +msgid "MonsterInsights Pro" +msgstr "" + +#: src/Admin/Pages/About.php:354 +msgid "OptinMonster" +msgstr "" + +#: src/Admin/Pages/About.php:355 +msgid "Our high-converting optin forms like Exit-Intent® popups, Fullscreen Welcome Mats, and Scroll boxes help you dramatically boost conversions and get more email subscribers." +msgstr "" + +#: src/Admin/Pages/About.php:361 +msgid "Contact Forms by WPForms" +msgstr "" + +#: src/Admin/Pages/About.php:362 +#: src/Admin/Pages/About.php:368 +msgid "The best WordPress contact form plugin. Drag & Drop online form builder that helps you create beautiful contact forms with just a few clicks." +msgstr "" + +#: src/Admin/Pages/About.php:367 +msgid "WPForms Pro" +msgstr "" + +#: src/Admin/Pages/About.php:375 +msgid "RafflePress" +msgstr "" + +#: src/Admin/Pages/About.php:376 +#: src/Admin/Pages/About.php:382 +msgid "Turn your visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with powerful viral giveaways & contests." +msgstr "" + +#: src/Admin/Pages/About.php:381 +msgid "RafflePress Pro" +msgstr "" + +#: src/Admin/Pages/About.php:401 +msgid "Could not activate the plugin. Please activate it from the Plugins page." +msgstr "" + +#: src/Admin/Pages/About.php:413 +msgid "Plugin activated." +msgstr "" + +#: src/Admin/Pages/About.php:430 +msgid "Could not install the plugin." +msgstr "" + +#: src/Admin/Pages/About.php:491 +msgid "Plugin installed & activated." +msgstr "" + +#: src/Admin/Pages/About.php:499 +msgid "Plugin installed." +msgstr "" + +#: src/Admin/Pages/About.php:534 +msgid "Get the most out of WP Mail SMTP by upgrading to Pro and unlocking all of the powerful features." +msgstr "" + +#: src/Admin/Pages/About.php:543 +msgid "Feature" +msgstr "" + +#: src/Admin/Pages/About.php:553 +msgid "Pro" +msgstr "" + +#: src/Admin/Pages/About.php:594 +msgid "Get WP Mail SMTP Pro Today and Unlock all of these Powerful Features" +msgstr "" + +#: src/Admin/Pages/About.php:601 +msgid "Bonus: WP Mail SMTP Lite users get 20% off regular price, automatically applied at checkout." +msgstr "" + +#: src/Admin/Pages/About.php:628 +#: src/Admin/Pages/ControlTab.php:27 +msgid "Email Controls" +msgstr "" + +#: src/Admin/Pages/About.php:629 +msgid "Additional Mailers" +msgstr "" + +#: src/Admin/Pages/About.php:630 +msgid "Customer Support" +msgstr "" + +#: src/Admin/Pages/About.php:651 +msgid "Emails are not logged" +msgstr "" + +#: src/Admin/Pages/About.php:657 +msgid "Complete Email Log management inside WordPress" +msgstr "" + +#: src/Admin/Pages/About.php:665 +msgid "No controls over whether default WordPress emails are sent" +msgstr "" + +#: src/Admin/Pages/About.php:671 +msgid "Complete Email Controls management for most default WordPress emails" +msgstr "" + +#: src/Admin/Pages/About.php:679 +msgid "Only default list of mailers" +msgstr "" + +#: src/Admin/Pages/About.php:685 +msgid "Additional mailers: Microsoft Outlook (with Office365 support) and Amazon SES" +msgstr "" + +#: src/Admin/Pages/About.php:693 +msgid "Limited Support" +msgstr "" + +#: src/Admin/Pages/About.php:699 +msgid "Priority Support" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:46 +msgid "Comment Notifications" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:47 +msgid "Manage emails sent when comments are published or awaiting moderation." +msgstr "" + +#: src/Admin/Pages/ControlTab.php:51 +msgid "Site Admin Email Change Notifications" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:52 +msgid "Manage emails sent when site admin's account has been changed." +msgstr "" + +#: src/Admin/Pages/ControlTab.php:56 +msgid "User Change Notifications" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:57 +msgid "Limit emails triggered by password changed/reset, email changed, and more." +msgstr "" + +#: src/Admin/Pages/ControlTab.php:61 +msgid "Personal Data Requests Notifications" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:62 +msgid "Control emails for data requests and data removal actions." +msgstr "" + +#: src/Admin/Pages/ControlTab.php:66 +msgid "Automatic Update Notifications" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:67 +msgid "Manage emails sent by the core automatic update process." +msgstr "" + +#: src/Admin/Pages/ControlTab.php:71 +msgid "New User Notifications" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:72 +msgid "Toggle emails sent to both user and site administrator about new user accounts." +msgstr "" + +#: src/Admin/Pages/ControlTab.php:79 +msgid "Unlock Email Controls" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:82 +msgid "Email Controls allows you to granularly manage emails sent by WordPress.
" +msgstr "" + +#: src/Admin/Pages/ControlTab.php:106 +#: src/Admin/Pages/Logs.php:77 +msgid "Upgrade to WP Mail SMTP Pro" +msgstr "" + +#: src/Admin/Pages/Logs.php:63 +msgid "Unlock Email Logging" +msgstr "" + +#: src/Admin/Pages/Logs.php:66 +msgid "Keep track of every email sent from your WordPress site with email logging.
" +msgstr "" + +#: src/Admin/Pages/Logs.php:67 +msgid "Troubleshoot sending issues, recover lost emails, and more!" +msgstr "" + +#: src/Admin/Pages/Logs.php:71 +msgid "Logs Archive Page Screenshot" +msgstr "" + +#: src/Admin/Pages/Logs.php:72 +msgid "Logs Single Page Screenshot" +msgstr "" + +#: src/Admin/Pages/MiscTab.php:24 +msgid "Misc" +msgstr "" + +#: src/Admin/Pages/MiscTab.php:56 +msgid "Do Not Send" +msgstr "" + +#: src/Admin/Pages/MiscTab.php:65 +msgid "Check this if you would like to stop sending all emails." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:71 +msgid "Some plugins, like BuddyPress and Events Manager, are using their own email delivery solutions. By default, this option does not block their emails, as those plugins do not use default wp_mail() function to send emails." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:79 +msgid "You will need to consult with their documentation to switch them to use default WordPress email delivery." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:81 +msgid "Test emails are allowed to be sent, regardless of this option." +msgstr "" + +#. translators: %1$s - constant that was used; %2$s - file where it was used. +#. translators: %1$s - constant name, %2$s - file name. +#: src/Admin/Pages/MiscTab.php:86 +#: src/Providers/OptionsAbstract.php:468 +msgid "The value of this field was set using a constant %1$s most likely inside %2$s of your WordPress installation." +msgstr "" + +#. translators: %1$s - constant to use; %2$s - file to put that constant in. +#: src/Admin/Pages/MiscTab.php:92 +msgid "If you want to disable using a constant, put %1$s in your %2$s file." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:106 +msgid "Hide Announcements" +msgstr "" + +#: src/Admin/Pages/MiscTab.php:115 +msgid "Check this if you would like to hide plugin announcements and update details." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:125 +msgid "Hide Email Delivery Errors" +msgstr "" + +#: src/Admin/Pages/MiscTab.php:141 +msgid "Check this if you would like to hide warnings alerting of email delivery errors." +msgstr "" + +#. translators: %s - filter that was used to disabled. +#: src/Admin/Pages/MiscTab.php:148 +msgid "Email Delivery Errors were disabled using a %s filter." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:157 +msgid "This is not recommended and should only be done for staging or development sites." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:172 +msgid "Uninstall WP Mail SMTP" +msgstr "" + +#: src/Admin/Pages/MiscTab.php:180 +msgid "Check this if you would like to remove ALL WP Mail SMTP data upon plugin deletion. All settings will be unrecoverable." +msgstr "" + +#: src/Admin/Pages/MiscTab.php:215 +#: src/Admin/Pages/SettingsTab.php:542 +msgid "Settings were successfully saved." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:36 +msgid "General" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:64 +msgid "License" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:67 +msgid "Your license key provides access to updates and support." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:75 +msgid "License Key" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:85 +msgid "Mail" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:92 +#: wp-mail-smtp-0.11.2.php:246 +msgid "From Email" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:103 +msgid "The email address which emails are sent from." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:104 +msgid "If you using an email provider (Gmail, Yahoo, Outlook.com, etc) this should be your email address for that account." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:107 +msgid "Please note that other plugins can change this, to prevent this use the setting below." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:119 +msgid "Force From Email" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:124 +msgid "Current provider will automatically force From Email to be the email address that you use to set up the connection below." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:128 +msgid "If checked, the From Email setting above will be used for all emails, ignoring values set by other plugins." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:138 +#: wp-mail-smtp-0.11.2.php:265 +msgid "From Name" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:149 +msgid "The name which emails are sent from." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:161 +msgid "Force From Name" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:166 +msgid "Current provider doesn't support setting and forcing From Name. Emails will be sent on behalf of the account name used to setup the connection below." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:170 +msgid "If checked, the From Name setting above will be used for all emails, ignoring values set by other plugins." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:179 +#: wp-mail-smtp-0.11.2.php:321 +#: wp-mail-smtp-0.11.2.php:326 +msgid "Return Path" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:188 +#: wp-mail-smtp-0.11.2.php:331 +msgid "Set the return-path to match the From Email" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:192 +#: wp-mail-smtp-0.11.2.php:335 +msgid "Return Path indicates where non-delivery receipts - or bounce messages - are to be sent." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:193 +msgid "If unchecked, bounce messages may be lost. Some providers may ignore this option." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:201 +#: wp-mail-smtp-0.11.2.php:280 +#: wp-mail-smtp-0.11.2.php:285 +msgid "Mailer" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:241 +#: src/Admin/Pages/SettingsTab.php:245 +msgid "Suggest a Mailer" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:274 +msgid "Dismiss this notice" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:316 +msgid "You're using WP Mail SMTP Lite - no license needed. Enjoy!" +msgstr "" + +#. translators: %s - WPMailSMTP.com upgrade URL. +#: src/Admin/Pages/SettingsTab.php:322 +msgid "To unlock more features consider upgrading to PRO." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:341 +msgid "As a valued WP Mail SMTP Lite user you receive 20% off, automatically applied at checkout!" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:402 +msgid "Get WP Mail SMTP Pro and Unlock all the Powerful Features" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:406 +msgid "Thanks for being a loyal WP Mail SMTP user. Upgrade to WP Mail SMTP Pro to unlock more awesome features and experience why WP Mail SMTP is the most popular SMTP plugin." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:410 +msgid "We know that you will truly love WP Mail SMTP. It's used by over 1,000,000 websites." +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:413 +msgid "Pro Features:" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:417 +msgid "Manage Notifications - control which emails your site sends" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:418 +msgid "Email Logging - keep track of every email sent from your site" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:419 +msgid "Office 365 - send emails using your Office 365 account" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:420 +msgid "Amazon SES - harness the power of AWS" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:421 +msgid "Outlook.com - send emails using your Outlook.com account" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:422 +msgid "Access to our world class support team" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:425 +msgid "White Glove Setup - sit back and relax while we handle everything for you" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:426 +msgid "Install WP Mail SMTP Pro plugin" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:427 +msgid "Set up domain name verification (DNS)" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:428 +msgid "Configure Mailgun service" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:429 +msgid "Set up WP Mail SMTP Pro plugin" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:430 +msgid "Test and verify email delivery" +msgstr "" + +#. translators: %s - WPMailSMTP.com URL. +#: src/Admin/Pages/SettingsTab.php:438 +msgid "Get WP Mail SMTP Pro Today and Unlock all the Powerful Features »" +msgstr "" + +#: src/Admin/Pages/SettingsTab.php:456 +msgid "Bonus: WP Mail SMTP users get 20% off regular price, automatically applied at checkout." +msgstr "" + +#: src/Admin/Pages/TestTab.php:37 +msgid "Email Test" +msgstr "" + +#: src/Admin/Pages/TestTab.php:59 +#: wp-mail-smtp-0.11.2.php:528 +msgid "Send a Test Email" +msgstr "" + +#: src/Admin/Pages/TestTab.php:66 +msgid "Send To" +msgstr "" + +#: src/Admin/Pages/TestTab.php:72 +msgid "Enter email address where test email will be sent." +msgstr "" + +#: src/Admin/Pages/TestTab.php:80 +msgid "HTML" +msgstr "" + +#: src/Admin/Pages/TestTab.php:86 +#: src/Providers/OptionsAbstract.php:264 +#: src/Providers/OptionsAbstract.php:286 +msgid "On" +msgstr "" + +#: src/Admin/Pages/TestTab.php:87 +#: src/Providers/OptionsAbstract.php:265 +#: src/Providers/OptionsAbstract.php:287 +msgid "Off" +msgstr "" + +#: src/Admin/Pages/TestTab.php:90 +msgid "Send this email in HTML or in plain text format." +msgstr "" + +#: src/Admin/Pages/TestTab.php:110 +msgid "You cannot send an email. Mailer is not properly configured. Please check your settings." +msgstr "" + +#: src/Admin/Pages/TestTab.php:114 +msgid "Send Email" +msgstr "" + +#: src/Admin/Pages/TestTab.php:142 +msgid "Test failed. Please use a valid email address and try to resend the test email." +msgstr "" + +#. translators: %s - email address a test email will be sent to. +#: src/Admin/Pages/TestTab.php:154 +#: src/Admin/Pages/TestTab.php:160 +msgid "Test email to %s" +msgstr "" + +#: src/Admin/Pages/TestTab.php:186 +msgid "Test plain text email was sent successfully!" +msgstr "" + +#. translators: %s - "HTML" in bold. +#: src/Admin/Pages/TestTab.php:190 +msgid "Test %s email was sent successfully! Please check your inbox to make sure it is delivered." +msgstr "" + +#: src/Admin/Pages/TestTab.php:498 +msgid "SSL certificate issue." +msgstr "" + +#: src/Admin/Pages/TestTab.php:499 +msgid "This means your web server cannot reliably make secure connections (make requests to HTTPS sites)." +msgstr "" + +#: src/Admin/Pages/TestTab.php:500 +#: src/Admin/Pages/TestTab.php:551 +msgid "Typically this error is returned when web server is not configured properly." +msgstr "" + +#: src/Admin/Pages/TestTab.php:503 +msgid "Contact your web hosting provider and inform them your site has an issue with SSL certificates." +msgstr "" + +#: src/Admin/Pages/TestTab.php:504 +#: src/Admin/Pages/TestTab.php:555 +msgid "The exact error you can provide them is in the Error log, available at the bottom of this page." +msgstr "" + +#: src/Admin/Pages/TestTab.php:505 +#: src/Admin/Pages/TestTab.php:556 +msgid "Ask them to resolve the issue then try again." +msgstr "" + +#: src/Admin/Pages/TestTab.php:516 +msgid "Could not connect to host." +msgstr "" + +#. translators: %s - SMTP host address. +#: src/Admin/Pages/TestTab.php:520 +#: src/Admin/Pages/TestTab.php:547 +#: src/Admin/Pages/TestTab.php:620 +msgid "This means your web server was unable to connect to %s." +msgstr "" + +#: src/Admin/Pages/TestTab.php:523 +#: src/Admin/Pages/TestTab.php:550 +#: src/Admin/Pages/TestTab.php:623 +msgid "This means your web server was unable to connect to the host server." +msgstr "" + +#: src/Admin/Pages/TestTab.php:524 +msgid "Typically this error is returned your web server is blocking the connections or the SMTP host denying the request." +msgstr "" + +#. translators: %s - SMTP host address. +#: src/Admin/Pages/TestTab.php:529 +msgid "Contact your web hosting provider and ask them to verify your server can connect to %s. Additionally, ask them if a firewall or security policy may be preventing the connection." +msgstr "" + +#: src/Admin/Pages/TestTab.php:532 +msgid "If using \"Other SMTP\" Mailer, triple check your SMTP settings including host address, email, and password." +msgstr "" + +#: src/Admin/Pages/TestTab.php:533 +msgid "If using \"Other SMTP\" Mailer, contact your SMTP host to confirm they are accepting outside connections with the settings you have configured (address, username, port, security, etc)." +msgstr "" + +#: src/Admin/Pages/TestTab.php:543 +msgid "Could not connect to your host." +msgstr "" + +#: src/Admin/Pages/TestTab.php:554 +msgid "Contact your web hosting provider and inform them you are having issues making outbound connections." +msgstr "" + +#: src/Admin/Pages/TestTab.php:566 +msgid "Could not authenticate your SMTP account." +msgstr "" + +#: src/Admin/Pages/TestTab.php:567 +msgid "This means we were able to connect to your SMTP host, but were not able to proceed using the email/password in the settings." +msgstr "" + +#: src/Admin/Pages/TestTab.php:568 +msgid "Typically this error is returned when the email or password is not correct or is not what the SMTP host is expecting." +msgstr "" + +#: src/Admin/Pages/TestTab.php:571 +msgid "Triple check your SMTP settings including host address, email, and password. If you have recently reset your password you will need to update the settings." +msgstr "" + +#: src/Admin/Pages/TestTab.php:572 +#: src/Admin/Pages/TestTab.php:649 +msgid "Contact your SMTP host to confirm you are using the correct username and password." +msgstr "" + +#: src/Admin/Pages/TestTab.php:573 +#: src/Admin/Pages/TestTab.php:650 +msgid "Verify with your SMTP host that your account has permissions to send emails using outside connections." +msgstr "" + +#: src/Admin/Pages/TestTab.php:583 +msgid "Error due to unsolicited and/or bulk e-mail." +msgstr "" + +#: src/Admin/Pages/TestTab.php:584 +msgid "This means the connection to your SMTP host was made successfully, but the host rejected the email." +msgstr "" + +#: src/Admin/Pages/TestTab.php:585 +msgid "Typically this error is returned when you are sending too many e-mails or e-mails that have been identified as spam." +msgstr "" + +#: src/Admin/Pages/TestTab.php:588 +msgid "Check the emails that are sending are sending individually. Example: email is not sending to 30 recipients. You can install any WordPress e-mail logging plugin to do that." +msgstr "" + +#: src/Admin/Pages/TestTab.php:589 +msgid "Contact your SMTP host to ask about sending/rate limits." +msgstr "" + +#: src/Admin/Pages/TestTab.php:590 +msgid "Verify with them your SMTP account is in good standing and your account has not been flagged." +msgstr "" + +#: src/Admin/Pages/TestTab.php:600 +msgid "Unauthenticated senders are not allowed." +msgstr "" + +#: src/Admin/Pages/TestTab.php:601 +msgid "This means the connection to your SMTP host was made successfully, but you should enable Authentication and provide correct Username and Password." +msgstr "" + +#: src/Admin/Pages/TestTab.php:604 +msgid "Go to WP Mail SMTP plugin Settings page." +msgstr "" + +#: src/Admin/Pages/TestTab.php:605 +msgid "Enable Authentication" +msgstr "" + +#: src/Admin/Pages/TestTab.php:606 +msgid "Enter correct SMTP Username (usually this is an email address) and Password in the appropriate fields." +msgstr "" + +#: src/Admin/Pages/TestTab.php:616 +msgid "Could not connect to the SMTP host." +msgstr "" + +#: src/Admin/Pages/TestTab.php:624 +#: src/Admin/Pages/TestTab.php:960 +msgid "Typically this error is returned for one of the following reasons:" +msgstr "" + +#: src/Admin/Pages/TestTab.php:625 +msgid "SMTP settings are incorrect (wrong port, security setting, incorrect host)." +msgstr "" + +#: src/Admin/Pages/TestTab.php:626 +#: src/Admin/Pages/TestTab.php:962 +msgid "Your web server is blocking the connection." +msgstr "" + +#: src/Admin/Pages/TestTab.php:627 +msgid "Your SMTP host is rejecting the connection." +msgstr "" + +#: src/Admin/Pages/TestTab.php:630 +msgid "Triple check your SMTP settings including host address, email, and password, port, and security." +msgstr "" + +#. translators: %1$s - SMTP host address, %2$s - SMTP port, %3$s - SMTP encryption. +#: src/Admin/Pages/TestTab.php:634 +msgid "Contact your web hosting provider and ask them to verify your server can connect to %1$s on port %2$s using %3$s encryption. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.
            Note: this is the most common cause of this issue." +msgstr "" + +#: src/Admin/Pages/TestTab.php:647 +msgid "no" +msgstr "" + +#: src/Admin/Pages/TestTab.php:660 +#: src/Admin/Pages/TestTab.php:675 +#: src/Admin/Pages/TestTab.php:691 +msgid "Mailgun failed." +msgstr "" + +#: src/Admin/Pages/TestTab.php:661 +msgid "It seems that you forgot to activate your Mailgun account." +msgstr "" + +#: src/Admin/Pages/TestTab.php:664 +msgid "Check your inbox you used to create a Mailgun account. Click the activation link in an email from Mailgun." +msgstr "" + +#: src/Admin/Pages/TestTab.php:665 +msgid "If you do not see activation email, go to your Mailgun control panel and resend the activation email." +msgstr "" + +#: src/Admin/Pages/TestTab.php:676 +msgid "Typically this error is because there is an issue with your Mailgun settings, in many cases the API key." +msgstr "" + +#: src/Admin/Pages/TestTab.php:679 +msgid "Verify your API key is correct." +msgstr "" + +#: src/Admin/Pages/TestTab.php:680 +msgid "Go to your Mailgun account and view your API key." +msgstr "" + +#: src/Admin/Pages/TestTab.php:681 +msgid "Note that the API key includes the \"key\" prefix, so make sure that it is in the WP Mail SMTP Mailgun API setting." +msgstr "" + +#: src/Admin/Pages/TestTab.php:692 +msgid "Your Mailgun account does not have access to send emails." +msgstr "" + +#: src/Admin/Pages/TestTab.php:693 +msgid "Typically this error is because you have not set up and/or complete domain name verification for your Mailgun account." +msgstr "" + +#. translators: %s - Mailgun documentation URL. +#: src/Admin/Pages/TestTab.php:699 +msgid "Go to our how-to guide for setting up Mailgun with WP Mail SMTP." +msgstr "" + +#: src/Admin/Pages/TestTab.php:710 +msgid "Complete the steps in section \"2. Verify Your Domain\"." +msgstr "" + +#: src/Admin/Pages/TestTab.php:720 +#: src/Admin/Pages/TestTab.php:771 +#: src/Admin/Pages/TestTab.php:792 +#: src/Admin/Pages/TestTab.php:819 +#: src/Admin/Pages/TestTab.php:835 +#: src/Admin/Pages/TestTab.php:890 +#: src/Admin/Pages/TestTab.php:917 +msgid "Google API Error." +msgstr "" + +#: src/Admin/Pages/TestTab.php:721 +msgid "You have not properly configured Gmail mailer." +msgstr "" + +#: src/Admin/Pages/TestTab.php:722 +msgid "Make sure that you have clicked the \"Allow plugin to send emails using your Google account\" button under Gmail settings." +msgstr "" + +#: src/Admin/Pages/TestTab.php:725 +msgid "Go to plugin Settings page and click the \"Allow plugin to send emails using your Google account\" button." +msgstr "" + +#: src/Admin/Pages/TestTab.php:726 +msgid "After the click you should be redirected to a Gmail authorization screen, where you will be asked a permission to send emails on your behalf." +msgstr "" + +#: src/Admin/Pages/TestTab.php:727 +msgid "Please click \"Agree\", if you see that button. If not - you will need to enable less secure apps first:" +msgstr "" + +#. translators: %s - Google support article URL. +#: src/Admin/Pages/TestTab.php:733 +msgid "if you are using regular Gmail account, please read this article to proceed." +msgstr "" + +#. translators: %s - Google support article URL. +#: src/Admin/Pages/TestTab.php:749 +msgid "if you are using G Suite, please read this article to proceed." +msgstr "" + +#: src/Admin/Pages/TestTab.php:772 +msgid "Typically this error is because address the email was sent to is invalid or was empty." +msgstr "" + +#: src/Admin/Pages/TestTab.php:775 +msgid "Check the \"Send To\" email address used and confirm it is a valid email and was not empty." +msgstr "" + +#. translators: 1 - correct email address example. 2 - incorrect email address example. +#: src/Admin/Pages/TestTab.php:778 +msgid "It should be something like this: %1$s. These are incorrect values: %2$s." +msgstr "" + +#: src/Admin/Pages/TestTab.php:782 +msgid "Make sure that the generated email has a TO header, useful when you are responsible for email creation." +msgstr "" + +#: src/Admin/Pages/TestTab.php:793 +msgid "Unfortunately, this error can be due to many different reasons." +msgstr "" + +#. translators: %s - Blog article URL. +#: src/Admin/Pages/TestTab.php:799 +msgid "Please read this article to learn more about what can cause this error and how it can be resolved." +msgstr "" + +#: src/Admin/Pages/TestTab.php:820 +msgid "Authentication code that Google returned to you has already been used on your previous auth attempt." +msgstr "" + +#: src/Admin/Pages/TestTab.php:823 +msgid "Make sure that you are not trying to manually clean up the plugin options to retry the \"Allow...\" step." +msgstr "" + +#: src/Admin/Pages/TestTab.php:824 +msgid "Reinstall the plugin with clean plugin data turned on on Misc page. This will remove all the plugin options and you will be safe to retry." +msgstr "" + +#: src/Admin/Pages/TestTab.php:825 +msgid "Make sure there is no aggressive caching on site admin area pages or try to clean cache between attempts." +msgstr "" + +#: src/Admin/Pages/TestTab.php:836 +msgid "There are various reasons for that, please review the steps below." +msgstr "" + +#. translators: %s - Google G Suite Admin area URL. +#: src/Admin/Pages/TestTab.php:842 +msgid "Make sure that your G Suite trial period has not expired. You can check the status here." +msgstr "" + +#. translators: %s - Google G Suite Admin area URL. +#: src/Admin/Pages/TestTab.php:856 +msgid "Make sure that Gmail app in your G Suite is actually enabled. You can check that in Apps list in G Suite Admin area." +msgstr "" + +#. translators: %s - Google Developers Console URL. +#: src/Admin/Pages/TestTab.php:870 +msgid "Make sure that you have Gmail API enabled, and you can do that here." +msgstr "" + +#: src/Admin/Pages/TestTab.php:893 +#: src/Admin/Pages/TestTab.php:921 +msgid "Make sure that the used Client ID/Secret correspond to a proper project that has Gmail API enabled." +msgstr "" + +#. translators: %s - WPForms.com tutorial URL. +#: src/Admin/Pages/TestTab.php:897 +msgid "Please follow our Gmail tutorial to be sure that all the correct project and data is applied." +msgstr "" + +#: src/Admin/Pages/TestTab.php:918 +msgid "You may have added a new API to a project" +msgstr "" + +#: src/Admin/Pages/TestTab.php:922 +msgid "Try to use a separate project for your emails, so the project has only 1 Gmail API in it enabled. You will need to remove the old project and create a new one from scratch." +msgstr "" + +#: src/Admin/Pages/TestTab.php:958 +msgid "An issue was detected." +msgstr "" + +#: src/Admin/Pages/TestTab.php:959 +msgid "This means your test email was unable to be sent." +msgstr "" + +#: src/Admin/Pages/TestTab.php:961 +msgid "Plugin settings are incorrect (wrong SMTP settings, invalid Mailer configuration, etc)." +msgstr "" + +#: src/Admin/Pages/TestTab.php:963 +msgid "Your host is rejecting the connection." +msgstr "" + +#: src/Admin/Pages/TestTab.php:966 +msgid "Triple check the plugin settings, consider reconfiguring to make sure everything is correct (eg bad copy and paste)." +msgstr "" + +#: src/Admin/Pages/TestTab.php:968 +msgid "Contact your web hosting provider and ask them to verify your server can make outside connections. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.
            Note: this is the most common cause of this issue." +msgstr "" + +#: src/Admin/Pages/TestTab.php:974 +msgid "Try using a different mailer." +msgstr "" + +#: src/Admin/Pages/TestTab.php:993 +msgid "There was a problem while sending the test email." +msgstr "" + +#: src/Admin/Pages/TestTab.php:1003 +msgid "Recommended next steps:" +msgstr "" + +#: src/Admin/Pages/TestTab.php:1013 +msgid "Need support?" +msgstr "" + +#. translators: %s - WPMailSMTP.com account area link. +#: src/Admin/Pages/TestTab.php:1021 +msgid "As a WP Mail SMTP Pro user you have access to WP Mail SMTP priority support. Please log in to your WPMailSMTP.com account and submit a support ticket." +msgstr "" + +#: src/Admin/Pages/TestTab.php:1038 +msgid "WP Mail SMTP is a free plugin, and the team behind WPForms maintains it to give back to the WordPress community." +msgstr "" + +#. translators: %s - WPMailSMTP.com URL. +#: src/Admin/Pages/TestTab.php:1045 +msgid "To access our world class support, please upgrade to WP Mail SMTP Pro. Along with getting expert support, you will also get Notification controls, Email Logging, and integrations for Amazon SES, Office 365, and Outlook.com." +msgstr "" + +#: src/Admin/Pages/TestTab.php:1060 +msgid "Additionally, you can take advantage of our White Glove Setup. Sit back and relax while we handle everything for you! If you simply don't have time or maybe you feel a bit in over your head - we got you covered." +msgstr "" + +#: src/Admin/Pages/TestTab.php:1066 +msgid "As a valued WP Mail SMTP user, you will get 20% off regular pricing, automatically applied at checkout!" +msgstr "" + +#. translators: %1$s - WP Mail SMTP support policy URL, %2$s - WP Mail SMTP support forum URL, %3$s - WPMailSMTP.com URL. +#: src/Admin/Pages/TestTab.php:1080 +msgid "Alternatively, we also offer limited support on the WordPress.org support forums. You can create a support thread there, but please understand that free support is not guaranteed and is limited to simple issues. If you have an urgent or complex issue, then please consider upgrading to WP Mail SMTP Pro to access our priority support ticket system." +msgstr "" + +#: src/Admin/Pages/TestTab.php:1101 +msgid "Click here to view the full Error Log for debugging" +msgstr "" + +#: src/Admin/Pages/TestTab.php:1110 +msgid "Please copy only the content of the error debug message above, identified with an orange left border, into the support forum topic if you experience any issues." +msgstr "" + +#. translators: %1$s - Plugin name causing conflict; %2$s - Plugin name causing conflict. +#: src/Conflicts.php:159 +msgid "Heads up! WP Mail SMTP has detected %1$s is activated. Please deactivate %2$s to prevent conflicts." +msgstr "" + +#. translators: %1$s - WPBeginner URL for recommended WordPress hosting. +#: src/Core.php:106 +msgid "Your site is running an insecure version of PHP that is no longer supported. Please contact your web hosting provider to update your PHP version or switch to a recommended WordPress hosting company." +msgstr "" + +#. translators: %s - WPForms.com docs URL with more details. +#: src/Core.php:123 +msgid "Note: WP Mail SMTP plugin is disabled on your site until you fix the issue. Read more for additional information." +msgstr "" + +#. translators: %1$s - WP Mail SMTP plugin name; %2$s - WPForms.com URL to a related doc. +#: src/Core.php:399 +msgid "Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. Read more for additional information." +msgstr "" + +#: src/Core.php:413 +msgid "Please Note: Support for PHP 5.3-5.5 will be discontinued in 2020. After this, if no further action is taken, WP Mail SMTP functionality will be disabled." +msgstr "" + +#. translators: %s - plugin name and its version. +#: src/Core.php:447 +msgid "EMAILING DISABLED: The %s is currently blocking all emails from being sent." +msgstr "" + +#. translators: %1$s - constant name; %2$s - constant value. +#: src/Core.php:458 +msgid "To send emails, change the value of the %1$s constant to %2$s." +msgstr "" + +#. translators: %s - plugin Misc settings page URL. +#: src/Core.php:469 +msgid "To send emails, go to plugin Misc settings and disable the \"Do Not Send\" option." +msgstr "" + +#. translators: %s - plugin name and its version. +#: src/Core.php:501 +msgid "EMAIL DELIVERY ERROR: the plugin %s logged this error during the last time it tried to send an email:" +msgstr "" + +#: src/Core.php:531 +msgid "Consider running an email test after fixing it." +msgstr "" + +#: src/Pro/SiteHealth.php:58 +msgid "Is wpmailsmtp.com reachable?" +msgstr "" + +#: src/Providers/AmazonSES/Options.php:25 +msgid "Amazon SES" +msgstr "" + +#: src/Providers/AmazonSES/Options.php:39 +msgid "We're sorry, the Amazon SES mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features." +msgstr "" + +#: src/Providers/Gmail/Auth.php:170 +msgid "There was an error while processing the Google authentication request. Please make sure that you have Client ID and Client Secret both valid and saved." +msgstr "" + +#: src/Providers/Gmail/Options.php:32 +msgid "Gmail" +msgstr "" + +#. translators: %s - URL to our Gmail doc. +#: src/Providers/Gmail/Options.php:35 +msgid "Send emails using your Gmail or G Suite (formerly Google Apps) account, all while keeping your login credentials safe. Other Google SMTP methods require enabling less secure apps in your account and entering your password. However, this integration uses the Google API to improve email delivery issues while keeping your site secure.

            Read our Gmail documentation to learn how to configure Gmail or G Suite." +msgstr "" + +#: src/Providers/Gmail/Options.php:48 +msgid "The Gmail mailer works well for sites that send low numbers of emails. However, Gmail's API has rate limitations and a number of additional restrictions that can lead to challenges during setup. If you expect to send a high volume of emails, or if you find that your web host is not compatible with the Gmail API restrictions, then we recommend considering a different mailer option." +msgstr "" + +#: src/Providers/Gmail/Options.php:72 +msgid "Client ID" +msgstr "" + +#: src/Providers/Gmail/Options.php:87 +msgid "Client Secret" +msgstr "" + +#: src/Providers/Gmail/Options.php:109 +msgid "Authorized redirect URI" +msgstr "" + +#: src/Providers/Gmail/Options.php:117 +msgid "Copy URL to clipboard" +msgstr "" + +#: src/Providers/Gmail/Options.php:122 +msgid "Please copy this URL into the \"Authorized redirect URIs\" field of your Google web application." +msgstr "" + +#: src/Providers/Gmail/Options.php:131 +msgid "Authorization" +msgstr "" + +#: src/Providers/Gmail/Options.php:159 +msgid "Allow plugin to send emails using your Google account" +msgstr "" + +#: src/Providers/Gmail/Options.php:162 +msgid "Click the button above to confirm authorization." +msgstr "" + +#: src/Providers/Gmail/Options.php:168 +msgid "Remove Connection" +msgstr "" + +#. translators: %s - email address, as received from Google API. +#: src/Providers/Gmail/Options.php:177 +msgid "Connected as %s" +msgstr "" + +#: src/Providers/Gmail/Options.php:184 +msgid "Removing the connection will give you an ability to redo the connection or link to another Google account." +msgstr "" + +#: src/Providers/Gmail/Options.php:192 +msgid "You need to save settings with Client ID and Client Secret before you can proceed." +msgstr "" + +#: src/Providers/Mail/Options.php:25 +msgid "Default (none)" +msgstr "" + +#: src/Providers/Mail/Options.php:37 +msgid "You currently have the native WordPress option selected. Please select any other Mailer option above to continue the setup." +msgstr "" + +#: src/Providers/Mailgun/Options.php:25 +msgid "Mailgun" +msgstr "" + +#. translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag. +#: src/Providers/Mailgun/Options.php:29 +msgid "%1$sMailgun%2$s is one of the leading transactional email services trusted by over 150,000+ businesses.
            They provide 5,000 free emails per month for 3 months, then $0.80 per 1000 emails.

            Read our %3$sMailgun documentation%4$s to learn how to configure Mailgun and improve your email deliverability." +msgstr "" + +#: src/Providers/Mailgun/Options.php:57 +msgid "Private API Key" +msgstr "" + +#. translators: %s - API key link. +#: src/Providers/Mailgun/Options.php:76 +msgid "Follow this link to get an API Key from Mailgun: %s." +msgstr "" + +#: src/Providers/Mailgun/Options.php:78 +msgid "Get a Private API Key" +msgstr "" + +#: src/Providers/Mailgun/Options.php:89 +msgid "Domain Name" +msgstr "" + +#. translators: %s - Domain Name link. +#: src/Providers/Mailgun/Options.php:101 +msgid "Follow this link to get a Domain Name from Mailgun: %s." +msgstr "" + +#: src/Providers/Mailgun/Options.php:103 +msgid "Get a Domain Name" +msgstr "" + +#: src/Providers/Mailgun/Options.php:114 +msgid "Region" +msgstr "" + +#: src/Providers/Mailgun/Options.php:124 +msgid "US" +msgstr "" + +#: src/Providers/Mailgun/Options.php:133 +msgid "EU" +msgstr "" + +#: src/Providers/Mailgun/Options.php:137 +msgid "Define which endpoint you want to use for sending messages." +msgstr "" + +#: src/Providers/Mailgun/Options.php:138 +msgid "If you are operating under EU laws, you may be required to use EU region." +msgstr "" + +#. translators: %s - URL to Mailgun.com page. +#: src/Providers/Mailgun/Options.php:143 +msgid "More information on Mailgun.com." +msgstr "" + +#: src/Providers/OptionsAbstract.php:186 +#: wp-mail-smtp-0.11.2.php:355 +msgid "SMTP Host" +msgstr "" + +#: src/Providers/OptionsAbstract.php:200 +#: wp-mail-smtp-0.11.2.php:370 +#: wp-mail-smtp-0.11.2.php:374 +#: wp-mail-smtp-0.11.2.php:489 +#: wp-mail-smtp-0.11.2.php:495 +msgid "Encryption" +msgstr "" + +#: src/Providers/OptionsAbstract.php:210 +msgid "None" +msgstr "" + +#: src/Providers/OptionsAbstract.php:219 +msgid "SSL" +msgstr "" + +#: src/Providers/OptionsAbstract.php:228 +msgid "TLS" +msgstr "" + +#: src/Providers/OptionsAbstract.php:232 +msgid "For most servers TLS is the recommended option. If your SMTP provider offers both SSL and TLS options, we recommend using TLS." +msgstr "" + +#: src/Providers/OptionsAbstract.php:240 +#: wp-mail-smtp-0.11.2.php:363 +#: wp-mail-smtp-0.11.2.php:481 +msgid "SMTP Port" +msgstr "" + +#: src/Providers/OptionsAbstract.php:254 +msgid "Auto TLS" +msgstr "" + +#: src/Providers/OptionsAbstract.php:268 +msgid "By default TLS encryption is automatically used if the server supports it, which is recommended. In some cases, due to server misconfigurations, this can cause issues and may need to be disabled." +msgstr "" + +#: src/Providers/OptionsAbstract.php:276 +#: wp-mail-smtp-0.11.2.php:397 +#: wp-mail-smtp-0.11.2.php:401 +msgid "Authentication" +msgstr "" + +#: src/Providers/OptionsAbstract.php:295 +msgid "SMTP Username" +msgstr "" + +#: src/Providers/OptionsAbstract.php:309 +msgid "SMTP Password" +msgstr "" + +#. translators: %s - constant name: WPMS_SMTP_PASS. +#: src/Providers/OptionsAbstract.php:321 +msgid "To change the password you need to change the value of the constant there: %s" +msgstr "" + +#. translators: %1$s - wp-config.php file, %2$s - WPMS_ON constant name. +#: src/Providers/OptionsAbstract.php:329 +msgid "If you want to disable the use of constants, find in %1$s file the constant %2$s and turn if off:" +msgstr "" + +#: src/Providers/OptionsAbstract.php:339 +msgid "All the defined constants will stop working and you will be able to change all the values on this page." +msgstr "" + +#: src/Providers/OptionsAbstract.php:347 +msgid "The password is stored in plain text. We highly recommend you set up your password in your WordPress configuration file for improved security." +msgstr "" + +#. translators: %s - wp-config.php. +#: src/Providers/OptionsAbstract.php:352 +msgid "To do this add the lines below to your %s file:" +msgstr "" + +#. translators: %1$s - Provider name; %2$s - PHP version required by Provider; %3$s - current PHP version. +#: src/Providers/OptionsAbstract.php:418 +msgid "%1$s requires PHP %2$s to work and does not support your current PHP version %3$s. Please contact your host and request a PHP upgrade to the latest one." +msgstr "" + +#: src/Providers/OptionsAbstract.php:425 +#: src/Providers/OptionsAbstract.php:449 +msgid "Meanwhile you can switch to some other mailers." +msgstr "" + +#. translators: %s - Provider name. +#: src/Providers/OptionsAbstract.php:444 +msgid "%s requires a SSL certificate on a site to work and does not support your current installation. Please contact your host and request a SSL certificate or install a free one, like Let's Encrypt." +msgstr "" + +#: src/Providers/Outlook/Options.php:25 +msgid "Outlook" +msgstr "" + +#: src/Providers/Outlook/Options.php:39 +msgid "We're sorry, the Microsoft Outlook mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features." +msgstr "" + +#: src/Providers/Pepipost/Options.php:25 +msgid "Pepipost SMTP" +msgstr "" + +#. translators: %1$s - URL to pepipost.com site. +#: src/Providers/PepipostAPI/Options.php:31 +msgid "Pepipost is a recommended transactional email service. Every month Pepipost delivers over 8 billion emails from 20,000+ customers. Their mission is to reliably send emails in the most efficient way and at the most disruptive pricing ever. Pepipost provides users 30,000 free emails the first 30 days, then 100 emails per day." +msgstr "" + +#. translators: %1$s - URL to wpmailsmtp.com doc. +#: src/Providers/PepipostAPI/Options.php:34 +msgid "Read our Pepipost documentation to learn how to configure Pepipost and improve your email deliverability." +msgstr "" + +#: src/Providers/PepipostAPI/Options.php:53 +msgid "Get Pepipost Now (Free)" +msgstr "" + +#: src/Providers/PepipostAPI/Options.php:61 +msgid "Pepipost" +msgstr "" + +#: src/Providers/PepipostAPI/Options.php:88 +#: src/Providers/Sendgrid/Options.php:57 +#: src/Providers/Sendinblue/Options.php:88 +msgid "API Key" +msgstr "" + +#. translators: %s - pepipost.com link to get an API Key. +#. translators: %s - sendinblue.com link to get an API Key. +#: src/Providers/PepipostAPI/Options.php:107 +#: src/Providers/Sendinblue/Options.php:107 +msgid "Follow this link to get an API Key: %s." +msgstr "" + +#: src/Providers/PepipostAPI/Options.php:109 +msgid "Get the API Key" +msgstr "" + +#: src/Providers/Sendgrid/Options.php:25 +msgid "SendGrid" +msgstr "" + +#. translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag. +#: src/Providers/Sendgrid/Options.php:29 +msgid "%1$sSendGrid%2$s is one of the leading transactional email services, sending over 35 billion emails every month. They provide users 100 free emails per day.

            Read our %3$sSendGrid documentation%4$s to learn how to set up SendGrid and improve your email deliverability." +msgstr "" + +#. translators: %s - API key link. +#: src/Providers/Sendgrid/Options.php:76 +msgid "Follow this link to get an API Key from SendGrid: %s." +msgstr "" + +#: src/Providers/Sendgrid/Options.php:78 +msgid "Create API Key" +msgstr "" + +#. translators: %s - SendGrid access level. +#: src/Providers/Sendgrid/Options.php:86 +msgid "To send emails you will need only a %s access level for this API key." +msgstr "" + +#. translators: %1$s - URL to sendinblue.com site. +#: src/Providers/Sendinblue/Options.php:31 +msgid "Sendinblue is a recommended transactional email service. Founded in 2012, they serve 80,000+ growing companies around the world and send over 30 million emails each day. They understand that transactional emails are the heart of your customer relationships. Their email deliverability experts are constantly at work optimizing the reliability and speed of their SMTP infrastructure. Sendinblue provides users 300 free emails per day." +msgstr "" + +#. translators: %2$s - URL to wpmailsmtp.com doc. +#: src/Providers/Sendinblue/Options.php:34 +msgid "Read our Sendinblue documentation to learn how to configure Sendinblue and improve your email deliverability." +msgstr "" + +#: src/Providers/Sendinblue/Options.php:53 +msgid "Get Sendinblue Now (Free)" +msgstr "" + +#: src/Providers/Sendinblue/Options.php:61 +msgid "Sendinblue" +msgstr "" + +#: src/Providers/Sendinblue/Options.php:109 +msgid "Get v3 API Key" +msgstr "" + +#: src/Providers/SMTP/Options.php:25 +msgid "Other SMTP" +msgstr "" + +#. translators: %s - URL to a related article on WPForms.com. +#: src/Providers/SMTP/Options.php:29 +msgid "Use the SMTP details provided by your hosting provider or email service.

            To see recommended settings for the popular services as well as troubleshooting tips, check out our SMTP documentation." +msgstr "" + +#: src/SiteHealth.php:67 +msgid "Is WP Mail SMTP mailer setup complete?" +msgstr "" + +#: src/SiteHealth.php:92 +msgid "Version" +msgstr "" + +#: src/SiteHealth.php:96 +msgid "License key type" +msgstr "" + +#: src/SiteHealth.php:100 +msgid "Debug" +msgstr "" + +#: src/SiteHealth.php:101 +msgid "No debug notices found." +msgstr "" + +#: src/SiteHealth.php:131 +msgid "Current mailer" +msgstr "" + +#: src/SiteHealth.php:136 +msgid "WP Mail SMTP mailer setup is complete" +msgstr "" + +#: src/SiteHealth.php:145 +msgid "The WP Mail SMTP plugin mailer setup is complete. You can send a test email, to make sure it's working properly." +msgstr "" + +#: src/SiteHealth.php:150 +msgid "Test email sending" +msgstr "" + +#: src/SiteHealth.php:158 +msgid "You currently have the default mailer selected, which means that you haven’t set up SMTP yet." +msgstr "" + +#: src/SiteHealth.php:163 +msgid "WP Mail SMTP mailer setup is incomplete" +msgstr "" + +#: src/SiteHealth.php:169 +msgid "The WP Mail SMTP plugin mailer setup is incomplete. Please click on the link below to access plugin settings and configure the mailer." +msgstr "" + +#: src/SiteHealth.php:174 +msgid "Configure mailer" +msgstr "" + +#. translators: %1$s - date, \a\t - specially escaped "at", %2$s - time. +#: src/WP.php:183 +msgid "%1$s \\a\\t %2$s" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:192 +#: wp-mail-smtp-0.11.2.php:546 +msgid "Send Test" +msgstr "" + +#. translators: %s - email address where test mail will be sent to. +#: wp-mail-smtp-0.11.2.php:201 +msgid "Test mail to %s" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:202 +msgid "This is a test email generated by the WP Mail SMTP WordPress plugin." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:218 +msgid "Test Message Sent" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:219 +msgid "The result was:" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:222 +msgid "The full debugging output is shown below:" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:225 +msgid "The SMTP debugging output is shown below:" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:237 +#: wp-mail-smtp-0.11.2.php:582 +msgid "WP Mail SMTP Settings" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:253 +msgid "You can specify the email address that emails should be sent from. If you leave this blank, the default email will be used." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:256 +msgid "Please Note: You appear to be using a version of WordPress prior to 2.3. Please ignore the From Name field and instead enter Name<email@domain.com> in this field." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:271 +msgid "You can specify the name that emails should be sent from. If you leave this blank, the emails will be sent from WordPress." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:290 +msgid "Send all WordPress emails via SMTP." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:294 +msgid "Use the PHP mail() function to send emails." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:300 +msgid "Use Pepipost SMTP to send emails." +msgstr "" + +#. translators: %1$s - link start; %2$s - link end. +#: wp-mail-smtp-0.11.2.php:306 +msgid "Looking for high inbox delivery? Try Pepipost with easy setup and free emails. Learn more %1$shere%2$s." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:343 +#: wp-mail-smtp-0.11.2.php:443 +#: wp-mail-smtp-0.11.2.php:519 +msgid "Save Changes" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:348 +msgid "SMTP Options" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:350 +msgid "These options only apply if you have chosen to send mail by SMTP above." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:379 +#: wp-mail-smtp-0.11.2.php:501 +msgid "No encryption." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:384 +#: wp-mail-smtp-0.11.2.php:506 +msgid "Use SSL encryption." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:389 +#: wp-mail-smtp-0.11.2.php:511 +msgid "Use TLS encryption." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:392 +msgid "TLS is not the same as STARTTLS. For most servers SSL is the recommended option." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:406 +msgid "No: Do not use SMTP authentication." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:411 +msgid "Yes: Use SMTP authentication." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:415 +msgid "If this is set to no, the values below are ignored." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:422 +#: wp-mail-smtp-0.11.2.php:465 +msgid "Username" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:430 +#: wp-mail-smtp-0.11.2.php:473 +msgid "Password" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:436 +msgid "This is in plain text because it must not be stored encrypted." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:450 +msgid "Pepipost SMTP Options" +msgstr "" + +#. translators: %s - Pepipost registration URL. +#: wp-mail-smtp-0.11.2.php:456 +msgid "You need to signup on %s to get the SMTP username/password." +msgstr "" + +#: wp-mail-smtp-0.11.2.php:536 +msgid "To" +msgstr "" + +#: wp-mail-smtp-0.11.2.php:540 +msgid "Type an email address here and then click Send Test to generate a test email." +msgstr "" + +#. translators: %1$s - WP Mail SMTP plugin name; %2$s - opening a link tag; %3$s - closing a link tag. +#: wp-mail-smtp-0.11.2.php:727 +msgid "Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. %2$sRead more%3$s for additional information." +msgstr "" + +#: wp_mail_smtp.php:131 +msgid "Please deactivate the free version of the WP Mail SMTP plugin before activating WP Mail SMTP Pro." +msgstr "" diff --git a/wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.css b/wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.css new file mode 100644 index 0000000..bd1bc75 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.css @@ -0,0 +1,9 @@ +/*! + * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) + * Author: boniface pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2019 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */@-webkit-keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}body[class*=jconfirm-no-scroll-]{overflow:hidden!important}.jconfirm{position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999999;font-family:inherit;overflow:hidden}.jconfirm .jconfirm-bg{position:fixed;top:0;left:0;right:0;bottom:0;-webkit-transition:opacity .4s;transition:opacity .4s}.jconfirm .jconfirm-bg.jconfirm-bg-h{opacity:0!important}.jconfirm .jconfirm-scrollpane{-webkit-perspective:500px;perspective:500px;-webkit-perspective-origin:center;perspective-origin:center;display:table;width:100%;height:100%}.jconfirm .jconfirm-row{display:table-row;width:100%}.jconfirm .jconfirm-cell{display:table-cell;vertical-align:middle}.jconfirm .jconfirm-holder{max-height:100%;padding:50px 0}.jconfirm .jconfirm-box-container{-webkit-transition:-webkit-transform;transition:-webkit-transform;transition:transform;transition:transform,-webkit-transform}.jconfirm .jconfirm-box-container.jconfirm-no-transition{-webkit-transition:none!important;transition:none!important}.jconfirm .jconfirm-box{background:white;border-radius:4px;position:relative;outline:0;padding:15px 15px 0;overflow:hidden;margin-left:auto;margin-right:auto}@-webkit-keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@-webkit-keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@-webkit-keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@-webkit-keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@-webkit-keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@-webkit-keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}@keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}.jconfirm .jconfirm-box.jconfirm-type-animated{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.jconfirm .jconfirm-box.jconfirm-type-blue{border-top:solid 7px #3498db;-webkit-animation-name:type-blue;animation-name:type-blue}.jconfirm .jconfirm-box.jconfirm-type-green{border-top:solid 7px #2ecc71;-webkit-animation-name:type-green;animation-name:type-green}.jconfirm .jconfirm-box.jconfirm-type-red{border-top:solid 7px #e74c3c;-webkit-animation-name:type-red;animation-name:type-red}.jconfirm .jconfirm-box.jconfirm-type-orange{border-top:solid 7px #f1c40f;-webkit-animation-name:type-orange;animation-name:type-orange}.jconfirm .jconfirm-box.jconfirm-type-purple{border-top:solid 7px #9b59b6;-webkit-animation-name:type-purple;animation-name:type-purple}.jconfirm .jconfirm-box.jconfirm-type-dark{border-top:solid 7px #34495e;-webkit-animation-name:type-dark;animation-name:type-dark}.jconfirm .jconfirm-box.loading{height:120px}.jconfirm .jconfirm-box.loading:before{content:'';position:absolute;left:0;background:white;right:0;top:0;bottom:0;border-radius:10px;z-index:1}.jconfirm .jconfirm-box.loading:after{opacity:.6;content:'';height:30px;width:30px;border:solid 3px transparent;position:absolute;left:50%;margin-left:-15px;border-radius:50%;-webkit-animation:jconfirm-spin 1s infinite linear;animation:jconfirm-spin 1s infinite linear;border-bottom-color:dodgerblue;top:50%;margin-top:-15px;z-index:2}.jconfirm .jconfirm-box div.jconfirm-closeIcon{height:20px;width:20px;position:absolute;top:10px;right:10px;cursor:pointer;opacity:.6;text-align:center;font-size:27px!important;line-height:14px!important;display:none;z-index:1}.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{opacity:1}.jconfirm .jconfirm-box div.jconfirm-title-c{display:block;font-size:22px;line-height:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;padding-bottom:15px}.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand{cursor:move}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{font-size:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i{vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:inherit;font-family:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-content-pane{margin-bottom:15px;height:auto;-webkit-transition:height .4s ease-in;transition:height .4s ease-in;display:inline-block;width:100%;position:relative;overflow-x:hidden;overflow-y:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll{overflow-y:hidden}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar{width:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track{background:rgba(0,0,0,0.1)}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb{background:#666;border-radius:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{overflow:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img{max-width:100%;height:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty{display:none}.jconfirm .jconfirm-box .jconfirm-buttons{padding-bottom:11px}.jconfirm .jconfirm-box .jconfirm-buttons>button{margin-bottom:4px;margin-left:2px;margin-right:2px}.jconfirm .jconfirm-box .jconfirm-buttons button{display:inline-block;padding:6px 12px;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;-webkit-tap-highlight-color:transparent;border:0;background-image:none}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue{background-color:#3498db;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover{background-color:#2980b9;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green{background-color:#2ecc71;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover{background-color:#27ae60;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red{background-color:#e74c3c;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover{background-color:#c0392b;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange{background-color:#f1c40f;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover{background-color:#f39c12;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default{background-color:#ecf0f1;color:#000;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover{background-color:#bdc3c7;color:#000}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple{background-color:#9b59b6;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover{background-color:#8e44ad;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark{background-color:#34495e;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover{background-color:#2c3e50;color:#FFF}.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c{color:#e74c3c!important}.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c{color:#3498db!important}.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c{color:#2ecc71!important}.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c{color:#9b59b6!important}.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c{color:#f1c40f!important}.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c{color:#34495e!important}.jconfirm .jconfirm-clear{clear:both}.jconfirm.jconfirm-rtl{direction:rtl}.jconfirm.jconfirm-rtl div.jconfirm-closeIcon{left:5px;right:auto}.jconfirm.jconfirm-white .jconfirm-bg,.jconfirm.jconfirm-light .jconfirm-bg{background-color:#444;opacity:.2}.jconfirm.jconfirm-white .jconfirm-box,.jconfirm.jconfirm-light .jconfirm-box{-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.2);box-shadow:0 2px 6px rgba(0,0,0,0.2);border-radius:5px}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default{-webkit-box-shadow:none;box-shadow:none;color:#333}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#ddd}.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-black .jconfirm-bg,.jconfirm.jconfirm-dark .jconfirm-bg{background-color:darkslategray;opacity:.4}.jconfirm.jconfirm-black .jconfirm-box,.jconfirm.jconfirm-dark .jconfirm-box{-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.2);box-shadow:0 2px 6px rgba(0,0,0,0.2);background:#444;border-radius:5px;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button{border:0;background-image:none;text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none;-webkit-transition:background .1s;transition:background .1s;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default{-webkit-box-shadow:none;box-shadow:none;color:#fff;background:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#666}.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake{-webkit-animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow{-webkit-animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-2px,0,0);transform:translate3d(-2px,0,0)}20%,80%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-8px,0,0);transform:translate3d(-8px,0,0)}40%,60%{-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-2px,0,0);transform:translate3d(-2px,0,0)}20%,80%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-8px,0,0);transform:translate3d(-8px,0,0)}40%,60%{-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}}@-webkit-keyframes glow{0%,100%{-webkit-box-shadow:0 0 0 red;box-shadow:0 0 0 red}50%{-webkit-box-shadow:0 0 30px red;box-shadow:0 0 30px red}}@keyframes glow{0%,100%{-webkit-box-shadow:0 0 0 red;box-shadow:0 0 0 red}50%{-webkit-box-shadow:0 0 30px red;box-shadow:0 0 30px red}}.jconfirm{-webkit-perspective:400px;perspective:400px}.jconfirm .jconfirm-box{opacity:1;-webkit-transition-property:all;transition-property:all}.jconfirm .jconfirm-box.jconfirm-animation-top,.jconfirm .jconfirm-box.jconfirm-animation-left,.jconfirm .jconfirm-box.jconfirm-animation-right,.jconfirm .jconfirm-box.jconfirm-animation-bottom,.jconfirm .jconfirm-box.jconfirm-animation-opacity,.jconfirm .jconfirm-box.jconfirm-animation-zoom,.jconfirm .jconfirm-box.jconfirm-animation-scale,.jconfirm .jconfirm-box.jconfirm-animation-none,.jconfirm .jconfirm-box.jconfirm-animation-rotate,.jconfirm .jconfirm-box.jconfirm-animation-rotatex,.jconfirm .jconfirm-box.jconfirm-animation-rotatey,.jconfirm .jconfirm-box.jconfirm-animation-scaley,.jconfirm .jconfirm-box.jconfirm-animation-scalex{opacity:0}.jconfirm .jconfirm-box.jconfirm-animation-rotate{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.jconfirm .jconfirm-box.jconfirm-animation-rotatex{-webkit-transform:rotateX(90deg);transform:rotateX(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatexr{-webkit-transform:rotateX(-90deg);transform:rotateX(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatey{-webkit-transform:rotatey(90deg);transform:rotatey(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotateyr{-webkit-transform:rotatey(-90deg);transform:rotatey(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scaley{-webkit-transform:scaley(1.5);transform:scaley(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scalex{-webkit-transform:scalex(1.5);transform:scalex(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-top{-webkit-transform:translate(0px,-100px);transform:translate(0px,-100px)}.jconfirm .jconfirm-box.jconfirm-animation-left{-webkit-transform:translate(-100px,0px);transform:translate(-100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-right{-webkit-transform:translate(100px,0px);transform:translate(100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-bottom{-webkit-transform:translate(0px,100px);transform:translate(0px,100px)}.jconfirm .jconfirm-box.jconfirm-animation-zoom{-webkit-transform:scale(1.2);transform:scale(1.2)}.jconfirm .jconfirm-box.jconfirm-animation-scale{-webkit-transform:scale(0.5);transform:scale(0.5)}.jconfirm .jconfirm-box.jconfirm-animation-none{visibility:hidden}.jconfirm.jconfirm-supervan .jconfirm-bg{background-color:rgba(54,70,93,0.95)}.jconfirm.jconfirm-supervan .jconfirm-box{background-color:transparent}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark{border:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon{color:white}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c{text-align:center;color:white;font-size:28px;font-weight:normal}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c>*{padding-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane{margin-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content{text-align:center;color:white}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button{font-size:16px;border-radius:2px;background:#303f53;text-shadow:none;border:0;color:white;padding:10px;min-width:100px}.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-material .jconfirm-bg{background-color:rgba(0,0,0,0.67)}.jconfirm.jconfirm-material .jconfirm-box{background-color:white;-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 25px 10px 25px}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons{text-align:right}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-weight:500}.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-bootstrap .jconfirm-bg{background-color:rgba(0,0,0,0.21)}.jconfirm.jconfirm-bootstrap .jconfirm-box{background-color:white;-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);border:solid 1px rgba(0,0,0,0.4);padding:15px 0 0}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold;padding-left:15px;padding-right:15px}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87);padding:0 15px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons{text-align:right;padding:10px;margin:-5px 0 0;border-top:solid 1px #ddd;overflow:hidden;border-radius:0 0 4px 4px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button{font-weight:500}.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-modern .jconfirm-bg{background-color:slategray;opacity:.6}.jconfirm.jconfirm-modern .jconfirm-box{background-color:white;-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 30px 15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87);top:15px;right:15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:24px;font-weight:bold;text-align:center;margin-bottom:10px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{-webkit-transition:-webkit-transform .5s;transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s;-webkit-transform:scale(0);transform:scale(0);display:block;margin-right:0;margin-left:0;margin-bottom:10px;font-size:69px;color:#aaa}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content{text-align:center;font-size:15px;color:#777;margin-bottom:25px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button{font-weight:bold;text-transform:uppercase;-webkit-transition:background .1s;transition:background .1s;padding:10px 20px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button+button{margin-left:4px}.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{-webkit-transform:scale(1);transform:scale(1)} \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.js b/wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.js new file mode 100644 index 0000000..4cf8123 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/libs/jquery-confirm.min.js @@ -0,0 +1,10 @@ +/*! + * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) + * Author: Boniface Pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2019 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */ +(function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory);}else{if(typeof module==="object"&&module.exports){module.exports=function(root,jQuery){if(jQuery===undefined){if(typeof window!=="undefined"){jQuery=require("jquery");}else{jQuery=require("jquery")(root);}}factory(jQuery);return jQuery;};}else{factory(jQuery);}}}(function($){var w=window;$.fn.confirm=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}$(this).each(function(){var $this=$(this);if($this.attr("jc-attached")){console.warn("jConfirm has already been attached to this element ",$this[0]);return;}$this.on("click",function(e){e.preventDefault();var jcOption=$.extend({},options);if($this.attr("data-title")){jcOption.title=$this.attr("data-title");}if($this.attr("data-content")){jcOption.content=$this.attr("data-content");}if(typeof jcOption.buttons==="undefined"){jcOption.buttons={};}jcOption["$target"]=$this;if($this.attr("href")&&Object.keys(jcOption.buttons).length===0){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});var firstBtn=Object.keys(buttons)[0];jcOption.buttons=buttons;jcOption.buttons[firstBtn].action=function(){location.href=$this.attr("href");};}jcOption.closeIcon=false;var instance=$.confirm(jcOption);});$this.attr("jc-attached",true);});return $(this);};$.confirm=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}var putDefaultButtons=!(options.buttons===false);if(typeof options.buttons!=="object"){options.buttons={};}if(Object.keys(options.buttons).length===0&&putDefaultButtons){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});options.buttons=buttons;}return w.jconfirm(options);};$.alert=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}var putDefaultButtons=!(options.buttons===false);if(typeof options.buttons!=="object"){options.buttons={};}if(Object.keys(options.buttons).length===0&&putDefaultButtons){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});var firstBtn=Object.keys(buttons)[0];options.buttons[firstBtn]=buttons[firstBtn];}return w.jconfirm(options);};$.dialog=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false,closeIcon:function(){}};}options.buttons={};if(typeof options.closeIcon==="undefined"){options.closeIcon=function(){};}options.confirmKeys=[13];return w.jconfirm(options);};w.jconfirm=function(options){if(typeof options==="undefined"){options={};}var pluginOptions=$.extend(true,{},w.jconfirm.pluginDefaults);if(w.jconfirm.defaults){pluginOptions=$.extend(true,pluginOptions,w.jconfirm.defaults);}pluginOptions=$.extend(true,{},pluginOptions,options);var instance=new w.Jconfirm(pluginOptions);w.jconfirm.instances.push(instance);return instance;};w.Jconfirm=function(options){$.extend(this,options);this._init();};w.Jconfirm.prototype={_init:function(){var that=this;if(!w.jconfirm.instances.length){w.jconfirm.lastFocused=$("body").find(":focus");}this._id=Math.round(Math.random()*99999);this.contentParsed=$(document.createElement("div"));if(!this.lazyOpen){setTimeout(function(){that.open();},0);}},_buildHTML:function(){var that=this;this._parseAnimation(this.animation,"o");this._parseAnimation(this.closeAnimation,"c");this._parseBgDismissAnimation(this.backgroundDismissAnimation);this._parseColumnClass(this.columnClass);this._parseTheme(this.theme);this._parseType(this.type);var template=$(this.template);template.find(".jconfirm-box").addClass(this.animationParsed).addClass(this.backgroundDismissAnimationParsed).addClass(this.typeParsed);if(this.typeAnimated){template.find(".jconfirm-box").addClass("jconfirm-type-animated");}if(this.useBootstrap){template.find(".jc-bs3-row").addClass(this.bootstrapClasses.row);template.find(".jc-bs3-row").addClass("justify-content-md-center justify-content-sm-center justify-content-xs-center justify-content-lg-center");template.find(".jconfirm-box-container").addClass(this.columnClassParsed);if(this.containerFluid){template.find(".jc-bs3-container").addClass(this.bootstrapClasses.containerFluid);}else{template.find(".jc-bs3-container").addClass(this.bootstrapClasses.container);}}else{template.find(".jconfirm-box").css("width",this.boxWidth);}if(this.titleClass){template.find(".jconfirm-title-c").addClass(this.titleClass);}template.addClass(this.themeParsed);var ariaLabel="jconfirm-box"+this._id;template.find(".jconfirm-box").attr("aria-labelledby",ariaLabel).attr("tabindex",-1);template.find(".jconfirm-content").attr("id",ariaLabel);if(this.bgOpacity!==null){template.find(".jconfirm-bg").css("opacity",this.bgOpacity);}if(this.rtl){template.addClass("jconfirm-rtl");}this.$el=template.appendTo(this.container);this.$jconfirmBoxContainer=this.$el.find(".jconfirm-box-container");this.$jconfirmBox=this.$body=this.$el.find(".jconfirm-box");this.$jconfirmBg=this.$el.find(".jconfirm-bg");this.$title=this.$el.find(".jconfirm-title");this.$titleContainer=this.$el.find(".jconfirm-title-c");this.$content=this.$el.find("div.jconfirm-content");this.$contentPane=this.$el.find(".jconfirm-content-pane");this.$icon=this.$el.find(".jconfirm-icon-c");this.$closeIcon=this.$el.find(".jconfirm-closeIcon");this.$holder=this.$el.find(".jconfirm-holder");this.$btnc=this.$el.find(".jconfirm-buttons");this.$scrollPane=this.$el.find(".jconfirm-scrollpane");that.setStartingPoint();this._contentReady=$.Deferred();this._modalReady=$.Deferred();this.$holder.css({"padding-top":this.offsetTop,"padding-bottom":this.offsetBottom,});this.setTitle();this.setIcon();this._setButtons();this._parseContent();this.initDraggable();if(this.isAjax){this.showLoading(false);}$.when(this._contentReady,this._modalReady).then(function(){if(that.isAjaxLoading){setTimeout(function(){that.isAjaxLoading=false;that.setContent();that.setTitle();that.setIcon();setTimeout(function(){that.hideLoading(false);that._updateContentMaxHeight();},100);if(typeof that.onContentReady==="function"){that.onContentReady();}},50);}else{that._updateContentMaxHeight();that.setTitle();that.setIcon();if(typeof that.onContentReady==="function"){that.onContentReady();}}if(that.autoClose){that._startCountDown();}}).then(function(){that._watchContent();});if(this.animation==="none"){this.animationSpeed=1;this.animationBounce=1;}this.$body.css(this._getCSS(this.animationSpeed,this.animationBounce));this.$contentPane.css(this._getCSS(this.animationSpeed,1));this.$jconfirmBg.css(this._getCSS(this.animationSpeed,1));this.$jconfirmBoxContainer.css(this._getCSS(this.animationSpeed,1));},_typePrefix:"jconfirm-type-",typeParsed:"",_parseType:function(type){this.typeParsed=this._typePrefix+type;},setType:function(type){var oldClass=this.typeParsed;this._parseType(type);this.$jconfirmBox.removeClass(oldClass).addClass(this.typeParsed);},themeParsed:"",_themePrefix:"jconfirm-",setTheme:function(theme){var previous=this.theme;this.theme=theme||this.theme;this._parseTheme(this.theme);if(previous){this.$el.removeClass(previous);}this.$el.addClass(this.themeParsed);this.theme=theme;},_parseTheme:function(theme){var that=this;theme=theme.split(",");$.each(theme,function(k,a){if(a.indexOf(that._themePrefix)===-1){theme[k]=that._themePrefix+$.trim(a);}});this.themeParsed=theme.join(" ").toLowerCase();},backgroundDismissAnimationParsed:"",_bgDismissPrefix:"jconfirm-hilight-",_parseBgDismissAnimation:function(bgDismissAnimation){var animation=bgDismissAnimation.split(",");var that=this;$.each(animation,function(k,a){if(a.indexOf(that._bgDismissPrefix)===-1){animation[k]=that._bgDismissPrefix+$.trim(a);}});this.backgroundDismissAnimationParsed=animation.join(" ").toLowerCase();},animationParsed:"",closeAnimationParsed:"",_animationPrefix:"jconfirm-animation-",setAnimation:function(animation){this.animation=animation||this.animation;this._parseAnimation(this.animation,"o");},_parseAnimation:function(animation,which){which=which||"o";var animations=animation.split(",");var that=this;$.each(animations,function(k,a){if(a.indexOf(that._animationPrefix)===-1){animations[k]=that._animationPrefix+$.trim(a);}});var a_string=animations.join(" ").toLowerCase();if(which==="o"){this.animationParsed=a_string;}else{this.closeAnimationParsed=a_string;}return a_string;},setCloseAnimation:function(closeAnimation){this.closeAnimation=closeAnimation||this.closeAnimation;this._parseAnimation(this.closeAnimation,"c");},setAnimationSpeed:function(speed){this.animationSpeed=speed||this.animationSpeed;},columnClassParsed:"",setColumnClass:function(colClass){if(!this.useBootstrap){console.warn("cannot set columnClass, useBootstrap is set to false");return;}this.columnClass=colClass||this.columnClass;this._parseColumnClass(this.columnClass);this.$jconfirmBoxContainer.addClass(this.columnClassParsed);},_updateContentMaxHeight:function(){var height=$(window).height()-(this.$jconfirmBox.outerHeight()-this.$contentPane.outerHeight())-(this.offsetTop+this.offsetBottom);this.$contentPane.css({"max-height":height+"px"});},setBoxWidth:function(width){if(this.useBootstrap){console.warn("cannot set boxWidth, useBootstrap is set to true");return;}this.boxWidth=width;this.$jconfirmBox.css("width",width);},_parseColumnClass:function(colClass){colClass=colClass.toLowerCase();var p;switch(colClass){case"xl":case"xlarge":p="col-md-12";break;case"l":case"large":p="col-md-8 col-md-offset-2";break;case"m":case"medium":p="col-md-6 col-md-offset-3";break;case"s":case"small":p="col-md-4 col-md-offset-4";break;case"xs":case"xsmall":p="col-md-2 col-md-offset-5";break;default:p=colClass;}this.columnClassParsed=p;},initDraggable:function(){var that=this;var $t=this.$titleContainer;this.resetDrag();if(this.draggable){$t.on("mousedown",function(e){$t.addClass("jconfirm-hand");that.mouseX=e.clientX;that.mouseY=e.clientY;that.isDrag=true;});$(window).on("mousemove."+this._id,function(e){if(that.isDrag){that.movingX=e.clientX-that.mouseX+that.initialX;that.movingY=e.clientY-that.mouseY+that.initialY;that.setDrag();}});$(window).on("mouseup."+this._id,function(){$t.removeClass("jconfirm-hand");if(that.isDrag){that.isDrag=false;that.initialX=that.movingX;that.initialY=that.movingY;}});}},resetDrag:function(){this.isDrag=false;this.initialX=0;this.initialY=0;this.movingX=0;this.movingY=0;this.mouseX=0;this.mouseY=0;this.$jconfirmBoxContainer.css("transform","translate("+0+"px, "+0+"px)");},setDrag:function(){if(!this.draggable){return;}this.alignMiddle=false;var boxWidth=this.$jconfirmBox.outerWidth();var boxHeight=this.$jconfirmBox.outerHeight();var windowWidth=$(window).width();var windowHeight=$(window).height();var that=this;var dragUpdate=1;if(that.movingX%dragUpdate===0||that.movingY%dragUpdate===0){if(that.dragWindowBorder){var leftDistance=(windowWidth/2)-boxWidth/2;var topDistance=(windowHeight/2)-boxHeight/2;topDistance-=that.dragWindowGap;leftDistance-=that.dragWindowGap;if(leftDistance+that.movingX<0){that.movingX=-leftDistance;}else{if(leftDistance-that.movingX<0){that.movingX=leftDistance;}}if(topDistance+that.movingY<0){that.movingY=-topDistance;}else{if(topDistance-that.movingY<0){that.movingY=topDistance;}}}that.$jconfirmBoxContainer.css("transform","translate("+that.movingX+"px, "+that.movingY+"px)");}},_scrollTop:function(){if(typeof pageYOffset!=="undefined"){return pageYOffset;}else{var B=document.body;var D=document.documentElement;D=(D.clientHeight)?D:B;return D.scrollTop;}},_watchContent:function(){var that=this;if(this._timer){clearInterval(this._timer);}var prevContentHeight=0;this._timer=setInterval(function(){if(that.smoothContent){var contentHeight=that.$content.outerHeight()||0;if(contentHeight!==prevContentHeight){prevContentHeight=contentHeight;}var wh=$(window).height();var total=that.offsetTop+that.offsetBottom+that.$jconfirmBox.height()-that.$contentPane.height()+that.$content.height();if(total').html(that.buttons[key].text).addClass(that.buttons[key].btnClass).prop("disabled",that.buttons[key].isDisabled).css("display",that.buttons[key].isHidden?"none":"").click(function(e){e.preventDefault();var res=that.buttons[key].action.apply(that,[that.buttons[key]]);that.onAction.apply(that,[key,that.buttons[key]]);that._stopCountDown();if(typeof res==="undefined"||res){that.close();}});that.buttons[key].el=button_element;that.buttons[key].setText=function(text){button_element.html(text);};that.buttons[key].addClass=function(className){button_element.addClass(className);};that.buttons[key].removeClass=function(className){button_element.removeClass(className);};that.buttons[key].disable=function(){that.buttons[key].isDisabled=true;button_element.prop("disabled",true);};that.buttons[key].enable=function(){that.buttons[key].isDisabled=false;button_element.prop("disabled",false);};that.buttons[key].show=function(){that.buttons[key].isHidden=false;button_element.css("display","");};that.buttons[key].hide=function(){that.buttons[key].isHidden=true;button_element.css("display","none");};that["$_"+key]=that["$$"+key]=button_element;that.$btnc.append(button_element);});if(total_buttons===0){this.$btnc.hide();}if(this.closeIcon===null&&total_buttons===0){this.closeIcon=true;}if(this.closeIcon){if(this.closeIconClass){var closeHtml='';this.$closeIcon.html(closeHtml);}this.$closeIcon.click(function(e){e.preventDefault();var buttonName=false;var shouldClose=false;var str;if(typeof that.closeIcon==="function"){str=that.closeIcon();}else{str=that.closeIcon;}if(typeof str==="string"&&typeof that.buttons[str]!=="undefined"){buttonName=str;shouldClose=false;}else{if(typeof str==="undefined"||!!(str)===true){shouldClose=true;}else{shouldClose=false;}}if(buttonName){var btnResponse=that.buttons[buttonName].action.apply(that);shouldClose=(typeof btnResponse==="undefined")||!!(btnResponse);}if(shouldClose){that.close();}});this.$closeIcon.show();}else{this.$closeIcon.hide();}},setTitle:function(string,force){force=force||false;if(typeof string!=="undefined"){if(typeof string==="string"){this.title=string;}else{if(typeof string==="function"){if(typeof string.promise==="function"){console.error("Promise was returned from title function, this is not supported.");}var response=string();if(typeof response==="string"){this.title=response;}else{this.title=false;}}else{this.title=false;}}}if(this.isAjaxLoading&&!force){return;}this.$title.html(this.title||"");this.updateTitleContainer();},setIcon:function(iconClass,force){force=force||false;if(typeof iconClass!=="undefined"){if(typeof iconClass==="string"){this.icon=iconClass;}else{if(typeof iconClass==="function"){var response=iconClass();if(typeof response==="string"){this.icon=response;}else{this.icon=false;}}else{this.icon=false;}}}if(this.isAjaxLoading&&!force){return;}this.$icon.html(this.icon?'':"");this.updateTitleContainer();},updateTitleContainer:function(){if(!this.title&&!this.icon){this.$titleContainer.hide();}else{this.$titleContainer.show();}},setContentPrepend:function(content,force){if(!content){return;}this.contentParsed.prepend(content);},setContentAppend:function(content){if(!content){return;}this.contentParsed.append(content);},setContent:function(content,force){force=!!force;var that=this;if(content){this.contentParsed.html("").append(content);}if(this.isAjaxLoading&&!force){return;}this.$content.html("");this.$content.append(this.contentParsed);setTimeout(function(){that.$body.find("input[autofocus]:visible:first").focus();},100);},loadingSpinner:false,showLoading:function(disableButtons){this.loadingSpinner=true;this.$jconfirmBox.addClass("loading");if(disableButtons){this.$btnc.find("button").prop("disabled",true);}},hideLoading:function(enableButtons){this.loadingSpinner=false;this.$jconfirmBox.removeClass("loading");if(enableButtons){this.$btnc.find("button").prop("disabled",false);}},ajaxResponse:false,contentParsed:"",isAjax:false,isAjaxLoading:false,_parseContent:function(){var that=this;var e=" ";if(typeof this.content==="function"){var res=this.content.apply(this);if(typeof res==="string"){this.content=res;}else{if(typeof res==="object"&&typeof res.always==="function"){this.isAjax=true;this.isAjaxLoading=true;res.always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});this.content=e;}else{this.content=e;}}}if(typeof this.content==="string"&&this.content.substr(0,4).toLowerCase()==="url:"){this.isAjax=true;this.isAjaxLoading=true;var u=this.content.substring(4,this.content.length);$.get(u).done(function(html){that.contentParsed.html(html);}).always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});}if(!this.content){this.content=e;}if(!this.isAjax){this.contentParsed.html(this.content);this.setContent();that._contentReady.resolve();}},_stopCountDown:function(){clearInterval(this.autoCloseInterval);if(this.$cd){this.$cd.remove();}},_startCountDown:function(){var that=this;var opt=this.autoClose.split("|");if(opt.length!==2){console.error("Invalid option for autoClose. example 'close|10000'");return false;}var button_key=opt[0];var time=parseInt(opt[1]);if(typeof this.buttons[button_key]==="undefined"){console.error("Invalid button key '"+button_key+"' for autoClose");return false;}var seconds=Math.ceil(time/1000);this.$cd=$(' ('+seconds+")").appendTo(this["$_"+button_key]);this.autoCloseInterval=setInterval(function(){that.$cd.html(" ("+(seconds-=1)+") ");if(seconds<=0){that["$$"+button_key].trigger("click");that._stopCountDown();}},1000);},_getKey:function(key){switch(key){case 192:return"tilde";case 13:return"enter";case 16:return"shift";case 9:return"tab";case 20:return"capslock";case 17:return"ctrl";case 91:return"win";case 18:return"alt";case 27:return"esc";case 32:return"space";}var initial=String.fromCharCode(key);if(/^[A-z0-9]+$/.test(initial)){return initial.toLowerCase();}else{return false;}},reactOnKey:function(e){var that=this;var a=$(".jconfirm");if(a.eq(a.length-1)[0]!==this.$el[0]){return false;}var key=e.which;if(this.$content.find(":input").is(":focus")&&/13|32/.test(key)){return false;}var keyChar=this._getKey(key);if(keyChar==="esc"&&this.escapeKey){if(this.escapeKey===true){this.$scrollPane.trigger("click");}else{if(typeof this.escapeKey==="string"||typeof this.escapeKey==="function"){var buttonKey;if(typeof this.escapeKey==="function"){buttonKey=this.escapeKey();}else{buttonKey=this.escapeKey;}if(buttonKey){if(typeof this.buttons[buttonKey]==="undefined"){console.warn("Invalid escapeKey, no buttons found with key "+buttonKey);}else{this["$_"+buttonKey].trigger("click");}}}}}$.each(this.buttons,function(key,button){if(button.keys.indexOf(keyChar)!==-1){that["$_"+key].trigger("click");}});},setDialogCenter:function(){console.info("setDialogCenter is deprecated, dialogs are centered with CSS3 tables");},_unwatchContent:function(){clearInterval(this._timer);},close:function(onClosePayload){var that=this;if(typeof this.onClose==="function"){this.onClose(onClosePayload);}this._unwatchContent();$(window).unbind("resize."+this._id);$(window).unbind("keyup."+this._id);$(window).unbind("jcKeyDown."+this._id);if(this.draggable){$(window).unbind("mousemove."+this._id);$(window).unbind("mouseup."+this._id);this.$titleContainer.unbind("mousedown");}that.$el.removeClass(that.loadedClass);$("body").removeClass("jconfirm-no-scroll-"+that._id);that.$jconfirmBoxContainer.removeClass("jconfirm-no-transition");setTimeout(function(){that.$body.addClass(that.closeAnimationParsed);that.$jconfirmBg.addClass("jconfirm-bg-h");var closeTimer=(that.closeAnimation==="none")?1:that.animationSpeed;setTimeout(function(){that.$el.remove();var l=w.jconfirm.instances;var i=w.jconfirm.instances.length-1;for(i;i>=0;i--){if(w.jconfirm.instances[i]._id===that._id){w.jconfirm.instances.splice(i,1);}}if(!w.jconfirm.instances.length){if(that.scrollToPreviousElement&&w.jconfirm.lastFocused&&w.jconfirm.lastFocused.length&&$.contains(document,w.jconfirm.lastFocused[0])){var $lf=w.jconfirm.lastFocused;if(that.scrollToPreviousElementAnimate){var st=$(window).scrollTop();var ot=w.jconfirm.lastFocused.offset().top;var wh=$(window).height();if(!(ot>st&&ot<(st+wh))){var scrollTo=(ot-Math.round((wh/3)));$("html, body").animate({scrollTop:scrollTo},that.animationSpeed,"swing",function(){$lf.focus();});}else{$lf.focus();}}else{$lf.focus();}w.jconfirm.lastFocused=false;}}if(typeof that.onDestroy==="function"){that.onDestroy();}},closeTimer*0.4);},50);return true;},open:function(){if(this.isOpen()){return false;}this._buildHTML();this._bindEvents();this._open();return true;},setStartingPoint:function(){var el=false;if(this.animateFromElement!==true&&this.animateFromElement){el=this.animateFromElement;w.jconfirm.lastClicked=false;}else{if(w.jconfirm.lastClicked&&this.animateFromElement===true){el=w.jconfirm.lastClicked;w.jconfirm.lastClicked=false;}else{return false;}}if(!el){return false;}var offset=el.offset();var iTop=el.outerHeight()/2;var iLeft=el.outerWidth()/2;iTop-=this.$jconfirmBox.outerHeight()/2;iLeft-=this.$jconfirmBox.outerWidth()/2;var sourceTop=offset.top+iTop;sourceTop=sourceTop-this._scrollTop();var sourceLeft=offset.left+iLeft;var wh=$(window).height()/2;var ww=$(window).width()/2;var targetH=wh-this.$jconfirmBox.outerHeight()/2;var targetW=ww-this.$jconfirmBox.outerWidth()/2;sourceTop-=targetH;sourceLeft-=targetW;if(Math.abs(sourceTop)>wh||Math.abs(sourceLeft)>ww){return false;}this.$jconfirmBoxContainer.css("transform","translate("+sourceLeft+"px, "+sourceTop+"px)");},_open:function(){var that=this;if(typeof that.onOpenBefore==="function"){that.onOpenBefore();}this.$body.removeClass(this.animationParsed);this.$jconfirmBg.removeClass("jconfirm-bg-h");this.$body.focus();that.$jconfirmBoxContainer.css("transform","translate("+0+"px, "+0+"px)");setTimeout(function(){that.$body.css(that._getCSS(that.animationSpeed,1));that.$body.css({"transition-property":that.$body.css("transition-property")+", margin"});that.$jconfirmBoxContainer.addClass("jconfirm-no-transition");that._modalReady.resolve();if(typeof that.onOpen==="function"){that.onOpen();}that.$el.addClass(that.loadedClass);},this.animationSpeed);},loadedClass:"jconfirm-open",isClosed:function(){return !this.$el||this.$el.parent().length===0;},isOpen:function(){return !this.isClosed();},toggle:function(){if(!this.isOpen()){this.open();}else{this.close();}}};w.jconfirm.instances=[];w.jconfirm.lastFocused=false;w.jconfirm.pluginDefaults={template:'
            ',title:"Hello",titleClass:"",type:"default",typeAnimated:true,draggable:true,dragWindowGap:15,dragWindowBorder:true,animateFromElement:true,alignMiddle:true,smoothContent:true,content:"Are you sure to continue?",buttons:{},defaultButtons:{ok:{action:function(){}},close:{action:function(){}}},contentLoaded:function(){},icon:"",lazyOpen:false,bgOpacity:null,theme:"light",animation:"scale",closeAnimation:"scale",animationSpeed:400,animationBounce:1,escapeKey:true,rtl:false,container:"body",containerFluid:false,backgroundDismiss:false,backgroundDismissAnimation:"shake",autoClose:false,closeIcon:null,closeIconClass:false,watchInterval:100,columnClass:"col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1",boxWidth:"50%",scrollToPreviousElement:true,scrollToPreviousElementAnimate:true,useBootstrap:true,offsetTop:40,offsetBottom:40,bootstrapClasses:{container:"container",containerFluid:"container-fluid",row:"row"},onContentReady:function(){},onOpenBefore:function(){},onOpen:function(){},onClose:function(){},onDestroy:function(){},onAction:function(){}};var keyDown=false;$(window).on("keydown",function(e){if(!keyDown){var $target=$(e.target);var pass=false;if($target.closest(".jconfirm-box").length){pass=true;}if(pass){$(window).trigger("jcKeyDown");}keyDown=true;}});$(window).on("keyup",function(){keyDown=false;});w.jconfirm.lastClicked=false;$(document).on("mousedown","button, a, [jc-source]",function(){w.jconfirm.lastClicked=$(this);});})); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/loco.xml b/wp-content/plugins/wp-mail-smtp/loco.xml new file mode 100644 index 0000000..9d9ec0c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/loco.xml @@ -0,0 +1,29 @@ + + + + + + . + + + assets/languages + + + + + + + + . + + + assets/pro/languages + + + + + diff --git a/wp-content/plugins/wp-mail-smtp/readme.txt b/wp-content/plugins/wp-mail-smtp/readme.txt new file mode 100644 index 0000000..f28b711 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/readme.txt @@ -0,0 +1,406 @@ +=== WP Mail SMTP by WPForms === +Contributors: wpforms, jaredatch, smub, slaFFik +Tags: smtp, wp mail smtp, wordpress smtp, gmail smtp, sendgrid smtp, mailgun smtp, mail, mailer, phpmailer, wp_mail, email, mailgun, sengrid, gmail, pepipost, sendinblue, wp smtp +Requires at least: 4.9 +Tested up to: 5.3 +Stable tag: 1.9.0 +Requires PHP: 5.3 + +The most popular WordPress SMTP and PHP Mailer plugin. Trusted by over 1 million sites. + +== Description == + +### WordPress Mail SMTP Plugin + +Having problems with your WordPress site not sending emails? You're not alone. Over 1 million websites use WP Mail SMTP to send their emails reliably. + +Our goal is to make email deliverability easy and reliable. We want to ensure your emails reach the inbox. + +WP Mail SMTP fixes your email deliverability by reconfiguring WordPress to use a proper SMTP provider when sending emails. + += What is SMTP? = + +SMTP (Simple Mail Transfer Protocol) is an industry standard for sending emails. Proper SMTP configuration helps increase email deliverability by using authentication. + +Popular email clients like Gmail, Yahoo, and Office 365 are in a constant battle with email spammers. One of the things they look at is if an email is originating from the location it claims to be originating from. + +If the proper authentication isn't there, then emails either go in the SPAM folder or worst, don't get delivered at all. + +This is a problem for a lot of WordPress sites because by default, WordPress uses the PHP mail function to send emails generated by WordPress or any contact form plugin like WPForms. + +The issue is that most WordPress hosting companies don't have their servers properly configured for sending PHP emails. + +The combination of two causes your WordPress emails to not get delivered. + += How does WP Mail SMTP work? = + +WP Mail SMTP plugin easily resolves email delivery problems by improving and changing how your WordPress site sends email. We reconfigure the `wp_mail()` function to either use proper SMTP host credentials or leverage a built-in SMTP mail provider. + +When using one of our built-in SMTP mail provider integrations (recommended), emails are sent using the provider's direct API. This means even if your web host is blocking SMTP ports, your emails still send successfully. + +This helps you fix all WordPress not sending email issues. + +WP Mail SMTP plugin includes many different SMTP setup options: + +1. Pepipost SMTP (Recommended) +2. Sendinblue SMTP (Recommended) +3. Mailgun SMTP +4. SendGrid SMTP +5. Gmail SMTP +6. Microsoft SMTP (Outlook.com and Office 365) [Pro] +7. Amazon SES SMTP [Pro] +8. All Other SMTP + +For all options, you can specify the "from name" and "email address" for outgoing emails. + +Instead of having users use different SMTP plugins and workflows for different SMTP providers, we decided to bring it all in one. This is what makes WP Mail SMTP, the best SMTP solution for WordPress. + += Pepipost SMTP = + +Pepipost is a recommended transactional email service. + +Every month they delivers over 8 billion emails from 20,000+ customers. + +Their mission is to reliably send emails in the most efficient way and at the most disruptive pricing ever. +Pepipost provides users 30,000 emails the first 30 days. + +Read our Pepipost documentation for more details. + += Sendinblue SMTP = + +Sendinblue is a recommended transactional email service. + +They serve 80,000+ growing companies around the world and send over 30 million emails each day. + +Their email deliverability experts are constantly at work optimizing the reliability and speed of their SMTP infrastructure. Sendinblue provides users 300 free emails per day. + +Read our Sendinblue documentation for more details. + += Mailgun SMTP = + +Mailgun SMTP is a popular SMTP service provider that allows you to send large quantities of emails. They provide 5,000 free emails per month for 3 months. + +WP Mail SMTP plugin offers a native integration with MailGun. All you have to do is connect your Mailgun account, and you will improve your email deliverability. + +Read our Mailgun documentation for more details. + += SendGrid SMTP = + +SendGrid has a free SMTP plan that you can use to send up to 100 emails per day. With our native SendGrid SMTP integration, you can easily and securely set up SendGrid SMTP on your WordPress site. + +Read our SendGrid documentation for more details. + += Gmail SMTP = + +Often bloggers and small business owners don't want to use third-party SMTP services. Well you can use your Gmail or G Suite account for SMTP emails. + +This allows you to use your professional email address and improve email deliverability. + +Unlike other Gmail SMTP plugins, our Gmail SMTP option uses OAuth to authenticate your Google account, keeping your login information 100% secure. + +Read our Gmail documentation for more details. + += Microsoft SMTP (Outlook.com and Office 365) = + +Many business use Outlook.com or Office 365 to their to power their email. For those users, the Microsoft mailer can be a great option. This integration allows you to use your existing Outlook.com or Office 365 account to send your emails reliably. + += Amazon SES SMTP = + +Advanced or technical users can harness the power of Amazon AWS (Amazon Web Services) with the Amazon SES mailer. With this integration, you can send a high volume of emails at a very reasonable rate. + +Read our Amazon SES documentation for more details. + += Other SMTP = + +WP Mail SMTP plugin also works with all major email services such as Gmail, Yahoo, Outlook, Microsoft Live, and any other email sending service that offers SMTP. + +You can set the following options: + +* Specify an SMTP host. +* Specify an SMTP port. +* Choose SSL / TLS encryption. +* Choose to use SMTP authentication or not. +* Specify an SMTP username and password. + +To see recommended settings for the popular services as well as troubleshooting tips, check out our SMTP documentation. + +We hope that you find WP Mail SMTP plugin helpful! + +### WP Mail SMTP PRO + +In addition to native Microsoft and Amazon SES integrations, WP Mail SMTP Pro provides access to many other powerful features and services. + +Click here to purchase WP Mail SMTP Pro now! + += Email Log = + +Email Logging lets you log and view all emails sent from your site. Email logs are helpful for storing emails for your records, auditing outgoing emails, and debugging during site development. + += Manage WordPress Emails and Notifications = + +The Manage Notification feature gives you full control over which email notifications WordPress sends. This means you can disable different WordPress notification emails. Don't want to receive emails when new users are created? No problem, turn it off. + += Expert Support = + +We provide limited support for the WP Mail SMTP plugin on the WordPress.org forums. Access to our world class one-on-one email support is available to WP Mail SMTP Pro users. + += White Glove Setup = + +Our White Glove Setup service is a great option that anyone can benefit from. Whether you don't have the time or maybe you feel a bit in over your head - we've got you covered. + +You can sit back and relax while we set up everything for you. White glove setup includes WP Mail SMTP plugin installation and setup, configuration adjustments to your DNS for proper email domain name verification, Mailgun setup, and final testing to confirm everything is passing with flying colors. + +### Security + +The WP Mail SMTP team takes security very seriously. Not only does the plugin follow all security best practices, but we have several options available to ensure your site is safe and secure. + +- Direct SMTP mailer integrations (recommended), such as Google and Mailgun, use the official provider APIs. This means you never enter your username or password in the plugin settings and these credentials are not stored in the database. Instead, we use tokens or API keys which are much more secure. + +- When using Other SMTP mailer, we provide the option to insert your password in your `wp-config.php` file, so it's not visible in your WordPress settings or saved in the database. + +### Credits + +WP Mail SMTP plugin was originally created by Callum Macdonald. It is now owned and maintained by the team behind WPForms - the best drag & drop form builder for WordPress. + +You can try the free version of WPForms plugin to see why it's the best in the market. + +### What's Next + +If you like this plugin, then consider checking out our other projects: + +* OptinMonster - Get More Email Subscribers with the most popular conversion optimization plugin for WordPress. +* MonsterInsights - See the Stats that Matter and Grow Your Business with Confidence. Best Google Analytics Plugin for WordPress. +* SeedProd - Jumpstart your website with the #1 Coming Soon & Maintenance Mode Plugin for WordPress. + +Visit WPBeginner to learn from our WordPress Tutorials and find out about other best WordPress plugins. + +== Installation == + +1. Install WP Mail SMTP by WPForms either via the WordPress.org plugin repository or by uploading the files to your server. (See instructions on how to install a WordPress plugin) +2. Activate WP Mail SMTP by WPForms. +3. Navigate to the Settings area of WP Mail SMTP in the WordPress admin. +4. Choose your SMTP option (Mailgun SMTP, SendGrid SMTP, Gmail SMTP, or Other SMTP) and follow the instructions to set it up. +5. Need more help? Get support with WP Mail SMTP PRO. + +== Frequently Asked Questions == + += Can I use this plugin to send email via Gmail, G Suite, Outlook.com, Office 365, Hotmail, Yahoo, or AOL SMTP? = + +Yes! We have extensive documentation that covers setting up SMTP most popular email services. + +Read our docs to see the correct SMTP settings for each service. + += Help! I need support or have an issue. = + +Please read our support policy for more information. + +Limited support is available for WP Mail SMTP users via WordPress.org support forums. + +Email support and set up assistance is available to WP Mail SMTP Pro users. + += I found a bug, now what? = + +If you've stumbled upon a bug, the best place to report it is in the WP Mail SMTP GitHub repository. GitHub is where the plugin is actively developed, and posting there will get your issue quickly seen by our developers (myself and Slava). Once posted, we'll review your bug report and triage the bug. When creating an issue, the more details you can add to your report, the faster the bug can be solved. + += Can you add feature x, y or z to the plugin? = + +Short answer: maybe. + +By all means please contact us to discuss features or options you'd like to see added to the plugin. We can't guarantee to add all of them, but we will consider all sensible requests. We can be contacted here: +https://wpmailsmtp.com/contact/ + +== Screenshots == + +1. WP Mail SMTP Settings page +2. Gmail / G Suite settings +3. Mailgun settings +4. SendGrid settings +5. SMTP settings +6. Send a Test Email + +== Changelog == + += 1.9.0 - 2020-03-23 = +* Added: Add various Status tests and Info section on Tools > Site Health page. +* Added: Notify admin if there are unsaved changes in plugin admin area options. +* Fixed: Test email now has a proper bottom margin for better look. +* Changed: Update "About us" plugin page with relevant information. +* Changed: Save default WordPress FROM Email address when incorrect FROM Email address is saved by a user. + += 1.8.1 - 2019-12-13 = +* Fixed: Revert Guzzle version to 6.4.1 because Sendinblue and Gmail mailers may experience issues under certain circumstances while sending emails (not all sites are affected). +* Fixed: Make compatible the WordPress PhpMailer class inline attachments management with the Sendgrid API. + += 1.8.0 - 2019-12-12 = +* Added: New recommended mailer: Pepipost. +* Added: "Suggest a Mailer" link in a list of mailers to send us your ideas about new ones. +* Fixed: Sendgrid: Content ID for attachments missing. +* Changed: Timeout to HTTP requests (pepipost, sendgrid, mailgun), same as max_execution_time, to prevent fails when sending emails with big attachments. + += 1.7.1 - 2019-11-11 = +* Fixed: Compatibility with WordPress 5.3. +* Fixed: `Processor::get_default_email()` always returns empty value when server incorrectly configured. + += 1.7.0 - 2019-10-24 = +* Added: Add a new constant `WPMS_DO_NOT_SEND` to block email sending. +* Fixed: Default email (wordpress@example.com) rewriting in CLI mode. +* Fixed: Incorrect conflicts detection with certain plugins. +* Fixed: various typos in plugin settings. + += 1.6.2 - 2019-09-02 = +* Fixed: Race condition when loading with certain plugins, that send emails very early. Makes email delivery more reliable. + += 1.6.0 - 2019-08-21 = +* Added: New transactional mailer: Sendinblue. +* Added: Educate users to use transactional mailers for better deliverability. +* Added: New option and filter to disable admin area delivery error notices. +* Changed: Hide private API key saved in the DB for API based mailers using `input[type=password]`. +* Changed: Update links to various docs, pointing now to https://wpmailsmtp.com. + += 1.5.2 - 2019-07-18 = +* Fixed: "Redirect URI mismatch" error for "Gmail" mailer when trying to re-authorize an account that was initially created with version < v1.5.0. +* Changed: Make "Authentication" setting in "Other SMTP" mailer ON by default for new users. +* Changed: Mailers docs links now point to wpmailsmtp.com own site. + += 1.5.1 - 2019-07-12 = +* Fixed: Duplicated emails sent to the first recipient in a loop (and others not receiving their emails). + += 1.5.0 - 2019-07-09 = +* Added: Loсo plugin support. +* Added: "About us" admin area page. +* Added: Display in debug output a possible conflicting plugin existence. +* Added: Lots of actions and filters to improve flexibility of the plugin. +* Changed: Plugin menu is now top level. +* Changed: Hide secrets/API keys in page DOM in plugin admin area. +* Changed: Do not save constant values into the database when plugin settings are saved. +* Changed: Lots of i18n improvements to support translation for both free and paid version of the plugin. +* Changed: Gmail mailer - allow to change From Name email header. +* Changed: Gmail mailer - display email used to create a connection. +* Changed: WordPress 4.9 is the minimum WordPress version we support. +* Fixed: X-Mailer header should be present in all emails. +* Fixed: PHP notices when migrating under certain circumstances from 0.x version of the plugin. +* Fixed: Options::get_group() now supports values set via constants. + += 1.4.2 - 2019-03-23 = +* Changed: Tested up to WordPress 5.1.x. +* Changed: Removed TGMPA library. + += 1.4.1 - 2018-12-03 = +* Fixed: correctly process backslashes in SMTP passwords defined via constants. +* Changed: allow to send a Test Email when Default (none) mailer is selected in plugin settings. + += 1.4.0 - 2018-11-29 = +* Added: New option: Do Not Send - block emails from being sent. +* Added: New option: Send HTML or plain text emails when doing an Email Test. +* Added: New option: Mailgun region selection - US and EU (US is default to preserve compatibility). +* Fixed: Compatibility with WordPress 3.6+. +* Fixed: Compatibility with WordPress 5.0. +* Fixed: Constants usage is much more reliable now, works correctly on Multisite. Constants are global accross the whole network. +* Fixed: Preserve multipart emails when using Sendgrid/Mailgun mailers (were converted to HTML-only). +* Fixed: Security hardening. +* Changed: Prefill Email Test page From field with currently logged in user email. +* Changed: Update libraries: google/apiclient-services, google/auth, phpseclib/phpseclib and their dependecies. +* Changed: Display in debug output cURL version if Gmail mailing failed. +* Changed: Display in debug output OpenSSL version if it exists if Gmail/SMTP mailing failed. +* Changed: Display plugin version in dashboard error notice when emailing failed. +* Changed: Do not allow to send Test Email if mailer not configured properly. +* Changed: Notify in plugin admin area that Gmail doesn't allow to redefine From Name/Email etc. +* Changed: List all constants with descriptions in plugin main file: wp_mail_smtp.php. +* Changed: TGMPA: change descriptions from "Required" to "Recommended" (labels were incorrect). + += 1.3.3 - 2018-07-05 = +* Fixed: Compatibility with other plugins, that are using Google Service or Google Client classes. +* Changed: Optimize code loading. + += 1.3.2 - 2018-06-29 = +* Make sure that other plugins/themes are not conflicting with our TGMPA library. + += 1.3.1 - 2018-06-29 = +* Fixed: Other SMTP: Clear new Debug messages about failed email delivery on next successful email sending. +* Fixed: Introduce conditional autoloader to workaround Gmail PHP 5.5 requirement and its library compatibility issues vs PHP 5.3+ minimum viable plugin version. + += 1.3.0 - 2018-06-28 = +* Added: New option: force From Email rewrite regardless of the current value. +* Added: New option: force From Name rewrite regardless of the current value. +* Added: New option: remove all plugin data on plugin uninstall (when user deletes it). +* Added: Notify site admins in wp-admin area with a notice about last failed email delivery. Cleans up on successful delivery. +* Added: Notify site admins in wp-admin area with a notice about possible compatibility issues with other SMTP and email delivery plugins. +* Added: Improve User Debug Experience when doing Email Test - display helpful description and steps to fix the issue. +* Added: New users: provide default SMTP Port value for new users based on Encryption selection. +* Added: New users: notify about not configured plugin settings. +* Added: New users: Recommend free WPForms Lite plugin for those who don't have it. +* Added: SendGrid/Mailgun: provide support for multipart/alternative types of emails. +* Added: Gmail: new button to remove connection and to connect a new Google account. +* Fixed: Support plugin installation into /mu-plugins/ directory. +* Fixed: SendGrid: required text/plain part of email being the first one - fixes plain text emails not having links. +* Fixed: SendGrid and Mailgun: improperly sending plain text emails in html format. +* Fixed: SMTP Debug output was empty in some cases. +* Fixed: Compatibility with lots of other plugins that use Google Analytics library of different versions. +* Fixed: "client_id is empty" is no more a problem, should be fixed. +* Changed: For SendGrid and Mailgun allow using custom defined attachments names if present. Fallback to file name. +* Changed: Gmail: switch to a wider scope to prevent possible issues in certain circumstances. +* Changed: Remove whitespaces start/end of keys, secrets etc. +* Changed: Improved helpful description tests of various options. +* Changed: Improved plugin autoloading functionality. + += 1.2.5 - 2017-02-05 = +* Fixed: `Return path` can't be turned off. +* Fixed: `Authentication` sometimes can't be turned off. +* Fixed: `Auto TLS` sometimes can't be turned off. +* Fixed: BCC support for Gmail was broken. +* Fixed: Debug output improved to handle SELinux and grsecurity. +* Fixed: Strip slashes from plugin settings (useful for `From Name` option). +* Fixed: Change the way sanitization is done to prevent accidental removal of useful data. +* Fixed: Plugin activation will not overwrite settings back to defaults. +* Fixed: Properly set `Auto TLS` option on plugin activation. +* Fixed: Providers autoloading improved for certain Windows-based installs. +* Fixed: Use the proper path to load translations from plugin's `/languages` directory. +* Changed: Do not autoload on each page request plugin settings from WordPress options table. +* Changed: Do not autoload Pepipost classes unless it's saved as active mailer in settings. + += 1.2.4 - 2017-01-28 = +* Fixed: Improved escaping in debug reporting. + += 1.2.3 - 2017-01-22 = +* Fixed: Gmail tokens were reset after clicking Save Settings. +* Fixed: Slight typo in Gmail success message. + += 1.2.2 - 2017-12-27 = +* Fixed: Correctly handle Mailgun debug message for an incorrect api key. +* Fixed: Fatal error for Gmail and SMTP mailers with Nginx web-server (without Apache at all). +* Changed: Update X-Mailer emails header to show the real sender with a mailer and plugin version. + += 1.2.1 - 2017-12-21 = +* Fixed: Failed SMTP connections generate fatal errors. + += 1.2.0 - 2017-12-21 = +* Fixed: Decrease the factual minimum WordPress version from 3.9 to 3.6. +* Changed: Improve debug output for all mail providers. + += 1.1.0 - 2017-12-18 = +* Added: New option "Auto TLS" for SMTP mailer. Default is enabled. Migration routine for all sites. +* Changed: Improve debug output - clear styles and context-aware content. +* Changed: Better exceptions handling for Google authentication process. +* Changed: Do not sanitize passwords, api keys etc - as they may contain special characters in certain order and sanitization will break those values. +* Changed: Improve wording of some helpful texts inside plugin admin area. +* Fixed: Do not include certain files in dependency libraries that are not used by Google mailer. This should stop flagging plugin by Wordfence and VaultPress. +* Fixed: Constants usage is working now, to define the SMTP password, for example. +* Fixed: Notice for default mailer. + += 1.0.2 - 2017-12-12 = +* Fixed: PHPMailer using incorrect SMTPSecure value. + += 1.0.1 - 2017-12-12 = +* Fixed: Global POST processing conflict. + += 1.0.0 - 2017-12-12 = +* Added: Automatic migration tool to move options from older storage format to a new one. +* Added: Added Gmail & G Suite email provider integration - without your email and password. +* Added: Added SendGrid email provider integration - using the API key only. +* Added: Added Mailgun email provider integration - using the API key and configured domain only. +* Added: New compatibility mode - for PHP 5.2 old plugin will be loaded, for PHP 5.3 and higher - new version of admin area and new functionality. +* Changed: The new look of the admin area. +* Changed: SMTP password field now has "password" type. +* Changed: SMTP password field does not display real password at all when using constants in `wp-config.php` to define it. +* Changed: Escape properly all translations. +* Changed: More helpful test email content (with a mailer name). diff --git a/wp-content/plugins/wp-mail-smtp/src/Admin/Area.php b/wp-content/plugins/wp-mail-smtp/src/Admin/Area.php new file mode 100644 index 0000000..0eac582 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Admin/Area.php @@ -0,0 +1,891 @@ +hooks(); + } + + /** + * Assign all hooks to proper places. + * + * @since 1.0.0 + */ + protected function hooks() { + + // Add the Settings link to a plugin on Plugins page. + add_filter( 'plugin_action_links', array( $this, 'add_plugin_action_link' ), 10, 2 ); + + // Add the options page. + add_action( 'admin_menu', array( $this, 'add_admin_options_page' ) ); + + // Admin footer text. + add_filter( 'admin_footer_text', array( $this, 'get_admin_footer' ), 1, 2 ); + + // Enqueue admin area scripts and styles. + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); + + // Process the admin page forms actions. + add_action( 'admin_init', array( $this, 'process_actions' ) ); + + // Display custom notices based on the error/success codes. + add_action( 'admin_init', array( $this, 'display_custom_auth_notices' ) ); + + // Display notice instructing the user to complete plugin setup. + add_action( 'admin_init', array( $this, 'display_setup_notice' ) ); + + // Outputs the plugin admin header. + add_action( 'in_admin_header', array( $this, 'display_admin_header' ), 100 ); + + // Hide all unrelated to the plugin notices on the plugin admin pages. + add_action( 'admin_print_scripts', array( $this, 'hide_unrelated_notices' ) ); + + // Process all AJAX requests. + add_action( 'wp_ajax_wp_mail_smtp_ajax', array( $this, 'process_ajax' ) ); + } + + /** + * Display custom notices based on the error/success codes. + * + * @since 1.0.0 + */ + public function display_custom_auth_notices() { + + $error = isset( $_GET['error'] ) ? sanitize_key( $_GET['error'] ) : ''; // phpcs:ignore + $success = isset( $_GET['success'] ) ? sanitize_key( $_GET['success'] ) : ''; // phpcs:ignore + + if ( empty( $error ) && empty( $success ) ) { + return; + } + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + switch ( $error ) { + case 'google_access_denied': + WP::add_admin_notice( + /* translators: %s - error code, returned by Google API. */ + sprintf( esc_html__( 'There was an error while processing the authentication request: %s. Please try again.', 'wp-mail-smtp' ), '' . $error . '' ), + WP::ADMIN_NOTICE_ERROR + ); + break; + + case 'google_no_code_scope': + case 'microsoft_no_code': + WP::add_admin_notice( + esc_html__( 'There was an error while processing the authentication request. Please try again.', 'wp-mail-smtp' ), + WP::ADMIN_NOTICE_ERROR + ); + break; + + case 'google_no_clients': + WP::add_admin_notice( + esc_html__( 'There was an error while processing the authentication request. Please make sure that you have Client ID and Client Secret both valid and saved.', 'wp-mail-smtp' ), + WP::ADMIN_NOTICE_ERROR + ); + break; + } + + switch ( $success ) { + case 'google_site_linked': + WP::add_admin_notice( + esc_html__( 'You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail.', 'wp-mail-smtp' ), + WP::ADMIN_NOTICE_SUCCESS + ); + break; + case 'microsoft_site_linked': + WP::add_admin_notice( + esc_html__( 'You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook.', 'wp-mail-smtp' ), + WP::ADMIN_NOTICE_SUCCESS + ); + break; + } + } + + /** + * Display notice instructing the user to complete plugin setup. + * + * @since 1.3.0 + */ + public function display_setup_notice() { + + // Bail if we're not on a plugin page. + if ( ! $this->is_admin_page( 'general' ) ) { + return; + } + + $default_options = wp_json_encode( Options::get_defaults() ); + $current_options = wp_json_encode( Options::init()->get_all() ); + + // Check if the current settings are the same as the default settings. + if ( $current_options !== $default_options ) { + return; + } + + // Display notice informing user further action is needed. + WP::add_admin_notice( + sprintf( + wp_kses( + /* translators: %s - Mailer anchor link. */ + __( 'Thanks for using WP Mail SMTP! To complete the plugin setup and start sending emails, please select and configure your Mailer.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + ), + 'strong' => array(), + ) + ), + wp_mail_smtp()->get_admin()->get_admin_page_url( self::SLUG . '#wp-mail-smtp-setting-row-mailer' ) + ), + WP::ADMIN_NOTICE_INFO + ); + } + + /** + * Add admin area menu item. + * + * @since 1.0.0 + * @since 1.5.0 Moved the menu to the top level. Added several more pages. + */ + public function add_admin_options_page() { + + $this->hook = \add_menu_page( + \esc_html__( 'WP Mail SMTP', 'wp-mail-smtp' ), + \esc_html__( 'WP Mail SMTP', 'wp-mail-smtp' ), + 'manage_options', + self::SLUG, + array( $this, 'display' ), + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM5ZWEzYTgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmlld0JveD0iMCAwIDQzIDM0Ij48cGF0aCBkPSJNMC4wMDcsMy41ODVWMjAuNDIxcTAsMy41ODYsMy43NTEsMy41ODVMMjAsMjRWMTlIMzBWMTQuMDE0bDAuOTkxLTFMMzQsMTNWMy41ODVRMzQsMCwzMC4yNDksMEgzLjc1OFEwLjAwNywwLC4wMDcsMy41ODVoMFpNMy41MjQsNi4xNTdhMS40OSwxLjQ5LDAsMCwxLS41MDgtMC45MzUsMS41ODEsMS41ODEsMCwwLDEsLjI3NC0xLjIwOCwxLjQ0OSwxLjQ0OSwwLDAsMSwxLjA5NC0uNjYzLDEuNzU2LDEuNzU2LDAsMCwxLDEuMjUuMzEybDExLjQwOSw3LjcxNkwyOC4zNzQsMy42NjNhMS45NiwxLjk2LDAsMCwxLDEuMjg5LS4zMTIsMS41NDYsMS41NDYsMCwwLDEsMS4wOTQuNjYzLDEuNCwxLjQsMCwwLDEsLjI3MywxLjIwOCwxLjY3LDEuNjcsMCwwLDEtLjU0Ny45MzVMMTcuMDQzLDE3LjIyNVoiLz48cGF0aCBkPSJNMjIsMjhIMzJsLTAuMDA5LDQuNjI0YTEuMTI2LDEuMTI2LDAsMCwwLDEuOTIyLjhsOC4yNS04LjIzNmExLjEyNiwxLjEyNiwwLDAsMCwwLTEuNTk0bC04LjI1LTguMjQxYTEuMTI2LDEuMTI2LDAsMCwwLTEuOTIyLjh2NC44NjZMMjIsMjF2N1oiLz48L3N2Zz4=', + 98 + ); + + \add_submenu_page( + self::SLUG, + $this->get_current_tab_title() . ' ‹ ' . \esc_html__( 'Settings', 'wp-mail-smtp' ), + \esc_html__( 'Settings', 'wp-mail-smtp' ), + 'manage_options', + self::SLUG, + array( $this, 'display' ) + ); + \add_submenu_page( + self::SLUG, + \esc_html__( 'Email Log', 'wp-mail-smtp' ), + \esc_html__( 'Email Log', 'wp-mail-smtp' ), + 'manage_options', + self::SLUG . '-logs', + array( $this, 'display' ) + ); + \add_submenu_page( + self::SLUG, + \esc_html__( 'About Us', 'wp-mail-smtp' ), + \esc_html__( 'About Us', 'wp-mail-smtp' ), + 'manage_options', + self::SLUG . '-about', + array( $this, 'display' ) + ); + } + + /** + * Enqueue admin area scripts and styles. + * + * @since 1.0.0 + * @since 1.5.0 Added new assets for new pages. + * @since 1.7.0 Added jQuery Confirm library css/js files. + * + * @param string $hook + */ + public function enqueue_assets( $hook ) { + + if ( strpos( $hook, self::SLUG ) === false ) { + return; + } + + // General styles and js. + \wp_enqueue_style( + 'wp-mail-smtp-admin', + \wp_mail_smtp()->assets_url . '/css/smtp-admin.min.css', + false, + WPMS_PLUGIN_VER + ); + + \wp_enqueue_script( + 'wp-mail-smtp-admin', + \wp_mail_smtp()->assets_url . '/js/smtp-admin' . WP::asset_min() . '.js', + array( 'jquery' ), + WPMS_PLUGIN_VER, + false + ); + + \wp_localize_script( + 'wp-mail-smtp-admin', + 'wp_mail_smtp', + array( + 'text_provider_remove' => esc_html__( 'Are you sure you want to reset the current provider connection? You will need to immediately create a new one to be able to send emails.', 'wp-mail-smtp' ), + 'text_settings_not_saved' => esc_html__( 'Changes that you made to the settings are not saved!', 'wp-mail-smtp' ), + 'education' => array( + 'upgrade_icon_lock' => '', + 'upgrade_title' => esc_html__( '%name% is a PRO Feature', 'wp-mail-smtp' ), + 'upgrade_button' => esc_html__( 'Upgrade to Pro', 'wp-mail-smtp' ), + 'upgrade_url' => 'https://wpmailsmtp.com/lite-upgrade/?discount=SMTPLITEUPGRADE&utm_source=WordPress&utm_medium=plugin-settings&utm_campaign=liteplugin', + 'upgrade_bonus' => '

            ' . + wp_kses( + __( 'Bonus: WP Mail SMTP users get 20% off regular price,
            applied at checkout.', 'wp-mail-smtp' ), + array( + 'strong' => true, + 'span' => true, + 'br' => true, + ) + ) + . '

            ', + 'upgrade_doc' => ' + ' . esc_html__( 'Already purchased?', 'wp-mail-smtp' ) . ' + ', + ), + ) + ); + + /* + * jQuery Confirm library v3.3.4. + */ + \wp_enqueue_style( + 'wp-mail-smtp-admin-jconfirm', + \wp_mail_smtp()->assets_url . '/libs/jquery-confirm.min.css', + array( 'wp-mail-smtp-admin' ), + '3.3.4' + ); + \wp_enqueue_script( + 'wp-mail-smtp-admin-jconfirm', + \wp_mail_smtp()->assets_url . '/libs/jquery-confirm.min.js', + array( 'wp-mail-smtp-admin' ), + '3.3.4', + false + ); + + /* + * Logs page. + */ + if ( $this->is_admin_page( 'logs' ) ) { + \wp_enqueue_style( + 'wp-mail-smtp-admin-logs', + apply_filters( 'wp_mail_smtp_admin_enqueue_assets_logs_css', '' ), + array( 'wp-mail-smtp-admin' ), + WPMS_PLUGIN_VER + ); + + \wp_enqueue_script( + 'wp-mail-smtp-admin-logs', + apply_filters( 'wp_mail_smtp_admin_enqueue_assets_logs_js', '' ), + array( 'wp-mail-smtp-admin' ), + WPMS_PLUGIN_VER, + false + ); + } + + /* + * About page. + */ + if ( $this->is_admin_page( 'about' ) ) { + + \wp_enqueue_style( + 'wp-mail-smtp-admin-about', + \wp_mail_smtp()->assets_url . '/css/smtp-about.min.css', + array( 'wp-mail-smtp-admin' ), + WPMS_PLUGIN_VER + ); + + \wp_enqueue_script( + 'wp-mail-smtp-admin-about', + \wp_mail_smtp()->assets_url . '/js/smtp-about' . WP::asset_min() . '.js', + array( 'wp-mail-smtp-admin' ), + '0.7.2', + false + ); + + $settings = array( + 'ajax_url' => \admin_url( 'admin-ajax.php' ), + 'nonce' => \wp_create_nonce( 'wp-mail-smtp-about' ), + // Strings. + 'plugin_activate' => \esc_html__( 'Activate', 'wp-mail-smtp' ), + 'plugin_activated' => \esc_html__( 'Activated', 'wp-mail-smtp' ), + 'plugin_active' => \esc_html__( 'Active', 'wp-mail-smtp' ), + 'plugin_inactive' => \esc_html__( 'Inactive', 'wp-mail-smtp' ), + 'plugin_processing' => \esc_html__( 'Processing...', 'wp-mail-smtp' ), + 'plugin_install_error' => \esc_html__( 'Could not install a plugin. Please download from WordPress.org and install manually.', 'wp-mail-smtp' ), + 'plugin_install_activate_btn' => \esc_html__( 'Install and Activate', 'wp-mail-smtp' ), + 'plugin_activate_btn' => \esc_html__( 'Activate', 'wp-mail-smtp' ), + 'plugin_download_btn' => \esc_html__( 'Download', 'wp-mail-smtp' ), + ); + + \wp_localize_script( + 'wp-mail-smtp-admin-about', + 'wp_mail_smtp_about', + $settings + ); + + \wp_enqueue_script( + 'wp-mail-smtp-admin-about-matchheight', + \wp_mail_smtp()->assets_url . '/js/jquery.matchHeight.min.js', + array( 'wp-mail-smtp-admin' ), + '0.7.2', + false + ); + } + + do_action( 'wp_mail_smtp_admin_area_enqueue_assets', $hook ); + } + + /** + * Outputs the plugin admin header. + * + * @since 1.0.0 + */ + public function display_admin_header() { + + // Bail if we're not on a plugin page. + if ( ! $this->is_admin_page() ) { + return; + } + ?> + +
            +
            + + +
            + + is_admin_page() ) { + $url = 'https://wordpress.org/support/plugin/wp-mail-smtp/reviews/?filter=5#new-post'; + + $text = sprintf( + wp_kses( + /* translators: %1$s - WP.org link; %2$s - same WP.org link. */ + __( 'Please rate WP Mail SMTP ★★★★★ on WordPress.org to help us spread the word. Thank you from the WP Mail SMTP team!', 'wp-mail-smtp' ), + array( + 'strong' => array(), + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + ) + ), + $url, + $url + ); + } + + return $text; + } + + /** + * Display content of the admin area page. + * + * @since 1.0.0 + * @since 1.5.0 Rewrite to distinguish between General tabs and separate pages. + */ + public function display() { + + // Bail if we're not on a plugin page. + if ( ! $this->is_admin_page() ) { + return; + } + + $page = ! empty( $_GET['page'] ) ? \sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore + ?> + +
            + + + +
            + display_tabs(); ?> +
            + + is_pro() && wp_mail_smtp()->pro->get_logs()->is_archive(); + ?> + +
            + display(); ?> +
            + + + +
            + display(); ?> +
            + + +
            + + + +
            + get_pages() as $page_slug => $page ) : + $label = $page->get_label(); + if ( empty( $label ) ) { + continue; + } + $class = $page_slug === $this->get_current_tab() ? 'active' : ''; + ?> + + + + + + +
            + +
            +

            + get_current_tab_title() ); ?> +

            + + display_current_tab_content(); ?> +
            + + get_pages(); + + if ( ! array_key_exists( $this->get_current_tab(), $pages ) ) { + return; + } + + $pages[ $this->get_current_tab() ]->display(); + } + + /** + * Get the current admin area tab. + * + * @since 1.0.0 + * + * @return string + */ + protected function get_current_tab() { + + $current = ''; + + if ( $this->is_admin_page( 'general' ) ) { + $current = ! empty( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'settings'; // phpcs:ignore + } + + return $current; + } + + /** + * Get the array of default registered tabs for General page admin area. + * + * @since 1.0.0 + * + * @return \WPMailSMTP\Admin\PageAbstract[] + */ + public function get_pages() { + + if ( empty( $this->pages ) ) { + $this->pages = array( + 'settings' => new Pages\SettingsTab(), + 'test' => new Pages\TestTab(), + 'logs' => new Pages\LogsTab(), + 'control' => new Pages\ControlTab(), + 'misc' => new Pages\MiscTab(), + 'auth' => new Pages\AuthTab(), + ); + } + + return apply_filters( 'wp_mail_smtp_admin_get_pages', $this->pages ); + } + + /** + * Get the current tab title. + * + * @since 1.0.0 + * + * @return string + */ + public function get_current_tab_title() { + + $pages = $this->get_pages(); + + if ( ! array_key_exists( $this->get_current_tab(), $pages ) ) { + return ''; + } + + return $pages[ $this->get_current_tab() ]->get_title(); + } + + /** + * Check whether we are on an admin page. + * + * @since 1.0.0 + * @since 1.5.0 Added support for new pages. + * + * @param array|string $slug ID(s) of a plugin page. Possible values: 'general', 'logs', 'about' or array of them. + * + * @return bool + */ + public function is_admin_page( $slug = array() ) { + + $cur_page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore + $check = self::SLUG; + $pages_equal = false; + + if ( is_string( $slug ) ) { + $slug = sanitize_key( $slug ); + + if ( + in_array( $slug, self::$pages_registered, true ) && + $slug !== 'general' + ) { + $check = self::SLUG . '-' . $slug; + } + + $pages_equal = $cur_page === $check; + } elseif ( is_array( $slug ) ) { + if ( empty( $slug ) ) { + $slug = array_map( function ( $v ) { + if ( $v === 'general' ) { + return Area::SLUG; + } + return Area::SLUG . '-' . $v; + }, self::$pages_registered ); + } else { + $slug = array_map( function ( $v ) { + if ( $v === 'general' ) { + return Area::SLUG; + } + return Area::SLUG . '-' . sanitize_key( $v ); + }, $slug ); + } + + $pages_equal = in_array( $cur_page, $slug, true ); + } + + return is_admin() && $pages_equal; + } + + /** + * Give ability to use either admin area option or a filter to hide error notices about failed email delivery. + * Filter has higher priority and overrides an option. + * + * @since 1.6.0 + * + * @return bool + */ + public function is_error_delivery_notice_enabled() { + + $is_hard_enabled = (bool) apply_filters( 'wp_mail_smtp_admin_is_error_delivery_notice_enabled', true ); + + // If someone changed the value to false using a filter - disable completely. + if ( ! $is_hard_enabled ) { + return false; + } + + return ! (bool) Options::init()->get( 'general', 'email_delivery_errors_hidden' ); + } + + /** + * All possible plugin forms manipulation will be done here. + * + * @since 1.0.0 + */ + public function process_actions() { + + // Bail if we're not on a plugin General page. + if ( ! $this->is_admin_page( 'general' ) ) { + return; + } + + $pages = $this->get_pages(); + + // Allow to process only own tabs. + if ( ! array_key_exists( $this->get_current_tab(), $pages ) ) { + return; + } + + // Process POST only if it exists. + if ( ! empty( $_POST ) ) { + if ( ! empty( $_POST['wp-mail-smtp'] ) ) { + $post = $_POST['wp-mail-smtp']; + } else { + $post = array(); + } + + $pages[ $this->get_current_tab() ]->process_post( $post ); + } + + // This won't do anything for most pages. + // Works for plugin page only, when GET params are allowed. + $pages[ $this->get_current_tab() ]->process_auth(); + } + + /** + * Process all AJAX requests. + * + * @since 1.3.0 + * @since 1.5.0 Added tasks to process plugins management. + */ + public function process_ajax() { + + $data = array(); + + // Only admins can fire these ajax requests. + if ( ! current_user_can( 'manage_options' ) ) { + wp_send_json_error( $data ); + } + + if ( empty( $_POST['task'] ) ) { // phpcs:ignore + wp_send_json_error( $data ); + } + + $task = sanitize_key( $_POST['task'] ); // phpcs:ignore + + switch ( $task ) { + case 'pro_banner_dismiss': + update_user_meta( get_current_user_id(), 'wp_mail_smtp_pro_banner_dismissed', true ); + $data['message'] = esc_html__( 'WP Mail SMTP Pro related message was successfully dismissed.', 'wp-mail-smtp' ); + break; + + case 'about_plugin_install': + Pages\About::ajax_plugin_install(); + break; + + case 'about_plugin_activate': + Pages\About::ajax_plugin_activate(); + break; + + case 'notice_dismiss': + $notice = sanitize_key( $_POST['notice'] ); // phpcs:ignore + $mailer = sanitize_key( $_POST['mailer'] ); // phpcs:ignore + if ( empty( $notice ) || empty( $mailer ) ) { + break; + } + + update_user_meta( get_current_user_id(), "wp_mail_smtp_notice_{$notice}_for_{$mailer}_dismissed", true ); + $data['message'] = esc_html__( 'Educational notice for this mailer was successfully dismissed.', 'wp-mail-smtp' ); + break; + + default: + // Allow custom tasks data processing being added here. + $data = apply_filters( 'wp_mail_smtp_admin_process_ajax_' . $task . '_data', $data ); + } + + // Final ability to rewrite all the data, just in case. + $data = (array) apply_filters( 'wp_mail_smtp_admin_process_ajax_data', $data, $task ); + + if ( empty( $data ) ) { + wp_send_json_error( $data ); + } + + wp_send_json_success( $data ); + } + + /** + * Add a link to Settings page of a plugin on Plugins page. + * + * @since 1.0.0 + * @since 1.5.0 Added a link to Email Log. + * + * @param array $links + * @param string $file + * + * @return mixed + */ + public function add_plugin_action_link( $links, $file ) { + + // Will target both pro and lite version of a plugin. + if ( strpos( $file, 'wp-mail-smtp' ) === false ) { + return $links; + } + + $settings_link = '' . esc_html__( 'Settings', 'wp-mail-smtp' ) . ''; + $logs_link = '' . esc_html__( 'Email Log', 'wp-mail-smtp' ) . ''; + + array_unshift( $links, $settings_link, $logs_link ); + + return $links; + } + + /** + * Get plugin admin area page URL. + * + * @since 1.0.0 + * @since 1.5.0 URL is changed to support the top level position of the plugin admin area. + * + * @param string $page + * + * @return string + */ + public function get_admin_page_url( $page = '' ) { + + if ( empty( $page ) ) { + $page = self::SLUG; + } + + return add_query_arg( + 'page', + $page, + admin_url( 'admin.php' ) + ); + } + + /** + * Remove all non-WP Mail SMTP plugin notices from plugin pages. + * + * @since 1.0.0 + */ + public function hide_unrelated_notices() { + + // Bail if we're not on our screen or page. + if ( empty( $_REQUEST['page'] ) || strpos( $_REQUEST['page'], self::SLUG ) === false ) { + return; + } + + global $wp_filter; + + if ( ! empty( $wp_filter['user_admin_notices']->callbacks ) && is_array( $wp_filter['user_admin_notices']->callbacks ) ) { + foreach ( $wp_filter['user_admin_notices']->callbacks as $priority => $hooks ) { + foreach ( $hooks as $name => $arr ) { + if ( is_object( $arr['function'] ) && $arr['function'] instanceof \Closure ) { + unset( $wp_filter['user_admin_notices']->callbacks[ $priority ][ $name ] ); + continue; + } + if ( ! empty( $arr['function'][0] ) && is_object( $arr['function'][0] ) && strpos( strtolower( get_class( $arr['function'][0] ) ), 'wpmailsmtp' ) !== false ) { + continue; + } + if ( ! empty( $name ) && strpos( strtolower( $name ), 'wpmailsmtp' ) === false ) { + unset( $wp_filter['user_admin_notices']->callbacks[ $priority ][ $name ] ); + } + } + } + } + + if ( ! empty( $wp_filter['admin_notices']->callbacks ) && is_array( $wp_filter['admin_notices']->callbacks ) ) { + foreach ( $wp_filter['admin_notices']->callbacks as $priority => $hooks ) { + foreach ( $hooks as $name => $arr ) { + if ( is_object( $arr['function'] ) && $arr['function'] instanceof \Closure ) { + unset( $wp_filter['admin_notices']->callbacks[ $priority ][ $name ] ); + continue; + } + if ( ! empty( $arr['function'][0] ) && is_object( $arr['function'][0] ) && strpos( strtolower( get_class( $arr['function'][0] ) ), 'wpmailsmtp' ) !== false ) { + continue; + } + if ( ! empty( $name ) && strpos( strtolower( $name ), 'wpmailsmtp' ) === false ) { + unset( $wp_filter['admin_notices']->callbacks[ $priority ][ $name ] ); + } + } + } + } + + if ( ! empty( $wp_filter['all_admin_notices']->callbacks ) && is_array( $wp_filter['all_admin_notices']->callbacks ) ) { + foreach ( $wp_filter['all_admin_notices']->callbacks as $priority => $hooks ) { + foreach ( $hooks as $name => $arr ) { + if ( is_object( $arr['function'] ) && $arr['function'] instanceof \Closure ) { + unset( $wp_filter['all_admin_notices']->callbacks[ $priority ][ $name ] ); + continue; + } + if ( ! empty( $arr['function'][0] ) && is_object( $arr['function'][0] ) && strpos( strtolower( get_class( $arr['function'][0] ) ), 'wpmailsmtp' ) !== false ) { + continue; + } + if ( ! empty( $name ) && strpos( strtolower( $name ), 'wpmailsmtp' ) === false ) { + unset( $wp_filter['all_admin_notices']->callbacks[ $priority ][ $name ] ); + } + } + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Admin/PageAbstract.php b/wp-content/plugins/wp-mail-smtp/src/Admin/PageAbstract.php new file mode 100644 index 0000000..70b556d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Admin/PageAbstract.php @@ -0,0 +1,87 @@ +slug, + admin_url( 'admin.php?page=' . Area::SLUG ) + ) + ); + } + + /** + * Process tab form submission ($_POST ). + * + * @since 1.0.0 + * + * @param array $data $_POST data specific for the plugin. + */ + public function process_post( $data ) { + } + + /** + * Process tab & mailer specific Auth actions. + * + * @since 1.0.0 + */ + public function process_auth() { + } + + /** + * Print the nonce field for a specific tab. + * + * @since 1.0.0 + */ + public function wp_nonce_field() { + + wp_nonce_field( Area::SLUG . '-' . $this->slug ); + } + + /** + * Make sure that a user was referred from plugin admin page. + * To avoid security problems. + * + * @since 1.0.0 + */ + public function check_admin_referer() { + + check_admin_referer( Area::SLUG . '-' . $this->slug ); + } + + /** + * Save button to be reused on other tabs. + * + * @since 1.5.0 + */ + public function display_save_btn() { + + ?> + +

            + +

            + + get_defined_tab( $tab ), + admin_url( 'admin.php?page=' . Area::SLUG . '-' . $this->slug ) + ); + } + + /** + * Get the current tab. + * + * @since 1.5.0 + * + * @return string Current tab. + */ + public function get_current_tab() { + + if ( empty( $_GET['tab'] ) ) { // phpcs:ignore + return $this->slug; + } + + return $this->get_defined_tab( $_GET['tab'] ); // phpcs:ignore + } + + /** + * Get the defined or default tab. + * + * @since 1.5.0 + * + * @param string $tab Tab to check. + * + * @return string Defined tab. Fallback to default one if it doesn't exist. + */ + protected function get_defined_tab( $tab ) { + + $tab = \sanitize_key( $tab ); + + return \in_array( $tab, $this->tabs, true ) ? $tab : $this->slug; + } + + /** + * Get label for a tab. + * Process only those that exists. + * Defaults to "About Us". + * + * @since 1.5.0 + * + * @param string $tab Tab to get label for. + * + * @return string + */ + public function get_label( $tab = '' ) { + + switch ( $this->get_defined_tab( $tab ) ) { + case 'versus': + $label = \sprintf( + /* translators: %s - plugin current license type. */ + \esc_html__( '%s vs Pro', 'wp-mail-smtp' ), + \ucfirst( \wp_mail_smtp()->get_license_type() ) + ); + break; + + case 'about': + default: + $label = \esc_html__( 'About Us', 'wp-mail-smtp' ); + break; + } + + return $label; + } + + /** + * @inheritdoc + */ + public function get_title() { + return $this->get_label( $this->get_current_tab() ); + } + + /** + * Display About page content based on the current tab. + * + * @since 1.5.0 + */ + public function display() { + ?> + +
            + + get_label( 'about' ) ); ?> + + + get_license_type() === 'lite' ) : ?> + + get_label( 'versus' ) ); ?> + + +
            + +
            +

            + get_label( $this->get_current_tab() ) ); ?> +

            + + get_current_tab(); + + if ( \method_exists( $this, $callback ) ) { + $this->{$callback}(); + } else { + $this->display_about(); + } + ?> +
            + + + +
            + +
            +

            + +

            + +

            + +

            +

            + +

            +

            + WPForms, the largest WordPress resource site, WPBeginner, the most popular lead-generation software, OptinMonster, the best WordPress analytics plugin, MonsterInsights, and the most powerful WordPress contest plugin, RafflePress.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://wpforms.com/?utm_source=wpmailsmtpplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpmailsmtp', + 'https://www.wpbeginner.com/?utm_source=wpmailsmtpplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpmailsmtp', + 'https://optinmonster.com/?utm_source=wpmailsmtpplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpmailsmtp', + 'https://www.monsterinsights.com/?utm_source=wpmailsmtpplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpmailsmtp', + 'https://rafflepress.com/?utm_source=wpmailsmtpplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpmailsmtp' + ); + ?> +

            +

            + +

            +
            + +
            +
            + <?php esc_attr_e( 'The WPForms Team photo', 'wp-mail-smtp' ); ?> +
            + +
            +
            +
            + +
            + +
            +
            + get_am_plugins() as $key => $plugin ) : + $is_url_external = false; + + $data = $this->get_about_plugins_data( $plugin ); + + if ( isset( $plugin['pro'] ) && \array_key_exists( $plugin['pro']['path'], \get_plugins() ) ) { + $is_url_external = true; + $plugin = $plugin['pro']; + + $data = array_merge( $data, $this->get_about_plugins_data( $plugin, true ) ); + } + + ?> +
            +
            +
            + +
            + +
            +

            + +

            +
            +
            +
            + + ' . $data['status_text'] . '' + ); + ?> + +
            +
            + + + + +
            +
            +
            +
            + +
            +
            + + array( + 'path' => 'google-analytics-for-wordpress/googleanalytics.php', + 'icon' => \wp_mail_smtp()->assets_url . '/images/about/plugin-mi.png', + 'name' => \esc_html__( 'MonsterInsights', 'wp-mail-smtp' ), + 'desc' => \esc_html__( 'MonsterInsights makes it “effortless” to properly connect your WordPress site with Google Analytics, so you can start making data-driven decisions to grow your business.', 'wp-mail-smtp' ), + 'url' => 'https://downloads.wordpress.org/plugin/google-analytics-for-wordpress.zip', + 'pro' => array( + 'path' => 'google-analytics-premium/googleanalytics-premium.php', + 'icon' => \wp_mail_smtp()->assets_url . '/images/about/plugin-mi.png', + 'name' => \esc_html__( 'MonsterInsights Pro', 'wp-mail-smtp' ), + 'desc' => \esc_html__( 'MonsterInsights makes it “effortless” to properly connect your WordPress site with Google Analytics, so you can start making data-driven decisions to grow your business.', 'wp-mail-smtp' ), + 'url' => 'https://www.monsterinsights.com/?utm_source=WordPress&utm_medium=about&utm_campaign=smtp', + ), + ), + 'om' => array( + 'path' => 'optinmonster/optin-monster-wp-api.php', + 'icon' => \wp_mail_smtp()->assets_url . '/images/about/plugin-om.png', + 'name' => \esc_html__( 'OptinMonster', 'wp-mail-smtp' ), + 'desc' => \esc_html__( 'Our high-converting optin forms like Exit-Intent® popups, Fullscreen Welcome Mats, and Scroll boxes help you dramatically boost conversions and get more email subscribers.', 'wp-mail-smtp' ), + 'url' => 'https://downloads.wordpress.org/plugin/optinmonster.zip', + ), + 'wpforms' => array( + 'path' => 'wpforms-lite/wpforms.php', + 'icon' => \wp_mail_smtp()->assets_url . '/images/about/plugin-wpf.png', + 'name' => \esc_html__( 'Contact Forms by WPForms', 'wp-mail-smtp' ), + 'desc' => \esc_html__( 'The best WordPress contact form plugin. Drag & Drop online form builder that helps you create beautiful contact forms with just a few clicks.', 'wp-mail-smtp' ), + 'url' => 'https://downloads.wordpress.org/plugin/wpforms-lite.zip', + 'pro' => array( + 'path' => 'wpforms/wpforms.php', + 'icon' => \wp_mail_smtp()->assets_url . '/images/about/plugin-wpf.png', + 'name' => \esc_html__( 'WPForms Pro', 'wp-mail-smtp' ), + 'desc' => \esc_html__( 'The best WordPress contact form plugin. Drag & Drop online form builder that helps you create beautiful contact forms with just a few clicks.', 'wp-mail-smtp' ), + 'url' => 'https://wpforms.com/?utm_source=WordPress&utm_medium=about&utm_campaign=smtp', + ), + ), + 'rafflepress' => array( + 'path' => 'rafflepress/rafflepress.php', + 'icon' => \wp_mail_smtp()->assets_url . '/images/about/plugin-rp.png', + 'name' => \esc_html__( 'RafflePress', 'wp-mail-smtp' ), + 'desc' => \esc_html__( 'Turn your visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with powerful viral giveaways & contests.', 'wp-mail-smtp' ), + 'url' => 'https://downloads.wordpress.org/plugin/rafflepress.zip', + 'pro' => array( + 'path' => 'rafflepress-pro/rafflepress-pro.php', + 'icon' => \wp_mail_smtp()->assets_url . '/images/about/plugin-rp.png', + 'name' => \esc_html__( 'RafflePress Pro', 'wp-mail-smtp' ), + 'desc' => \esc_html__( 'Turn your visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with powerful viral giveaways & contests.', 'wp-mail-smtp' ), + 'url' => 'https://rafflepress.com/pricing/', + ), + ), + ); + + return $data; + } + + /** + * Active the given plugin. + * + * @since 1.5.0 + */ + public static function ajax_plugin_activate() { + + // Run a security check. + \check_ajax_referer( 'wp-mail-smtp-about', 'nonce' ); + + $error = \esc_html__( 'Could not activate the plugin. Please activate it from the Plugins page.', 'wp-mail-smtp' ); + + // Check for permissions. + if ( ! \current_user_can( 'activate_plugins' ) ) { + \wp_send_json_error( $error ); + } + + if ( isset( $_POST['plugin'] ) ) { + + $activate = \activate_plugins( $_POST['plugin'] ); // phpcs:ignore + + if ( ! \is_wp_error( $activate ) ) { + \wp_send_json_success( esc_html__( 'Plugin activated.', 'wp-mail-smtp' ) ); + } + } + + \wp_send_json_error( $error ); + } + + /** + * Install & activate the given plugin. + * + * @since 1.5.0 + */ + public static function ajax_plugin_install() { + + // Run a security check. + \check_ajax_referer( 'wp-mail-smtp-about', 'nonce' ); + + $error = \esc_html__( 'Could not install the plugin.', 'wp-mail-smtp' ); + + // Check for permissions. + if ( ! \current_user_can( 'activate_plugins' ) ) { + \wp_send_json_error( $error ); + } + + if ( empty( $_POST['plugin'] ) ) { + \wp_send_json_error(); + } + + // Set the current screen to avoid undefined notices. + \set_current_screen( 'wp-mail-smtp_page_wp-mail-smtp-about' ); + + // Prepare variables. + $url = \esc_url_raw( + \add_query_arg( + array( + 'page' => 'wp-mail-smtp-about', + ), + \admin_url( 'admin.php' ) + ) + ); + + $creds = \request_filesystem_credentials( $url, '', false, false, null ); + + // Check for file system permissions. + if ( false === $creds ) { + \wp_send_json_error( $error ); + } + + if ( ! \WP_Filesystem( $creds ) ) { + \wp_send_json_error( $error ); + } + + // Do not allow WordPress to search/download translations, as this will break JS output. + \remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 ); + + // Create the plugin upgrader with our custom skin. + $installer = new PluginsInstallUpgrader( new PluginsInstallSkin() ); + + // Error check. + if ( ! \method_exists( $installer, 'install' ) || empty( $_POST['plugin'] ) ) { + \wp_send_json_error( $error ); + } + + $installer->install( $_POST['plugin'] ); // phpcs:ignore + + // Flush the cache and return the newly installed plugin basename. + \wp_cache_flush(); + + if ( $installer->plugin_info() ) { + + $plugin_basename = $installer->plugin_info(); + + // Activate the plugin silently. + $activated = \activate_plugin( $plugin_basename ); + + if ( ! \is_wp_error( $activated ) ) { + \wp_send_json_success( + array( + 'msg' => \esc_html__( 'Plugin installed & activated.', 'wp-mail-smtp' ), + 'is_activated' => true, + 'basename' => $plugin_basename, + ) + ); + } else { + \wp_send_json_success( + array( + 'msg' => esc_html__( 'Plugin installed.', 'wp-mail-smtp' ), + 'is_activated' => false, + 'basename' => $plugin_basename, + ) + ); + } + } + + \wp_send_json_error( $error ); + } + + /** + * Display a "Lite vs Pro" tab content. + * + * @since 1.5.0 + */ + protected function display_versus() { + + $license = \wp_mail_smtp()->get_license_type(); + ?> + +
            +

            + + + +

            + +

            + +

            +
            + +
            + +
            +
            +

            + +

            +
            +
            +

            + +

            +
            +
            +

            + +

            +
            +
            +
            + + + get_license_features() as $slug => $name ) { + $current = $this->get_license_data( $slug, $license ); + $pro = $this->get_license_data( $slug, 'pro' ); + ?> + + + + + + +
            +

            +
            +

            + ', $current['text'] ); ?> +

            +
            +

            + ', $pro['text'] ); ?> +

            +
            + +
            + +
            + + +
            +
            +

            + + + +

            + +

            + 20% off regular price, automatically applied at checkout.', 'wp-mail-smtp' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ); + ?> +

            +
            +
            + + + \esc_html__( 'Email Log', 'wp-mail-smtp' ), + 'control' => \esc_html__( 'Email Controls', 'wp-mail-smtp' ), + 'mailers' => \esc_html__( 'Additional Mailers', 'wp-mail-smtp' ), + 'support' => \esc_html__( 'Customer Support', 'wp-mail-smtp' ), + ); + } + + /** + * Get the array of data that compared the license data. + * + * @since 1.5.0 + * + * @param string $feature Feature name. + * @param string $license License type to get data for. + * + * @return array|false + */ + private function get_license_data( $feature, $license ) { + + $data = array( + 'log' => array( + 'lite' => array( + 'status' => 'none', + 'text' => array( + '' . esc_html__( 'Emails are not logged', 'wp-mail-smtp' ) . '', + ), + ), + 'pro' => array( + 'status' => 'full', + 'text' => array( + '' . esc_html__( 'Complete Email Log management inside WordPress', 'wp-mail-smtp' ) . '', + ), + ), + ), + 'control' => array( + 'lite' => array( + 'status' => 'none', + 'text' => array( + '' . esc_html__( 'No controls over whether default WordPress emails are sent', 'wp-mail-smtp' ) . '', + ), + ), + 'pro' => array( + 'status' => 'full', + 'text' => array( + '' . esc_html__( 'Complete Email Controls management for most default WordPress emails', 'wp-mail-smtp' ) . '', + ), + ), + ), + 'mailers' => array( + 'lite' => array( + 'status' => 'none', + 'text' => array( + '' . esc_html__( 'Only default list of mailers', 'wp-mail-smtp' ) . '', + ), + ), + 'pro' => array( + 'status' => 'full', + 'text' => array( + '' . esc_html__( 'Additional mailers: Microsoft Outlook (with Office365 support) and Amazon SES', 'wp-mail-smtp' ) . '', + ), + ), + ), + 'support' => array( + 'lite' => array( + 'status' => 'none', + 'text' => array( + '' . esc_html__( 'Limited Support', 'wp-mail-smtp' ) . '', + ), + ), + 'pro' => array( + 'status' => 'full', + 'text' => array( + '' . esc_html__( 'Priority Support', 'wp-mail-smtp' ) . '', + ), + ), + ), + ); + + // Wrong feature? + if ( ! isset( $data[ $feature ] ) ) { + return false; + } + + // Wrong license type? + if ( ! isset( $data[ $feature ][ $license ] ) ) { + return false; + } + + return $data[ $feature ][ $license ]; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AuthTab.php b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AuthTab.php new file mode 100644 index 0000000..661b108 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AuthTab.php @@ -0,0 +1,63 @@ +get_providers()->get_auth( Options::init()->get( 'mail', 'mailer' ) ); + + if ( + $auth && + $auth instanceof AuthAbstract && + method_exists( $auth, 'process' ) + ) { + $auth->process(); + } + } + + /** + * Return nothing, as we don't need this functionality. + * + * @since 1.0.0 + */ + public function get_label() { + return ''; + } + + /** + * Return nothing, as we don't need this functionality. + * + * @since 1.0.0 + */ + public function get_title() { + return ''; + } + + /** + * Do nothing, as we don't need this functionality. + * + * @since 1.0.0 + */ + public function display() { + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/ControlTab.php b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/ControlTab.php new file mode 100644 index 0000000..30234b8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/ControlTab.php @@ -0,0 +1,124 @@ +get_label(); + } + + /** + * @inheritdoc + */ + public function display() { + + $features = array( + array( + 'image' => 'comments.png', + 'title' => esc_html__( 'Comment Notifications', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Manage emails sent when comments are published or awaiting moderation.', 'wp-mail-smtp' ), + ), + array( + 'image' => 'admin.png', + 'title' => esc_html__( 'Site Admin Email Change Notifications', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Manage emails sent when site admin\'s account has been changed.', 'wp-mail-smtp' ), + ), + array( + 'image' => 'users.png', + 'title' => esc_html__( 'User Change Notifications', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Limit emails triggered by password changed/reset, email changed, and more.', 'wp-mail-smtp' ), + ), + array( + 'image' => 'personal.png', + 'title' => esc_html__( 'Personal Data Requests Notifications', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Control emails for data requests and data removal actions.', 'wp-mail-smtp' ), + ), + array( + 'image' => 'update.png', + 'title' => esc_html__( 'Automatic Update Notifications', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Manage emails sent by the core automatic update process.', 'wp-mail-smtp' ), + ), + array( + 'image' => 'user_new.png', + 'title' => esc_html__( 'New User Notifications', 'wp-mail-smtp' ), + 'desc' => esc_html__( 'Toggle emails sent to both user and site administrator about new user accounts.', 'wp-mail-smtp' ), + ), + + ) + ?> + +
            +

            + +

            + +

            + +
            + +
            + +
            +
            + +
            +
            +

            +

            +
            +
            + +
            + +
            + +
            + + + +
            + +
            + + slug, + admin_url( 'admin.php' ) + ); + } + + /** + * @inheritdoc + */ + public function get_label() { + return esc_html__( 'Email Log', 'wp-mail-smtp' ); + } + + /** + * @inheritdoc + */ + public function get_title() { + return $this->get_label(); + } + + /** + * @inheritdoc + */ + public function display() { + ?> + +
            +

            + get_label() ); ?> +

            +
            + +
            +

            + +

            +
            + +

            + +
            + <?php esc_attr_e( 'Logs Archive Page Screenshot', 'wp-mail-smtp' ); ?> + <?php esc_attr_e( 'Logs Single Page Screenshot', 'wp-mail-smtp' ); ?> +
            + +
            + + + +
            + +
            + + get_label(); + } + + /** + * Custom URL for this tab, redirects to Email Log page. + * + * @since 1.6.0 + * + * @return string + */ + public function get_link() { + + return wp_mail_smtp()->get_admin()->get_admin_page_url( Area::SLUG . '-' . $this->slug ); + } + + /** + * Not used as we are simply redirecting users. + * + * @since 1.6.0 + */ + public function display() { + } + + /** + * Not used as we are simply redirecting users. + * + * @since 1.6.0 + * + * @param array $data + */ + public function process_post( $data ) { + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/MiscTab.php b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/MiscTab.php new file mode 100644 index 0000000..ee417fe --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/MiscTab.php @@ -0,0 +1,219 @@ +get_label(); + } + + /** + * @inheritdoc + */ + public function display() { + + $options = new Options(); + ?> + +
            + wp_nonce_field(); ?> + + +
            +
            +

            get_title(); ?>

            +
            +
            + + +
            +
            + +
            +
            + is_const_defined( 'general', 'do_not_send' ) ? 'disabled' : ''; ?> + get( 'general', 'do_not_send' ) ); ?> + > + +

            + wp_mail() function to send emails.', 'wp-mail-smtp' ), + array( + 'code' => array(), + ) + ) + ); + ?> +
            + +
            + +
            + is_const_defined( 'general', 'do_not_send' ) ) { + printf( /* translators: %1$s - constant that was used; %2$s - file where it was used. */ + esc_html__( 'The value of this field was set using a constant %1$s most likely inside %2$s of your WordPress installation.', 'wp-mail-smtp' ), + 'WPMS_DO_NOT_SEND', + 'wp-config.php' + ); + } else { + printf( /* translators: %1$s - constant to use; %2$s - file to put that constant in. */ + esc_html__( 'If you want to disable using a constant, put %1$s in your %2$s file.', 'wp-mail-smtp' ), + 'define( \'WPMS_DO_NOT_SEND\', true );', + 'wp-config.php' + ); + } + ?> +

            +
            +
            + + +
            +
            + +
            +
            + get( 'general', 'am_notifications_hidden' ) ); ?> + id="wp-mail-smtp-setting-am_notifications_hidden" + > + +
            +
            + + +
            +
            + +
            +
            + get_admin()->is_error_delivery_notice_enabled(); + ?> + + + + get( 'general', 'email_delivery_errors_hidden' ) ); ?> + id="wp-mail-smtp-setting-email_delivery_errors_hidden"> + + + + + +

            + wp_mail_smtp_admin_is_error_delivery_notice_enabled' + ); + ?> +

            + +

            + This is not recommended and should only be done for staging or development sites.', 'wp-mail-smtp' ), + array( + 'strong' => true, + ) + ); + ?> +

            + +
            +
            + + +
            +
            + +
            +
            + get( 'general', 'uninstall' ) ); ?> + id="wp-mail-smtp-setting-uninstall"> + +
            +
            + + display_save_btn(); ?> + +
            + + check_admin_referer(); + + $options = new Options(); + + // Unchecked checkboxes doesn't exist in $_POST, so we need to ensure we actually have them in data to save. + if ( empty( $data['general']['am_notifications_hidden'] ) ) { + $data['general']['am_notifications_hidden'] = false; + } + if ( empty( $data['general']['uninstall'] ) ) { + $data['general']['uninstall'] = false; + } + + $to_save = array_merge( $options->get_all(), $data ); + + // All the sanitization is done there. + $options->set( $to_save ); + + WP::add_admin_notice( + esc_html__( 'Settings were successfully saved.', 'wp-mail-smtp' ), + WP::ADMIN_NOTICE_SUCCESS + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/SettingsTab.php b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/SettingsTab.php new file mode 100644 index 0000000..276ae21 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/SettingsTab.php @@ -0,0 +1,546 @@ +get_label(); + } + + /** + * @inheritdoc + */ + public function display() { + + $options = new Options(); + $mailer = $options->get( 'mail', 'mailer' ); + + $disabled_email = 'gmail' === $mailer || 'outlook' === $mailer ? 'disabled' : ''; + $disabled_name = 'outlook' === $mailer ? 'disabled' : ''; + ?> + +
            + wp_nonce_field(); ?> + + +
            +
            +

            + +

            + +

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

            +
            +
            + + +
            +
            + +
            +
            + is_const_defined( 'mail', 'from_email' ) || ! empty( $disabled_email ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-from_email" spellcheck="false" + placeholder="get_processor()->get_default_email() ); ?>"> + + +

            +
            + +

            +

            + +

            + + +
            + + get( 'mail', 'from_email_force' ) ); ?> + is_const_defined( 'mail', 'from_email_force' ) || ! empty( $disabled_email ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-from_email_force"> + + + + +

            + +

            + +

            + +

            + + +
            +
            + + +
            +
            + +
            +
            + is_const_defined( 'mail', 'from_name' ) || ! empty( $disabled_name ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-from_name" spellcheck="false" + placeholder="get_processor()->get_default_name() ); ?>"> + + +

            + +

            + + +
            + + get( 'mail', 'from_name_force' ) ); ?> + is_const_defined( 'mail', 'from_name_force' ) || ! empty( $disabled_name ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-from_name_force"> + + + + +

            + +

            + +

            + +

            + +
            +
            + + +
            +
            + +
            +
            + get( 'mail', 'return_path' ) ); ?> + is_const_defined( 'mail', 'return_path' ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-return_path"> + + + +

            +
            + +

            +
            +
            + + +
            +
            + +
            +
            +
            + + get_providers()->get_options_all() as $provider ) : ?> + +
            + +
            + <?php echo esc_attr( $provider->get_title() ); ?> +
            + +
            + is_disabled() ) : ?> + + + get_slug(), $mailer ); ?> + is_const_defined( 'mail', 'mailer' ) || $provider->is_disabled() ? 'disabled' : ''; ?> + is_disabled() ? 'class="educate"' : ''; ?> + /> + + +
            +
            + + + + +
            + + + + +
            + +
            +
            + +
            +
            +
            + + +
            + get_providers()->get_options_all() as $provider ) : ?> + get_description(); ?> +
            + + +
            +
            + is_disabled() ) : ?> + display_options(); ?> + +

            get_title(); ?>

            + get_notice( 'educational' ); + $is_dismissed = (bool) get_user_meta( get_current_user_id(), "wp_mail_smtp_notice_educational_for_{$provider->get_slug()}_dismissed", true ); + if ( ! empty( $provider_edu_notice ) && ! $is_dismissed ) : + ?> +

            + + + + + +

            + + + +

            + + +
            +
            + + display_options(); ?> +
            + + + +
            + + display_save_btn(); ?> + +
            + + display_wpforms(); + $this->display_pro_banner(); + } + + /** + * License key text for a Lite version of the plugin. + * + * @since 1.5.0 + * + * @param Options $options + */ + public static function display_license_key_field_content( $options ) { + ?> + +

            🙂

            + +

            + upgrading to PRO.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'class' => array(), + 'target' => array(), + 'rel' => array(), + ), + 'strong' => array(), + ) + ), + esc_url( wp_mail_smtp()->get_upgrade_link( 'general-license-key' ) ) + ); + ?> +

            + +

            + 20% off, automatically applied at checkout!', 'wp-mail-smtp' ), + array( + 'strong' => array(), + 'br' => array(), + ) + ); + ?> +

            + + is_pro() ) { + return; + } + + $is_dismissed = get_user_meta( get_current_user_id(), 'wp_mail_smtp_pro_banner_dismissed', true ); + + // Do not display if user dismissed. + if ( (bool) $is_dismissed === true ) { + return; + } + ?> + +
            + + + + + +

            + +

            + +

            + +

            + +

            + +

            + +

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

            + Get WP Mail SMTP Pro Today and Unlock all the Powerful Features »', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + 'strong' => array(), + ) + ), + esc_url( wp_mail_smtp()->get_upgrade_link( 'general-cta' ) ) + ); + ?> +

            + +

            + Bonus: WP Mail SMTP users get 20% off regular price, automatically applied at checkout.', 'wp-mail-smtp' ), + array( + 'strong' => array(), + 'span' => array( + 'class' => array(), + ), + ) + ); + ?> +

            + +
            + + check_admin_referer(); + + $options = new Options(); + $old_opt = $options->get_all(); + + // When checkbox is unchecked - it's not submitted at all, so we need to define its default false value. + if ( ! isset( $data['mail']['from_email_force'] ) ) { + $data['mail']['from_email_force'] = false; + } + if ( ! isset( $data['mail']['from_name_force'] ) ) { + $data['mail']['from_name_force'] = false; + } + if ( ! isset( $data['mail']['return_path'] ) ) { + $data['mail']['return_path'] = false; + } + if ( ! isset( $data['smtp']['autotls'] ) ) { + $data['smtp']['autotls'] = false; + } + if ( ! isset( $data['smtp']['auth'] ) ) { + $data['smtp']['auth'] = false; + } + + // Remove all debug messages when switching mailers. + if ( + ! empty( $old_opt['mail']['mailer'] ) && + ! empty( $data['mail']['mailer'] ) && + $old_opt['mail']['mailer'] !== $data['mail']['mailer'] + ) { + Debug::clear(); + } + + $to_redirect = false; + + // Old and new Gmail client id/secret values are different - we need to invalidate tokens and scroll to Auth button. + if ( + $options->get( 'mail', 'mailer' ) === 'gmail' && + ! empty( $data['gmail']['client_id'] ) && + ! empty( $data['gmail']['client_secret'] ) && + ( + $options->get( 'gmail', 'client_id' ) !== $data['gmail']['client_id'] || + $options->get( 'gmail', 'client_secret' ) !== $data['gmail']['client_secret'] + ) + ) { + unset( $old_opt['gmail'] ); + + if ( + ! empty( $data['gmail']['client_id'] ) && + ! empty( $data['gmail']['client_secret'] ) + ) { + $to_redirect = true; + } + } + + // New gmail clients data will be added from new $data. + $to_save = Options::array_merge_recursive( $old_opt, $data ); + + // All the sanitization is done in Options class. + $options->set( $to_save ); + + if ( $to_redirect ) { + wp_redirect( $_POST['_wp_http_referer'] . '#wp-mail-smtp-setting-row-gmail-authorize' ); + exit; + } + + WP::add_admin_notice( + esc_html__( 'Settings were successfully saved.', 'wp-mail-smtp' ), + WP::ADMIN_NOTICE_SUCCESS + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/TestTab.php b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/TestTab.php new file mode 100644 index 0000000..a9a96f3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Admin/Pages/TestTab.php @@ -0,0 +1,1115 @@ +get_label(); + } + + /** + * @inheritdoc + */ + public function display() { + ?> + +
            + wp_nonce_field(); ?> + + +
            +
            +

            +
            +
            + + +
            +
            + +
            +
            + +

            + +

            +
            +
            + + +
            +
            + +
            +
            + +

            + +

            +
            +
            + +

            + get_providers()->get_mailer( + Options::init()->get( 'mail', 'mailer' ), + wp_mail_smtp()->get_processor()->get_phpmailer() + )->is_mailer_complete() + ) { + $btn = 'wp-mail-smtp-btn-red'; + $disabled = 'disabled'; + + $help_text = '' . esc_html__( 'You cannot send an email. Mailer is not properly configured. Please check your settings.', 'wp-mail-smtp' ) . ''; + } + ?> + + +

            +
            + + display_debug_details(); + } + + /** + * @inheritdoc + */ + public function process_post( $data ) { + + $this->check_admin_referer(); + + if ( ! empty( $data['test']['email'] ) ) { + $data['test']['email'] = filter_var( $data['test']['email'], FILTER_VALIDATE_EMAIL ); + } + + $is_html = true; + if ( empty( $data['test']['html'] ) ) { + $is_html = false; + } + + if ( empty( $data['test']['email'] ) ) { + WP::add_admin_notice( + esc_html__( 'Test failed. Please use a valid email address and try to resend the test email.', 'wp-mail-smtp' ), + WP::ADMIN_NOTICE_WARNING + ); + return; + } + + $phpmailer = wp_mail_smtp()->get_processor()->get_phpmailer(); + + // Set SMTPDebug level, default is 3 (commands + data + connection status). + $phpmailer->SMTPDebug = apply_filters( 'wp_mail_smtp_admin_test_email_smtp_debug', 3 ); + + /* translators: %s - email address a test email will be sent to. */ + $subject = 'WP Mail SMTP: ' . sprintf( esc_html__( 'Test email to %s', 'wp-mail-smtp' ), $data['test']['email'] ); + + if ( $is_html ) { + add_filter( 'wp_mail_content_type', array( __CLASS__, 'set_test_html_content_type' ) ); + + /* translators: %s - email address a test email will be sent to. */ + $subject = 'WP Mail SMTP: HTML ' . sprintf( esc_html__( 'Test email to %s', 'wp-mail-smtp' ), $data['test']['email'] ); + } + + // Start output buffering to grab smtp debugging output. + ob_start(); + + // Send the test mail. + $result = wp_mail( + $data['test']['email'], + $subject, + $this->get_email_message( $is_html ), + array( + 'X-Mailer-Type:WPMailSMTP/Admin/Test', + ) + ); + + $smtp_debug = ob_get_clean(); + + if ( $is_html ) { + remove_filter( 'wp_mail_content_type', array( __NAMESPACE__, 'set_test_html_content_type' ) ); + } + + /* + * Notify a user about the results. + */ + if ( $result ) { + $result_message = esc_html__( 'Test plain text email was sent successfully!', 'wp-mail-smtp' ); + if ( $is_html ) { + $result_message = sprintf( + /* translators: %s - "HTML" in bold. */ + esc_html__( 'Test %s email was sent successfully! Please check your inbox to make sure it is delivered.', 'wp-mail-smtp' ), + 'HTML' + ); + } + WP::add_admin_notice( + $result_message, + WP::ADMIN_NOTICE_SUCCESS + ); + } else { + // Grab the smtp debugging output. + $this->debug['smtp_debug'] = $smtp_debug; + $this->debug['smtp_error'] = wp_strip_all_tags( $phpmailer->ErrorInfo ); + $this->debug['error_log'] = $this->get_debug_messages( $phpmailer, $smtp_debug ); + } + } + + /** + * Get the email message that should be sent. + * + * @since 1.4.0 + * + * @param bool $is_html Whether to send an HTML email or plain text. + * + * @return string + */ + private function get_email_message( $is_html = true ) { + + // Default plain text version of the email. + $message = $this->get_email_message_text(); + + if ( $is_html ) { + $message = $this->get_email_message_html(); + } + + return $message; + } + + /** + * Get the HTML prepared message for test email. + * + * @since 1.4.0 + * + * @return string + */ + private function get_email_message_html() { + + ob_start(); + ?> + + + + + + + WP Mail SMTP Test Email + + + + + + + +
            + + + + + + + + + + + + is_pro() ) : ?> + + + + +
            + WP Mail SMTP Logo +
            +
            +

            + Success +

            +

            + Congrats, test email was sent successfully! +

            +

            + Thank you for trying out WP Mail SMTP. We're on a mission to make sure that your emails actually get delivered. +

            + is_pro() ) : ?> +

            + If you find this free plugin useful, please consider giving WP Mail SMTP Pro a try! +

            + +

            + Signature +

            +

            + Jared Atchison
            Lead Developer, WP Mail SMTP +

            +
            +
            +
            + Unlock More Features with WP Mail SMTP Pro +
            +

            + Email Logs and Notification Controls
            + Amazon SES / Outlook.com / Office 365 integrations
            + Access to our world class support team +

            +

            + WP Mail SMTP users get 20% off, automatically applied at checkout +

            +
            + + + + +
            + + + + +
            + + Upgrade to WP Mail SMTP Pro Today + +
            +
            +
            +
            +
            + + + + is_pro() ) { + // WP Mail SMTP Pro & WPForms paid installed. + $message = +'Congrats, test email was sent successfully! + +Thank you for trying out WP Mail SMTP. We are on a mission to make sure your emails actually get delivered. + +- Jared Atchison +Lead Developer, WP Mail SMTP'; + } else { + // Free WP Mail SMTP is installed. + $message = +'Congrats, test email was sent successfully! + +Thank you for trying out WP Mail SMTP. We are on a mission to make sure your emails actually get delivered. + +If you find this free plugin useful, please consider giving WP Mail SMTP Pro a try! + +https://wpmailsmtp.com/lite-upgrade/ + +Unlock More Features with WP Mail SMTP Pro: + ++ Email Logs and Notification Controls ++ Amazon SES / Outlook.com / Office 365 integrations ++ Access to our world class support team + +- Jared Atchison +Lead Developer, WP Mail SMTP'; + } + // phpcs:enable + + return $message; + } + + /** + * Set the HTML content type for a test email. + * + * @since 1.4.0 + * + * @return string + */ + public static function set_test_html_content_type() { + + return 'text/html'; + } + + /** + * Prepare debug information, that will help users to identify the error. + * + * @since 1.0.0 + * + * @param MailCatcher $phpmailer + * @param string $smtp_debug + * + * @return string + */ + protected function get_debug_messages( $phpmailer, $smtp_debug ) { + + $options = new Options(); + $conflicts = new Conflicts(); + + $this->debug['mailer'] = $options->get( 'mail', 'mailer' ); + + /* + * Versions Debug. + */ + + $versions_text = 'Versions:
            '; + + $versions_text .= 'WordPress: ' . get_bloginfo( 'version' ) . '
            '; + $versions_text .= 'WordPress MS: ' . ( is_multisite() ? 'Yes' : 'No' ) . '
            '; + $versions_text .= 'PHP: ' . PHP_VERSION . '
            '; + $versions_text .= 'WP Mail SMTP: ' . WPMS_PLUGIN_VER . '
            '; + + /* + * Mailer Debug. + */ + + $mailer_text = 'Params:
            '; + + $mailer_text .= 'Mailer: ' . $this->debug['mailer'] . '
            '; + $mailer_text .= 'Constants: ' . ( $options->is_const_enabled() ? 'Yes' : 'No' ) . '
            '; + if ( $conflicts->is_detected() ) { + $mailer_text .= 'Conflicts: ' . esc_html( $conflicts->get_conflict_name() ) . '
            '; + } + + // Display different debug info based on the mailer. + $mailer = wp_mail_smtp()->get_providers()->get_mailer( $this->debug['mailer'], $phpmailer ); + + if ( $mailer ) { + $mailer_text .= $mailer->get_debug_info(); + } + + /* + * General Debug. + */ + + $debug_text = implode( '
            ', Debug::get() ); + Debug::clear(); + if ( ! empty( $debug_text ) ) { + $debug_text = '
            Debug:
            ' . $debug_text . '
            '; + } + + /* + * SMTP Debug. + */ + + $smtp_text = ''; + if ( $options->is_mailer_smtp() ) { + $smtp_text = 'SMTP Debug:
            '; + if ( ! empty( $smtp_debug ) ) { + $smtp_text .= '
            ' . $smtp_debug . '
            '; + } else { + $smtp_text .= '[empty]'; + } + } + + $errors = apply_filters( + 'wp_mail_smtp_admin_test_get_debug_messages', + array( + $versions_text, + $mailer_text, + $debug_text, + $smtp_text, + ) + ); + + return '
            ' . implode( '
            ', array_filter( $errors ) ) . '
            '; + } + + /** + * Returns debug information for detection, processing, and display. + * + * @since 1.3.0 + * + * @return array + */ + protected function get_debug_details() { + + $options = new Options(); + $smtp_host = $options->get( 'smtp', 'host' ); + $smtp_port = $options->get( 'smtp', 'port' ); + $smtp_encryption = $options->get( 'smtp', 'encryption' ); + + $details = array( + // [any] - cURL error 60/77. + array( + 'mailer' => 'any', + 'errors' => array( + array( 'cURL error 60' ), + array( 'cURL error 77' ), + ), + 'description' => array( + '' . esc_html__( 'SSL certificate issue.', 'wp-mail-smtp' ) . '', + esc_html__( 'This means your web server cannot reliably make secure connections (make requests to HTTPS sites).', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is returned when web server is not configured properly.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Contact your web hosting provider and inform them your site has an issue with SSL certificates.', 'wp-mail-smtp' ), + esc_html__( 'The exact error you can provide them is in the Error log, available at the bottom of this page.', 'wp-mail-smtp' ), + esc_html__( 'Ask them to resolve the issue then try again.', 'wp-mail-smtp' ), + ), + ), + // [any] - cURL error 6/7. + array( + 'mailer' => 'any', + 'errors' => array( + array( 'cURL error 6' ), + array( 'cURL error 7' ), + ), + 'description' => array( + '' . esc_html__( 'Could not connect to host.', 'wp-mail-smtp' ) . '', + ! empty( $smtp_host ) + ? sprintf( + /* translators: %s - SMTP host address. */ + esc_html__( 'This means your web server was unable to connect to %s.', 'wp-mail-smtp' ), + $smtp_host + ) + : esc_html__( 'This means your web server was unable to connect to the host server.', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is returned your web server is blocking the connections or the SMTP host denying the request.', 'wp-mail-smtp' ), + ), + 'steps' => array( + sprintf( + /* translators: %s - SMTP host address. */ + esc_html__( 'Contact your web hosting provider and ask them to verify your server can connect to %s. Additionally, ask them if a firewall or security policy may be preventing the connection.', 'wp-mail-smtp' ), + $smtp_host + ), + esc_html__( 'If using "Other SMTP" Mailer, triple check your SMTP settings including host address, email, and password.', 'wp-mail-smtp' ), + esc_html__( 'If using "Other SMTP" Mailer, contact your SMTP host to confirm they are accepting outside connections with the settings you have configured (address, username, port, security, etc).', 'wp-mail-smtp' ), + ), + ), + // [any] - cURL error XX (other). + array( + 'mailer' => 'any', + 'errors' => array( + array( 'cURL error' ), + ), + 'description' => array( + '' . esc_html__( 'Could not connect to your host.', 'wp-mail-smtp' ) . '', + ! empty( $smtp_host ) + ? sprintf( + /* translators: %s - SMTP host address. */ + esc_html__( 'This means your web server was unable to connect to %s.', 'wp-mail-smtp' ), + $smtp_host + ) + : esc_html__( 'This means your web server was unable to connect to the host server.', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is returned when web server is not configured properly.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Contact your web hosting provider and inform them you are having issues making outbound connections.', 'wp-mail-smtp' ), + esc_html__( 'The exact error you can provide them is in the Error log, available at the bottom of this page.', 'wp-mail-smtp' ), + esc_html__( 'Ask them to resolve the issue then try again.', 'wp-mail-smtp' ), + ), + ), + // [smtp] - SMTP Error: Count not authenticate. + array( + 'mailer' => 'smtp', + 'errors' => array( + array( 'SMTP Error: Could not authenticate.' ), + ), + 'description' => array( + '' . esc_html__( 'Could not authenticate your SMTP account.', 'wp-mail-smtp' ) . '', + esc_html__( 'This means we were able to connect to your SMTP host, but were not able to proceed using the email/password in the settings.', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is returned when the email or password is not correct or is not what the SMTP host is expecting.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Triple check your SMTP settings including host address, email, and password. If you have recently reset your password you will need to update the settings.', 'wp-mail-smtp' ), + esc_html__( 'Contact your SMTP host to confirm you are using the correct username and password.', 'wp-mail-smtp' ), + esc_html__( 'Verify with your SMTP host that your account has permissions to send emails using outside connections.', 'wp-mail-smtp' ), + ), + ), + // [smtp] - Sending bulk email, hitting rate limit. + array( + 'mailer' => 'smtp', + 'errors' => array( + array( 'We do not authorize the use of this system to transport unsolicited' ), + ), + 'description' => array( + '' . esc_html__( 'Error due to unsolicited and/or bulk e-mail.', 'wp-mail-smtp' ) . '', + esc_html__( 'This means the connection to your SMTP host was made successfully, but the host rejected the email.', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is returned when you are sending too many e-mails or e-mails that have been identified as spam.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Check the emails that are sending are sending individually. Example: email is not sending to 30 recipients. You can install any WordPress e-mail logging plugin to do that.', 'wp-mail-smtp' ), + esc_html__( 'Contact your SMTP host to ask about sending/rate limits.', 'wp-mail-smtp' ), + esc_html__( 'Verify with them your SMTP account is in good standing and your account has not been flagged.', 'wp-mail-smtp' ), + ), + ), + // [smtp] - Unauthenticated senders not allowed. + array( + 'mailer' => 'smtp', + 'errors' => array( + array( 'Unauthenticated senders not allowed' ), + ), + 'description' => array( + '' . esc_html__( 'Unauthenticated senders are not allowed.', 'wp-mail-smtp' ) . '', + esc_html__( 'This means the connection to your SMTP host was made successfully, but you should enable Authentication and provide correct Username and Password.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Go to WP Mail SMTP plugin Settings page.', 'wp-mail-smtp' ), + esc_html__( 'Enable Authentication', 'wp-mail-smtp' ), + esc_html__( 'Enter correct SMTP Username (usually this is an email address) and Password in the appropriate fields.', 'wp-mail-smtp' ), + ), + ), + // [smtp] - SMTP connect() failed. + array( + 'mailer' => 'smtp', + 'errors' => array( + array( 'SMTP connect() failed' ), + ), + 'description' => array( + '' . esc_html__( 'Could not connect to the SMTP host.', 'wp-mail-smtp' ) . '', + ! empty( $smtp_host ) + ? sprintf( + /* translators: %s - SMTP host address. */ + esc_html__( 'This means your web server was unable to connect to %s.', 'wp-mail-smtp' ), + $smtp_host + ) + : esc_html__( 'This means your web server was unable to connect to the host server.', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is returned for one of the following reasons:', 'wp-mail-smtp' ), + '-' . esc_html__( 'SMTP settings are incorrect (wrong port, security setting, incorrect host).', 'wp-mail-smtp' ) . '
            ' . + '-' . esc_html__( 'Your web server is blocking the connection.', 'wp-mail-smtp' ) . '
            ' . + '-' . esc_html__( 'Your SMTP host is rejecting the connection.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Triple check your SMTP settings including host address, email, and password, port, and security.', 'wp-mail-smtp' ), + sprintf( + wp_kses( + /* translators: %1$s - SMTP host address, %2$s - SMTP port, %3$s - SMTP encryption. */ + __( 'Contact your web hosting provider and ask them to verify your server can connect to %1$s on port %2$s using %3$s encryption. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.
            Note: this is the most common cause of this issue.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + 'strong' => array(), + 'br' => array(), + ) + ), + $smtp_host, + $smtp_port, + 'none' === $smtp_encryption ? esc_html__( 'no', 'wp-mail-smtp' ) : $smtp_encryption + ), + esc_html__( 'Contact your SMTP host to confirm you are using the correct username and password.', 'wp-mail-smtp' ), + esc_html__( 'Verify with your SMTP host that your account has permissions to send emails using outside connections.', 'wp-mail-smtp' ), + ), + ), + // [mailgun] - Please activate your Mailgun account. + array( + 'mailer' => 'mailgun', + 'errors' => array( + array( 'Please activate your Mailgun account' ), + ), + 'description' => array( + '' . esc_html__( 'Mailgun failed.', 'wp-mail-smtp' ) . '', + esc_html__( 'It seems that you forgot to activate your Mailgun account.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Check your inbox you used to create a Mailgun account. Click the activation link in an email from Mailgun.', 'wp-mail-smtp' ), + esc_html__( 'If you do not see activation email, go to your Mailgun control panel and resend the activation email.', 'wp-mail-smtp' ), + ), + ), + // [mailgun] - Forbidden. + array( + 'mailer' => 'mailgun', + 'errors' => array( + array( 'Forbidden' ), + ), + 'description' => array( + '' . esc_html__( 'Mailgun failed.', 'wp-mail-smtp' ) . '', + esc_html__( 'Typically this error is because there is an issue with your Mailgun settings, in many cases the API key.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Verify your API key is correct.', 'wp-mail-smtp' ), + esc_html__( 'Go to your Mailgun account and view your API key.', 'wp-mail-smtp' ), + esc_html__( 'Note that the API key includes the "key" prefix, so make sure that it is in the WP Mail SMTP Mailgun API setting.', 'wp-mail-smtp' ), + ), + ), + // [mailgun] - Free accounts are for test purposes only. + array( + 'mailer' => 'mailgun', + 'errors' => array( + array( 'Free accounts are for test purposes only' ), + ), + 'description' => array( + '' . esc_html__( 'Mailgun failed.', 'wp-mail-smtp' ) . '', + esc_html__( 'Your Mailgun account does not have access to send emails.', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is because you have not set up and/or complete domain name verification for your Mailgun account.', 'wp-mail-smtp' ), + ), + 'steps' => array( + sprintf( + wp_kses( + /* translators: %s - Mailgun documentation URL. */ + __( 'Go to our how-to guide for setting up Mailgun with WP Mail SMTP.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://wpforms.com/how-to-send-wordpress-emails-with-mailgun/' + ), + esc_html__( 'Complete the steps in section "2. Verify Your Domain".', 'wp-mail-smtp' ), + ), + ), + // [gmail] - 401: Login Required. + array( + 'mailer' => 'gmail', + 'errors' => array( + array( '401', 'Login Required' ), + ), + 'description' => array( + '' . esc_html__( 'Google API Error.', 'wp-mail-smtp' ) . '', + esc_html__( 'You have not properly configured Gmail mailer.', 'wp-mail-smtp' ), + esc_html__( 'Make sure that you have clicked the "Allow plugin to send emails using your Google account" button under Gmail settings.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Go to plugin Settings page and click the "Allow plugin to send emails using your Google account" button.', 'wp-mail-smtp' ), + esc_html__( 'After the click you should be redirected to a Gmail authorization screen, where you will be asked a permission to send emails on your behalf.', 'wp-mail-smtp' ), + esc_html__( 'Please click "Agree", if you see that button. If not - you will need to enable less secure apps first:', 'wp-mail-smtp' ) + . '
              ' + . '
            • ' . + sprintf( + wp_kses( + /* translators: %s - Google support article URL. */ + __( 'if you are using regular Gmail account, please read this article to proceed.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + ) + ), + 'https://support.google.com/accounts/answer/6010255?hl=en' + ) + . '
            • ' + . '
            • ' . + sprintf( + wp_kses( + /* translators: %s - Google support article URL. */ + __( 'if you are using G Suite, please read this article to proceed.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + ) + ), + 'https://support.google.com/cloudidentity/answer/6260879?hl=en' + ) + . '
            • ' + . '
            ', + ), + ), + // [gmail] - 400: Recipient address required. + array( + 'mailer' => 'gmail', + 'errors' => array( + array( '400', 'Recipient address required' ), + ), + 'description' => array( + '' . esc_html__( 'Google API Error.', 'wp-mail-smtp' ) . '', + esc_html__( 'Typically this error is because address the email was sent to is invalid or was empty.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Check the "Send To" email address used and confirm it is a valid email and was not empty.', 'wp-mail-smtp' ), + sprintf( + /* translators: 1 - correct email address example. 2 - incorrect email address example. */ + esc_html__( 'It should be something like this: %1$s. These are incorrect values: %2$s.', 'wp-mail-smtp' ), + 'info@example.com', + 'info@localhost, info@192.168.1.1' + ), + esc_html__( 'Make sure that the generated email has a TO header, useful when you are responsible for email creation.', 'wp-mail-smtp' ), + ), + ), + // [gmail] - Token has been expired or revoked. + array( + 'mailer' => 'gmail', + 'errors' => array( + array( 'invalid_grant', 'Token has been expired or revoked' ), + ), + 'description' => array( + '' . esc_html__( 'Google API Error.', 'wp-mail-smtp' ) . '', + esc_html__( 'Unfortunately, this error can be due to many different reasons.', 'wp-mail-smtp' ), + ), + 'steps' => array( + sprintf( + wp_kses( + /* translators: %s - Blog article URL. */ + __( 'Please read this article to learn more about what can cause this error and how it can be resolved.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + ) + ), + 'https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35' + ), + ), + ), + // [gmail] - Code was already redeemed. + array( + 'mailer' => 'gmail', + 'errors' => array( + array( 'invalid_grant', 'Code was already redeemed' ), + ), + 'description' => array( + '' . esc_html__( 'Google API Error.', 'wp-mail-smtp' ) . '', + esc_html__( 'Authentication code that Google returned to you has already been used on your previous auth attempt.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Make sure that you are not trying to manually clean up the plugin options to retry the "Allow..." step.', 'wp-mail-smtp' ), + esc_html__( 'Reinstall the plugin with clean plugin data turned on on Misc page. This will remove all the plugin options and you will be safe to retry.', 'wp-mail-smtp' ), + esc_html__( 'Make sure there is no aggressive caching on site admin area pages or try to clean cache between attempts.', 'wp-mail-smtp' ), + ), + ), + // [gmail] - 400: Mail service not enabled. + array( + 'mailer' => 'gmail', + 'errors' => array( + array( '400', 'Mail service not enabled' ), + ), + 'description' => array( + '' . esc_html__( 'Google API Error.', 'wp-mail-smtp' ) . '', + esc_html__( 'There are various reasons for that, please review the steps below.', 'wp-mail-smtp' ), + ), + 'steps' => array( + sprintf( + wp_kses( + /* translators: %s - Google G Suite Admin area URL. */ + __( 'Make sure that your G Suite trial period has not expired. You can check the status here.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://admin.google.com' + ), + sprintf( + wp_kses( + /* translators: %s - Google G Suite Admin area URL. */ + __( 'Make sure that Gmail app in your G Suite is actually enabled. You can check that in Apps list in G Suite Admin area.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://admin.google.com' + ), + sprintf( + wp_kses( + /* translators: %s - Google Developers Console URL. */ + __( 'Make sure that you have Gmail API enabled, and you can do that here.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://console.developers.google.com/' + ), + ), + ), + // [gmail] - 403: Project X is not found and cannot be used for API calls. + array( + 'mailer' => 'gmail', + 'errors' => array( + array( '403', 'is not found and cannot be used for API calls' ), + ), + 'description' => array( + '' . esc_html__( 'Google API Error.', 'wp-mail-smtp' ) . '', + ), + 'steps' => array( + esc_html__( 'Make sure that the used Client ID/Secret correspond to a proper project that has Gmail API enabled.', 'wp-mail-smtp' ), + sprintf( + wp_kses( + /* translators: %s - WPForms.com tutorial URL. */ + esc_html__( 'Please follow our Gmail tutorial to be sure that all the correct project and data is applied.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://wpforms.com/how-to-securely-send-wordpress-emails-using-gmail-smtp/' + ), + ), + ), + // [gmail] - The OAuth client was disabled. + array( + 'mailer' => 'gmail', + 'errors' => array( + array( 'disabled_client', 'The OAuth client was disabled' ), + ), + 'description' => array( + '' . esc_html__( 'Google API Error.', 'wp-mail-smtp' ) . '', + esc_html__( 'You may have added a new API to a project', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Make sure that the used Client ID/Secret correspond to a proper project that has Gmail API enabled.', 'wp-mail-smtp' ), + esc_html__( 'Try to use a separate project for your emails, so the project has only 1 Gmail API in it enabled. You will need to remove the old project and create a new one from scratch.', 'wp-mail-smtp' ), + ), + ), + ); + + // Error detection logic. + foreach ( $details as $data ) { + + // Check for appropriate mailer. + if ( 'any' !== $data['mailer'] && $this->debug['mailer'] !== $data['mailer'] ) { + continue; + } + + $match = false; + + // Attempt to detect errors. + foreach ( $data['errors'] as $error_group ) { + foreach ( $error_group as $error_code => $error_message ) { + $match = ( false !== strpos( $this->debug['error_log'], $error_message ) || false !== strpos( $this->debug['error_log'], $error_message ) ); + if ( ! $match ) { + break; + } + } + if ( $match ) { + break; + } + } + + if ( $match ) { + return $data; + } + } + + // Return defaults. + return array( + 'description' => array( + '' . esc_html__( 'An issue was detected.', 'wp-mail-smtp' ) . '', + esc_html__( 'This means your test email was unable to be sent.', 'wp-mail-smtp' ), + esc_html__( 'Typically this error is returned for one of the following reasons:', 'wp-mail-smtp' ), + '- ' . esc_html__( 'Plugin settings are incorrect (wrong SMTP settings, invalid Mailer configuration, etc).', 'wp-mail-smtp' ) . '
            ' . + '- ' . esc_html__( 'Your web server is blocking the connection.', 'wp-mail-smtp' ) . '
            ' . + '- ' . esc_html__( 'Your host is rejecting the connection.', 'wp-mail-smtp' ), + ), + 'steps' => array( + esc_html__( 'Triple check the plugin settings, consider reconfiguring to make sure everything is correct (eg bad copy and paste).', 'wp-mail-smtp' ), + wp_kses( + __( 'Contact your web hosting provider and ask them to verify your server can make outside connections. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.
            Note: this is the most common cause of this issue.', 'wp-mail-smtp' ), + array( + 'strong' => array(), + 'br' => array(), + ) + ), + esc_html__( 'Try using a different mailer.', 'wp-mail-smtp' ), + ), + ); + } + + /** + * Displays all the various error and debug details. + * + * @since 1.3.0 + */ + protected function display_debug_details() { + + if ( empty( $this->debug ) ) { + return; + } + + $debug = $this->get_debug_details(); + ?> +
            +

            +
            + +
            + ' . $description . '

            '; + } + ?> + +

            + +
              + ' . $step . ''; + } + ?> +
            + +

            + + is_pro() ) : ?> + +

            + submit a support ticket.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://wpmailsmtp.com/account/support/' + ); + ?> +

            + + + +

            + +

            + +

            + upgrade to WP Mail SMTP Pro. Along with getting expert support, you will also get Notification controls, Email Logging, and integrations for Amazon SES, Office 365, and Outlook.com.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + ) + ), + esc_url( wp_mail_smtp()->get_upgrade_link( 'email-test-fail' ) ) + ) + ?> +

            + +

            + +

            + +

            + 20% off regular pricing, automatically applied at checkout!', 'wp-mail-smtp' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ); + ?> +

            + +

            + limited support on the WordPress.org support forums. You can create a support thread there, but please understand that free support is not guaranteed and is limited to simple issues. If you have an urgent or complex issue, then please consider upgrading to WP Mail SMTP Pro to access our priority support ticket system.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://wordpress.org/support/topic/wp-mail-smtp-support-policy/', + 'https://wordpress.org/support/plugin/wp-mail-smtp/', + esc_url( wp_mail_smtp()->get_upgrade_link( 'email-test-fail' ) ) + ); + ?> +

            + + + +

            + + + + +

            + +
            + debug['error_log']; ?> +
            + +

            + +

            +
            + '', // Please always pass this. + 'destination' => '', // And this + 'clear_destination' => false, + 'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please + '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 ); + + /** + * Filters the package options before running an update. + * + * See also {@see 'upgrader_process_complete'}. + * + * @since 4.3.0 + * + * @param array $options { + * Options used by the upgrader. + * + * @type string $package Package for update. + * @type string $destination Update location. + * @type bool $clear_destination Clear the destination resource. + * @type bool $clear_working Clear the working resource. + * @type bool $abort_if_destination_exists Abort if the Destination directory exists. + * @type bool $is_multi Whether the upgrader is running multiple times. + * @type array $hook_extra { + * Extra hook arguments. + * + * @type string $action Type of action. Default 'update'. + * @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'. + * @type bool $bulk Whether the update process is a bulk update. Default true. + * @type string $plugin Path to the plugin file relative to the plugins directory. + * @type string $theme The stylesheet or template name of the theme. + * @type string $language_update_type The language pack update type. Accepts 'plugin', 'theme', + * or 'core'. + * @type object $language_update The language pack update offer. + * } + * } + */ + $options = apply_filters( 'upgrader_package_options', $options ); + + if ( ! $options['is_multi'] ) { // call $this->header separately if running multiple times + $this->skin->header(); + } + + // Connect to the Filesystem first. + $res = $this->fs_connect( array( WP_CONTENT_DIR, $options['destination'] ) ); + // Mainly for non-connected filesystem. + if ( ! $res ) { + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return false; + } + + $this->skin->before(); + + if ( is_wp_error( $res ) ) { + $this->skin->error( $res ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $res; + } + + /* + * Download the package (Note, This just returns the filename + * of the file if the package is a local file) + */ + $download = $this->download_package( $options['package'], true ); + + // Allow for signature soft-fail. + // WARNING: This may be removed in the future. + if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) { + + // Don't output the 'no signature could be found' failure message for now. + if ( 'signature_verification_no_signature' != $download->get_error_code() || WP_DEBUG ) { + // Outout the failure error as a normal feedback, and not as an error: + //$this->skin->feedback( $download->get_error_message() ); + + // Report this failure back to WordPress.org for debugging purposes. + wp_version_check( + array( + 'signature_failure_code' => $download->get_error_code(), + 'signature_failure_data' => $download->get_error_data(), + ) + ); + } + + // Pretend this error didn't happen. + $download = $download->get_error_data( 'softfail-filename' ); + } + + if ( is_wp_error( $download ) ) { + $this->skin->error( $download ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $download; + } + + $delete_package = ( $download != $options['package'] ); // Do not delete a "local" file + + // Unzips 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(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $working_dir; + } + + // With the given options, this installs it to the destination directory. + $result = $this->install_package( + array( + 'source' => $working_dir, + 'destination' => $options['destination'], + 'clear_destination' => $options['clear_destination'], + 'abort_if_destination_exists' => $options['abort_if_destination_exists'], + 'clear_working' => $options['clear_working'], + 'hook_extra' => $options['hook_extra'], + ) + ); + + $this->skin->set_result( $result ); + if ( is_wp_error( $result ) ) { + $this->skin->error( $result ); + //$this->skin->feedback( 'process_failed' ); + } else { + // Installation succeeded. + //$this->skin->feedback( 'process_success' ); + } + + $this->skin->after(); + + if ( ! $options['is_multi'] ) { + + /** + * Fires when the upgrader process is complete. + * + * See also {@see 'upgrader_package_options'}. + * + * @since 3.6.0 + * @since 3.7.0 Added to WP_Upgrader::run(). + * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`. + * + * @param WP_Upgrader $this WP_Upgrader instance. In other contexts, $this, might be a + * Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance. + * @param array $hook_extra { + * Array of bulk item update data. + * + * @type string $action Type of action. Default 'update'. + * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'. + * @type bool $bulk Whether the update process is a bulk update. Default true. + * @type array $plugins Array of the basename paths of the plugins' main files. + * @type array $themes The theme slugs. + * @type array $translations { + * Array of translations update data. + * + * @type string $language The locale the translation is for. + * @type string $type Type of translation. Accepts 'plugin', 'theme', or 'core'. + * @type string $slug Text domain the translation is for. The slug of a theme/plugin or + * 'default' for core translations. + * @type string $version The version of a theme, plugin, or core. + * } + * } + */ + do_action( 'upgrader_process_complete', $this, $options['hook_extra'] ); + + $this->skin->footer(); + } + + return $result; + } + + /** + * Toggle maintenance mode for the site. + * + * Creates/deletes the maintenance file to enable/disable maintenance mode. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem Subclass + * + * @param bool $enable True to enable maintenance mode, false to disable. + */ + public 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 ); + } elseif ( ! $enable && $wp_filesystem->exists( $file ) ) { + //$this->skin->feedback( 'maintenance_end' ); + $wp_filesystem->delete( $file ); + } + } + + /** + * Download a package. + * + * @since 2.8.0 + * + * @param string $package The URI of the package. If this is the full path to an + * existing local file, it will be returned untouched. + * @param bool $check_signatures Whether to validate file signatures. Default false. + * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object. + */ + public function download_package( $package, $check_signatures = false ) { + + /** + * Filters whether to return the package. + * + * @since 3.7.0 + * + * @param bool $reply Whether to bail without returning the package. + * Default false. + * @param string $package The package file name. + * @param WP_Upgrader $this The WP_Upgrader instance. + */ + $reply = apply_filters( 'upgrader_pre_download', false, $package, $this ); + if ( false !== $reply ) { + return $reply; + } + + 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, 300, $check_signatures ); + + if ( is_wp_error( $download_file ) && ! $download_file->get_error_data( 'softfail-filename' ) ) { + return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() ); + } + + return $download_file; + } + + /** + * Unpack a compressed package file. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $package Full path to the package file. + * @param bool $delete_package Optional. Whether to delete the package file after attempting + * to unpack it. Default true. + * @return string|WP_Error The path to the unpacked contents, or a WP_Error on failure. + */ + public 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 - Strip off any .tmp or .zip suffixes + $working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.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 ); + + // Once extracted, delete the package if required. + if ( $delete_package ) { + unlink( $package ); + } + + if ( is_wp_error( $result ) ) { + $wp_filesystem->delete( $working_dir, true ); + if ( 'incompatible_archive' == $result->get_error_code() ) { + return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() ); + } + return $result; + } + + return $working_dir; + } + + /** + * Install a package. + * + * Copies the contents of a package form a source directory, and installs them in + * a destination directory. Optionally removes the source. It can also optionally + * clear out the destination folder if it already exists. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * @global array $wp_theme_directories + * + * @param array|string $args { + * Optional. Array or string of arguments for installing a package. Default empty array. + * + * @type string $source Required path to the package source. Default empty. + * @type string $destination Required path to a folder to install the package in. + * Default empty. + * @type bool $clear_destination Whether to delete any files already in the destination + * folder. Default false. + * @type bool $clear_working Whether to delete the files form the working directory + * after copying to the destination. Default false. + * @type bool $abort_if_destination_exists Whether to abort the installation if + * the destination folder already exists. Default true. + * @type array $hook_extra Extra arguments to pass to the filter hooks called by + * WP_Upgrader::install_package(). Default empty array. + * } + * + * @return array|WP_Error The result (also stored in `WP_Upgrader::$result`), or a WP_Error on failure. + */ + public function install_package( $args = array() ) { + global $wp_filesystem, $wp_theme_directories; + + $defaults = array( + 'source' => '', // Please always pass this + 'destination' => '', // and this + 'clear_destination' => false, + 'clear_working' => false, + 'abort_if_destination_exists' => true, + 'hook_extra' => array(), + ); + + $args = wp_parse_args( $args, $defaults ); + + // These were previously extract()'d. + $source = $args['source']; + $destination = $args['destination']; + $clear_destination = $args['clear_destination']; + + set_time_limit( 300 ); + + if ( empty( $source ) || empty( $destination ) ) { + return new WP_Error( 'bad_request', $this->strings['bad_request'] ); + } + //$this->skin->feedback( 'installing_package' ); + + /** + * Filters the install response before the installation has started. + * + * Returning a truthy value, or one that could be evaluated as a WP_Error + * will effectively short-circuit the installation, returning that value + * instead. + * + * @since 2.8.0 + * + * @param bool|WP_Error $response Response. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] ); + + if ( is_wp_error( $res ) ) { + return $res; + } + + //Retain the Original source and destinations + $remote_source = $args['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( $args['source'] ) . $source_files[0] . '/' ) ) { //Only one folder? Then we want its contents. + $source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] ); + } elseif ( count( $source_files ) == 0 ) { + return new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] ); // There are no files? + } else { // It's only a single file, the upgrader will use the folder name of this file as the destination folder. Folder name is based on zip filename. + $source = trailingslashit( $args['source'] ); + } + + /** + * Filters the source file location for the upgrade package. + * + * @since 2.8.0 + * @since 4.4.0 The $hook_extra parameter became available. + * + * @param string $source File source location. + * @param string $remote_source Remote file source location. + * @param WP_Upgrader $this WP_Upgrader instance. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] ); + + 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. + * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the + * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending + * to copy the directory into the directory, whilst they pass the source + * as the actual files to copy. + */ + $protected_directories = array( ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' ); + + if ( is_array( $wp_theme_directories ) ) { + $protected_directories = array_merge( $protected_directories, $wp_theme_directories ); + } + + if ( in_array( $destination, $protected_directories ) ) { + $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 there's something there. + //$this->skin->feedback( 'remove_old' ); + + $removed = $this->clear_destination( $remote_destination ); + + /** + * Filters whether the upgrader cleared the destination. + * + * @since 2.8.0 + * + * @param mixed $removed Whether the destination was cleared. true on success, WP_Error on failure + * @param string $local_destination The local package destination. + * @param string $remote_destination The remote package destination. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] ); + + if ( is_wp_error( $removed ) ) { + return $removed; + } + } elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists( $remote_destination ) ) { + //If we're not clearing the destination folder and something exists there already, 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_destination', $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 ( $args['clear_working'] ) { + $wp_filesystem->delete( $remote_source, true ); + } + return $result; + } + + //Clear the Working folder? + if ( $args['clear_working'] ) { + $wp_filesystem->delete( $remote_source, true ); + } + + $destination_name = basename( str_replace( $local_destination, '', $destination ) ); + if ( '.' == $destination_name ) { + $destination_name = ''; + } + + $this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' ); + + /** + * Filters the installation response after the installation has finished. + * + * @since 2.8.0 + * + * @param bool $response Installation response. + * @param array $hook_extra Extra arguments passed to hooked filters. + * @param array $result Installation result data. + */ + $res = apply_filters( 'upgrader_post_install', true, $args['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; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Conflicts.php b/wp-content/plugins/wp-mail-smtp/src/Conflicts.php new file mode 100644 index 0000000..91c22fb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Conflicts.php @@ -0,0 +1,184 @@ + array( + 'name' => 'Easy WP SMTP', + ), + 'postman_start' => array( + 'name' => 'Postman SMTP', + ), + 'post_start' => array( + 'name' => 'Post SMTP Mailer/Email Log', + ), + 'mail_bank' => array( + 'name' => 'WP Mail Bank', + ), + 'SMTP_MAILER' => array( + 'name' => 'SMTP Mailer', + 'class' => true, + ), + 'GMAIL_SMTP' => array( + 'name' => 'Gmail SMTP', + 'class' => true, + ), + 'WP_Email_Smtp' => array( + 'name' => 'WP Email SMTP', + 'class' => true, + ), + 'smtpmail_include' => array( + 'name' => 'SMTP Mail', + ), + 'bwssmtp_init' => array( + 'name' => 'SMTP by BestWebSoft', + ), + 'WPSendGrid_SMTP' => array( + 'name' => 'WP SendGrid SMTP', + 'class' => true, + ), + 'sar_friendly_smtp' => array( + 'name' => 'SAR Friendly SMTP', + ), + 'WPGmail_SMTP' => array( + 'name' => 'WP Gmail SMTP', + 'class' => true, + ), + 'st_smtp_check_config' => array( + 'name' => 'Cimy Swift SMTP', + ), + 'WP_Easy_SMTP' => array( + 'name' => 'WP Easy SMTP', + 'class' => true, + ), + 'WPMailgun_SMTP' => array( + 'name' => 'WP Mailgun SMTP', + 'class' => true, + ), + 'my_smtp_wp' => array( + 'name' => 'MY SMTP WP', + ), + 'mail_booster' => array( + 'name' => 'WP Mail Booster', + ), + 'Sendgrid_Settings' => array( + 'name' => 'SendGrid', + 'class' => true, + ), + 'WPMS_php_mailer' => array( + 'name' => 'WP Mail Smtp Mailer', + ), + 'WPAmazonSES_SMTP' => array( + 'name' => 'WP Amazon SES SMTP', + 'class' => true, + ), + 'Postmark_Mail' => array( + 'name' => 'Postmark for WordPress', + 'class' => true, + ), + 'Mailgun' => array( + 'name' => 'Mailgun', + 'class' => true, + ), + 'WPSparkPost\SparkPost' => array( + 'name' => 'SparkPost', + 'class' => true, + ), + 'WPYahoo_SMTP' => array( + 'name' => 'WP Yahoo SMTP', + 'class' => true, + ), + 'wpses_init' => array( + 'name' => 'WP SES', + 'class' => true, + ), + 'TSPHPMailer' => array( + 'name' => 'turboSMTP', + ), + 'WP_SMTP' => array( + 'name' => 'WP SMTP', + 'class' => true, + ), + ); + + /** + * @var array Conflict information. + */ + protected $conflict = array(); + + /** + * Whether we have a conflict with predefined list of plugins. + * + * @since 1.5.0 + * + * @return bool + */ + public function is_detected() { + + foreach ( self::$plugins as $callback => $plugin ) { + if ( ! empty( $plugin['class'] ) ) { + $detected = \class_exists( $callback, false ); + } else { + $detected = \function_exists( $callback ); + } + + if ( $detected ) { + $this->conflict = $plugin; + break; + } + } + + return ! empty( $this->conflict ); + } + + /** + * Add a warning admin message to a user about the conflicting plugin. + * + * @since 1.5.0 + */ + public function notify() { + + if ( empty( $this->conflict ) ) { + return; + } + + WP::add_admin_notice( + \sprintf( /* translators: %1$s - Plugin name causing conflict; %2$s - Plugin name causing conflict. */ + \esc_html__( 'Heads up! WP Mail SMTP has detected %1$s is activated. Please deactivate %2$s to prevent conflicts.', 'wp-mail-smtp' ), + $this->get_conflict_name(), + $this->get_conflict_name() + ), + WP::ADMIN_NOTICE_WARNING + ); + } + + /** + * Get the conflicting plugin name is any. + * + * @since 1.5.0 + * + * @return null|string + */ + public function get_conflict_name() { + + $name = null; + + if ( ! empty( $this->conflict['name'] ) ) { + $name = $this->conflict['name']; + } + + return $name; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Core.php b/wp-content/plugins/wp-mail-smtp/src/Core.php new file mode 100644 index 0000000..f903893 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Core.php @@ -0,0 +1,738 @@ +pro->example(). + * + * @since 1.5.0 + * + * @var \WPMailSMTP\Pro\Pro + */ + public $pro; + + /** + * Core constructor. + * + * @since 1.0.0 + */ + public function __construct() { + + $this->plugin_url = rtrim( plugin_dir_url( __DIR__ ), '/\\' ); + $this->assets_url = $this->plugin_url . '/assets'; + $this->plugin_path = rtrim( plugin_dir_path( __DIR__ ), '/\\' ); + + if ( $this->is_not_loadable() ) { + $this->do_not_load(); + + return; + } + + // Finally, load all the plugin. + $this->hooks(); + $this->init_early(); + } + + /** + * Currently used for Pro version only. + * + * @since 1.5.0 + * + * @return bool + */ + protected function is_not_loadable() { + + // Check the Pro. + if ( + is_readable( $this->plugin_path . '/src/Pro/Pro.php' ) && + ! $this->is_pro_allowed() + ) { + // So there is a Pro version, but its PHP version check failed. + return true; + } + + return false; + } + + /** + * What to do if plugin is not loaded. + * + * @since 1.5.0 + */ + protected function do_not_load() { + + add_action( 'admin_notices', function () { + + ?> +
            +

            + insecure version of PHP that is no longer supported. Please contact your web hosting provider to update your PHP version or switch to a recommended WordPress hosting company.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + 'strong' => array(), + ) + ), + 'https://www.wpbeginner.com/wordpress-hosting/' + ); + ?> +

            + Note: WP Mail SMTP plugin is disabled on your site until you fix the issue. Read more for additional information.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + 'strong' => array(), + ) + ), + 'https://wpforms.com/docs/supported-php-version/' + ); + ?> +

            +
            + + plugin_path ) . '/assets/languages' ); + + /* + * Constantly check in admin area, that we don't need to upgrade DB. + * Do not wait for the `admin_init` hook, because some actions are already done + * on `plugins_loaded`, so migration has to be done before. + * We should not fire this in AJAX requests. + */ + if ( WP::in_wp_admin() ) { + $this->get_migration(); + $this->get_upgrade(); + $this->detect_conflicts(); + } + + // In admin area, regardless of AJAX or not AJAX request. + if ( is_admin() ) { + $this->get_admin(); + $this->get_site_health()->init(); + } + + // Plugin admin area notices. Display to "admins" only. + if ( current_user_can( 'manage_options' ) ) { + add_action( 'admin_notices', array( '\WPMailSMTP\WP', 'display_admin_notices' ) ); + add_action( 'admin_notices', array( $this, 'display_general_notices' ) ); + } + } + + /** + * Whether the Pro part of the plugin is allowed to be loaded. + * + * @since 1.5.0 + * @since 1.6.0 Added a filter. + * + * @return bool + */ + protected function is_pro_allowed() { + + $is_allowed = true; + + if ( ! is_readable( $this->plugin_path . '/src/Pro/Pro.php' ) ) { + $is_allowed = false; + } + + if ( version_compare( phpversion(), '5.6', '<' ) ) { + $is_allowed = false; + } + + return apply_filters( 'wp_mail_smtp_core_is_pro_allowed', $is_allowed ); + } + + /** + * Get/Load the Pro code of the plugin if it exists. + * + * @since 1.6.2 + * + * @return \WPMailSMTP\Pro\Pro + */ + public function get_pro() { + + if ( ! $this->is_pro_allowed() ) { + return $this->pro; + } + + if ( ! $this->is_pro() ) { + $this->pro = new \WPMailSMTP\Pro\Pro(); + } + + return $this->pro; + } + + /** + * This method allows to overwrite certain core WP functions, because it's fired: + * - after `muplugins_loaded` hook, + * - before WordPress own `wp-includes/pluggable.php` file include, + * - before `plugin_loaded` and `plugins_loaded` hooks. + * + * @since 1.5.0 + */ + protected function init_early() { + + $pro_files = $this->is_pro_allowed() ? \WPMailSMTP\Pro\Pro::PLUGGABLE_FILES : array(); + + $files = (array) apply_filters( 'wp_mail_smtp_core_init_early_include_files', $pro_files ); + + foreach ( $files as $file ) { + $path = $this->plugin_path . '/' . $file; + + if ( is_readable( $path ) ) { + /** @noinspection PhpIncludeInspection */ + include_once $path; + } + } + } + + /** + * Load the plugin core processor. + * + * @since 1.0.0 + * + * @return Processor + */ + public function get_processor() { + + static $processor; + + if ( ! isset( $processor ) ) { + $processor = apply_filters( 'wp_mail_smtp_core_get_processor', new Processor() ); + } + + return $processor; + } + + /** + * Load the plugin admin area. + * + * @since 1.0.0 + * + * @return Admin\Area + */ + public function get_admin() { + + static $admin; + + if ( ! isset( $admin ) ) { + $admin = apply_filters( 'wp_mail_smtp_core_get_admin', new Admin\Area() ); + } + + return $admin; + } + + /** + * Load the plugin providers loader. + * + * @since 1.0.0 + * + * @return Providers\Loader + */ + public function get_providers() { + + static $providers; + + if ( ! isset( $providers ) ) { + $providers = apply_filters( 'wp_mail_smtp_core_get_providers', new Providers\Loader() ); + } + + return $providers; + } + + /** + * Load the plugin option migrator. + * + * @since 1.0.0 + * + * @return Migration + */ + public function get_migration() { + + static $migration; + + if ( ! isset( $migration ) ) { + $migration = apply_filters( 'wp_mail_smtp_core_get_migration', new Migration() ); + } + + return $migration; + } + + /** + * Load the plugin upgrader. + * + * @since 1.1.0 + * + * @return Upgrade + */ + public function get_upgrade() { + + static $upgrade; + + if ( ! isset( $upgrade ) ) { + $upgrade = apply_filters( 'wp_mail_smtp_core_get_upgrade', new Upgrade() ); + } + + return $upgrade; + } + + /** + * Get the plugin's WP Site Health object. + * + * @since {VERSION} + * + * @return SiteHealth + */ + public function get_site_health() { + + static $site_health; + + if ( ! isset( $site_health ) ) { + $site_health = apply_filters( 'wp_mail_smtp_core_get_site_health', new SiteHealth() ); + } + + return $site_health; + } + + /** + * Display various notifications to a user + * + * @since 1.0.0 + */ + public function init_notifications() { + + // Old PHP version notification. + if ( + version_compare( phpversion(), '5.6', '<' ) && + is_super_admin() && + ( + isset( $GLOBALS['pagenow'] ) && + $GLOBALS['pagenow'] === 'index.php' + ) + ) { + WP::add_admin_notice( + sprintf( + wp_kses( /* translators: %1$s - WP Mail SMTP plugin name; %2$s - WPForms.com URL to a related doc. */ + __( 'Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. Read more for additional information.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + 'rel' => array(), + ), + ) + ), + 'WP Mail SMTP', + 'https://wpforms.com/docs/supported-php-version/' + ) . + '

            ' . + wp_kses( + __( 'Please Note: Support for PHP 5.3-5.5 will be discontinued in 2020. After this, if no further action is taken, WP Mail SMTP functionality will be disabled.', 'wp-mail-smtp' ), + array( + 'strong' => array(), + 'em' => array(), + ) + ) . + '', + WP::ADMIN_NOTICE_ERROR, + false + ); + } + + // Awesome Motive Notifications. + if ( Options::init()->get( 'general', 'am_notifications_hidden' ) ) { + return; + } + } + + /** + * Display all debug mail-delivery related notices. + * + * @since 1.3.0 + * @since 1.6.0 Added a filter that allows to hide debug errors. + */ + public static function display_general_notices() { + + if ( wp_mail_smtp()->is_blocked() ) { + ?> + +
            +

            + EMAILING DISABLED: The %s is currently blocking all emails from being sent.', 'wp-mail-smtp' ), + array( + 'strong' => true, + ) + ), + esc_html( 'WP Mail SMTP v' . WPMS_PLUGIN_VER ) + ); + + if ( Options::init()->is_const_defined( 'general', 'do_not_send' ) ) { + $notices[] = sprintf( + wp_kses( /* translators: %1$s - constant name; %2$s - constant value. */ + __( 'To send emails, change the value of the %1$s constant to %2$s.', 'wp-mail-smtp' ), + array( + 'code' => true, + ) + ), + 'WPMS_DO_NOT_SEND', + 'false' + ); + } else { + $notices[] = sprintf( + wp_kses( /* translators: %s - plugin Misc settings page URL. */ + __( 'To send emails, go to plugin Misc settings and disable the "Do Not Send" option.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => true, + ), + ) + ), + esc_url( add_query_arg( 'tab', 'misc', wp_mail_smtp()->get_admin()->get_admin_page_url() ) ) + ); + } + + echo implode( ' ', $notices ); + ?> +

            +
            + + get_admin()->is_error_delivery_notice_enabled() ) { + + $notice = Debug::get_last(); + + if ( ! empty( $notice ) ) { + ?> + +
            +

            + EMAIL DELIVERY ERROR: the plugin %s logged this error during the last time it tried to send an email:', 'wp-mail-smtp' ), + array( + 'strong' => array(), + ) + ), + esc_html( 'WP Mail SMTP v' . WPMS_PLUGIN_VER ) + ); + ?> +

            + +
            +
            +
            + +

            + get_admin()->is_admin_page() ) { + printf( + wp_kses( /* translators: %s - plugin admin page URL. */ + __( 'Please review your WP Mail SMTP settings in plugin admin area.' ) . ' ', + array( + 'a' => array( + 'href' => array(), + ), + ) + ), + esc_url( wp_mail_smtp()->get_admin()->get_admin_page_url() ) + ); + } + + esc_html_e( 'Consider running an email test after fixing it.', 'wp-mail-smtp' ); + ?> +

            +
            + + is_detected() ) { + $conflicts->notify(); + } + } + + /** + * Init the \PHPMailer replacement. + * + * @since 1.0.0 + * + * @return \WPMailSMTP\MailCatcher + */ + public function replace_phpmailer() { + + global $phpmailer; + + return $this->replace_w_fake_phpmailer( $phpmailer ); + } + + /** + * Overwrite default PhpMailer with our MailCatcher. + * + * @since 1.0.0 + * @since 1.5.0 Throw external PhpMailer exceptions, inherits default WP behavior. + * + * @param null $obj PhpMailer object to override with own implementation. + * + * @return \WPMailSMTP\MailCatcher + */ + protected function replace_w_fake_phpmailer( &$obj = null ) { + + $obj = new MailCatcher( true ); + + return $obj; + } + + /** + * What to do on plugin activation. + * + * @since 1.0.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @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. + */ + public function activate( $plugin, $network_wide ) { + + // Store the plugin version when initial install occurred. + add_option( 'wp_mail_smtp_initial_version', WPMS_PLUGIN_VER, '', false ); + + // Store the plugin version activated to reference with upgrades. + update_option( 'wp_mail_smtp_version', WPMS_PLUGIN_VER, false ); + + // Save default options, only once. + Options::init()->set( Options::get_defaults(), true ); + } + + /** + * Whether this is a Pro version of a plugin. + * + * @since 1.5.0 + * + * @return bool + */ + public function is_pro() { + + return apply_filters( 'wp_mail_smtp_core_is_pro', ! empty( $this->pro ) ); + } + + /** + * Get the current license type. + * + * @since 1.5.0 + * + * @return string Default value: lite. + */ + public function get_license_type() { + + $type = Options::init()->get( 'license', 'type' ); + + if ( empty( $type ) ) { + $type = 'lite'; + } + + return strtolower( $type ); + } + + /** + * Get the current license key. + * + * @since 1.5.0 + * + * @return string + */ + public function get_license_key() { + + $key = Options::init()->get( 'license', 'key' ); + + if ( empty( $key ) ) { + $key = ''; + } + + return $key; + } + + /** + * Upgrade link used within the various admin pages. + * + * @since 1.5.0 + * @since 1.5.1 Support all UTM params. + * + * @param array|string $utm Array of UTM params, or if string provided - utm_content URL parameter. + * + * @return string + */ + public function get_upgrade_link( $utm ) { + + // Defaults. + $source = 'WordPress'; + $medium = 'plugin-settings'; + $campaign = 'liteplugin'; + $content = 'general'; + + if ( is_array( $utm ) ) { + if ( isset( $utm['source'] ) ) { + $source = $utm['source']; + } + if ( isset( $utm['medium'] ) ) { + $medium = $utm['medium']; + } + if ( isset( $utm['campaign'] ) ) { + $campaign = $utm['campaign']; + } + if ( isset( $utm['content'] ) ) { + $content = $utm['content']; + } + } elseif ( is_string( $utm ) ) { + $content = $utm; + } + + return apply_filters( + 'wp_mail_smtp_core_get_upgrade_link', + 'https://wpmailsmtp.com/lite-upgrade/?utm_source=' . esc_attr( $source ) . '&utm_medium=' . esc_attr( $medium ) . '&utm_campaign=' . esc_attr( $campaign ) . '&utm_content=' . esc_attr( $content ) + ); + } + + /** + * Whether the emailing functionality is blocked, with either an option or a constatnt. + * + * @since 1.7.0 + * + * @return bool + */ + public function is_blocked() { + + return (bool) Options::init()->get( 'general', 'do_not_send' ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Debug.php b/wp-content/plugins/wp-mail-smtp/src/Debug.php new file mode 100644 index 0000000..9eddfb9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Debug.php @@ -0,0 +1,122 @@ + $e->getMessage() ); + * $debug = Debug::get(); // array + * $debug = Debug::get_last(); // string + * + * @since 1.2.0 + */ +class Debug { + + /** + * Key for options table where all messages will be saved to. + */ + const OPTION_KEY = 'wp_mail_smtp_debug'; + + /** + * Save unique debug message to a debug log. + * Adds one more to a list, at the end. + * + * @since 1.2.0 + * + * @param mixed $message + */ + public static function set( $message ) { + + if ( empty( $message ) ) { + return; + } + + if ( ! is_string( $message ) ) { + $message = wp_json_encode( $message ); + } else { + $message = wp_strip_all_tags( $message, false ); + } + + $all = self::get(); + + array_push( $all, $message ); + + update_option( self::OPTION_KEY, array_unique( $all ), false ); + } + + /** + * Remove all messages for a debug log. + * + * @since 1.2.0 + */ + public static function clear() { + update_option( self::OPTION_KEY, array(), false ); + } + + /** + * Retrieve all messages from a debug log. + * + * @since 1.2.0 + * + * @return array + */ + public static function get() { + + $all = get_option( self::OPTION_KEY, array() ); + + if ( ! is_array( $all ) ) { + $all = (array) $all; + } + + return $all; + } + + /** + * Get the last message that was saved to a debug log. + * + * @since 1.2.0 + * + * @return string + */ + public static function get_last() { + + $all = self::get(); + + if ( ! empty( $all ) && is_array( $all ) ) { + return (string) end( $all ); + } + + return ''; + } + + /** + * Get the proper variable content output to debug. + * + * @since 1.2.0 + * + * @param mixed $var + * + * @return string + */ + public static function pvar( $var = '' ) { + + ob_start(); + + echo ''; + + if ( is_bool( $var ) || empty( $var ) ) { + var_dump( $var ); + } else { + print_r( $var ); + } + + echo ''; + + $output = ob_get_clean(); + + return str_replace( array( "\r\n", "\r", "\n" ), '', $output ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Geo.php b/wp-content/plugins/wp-mail-smtp/src/Geo.php new file mode 100644 index 0000000..e2cb71f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Geo.php @@ -0,0 +1,163 @@ + sanitize_text_field( $request['latitude'] ), + 'longitude' => sanitize_text_field( $request['longitude'] ), + 'city' => sanitize_text_field( $request['city'] ), + 'region' => sanitize_text_field( $request['region_name'] ), + 'country' => sanitize_text_field( $request['country_code'] ), + 'postal' => sanitize_text_field( $request['zip_code'] ), + ); + + return $data; + } + } + + $request = wp_remote_get( 'https://ipapi.co/' . $ip . '/json' ); + + if ( ! is_wp_error( $request ) ) { + + $request = json_decode( wp_remote_retrieve_body( $request ), true ); + + if ( ! empty( $request['latitude'] ) && ! empty( $request['longitude'] ) ) { + + $data = array( + 'latitude' => sanitize_text_field( $request['latitude'] ), + 'longitude' => sanitize_text_field( $request['longitude'] ), + 'city' => sanitize_text_field( $request['city'] ), + 'region' => sanitize_text_field( $request['region'] ), + 'country' => sanitize_text_field( $request['country'] ), + 'postal' => sanitize_text_field( $request['postal'] ), + ); + + return $data; + } + } + + $request = wp_remote_get( 'https://tools.keycdn.com/geo.json?host=' . $ip ); + + if ( ! is_wp_error( $request ) ) { + + $request = json_decode( wp_remote_retrieve_body( $request ), true ); + + if ( ! empty( $request['data']['geo']['latitude'] ) && ! empty( $request['data']['geo']['longitude'] ) ) { + + $data = array( + 'latitude' => sanitize_text_field( $request['data']['geo']['latitude'] ), + 'longitude' => sanitize_text_field( $request['data']['geo']['longitude'] ), + 'city' => sanitize_text_field( $request['data']['geo']['city'] ), + 'region' => sanitize_text_field( $request['data']['geo']['region_name'] ), + 'country' => sanitize_text_field( $request['data']['geo']['country_code'] ), + 'postal' => sanitize_text_field( $request['data']['geo']['postal_code'] ), + ); + + return $data; + } + } + + return array(); + } + + /** + * This routine calculates the distance between two points (given the latitude/longitude of those points). + * Definitions: South latitudes are negative, east longitudes are positive. + * + * @see https://www.geodatasource.com/developers/php + * + * @since 1.5.0 + * + * @param float $lat1 Latitude of point 1 (in decimal degrees). + * @param float $lon1 Longitude of point 1 (in decimal degrees). + * @param float $lat2 Latitude of point 2 (in decimal degrees). + * @param float $lon2 Longitude of point 2 (in decimal degrees). + * @param string $unit Supported values: M, K, N. Miles by default. + * + * @return float|int + */ + public static function get_distance_between( $lat1, $lon1, $lat2, $lon2, $unit = 'M' ) { + + if ( ( $lat1 === $lat2 ) && ( $lon1 === $lon2 ) ) { + return 0; + } + + $theta = $lon1 - $lon2; + $dist = sin( deg2rad( $lat1 ) ) * sin( deg2rad( $lat2 ) ) + cos( deg2rad( $lat1 ) ) * cos( deg2rad( $lat2 ) ) * cos( deg2rad( $theta ) ); + $dist = acos( $dist ); + $dist = rad2deg( $dist ); + $miles = $dist * 60 * 1.1515; + $unit = strtoupper( $unit ); + + if ( $unit === 'K' ) { + return ( $miles * 1.609344 ); + } elseif ( $unit === 'N' ) { + return ( $miles * 0.8684 ); + } + + return $miles; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/MailCatcher.php b/wp-content/plugins/wp-mail-smtp/src/MailCatcher.php new file mode 100644 index 0000000..72efda3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/MailCatcher.php @@ -0,0 +1,145 @@ +get( 'mail', 'mailer' ) ); + + $is_emailing_blocked = false; + + if ( wp_mail_smtp()->is_blocked() ) { + $is_emailing_blocked = true; + } + + // Always allow a test email - check for the specific header. + foreach ( (array) $this->getCustomHeaders() as $header ) { + if ( + ! empty( $header[0] ) && + ! empty( $header[1] ) && + $header[0] === 'X-Mailer-Type' && + trim( $header[1] ) === 'WPMailSMTP/Admin/Test' + ) { + $is_emailing_blocked = false; + } + }; + + // Do not send emails if admin desired that. + if ( $is_emailing_blocked ) { + return false; + } + + // Define a custom header, that will be used to identify the plugin and the mailer. + $this->XMailer = 'WPMailSMTP/Mailer/' . $mail_mailer . ' ' . WPMS_PLUGIN_VER; + + // Use the default PHPMailer, as we inject our settings there for certain providers. + if ( + $mail_mailer === 'mail' || + $mail_mailer === 'smtp' || + $mail_mailer === 'pepipost' + ) { + try { + // Prepare all the headers. + if ( ! $this->preSend() ) { + return false; + } + + // Allow to hook after all the preparation before the actual sending. + do_action( 'wp_mail_smtp_mailcatcher_smtp_send_before', $this ); + + return $this->postSend(); + } catch ( \phpmailerException $e ) { + $this->mailHeader = ''; + $this->setError( $e->getMessage() ); + if ( $this->exceptions ) { + throw $e; + } + + return false; + } + } + + // We need this so that the \PHPMailer class will correctly prepare all the headers. + $this->Mailer = 'mail'; + + // Prepare everything (including the message) for sending. + if ( ! $this->preSend() ) { + return false; + } + + $mailer = wp_mail_smtp()->get_providers()->get_mailer( $mail_mailer, $this ); + + if ( ! $mailer ) { + return false; + } + + if ( ! $mailer->is_php_compatible() ) { + return false; + } + + /* + * Send the actual email. + * We reuse everything, that was preprocessed for usage in \PHPMailer. + */ + $mailer->send(); + + $is_sent = $mailer->is_email_sent(); + + // Allow to perform any actions with the data. + do_action( 'wp_mail_smtp_mailcatcher_send_after', $mailer, $this ); + + return $is_sent; + } + + /** + * Returns all custom headers. + * In older versions of \PHPMailer class this method didn't exist. + * As we support WordPress 3.6+ - we need to make sure this method is always present. + * + * @since 1.5.0 + * + * @return array + */ + public function getCustomHeaders() { + + return $this->CustomHeader; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Migration.php b/wp-content/plugins/wp-mail-smtp/src/Migration.php new file mode 100644 index 0000000..80cdaa0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Migration.php @@ -0,0 +1,257 @@ +is_migrated() ) { + return; + } + + $this->old_values = $this->get_old_values(); + $this->new_values = $this->get_converted_options(); + + Options::init()->set( $this->new_values, true ); + + // Removing all old options will be enabled some time in the future. + // $this->clean_deprecated_data(); + } + + /** + * Whether we already migrated or not. + * + * @since 1.0.0 + * + * @return bool + */ + protected function is_migrated() { + + $is_migrated = false; + $new_values = get_option( Options::META_KEY, array() ); + + if ( ! empty( $new_values ) ) { + $is_migrated = true; + } + + return $is_migrated; + } + + /** + * Get all old values from DB. + * + * @since 1.0.0 + * + * @return array + */ + protected function get_old_values() { + + $old_values = array(); + + foreach ( $this->old_keys as $old_key ) { + $value = get_option( $old_key, '' ); + + if ( ! empty( $value ) ) { + $old_values[ $old_key ] = $value; + } + } + + return $old_values; + } + + /** + * Convert old values from key=>value to a multidimensional array of data. + * + * @since 1.0.0 + */ + protected function get_converted_options() { + + $converted = array(); + + foreach ( $this->old_keys as $old_key ) { + + $old_value = isset( $this->old_values[ $old_key ] ) ? $this->old_values[ $old_key ] : ''; + + switch ( $old_key ) { + case 'pepipost_user': + case 'pepipost_pass': + case 'pepipost_port': + case 'pepipost_ssl': + // Do not migrate pepipost options if it's not activated at the moment. + if ( isset( $this->old_values['mailer'] ) && $this->old_values['mailer'] === 'pepipost' ) { + $shortcut = explode( '_', $old_key ); + + if ( $old_key === 'pepipost_ssl' ) { + $converted[ $shortcut[0] ]['encryption'] = $old_value; + } else { + $converted[ $shortcut[0] ][ $shortcut[1] ] = $old_value; + } + } + break; + + case 'smtp_host': + case 'smtp_port': + case 'smtp_ssl': + case 'smtp_auth': + case 'smtp_user': + case 'smtp_pass': + $shortcut = explode( '_', $old_key ); + + if ( $old_key === 'smtp_ssl' ) { + $converted[ $shortcut[0] ]['encryption'] = $old_value; + } elseif ( $old_key === 'smtp_auth' ) { + $converted[ $shortcut[0] ][ $shortcut[1] ] = ( $old_value === 'true' ? 'yes' : 'no' ); + } else { + $converted[ $shortcut[0] ][ $shortcut[1] ] = $old_value; + } + + break; + + case 'mail_from': + $converted['mail']['from_email'] = $old_value; + break; + case 'mail_from_name': + $converted['mail']['from_name'] = $old_value; + break; + case 'mail_set_return_path': + $converted['mail']['return_path'] = ( $old_value === 'true' ); + break; + case 'mailer': + $converted['mail']['mailer'] = $old_value; + break; + case 'wp_mail_smtp_am_notifications_hidden': + $converted['general']['am_notifications_hidden'] = ( isset( $old_value ) && $old_value === 'true' ); + break; + } + } + + $converted = $this->get_converted_constants_options( $converted ); + + return $converted; + } + + /** + * Some users use constants in wp-config.php to define values. + * We need to prioritize them and reapply data to options. + * Use only those that are actually defined. + * + * @since 1.0.0 + * + * @param array $converted + * + * @return array + */ + protected function get_converted_constants_options( $converted ) { + + // Are we configured via constants? + if ( ! defined( 'WPMS_ON' ) || ! WPMS_ON ) { + return $converted; + } + + /* + * Mail settings. + */ + if ( defined( 'WPMS_MAIL_FROM' ) ) { + $converted['mail']['from_email'] = WPMS_MAIL_FROM; + } + if ( defined( 'WPMS_MAIL_FROM_NAME' ) ) { + $converted['mail']['from_name'] = WPMS_MAIL_FROM_NAME; + } + if ( defined( 'WPMS_MAILER' ) ) { + $converted['mail']['mailer'] = WPMS_MAILER; + } + if ( defined( 'WPMS_SET_RETURN_PATH' ) ) { + $converted['mail']['return_path'] = WPMS_SET_RETURN_PATH; + } + + /* + * SMTP settings. + */ + if ( defined( 'WPMS_SMTP_HOST' ) ) { + $converted['smtp']['host'] = WPMS_SMTP_HOST; + } + if ( defined( 'WPMS_SMTP_PORT' ) ) { + $converted['smtp']['port'] = WPMS_SMTP_PORT; + } + if ( defined( 'WPMS_SSL' ) ) { + $converted['smtp']['ssl'] = WPMS_SSL; + } + if ( defined( 'WPMS_SMTP_AUTH' ) ) { + $converted['smtp']['auth'] = WPMS_SMTP_AUTH; + } + if ( defined( 'WPMS_SMTP_USER' ) ) { + $converted['smtp']['user'] = WPMS_SMTP_USER; + } + if ( defined( 'WPMS_SMTP_PASS' ) ) { + $converted['smtp']['pass'] = WPMS_SMTP_PASS; + } + + return $converted; + } + + /** + * Delete all old values that are stored separately each. + * + * @since 1.0.0 + */ + protected function clean_deprecated_data() { + + foreach ( $this->old_keys as $old_key ) { + delete_option( $old_key ); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Options.php b/wp-content/plugins/wp-mail-smtp/src/Options.php new file mode 100644 index 0000000..81800d1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Options.php @@ -0,0 +1,937 @@ + array( + 'from_name', + 'from_email', + 'mailer', + 'return_path', + 'from_name_force', + 'from_email_force', + ), + 'smtp' => array( + 'host', + 'port', + 'encryption', + 'autotls', + 'auth', + 'user', + 'pass', + ), + 'gmail' => array( + 'client_id', + 'client_secret', + ), + 'outlook' => array( + 'client_id', + 'client_secret', + ), + 'amazonses' => array( + 'client_id', + 'client_secret', + 'region', + 'emails_pending', + ), + 'mailgun' => array( + 'api_key', + 'domain', + 'region', + ), + 'sendgrid' => array( + 'api_key', + ), + 'sendinblue' => array( + 'api_key', + ), + 'pepipostapi' => array( + 'api_key', + ), + 'pepipost' => array( + 'host', + 'port', + 'encryption', + 'auth', + 'user', + 'pass', + ), + 'license' => array( + 'key', + ), + ); + + /** + * That's where plugin options are saved in wp_options table. + * + * @var string + */ + const META_KEY = 'wp_mail_smtp'; + + /** + * All the plugin options. + * + * @var array + */ + private $_options = array(); + + /** + * Init the Options class. + * TODO: add a flag to process without retrieving const values. + * + * @since 1.0.0 + */ + public function __construct() { + $this->populate_options(); + } + + /** + * Initialize all the options, used for chaining. + * + * One-liner: + * Options::init()->get('smtp', 'host'); + * Options::init()->is_pepipost_active(); + * + * Or multiple-usage: + * $options = new Options(); + * $options->get('smtp', 'host'); + * + * @since 1.0.0 + * + * @return Options + */ + public static function init() { + + static $instance; + + if ( ! $instance ) { + $instance = new self(); + } + + return $instance; + } + + /** + * Default options that are saved on plugin activation. + * + * @since 1.3.0 + * + * @return array + */ + public static function get_defaults() { + + return array( + 'mail' => array( + 'from_email' => get_option( 'admin_email' ), + 'from_name' => get_bloginfo( 'name' ), + 'mailer' => 'mail', + 'return_path' => false, + 'from_email_force' => false, + 'from_name_force' => false, + ), + 'smtp' => array( + 'autotls' => true, + 'auth' => true, + ), + ); + } + + /** + * Retrieve all options of the plugin. + * + * @since 1.0.0 + */ + protected function populate_options() { + $this->_options = get_option( self::META_KEY, array() ); + } + + /** + * Get all the options. + * + * Options::init()->get_all(); + * + * @since 1.0.0 + * + * @return array + */ + public function get_all() { + + $options = $this->_options; + + foreach ( $options as $group => $g_value ) { + foreach ( $g_value as $key => $value ) { + $options[ $group ][ $key ] = $this->get( $group, $key ); + } + } + + return apply_filters( 'wp_mail_smtp_options_get_all', $options ); + } + + /** + * Get all the options for a group. + * + * Options::init()->get_group('smtp') - will return the array of options for the group, including defaults and constants. + * + * @since 1.0.0 + * @since 1.5.0 Process values through the get() method which is aware of constants. + * + * @param string $group + * + * @return array + */ + public function get_group( $group ) { + + // Just to feel safe. + $group = sanitize_key( $group ); + + /* + * Get the values saved in DB. + * If plugin is configured with constants right from the start - this will not have all the values. + */ + $options = isset( $this->_options[ $group ] ) ? $this->_options[ $group ] : array(); + + // We need to process certain constants-aware options through actual constants. + if ( isset( self::$map[ $group ] ) ) { + foreach ( self::$map[ $group ] as $key ) { + $options[ $key ] = $this->get( $group, $key ); + } + } + + return apply_filters( 'wp_mail_smtp_options_get_group', $options, $group ); + } + + /** + * Get options by a group and a key. + * + * Options::init()->get( 'smtp', 'host' ) - will return only SMTP 'host' option. + * + * @since 1.0.0 + * + * @param string $group + * @param string $key + * + * @return mixed|null Null if value doesn't exist anywhere: in constants, in DB, in a map. So it's completely custom or a typo. + */ + public function get( $group, $key ) { + + // Just to feel safe. + $group = sanitize_key( $group ); + $key = sanitize_key( $key ); + $value = null; + + // Get the const value if we have one. + $value = $this->get_const_value( $group, $key, $value ); + + // We don't have a const value. + if ( $value === null ) { + // Ordinary database or default values. + if ( isset( $this->_options[ $group ] ) ) { + // Get the options key of a group. + if ( isset( $this->_options[ $group ][ $key ] ) ) { + $value = $this->_options[ $group ][ $key ]; + } else { + $value = $this->postprocess_key_defaults( $group, $key ); + } + } else { + /* + * Fallback to default if it doesn't exist in a map. + * Allow to retrieve only values from a map. + */ + if ( + isset( self::$map[ $group ] ) && + in_array( $key, self::$map[ $group ], true ) + ) { + $value = $this->postprocess_key_defaults( $group, $key ); + } + } + } + + // Strip slashes only from values saved in DB. Constants should be processed as is. + if ( is_string( $value ) && ! $this->is_const_defined( $group, $key ) ) { + $value = stripslashes( $value ); + } + + return apply_filters( 'wp_mail_smtp_options_get', $value, $group, $key ); + } + + /** + * Some options may be non-empty by default, + * so we need to postprocess them to convert. + * + * @since 1.0.0 + * @since 1.4.0 Added Mailgun:region. + * @since 1.5.0 Added Outlook/AmazonSES, license key support. + * + * @param string $group + * @param string $key + * + * @return mixed + */ + protected function postprocess_key_defaults( $group, $key ) { + + $value = ''; + + switch ( $key ) { + case 'from_email_force': + case 'from_name_force': + case 'return_path': + $value = $group === 'mail' ? false : true; + break; + + case 'mailer': + $value = 'mail'; + break; + + case 'encryption': + $value = in_array( $group, array( 'smtp', 'pepipost' ), true ) ? 'none' : $value; + break; + + case 'region': + $value = $group === 'mailgun' ? 'US' : $value; + break; + + case 'emails_pending': + $value = array(); + break; + + case 'auth': + case 'autotls': + $value = in_array( $group, array( 'smtp', 'pepipost' ), true ) ? false : true; + break; + + case 'pass': + $value = $this->get_const_value( $group, $key, $value ); + break; + + case 'type': + $value = $group === 'license' ? 'lite' : ''; + break; + } + + return apply_filters( 'wp_mail_smtp_options_postprocess_key_defaults', $value, $group, $key ); + } + + /** + * Process the options values through the constants check. + * If we have defined associated constant - use it instead of a DB value. + * Backward compatibility is hard. + * General section of options won't have constants, so we are omitting those checks and just return default value. + * + * @since 1.0.0 + * @since 1.4.0 Added WPMS_MAILGUN_REGION. + * @since 1.5.0 Added Outlook/AmazonSES, license key support. + * @since 1.6.0 Added Sendinblue. + * @since 1.7.0 Added Do Not Send. + * @since 1.8.0 Added Pepipost API. + * + * @param string $group + * @param string $key + * @param mixed $value + * + * @return mixed + */ + protected function get_const_value( $group, $key, $value ) { + + if ( ! $this->is_const_enabled() ) { + return $value; + } + + $return = null; + + switch ( $group ) { + case 'mail': + switch ( $key ) { + case 'from_name': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAIL_FROM_NAME : $value; + break; + case 'from_email': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAIL_FROM : $value; + break; + case 'mailer': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAILER : $value; + break; + case 'return_path': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SET_RETURN_PATH : $value; + break; + case 'from_name_force': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAIL_FROM_NAME_FORCE : $value; + break; + case 'from_email_force': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAIL_FROM_FORCE : $value; + break; + } + + break; + + case 'smtp': + switch ( $key ) { + case 'host': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SMTP_HOST : $value; + break; + case 'port': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SMTP_PORT : $value; + break; + case 'encryption': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? ( WPMS_SSL === '' ? 'none' : WPMS_SSL ) : $value; + break; + case 'auth': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SMTP_AUTH : $value; + break; + case 'autotls': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SMTP_AUTOTLS : $value; + break; + case 'user': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SMTP_USER : $value; + break; + case 'pass': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SMTP_PASS : $value; + break; + } + + break; + + case 'gmail': + switch ( $key ) { + case 'client_id': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_GMAIL_CLIENT_ID : $value; + break; + case 'client_secret': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_GMAIL_CLIENT_SECRET : $value; + break; + } + + break; + + case 'outlook': + switch ( $key ) { + case 'client_id': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_OUTLOOK_CLIENT_ID : $value; + break; + case 'client_secret': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_OUTLOOK_CLIENT_SECRET : $value; + break; + } + + break; + + case 'amazonses': + switch ( $key ) { + case 'client_id': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_AMAZONSES_CLIENT_ID : $value; + break; + case 'client_secret': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_AMAZONSES_CLIENT_SECRET : $value; + break; + case 'region': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_AMAZONSES_REGION : $value; + break; + } + + break; + + case 'mailgun': + switch ( $key ) { + case 'api_key': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAILGUN_API_KEY : $value; + break; + case 'domain': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAILGUN_DOMAIN : $value; + break; + case 'region': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_MAILGUN_REGION : $value; + break; + } + + break; + + case 'sendgrid': + switch ( $key ) { + case 'api_key': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SENDGRID_API_KEY : $value; + break; + } + + break; + + case 'sendinblue': + switch ( $key ) { + case 'api_key': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_SENDINBLUE_API_KEY : $value; + break; + } + + break; + + case 'pepipostapi': + switch ( $key ) { + case 'api_key': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_PEPIPOST_API_KEY : $value; + break; + } + + break; + + case 'license': + switch ( $key ) { + case 'key': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_LICENSE_KEY : $value; + break; + } + + break; + + case 'general': + switch ( $key ) { + case 'do_not_send': + /** @noinspection PhpUndefinedConstantInspection */ + $return = $this->is_const_defined( $group, $key ) ? WPMS_DO_NOT_SEND : $value; + break; + } + + break; + + default: + // Always return the default value if nothing from above matches the request. + $return = $value; + } + + return apply_filters( 'wp_mail_smtp_options_get_const_value', $return, $group, $key, $value ); + } + + /** + * Whether constants redefinition is enabled or not. + * + * @since 1.0.0 + * @since 1.5.0 Added filter to redefine the value. + * + * @return bool + */ + public function is_const_enabled() { + + $return = defined( 'WPMS_ON' ) && WPMS_ON === true; + + return apply_filters( 'wp_mail_smtp_options_is_const_enabled', $return ); + } + + /** + * We need this check to reuse later in admin area, + * to distinguish settings fields that were redefined, + * and display them differently. + * + * @since 1.0.0 + * @since 1.5.0 Added a filter, Outlook/AmazonSES, license key support. + * @since 1.6.0 Added Sendinblue. + * @since 1.7.0 Added Do Not Send. + * @since 1.8.0 Added Pepipost API. + * + * @param string $group + * @param string $key + * + * @return bool + */ + public function is_const_defined( $group, $key ) { + + if ( ! $this->is_const_enabled() ) { + return false; + } + + // Just to feel safe. + $group = sanitize_key( $group ); + $key = sanitize_key( $key ); + $return = false; + + switch ( $group ) { + case 'mail': + switch ( $key ) { + case 'from_name': + $return = defined( 'WPMS_MAIL_FROM_NAME' ) && WPMS_MAIL_FROM_NAME; + break; + case 'from_email': + $return = defined( 'WPMS_MAIL_FROM' ) && WPMS_MAIL_FROM; + break; + case 'mailer': + $return = defined( 'WPMS_MAILER' ) && WPMS_MAILER; + break; + case 'return_path': + $return = defined( 'WPMS_SET_RETURN_PATH' ) && ( WPMS_SET_RETURN_PATH === 'true' || WPMS_SET_RETURN_PATH === true ); + break; + case 'from_name_force': + $return = defined( 'WPMS_MAIL_FROM_NAME_FORCE' ) && ( WPMS_MAIL_FROM_NAME_FORCE === 'true' || WPMS_MAIL_FROM_NAME_FORCE === true ); + break; + case 'from_email_force': + $return = defined( 'WPMS_MAIL_FROM_FORCE' ) && ( WPMS_MAIL_FROM_FORCE === 'true' || WPMS_MAIL_FROM_FORCE === true ); + break; + } + + break; + + case 'smtp': + switch ( $key ) { + case 'host': + $return = defined( 'WPMS_SMTP_HOST' ) && WPMS_SMTP_HOST; + break; + case 'port': + $return = defined( 'WPMS_SMTP_PORT' ) && WPMS_SMTP_PORT; + break; + case 'encryption': + $return = defined( 'WPMS_SSL' ); + break; + case 'auth': + $return = defined( 'WPMS_SMTP_AUTH' ) && WPMS_SMTP_AUTH; + break; + case 'autotls': + $return = defined( 'WPMS_SMTP_AUTOTLS' ) && ( WPMS_SMTP_AUTOTLS === 'true' || WPMS_SMTP_AUTOTLS === true ); + break; + case 'user': + $return = defined( 'WPMS_SMTP_USER' ) && WPMS_SMTP_USER; + break; + case 'pass': + $return = defined( 'WPMS_SMTP_PASS' ) && WPMS_SMTP_PASS; + break; + } + + break; + + case 'gmail': + switch ( $key ) { + case 'client_id': + $return = defined( 'WPMS_GMAIL_CLIENT_ID' ) && WPMS_GMAIL_CLIENT_ID; + break; + case 'client_secret': + $return = defined( 'WPMS_GMAIL_CLIENT_SECRET' ) && WPMS_GMAIL_CLIENT_SECRET; + break; + } + + break; + + case 'outlook': + switch ( $key ) { + case 'client_id': + $return = defined( 'WPMS_OUTLOOK_CLIENT_ID' ) && WPMS_OUTLOOK_CLIENT_ID; + break; + case 'client_secret': + $return = defined( 'WPMS_OUTLOOK_CLIENT_SECRET' ) && WPMS_OUTLOOK_CLIENT_SECRET; + break; + } + + break; + + case 'amazonses': + switch ( $key ) { + case 'client_id': + $return = defined( 'WPMS_AMAZONSES_CLIENT_ID' ) && WPMS_AMAZONSES_CLIENT_ID; + break; + case 'client_secret': + $return = defined( 'WPMS_AMAZONSES_CLIENT_SECRET' ) && WPMS_AMAZONSES_CLIENT_SECRET; + break; + case 'region': + $return = defined( 'WPMS_AMAZONSES_REGION' ) && WPMS_AMAZONSES_REGION; + break; + } + + break; + + case 'mailgun': + switch ( $key ) { + case 'api_key': + $return = defined( 'WPMS_MAILGUN_API_KEY' ) && WPMS_MAILGUN_API_KEY; + break; + case 'domain': + $return = defined( 'WPMS_MAILGUN_DOMAIN' ) && WPMS_MAILGUN_DOMAIN; + break; + case 'region': + $return = defined( 'WPMS_MAILGUN_REGION' ) && WPMS_MAILGUN_REGION; + break; + } + + break; + + case 'sendgrid': + switch ( $key ) { + case 'api_key': + $return = defined( 'WPMS_SENDGRID_API_KEY' ) && WPMS_SENDGRID_API_KEY; + break; + } + + break; + + case 'sendinblue': + switch ( $key ) { + case 'api_key': + $return = defined( 'WPMS_SENDINBLUE_API_KEY' ) && WPMS_SENDINBLUE_API_KEY; + break; + } + + break; + + case 'pepipostapi': + switch ( $key ) { + case 'api_key': + $return = defined( 'WPMS_PEPIPOST_API_KEY' ) && WPMS_PEPIPOST_API_KEY; + break; + } + + break; + + case 'license': + switch ( $key ) { + case 'key': + $return = defined( 'WPMS_LICENSE_KEY' ) && WPMS_LICENSE_KEY; + break; + } + + break; + + case 'general': + switch ( $key ) { + case 'do_not_send': + /** @noinspection PhpUndefinedConstantInspection */ + $return = defined( 'WPMS_DO_NOT_SEND' ) && WPMS_DO_NOT_SEND; + break; + } + + break; + } + + return apply_filters( 'wp_mail_smtp_options_is_const_defined', $return, $group, $key ); + } + + /** + * Set plugin options, all at once. + * + * @since 1.0.0 + * @since 1.3.0 Added $once argument to save options only if they don't exist already. + * @since 1.4.0 Added Mailgun:region. + * @since 1.5.0 Added Outlook/AmazonSES, Email Log. Stop saving const values into DB. + * + * @param array $options Plugin options to save. + * @param bool $once Whether to update existing options or to add these options only once. + */ + public function set( $options, $once = false ) { + /* + * Process generic options. + */ + foreach ( (array) $options as $group => $keys ) { + foreach ( $keys as $option_name => $option_value ) { + switch ( $group ) { + case 'mail': + switch ( $option_name ) { + case 'from_name': + case 'mailer': + $options[ $group ][ $option_name ] = sanitize_text_field( $option_value ); + break; + case 'from_email': + if ( filter_var( $option_value, FILTER_VALIDATE_EMAIL ) ) { + $options[ $group ][ $option_name ] = sanitize_email( $option_value ); + } else { + $options[ $group ][ $option_name ] = sanitize_email( + wp_mail_smtp()->get_processor()->get_default_email() + ); + } + break; + case 'return_path': + case 'from_name_force': + case 'from_email_force': + $options[ $group ][ $option_name ] = (bool) $option_value; + break; + } + break; + + case 'general': + switch ( $option_name ) { + case 'do_not_send': + case 'am_notifications_hidden': + case 'email_delivery_errors_hidden': + case 'uninstall': + $options[ $group ][ $option_name ] = (bool) $option_value; + break; + } + } + } + } + + /* + * Process mailers-specific options. + */ + if ( + ! empty( $options['mail']['mailer'] ) && + isset( $options[ $options['mail']['mailer'] ] ) && + in_array( $options['mail']['mailer'], array( 'pepipost', 'pepipostapi', 'smtp', 'sendgrid', 'sendinblue', 'mailgun', 'gmail', 'outlook' ), true ) + ) { + + $mailer = $options['mail']['mailer']; + + foreach ( $options[ $mailer ] as $option_name => $option_value ) { + switch ( $option_name ) { + case 'host': // smtp. + case 'user': // smtp. + case 'encryption': // smtp. + case 'region': // mailgun/amazonses. + $options[ $mailer ][ $option_name ] = $this->is_const_defined( $mailer, $option_name ) ? '' : sanitize_text_field( $option_value ); + break; // smtp. + case 'port': + $options[ $mailer ][ $option_name ] = $this->is_const_defined( $mailer, $option_name ) ? 25 : (int) $option_value; + break; + case 'auth': // smtp. + case 'autotls': // smtp. + $option_value = (bool) $option_value; + + $options[ $mailer ][ $option_name ] = $this->is_const_defined( $mailer, $option_name ) ? false : $option_value; + break; + + case 'pass': // smtp. + // Do not process as they may contain certain special characters, but allow to be overwritten using constants. + $options[ $mailer ][ $option_name ] = $this->is_const_defined( $mailer, $option_name ) ? '' : trim( (string) $option_value ); + break; + + case 'api_key': // mailgun/sendgrid/sendinblue/pepipostapi. + case 'domain': // mailgun. + case 'client_id': // gmail/outlook/amazonses. + case 'client_secret': // gmail/outlook/amazonses. + case 'auth_code': // gmail/outlook. + $options[ $mailer ][ $option_name ] = $this->is_const_defined( $mailer, $option_name ) ? '' : sanitize_text_field( $option_value ); + break; + + case 'access_token': // gmail/outlook, array(). + case 'user_details': // outlook, array(). + case 'emails_pending': // amazonses, array(). + // These options don't support constants. + $options[ $mailer ][ $option_name ] = $option_value; + break; + } + } + } + + $options = apply_filters( 'wp_mail_smtp_options_set', $options ); + + // Whether to update existing options or to add these options only once if they don't exist yet. + if ( $once ) { + add_option( self::META_KEY, $options, '', 'no' ); // Do not autoload these options. + } else { + update_option( self::META_KEY, $options, 'no' ); + } + + // Now we need to re-cache values. + $this->populate_options(); + } + + /** + * Merge recursively, including a proper substitution of values in sub-arrays when keys are the same. + * It's more like array_merge() and array_merge_recursive() combined. + * + * @since 1.0.0 + * + * @return array + */ + public static function array_merge_recursive() { + + $arrays = func_get_args(); + + if ( count( $arrays ) < 2 ) { + return isset( $arrays[0] ) ? $arrays[0] : array(); + } + + $merged = array(); + + while ( $arrays ) { + $array = array_shift( $arrays ); + + if ( ! is_array( $array ) ) { + return array(); + } + + if ( empty( $array ) ) { + continue; + } + + foreach ( $array as $key => $value ) { + if ( is_string( $key ) ) { + if ( + is_array( $value ) && + array_key_exists( $key, $merged ) && + is_array( $merged[ $key ] ) + ) { + $merged[ $key ] = call_user_func( __METHOD__, $merged[ $key ], $value ); + } else { + $merged[ $key ] = $value; + } + } else { + $merged[] = $value; + } + } + } + + return $merged; + } + + /** + * Check whether the site is using Pepipost SMTP or not. + * + * @since 1.0.0 + * + * @return bool + */ + public function is_pepipost_active() { + return apply_filters( 'wp_mail_smtp_options_is_pepipost_active', $this->get( 'mail', 'mailer' ) === 'pepipost' ); + } + + /** + * Check whether the site is using Pepipost/SMTP as a mailer or not. + * + * @since 1.1.0 + * + * @return bool + */ + public function is_mailer_smtp() { + return apply_filters( 'wp_mail_smtp_options_is_mailer_smtp', in_array( $this->get( 'mail', 'mailer' ), array( 'pepipost', 'smtp' ), true ) ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Processor.php b/wp-content/plugins/wp-mail-smtp/src/Processor.php new file mode 100644 index 0000000..96b15d4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Processor.php @@ -0,0 +1,252 @@ +hooks(); + } + + /** + * Assign all hooks to proper places. + * + * @since 1.0.0 + */ + public function hooks() { + + add_action( 'phpmailer_init', array( $this, 'phpmailer_init' ) ); + + add_filter( 'wp_mail_from', array( $this, 'filter_mail_from_email' ), 1000 ); + add_filter( 'wp_mail_from_name', array( $this, 'filter_mail_from_name' ), 1000 ); + } + + /** + * Redefine certain PHPMailer options with our custom ones. + * + * @since 1.0.0 + * + * @param \PHPMailer $phpmailer It's passed by reference, so no need to return anything. + */ + public function phpmailer_init( $phpmailer ) { + + $options = new Options(); + $mailer = $options->get( 'mail', 'mailer' ); + + // Check that mailer is not blank, and if mailer=smtp, host is not blank. + if ( + ! $mailer || + ( 'smtp' === $mailer && ! $options->get( 'smtp', 'host' ) ) + ) { + return; + } + + // If the mailer is pepipost, make sure we have a username and password. + if ( + 'pepipost' === $mailer && + ( ! $options->get( 'pepipost', 'user' ) && ! $options->get( 'pepipost', 'pass' ) ) + ) { + return; + } + + // Set the mailer type as per config above, this overrides the already called isMail method. + // It's basically always 'smtp'. + $phpmailer->Mailer = $mailer; + + // Set the Sender (return-path) if required. + if ( $options->get( 'mail', 'return_path' ) ) { + $phpmailer->Sender = $phpmailer->From; + } + + // Set the SMTPSecure value, if set to none, leave this blank. Possible values: 'ssl', 'tls', ''. + if ( 'none' === $options->get( $mailer, 'encryption' ) ) { + $phpmailer->SMTPSecure = ''; + } else { + $phpmailer->SMTPSecure = $options->get( $mailer, 'encryption' ); + } + + // Check if user has disabled SMTPAutoTLS. + if ( $options->get( $mailer, 'encryption' ) !== 'tls' && ! $options->get( $mailer, 'autotls' ) ) { + $phpmailer->SMTPAutoTLS = false; + } + + // If we're sending via SMTP, set the host. + if ( 'smtp' === $mailer ) { + // Set the other options. + $phpmailer->Host = $options->get( $mailer, 'host' ); + $phpmailer->Port = $options->get( $mailer, 'port' ); + + // If we're using smtp auth, set the username & password. + if ( $options->get( $mailer, 'auth' ) ) { + $phpmailer->SMTPAuth = true; + $phpmailer->Username = $options->get( $mailer, 'user' ); + $phpmailer->Password = $options->get( $mailer, 'pass' ); + } + } elseif ( 'pepipost' === $mailer ) { + // Set the Pepipost settings for BC. + $phpmailer->Mailer = 'smtp'; + $phpmailer->Host = 'smtp.pepipost.com'; + $phpmailer->Port = $options->get( $mailer, 'port' ); + $phpmailer->SMTPSecure = $options->get( $mailer, 'encryption' ) === 'none' ? '' : $options->get( $mailer, 'encryption' ); + $phpmailer->SMTPAuth = true; + $phpmailer->Username = $options->get( $mailer, 'user' ); + $phpmailer->Password = $options->get( $mailer, 'pass' ); + } + + // You can add your own options here. + // See the phpmailer documentation for more info: https://github.com/PHPMailer/PHPMailer/tree/5.2-stable. + /** @noinspection PhpUnusedLocalVariableInspection It's passed by reference. */ + $phpmailer = apply_filters( 'wp_mail_smtp_custom_options', $phpmailer ); + } + + /** + * This method will be called every time 'smtp' and 'mail' mailers will be used to send emails. + * + * @since 1.3.0 + * @since 1.5.0 Added a do_action() to be able to hook into. + * + * @param bool $is_sent + * @param array $to + * @param array $cc + * @param array $bcc + * @param string $subject + * @param string $body + * @param string $from + */ + public static function send_callback( $is_sent, $to, $cc, $bcc, $subject, $body, $from ) { + + if ( ! $is_sent ) { + // Add mailer to the beginning and save to display later. + Debug::set( + 'Mailer: ' . esc_html( wp_mail_smtp()->get_providers()->get_options( Options::init()->get( 'mail', 'mailer' ) )->get_title() ) . "\r\n" . + 'PHPMailer was able to connect to SMTP server but failed while trying to send an email.' + ); + } else { + Debug::clear(); + } + + do_action( 'wp_mail_smtp_mailcatcher_smtp_send_after', $is_sent, $to, $cc, $bcc, $subject, $body, $from ); + } + + /** + * Modify the email address that is used for sending emails. + * + * @since 1.0.0 + * @since 1.3.0 Forcing email rewrite if option is selected. + * @since 1.7.0 Default email may be empty, so pay attention to that as well. + * + * @param string $wp_email + * + * @return string + */ + public function filter_mail_from_email( $wp_email ) { + + $options = new Options(); + $forced = $options->get( 'mail', 'from_email_force' ); + $from_email = $options->get( 'mail', 'from_email' ); + $def_email = $this->get_default_email(); + + // Return FROM EMAIL if forced in settings. + if ( $forced & ! empty( $from_email ) ) { + return $from_email; + } + + // If the FROM EMAIL is not the default, return it unchanged. + if ( ! empty( $def_email ) && $wp_email !== $def_email ) { + return $wp_email; + } + + return ! empty( $from_email ) ? $from_email : $wp_email; + } + + /** + * Modify the sender name that is used for sending emails. + * + * @since 1.0.0 + * @since 1.3.0 Forcing name rewrite if option is selected. + * + * @param string $name + * + * @return string + */ + public function filter_mail_from_name( $name ) { + + $options = new Options(); + $force = $options->get( 'mail', 'from_name_force' ); + + // If the FROM NAME is not the default and not forced, return it unchanged. + if ( ! $force && $name !== $this->get_default_name() ) { + return $name; + } + + $name = $options->get( 'mail', 'from_name' ); + + return $name; + } + + /** + * Get the default email address based on domain name. + * + * @since 1.0.0 + * @since 1.7.0 May return an empty string. + * + * @return string Empty string when we aren't able to get the site domain (CLI, misconfigured server etc). + */ + public function get_default_email() { + + $server_name = Geo::get_site_domain(); + + if ( empty( $server_name ) ) { + return ''; + } + + // Get rid of www. + $sitename = strtolower( $server_name ); + if ( substr( $sitename, 0, 4 ) === 'www.' ) { + $sitename = substr( $sitename, 4 ); + } + + return 'wordpress@' . $sitename; + } + + /** + * Get the default email FROM NAME generated by WordPress. + * + * @since 1.3.0 + * + * @return string + */ + public function get_default_name() { + return 'WordPress'; + } + + /** + * Get or create the phpmailer. + * + * @since {VERSION} + * + * @return \WPMailSMTP\MailCatcher + */ + public function get_phpmailer() { + + global $phpmailer; + + // Make sure the PHPMailer class has been instantiated. + if ( ! is_object( $phpmailer ) || ! is_a( $phpmailer, 'PHPMailer' ) ) { + require_once ABSPATH . WPINC . '/class-phpmailer.php'; + $phpmailer = new MailCatcher( true ); // phpcs:ignore + } + + return $phpmailer; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/AmazonSES/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/AmazonSES/Options.php new file mode 100644 index 0000000..0266633 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/AmazonSES/Options.php @@ -0,0 +1,44 @@ + wp_mail_smtp()->assets_url . '/images/providers/aws.svg', + 'slug' => 'amazonses', + 'title' => esc_html__( 'Amazon SES', 'wp-mail-smtp' ), + 'disabled' => true, + ) + ); + } + + /** + * @inheritdoc + */ + public function display_options() { + + ?> + +

            + +

            + + plugin_path . '/vendor/autoload.php'; + } + + /** + * Get the url, that users will be redirected back to finish the OAuth process. + * + * @since 1.0.0 + * + * @return string + */ + public static function get_plugin_auth_url() { + + return add_query_arg( 'tab', 'auth', wp_mail_smtp()->get_admin()->get_admin_page_url() ); + } + + /** + * Update auth code in our DB. + * + * @since 1.0.0 + * + * @param string $code + */ + protected function update_auth_code( $code ) { + + $options = new PluginOptions(); + $all = $options->get_all(); + + // To save in DB. + $all[ $this->mailer_slug ]['auth_code'] = $code; + + // To save in currently retrieved options array. + $this->options['auth_code'] = $code; + + $options->set( $all ); + } + + /** + * Update access token in our DB. + * + * @since 1.0.0 + * + * @param mixed $token + */ + protected function update_access_token( $token ) { + + $options = new PluginOptions(); + $all = $options->get_all(); + + // To save in DB. + $all[ $this->mailer_slug ]['access_token'] = $token; + + // To save in currently retrieved options array. + $this->options['access_token'] = $token; + + $options->set( $all ); + } + + /** + * Update refresh token in our DB. + * + * @since 1.0.0 + * + * @param mixed $token + */ + protected function update_refresh_token( $token ) { + + $options = new PluginOptions(); + $all = $options->get_all(); + + // To save in DB. + $all[ $this->mailer_slug ]['refresh_token'] = $token; + + // To save in currently retrieved options array. + $this->options['refresh_token'] = $token; + + $options->set( $all ); + } + + /** + * @inheritdoc + */ + public function is_clients_saved() { + + return ! empty( $this->options['client_id'] ) && ! empty( $this->options['client_secret'] ); + } + + /** + * @inheritdoc + */ + public function is_auth_required() { + + return empty( $this->options['access_token'] ) || empty( $this->options['refresh_token'] ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/AuthInterface.php b/wp-content/plugins/wp-mail-smtp/src/Providers/AuthInterface.php new file mode 100644 index 0000000..24369ab --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/AuthInterface.php @@ -0,0 +1,30 @@ +mailer_slug = $options->get( 'mail', 'mailer' ); + + if ( $this->mailer_slug !== Options::SLUG ) { + return; + } + + $this->options = $options->get_group( $this->mailer_slug ); + + if ( $this->is_clients_saved() ) { + + $this->include_vendor_lib(); + + $this->client = $this->get_client(); + } + } + + /** + * Get the url, that users will be redirected back to finish the OAuth process. + * + * @since 1.5.2 Returned to the old, pre-1.5, structure of the link to preserve BC. + * + * @return string + */ + public static function get_plugin_auth_url() { + + return add_query_arg( + array( + 'page' => Area::SLUG, + 'tab' => 'auth', + ), + admin_url( 'options-general.php' ) + ); + } + + /** + * Init and get the Google Client object. + * + * @since 1.0.0 + * @since 1.5.0 Add ability to apply custom options to the client via a filter. + * + * @return \Google_Client + */ + public function get_client() { + + // Doesn't load client twice + gives ability to overwrite. + if ( ! empty( $this->client ) ) { + return $this->client; + } + + $this->include_vendor_lib(); + + $client = new \Google_Client( + array( + 'client_id' => $this->options['client_id'], + 'client_secret' => $this->options['client_secret'], + 'redirect_uris' => array( + self::get_plugin_auth_url(), + ), + ) + ); + $client->setApplicationName( 'WP Mail SMTP v' . WPMS_PLUGIN_VER ); + $client->setAccessType( 'offline' ); + $client->setApprovalPrompt( 'force' ); + $client->setIncludeGrantedScopes( true ); + // We request only the sending capability, as it's what we only need to do. + $client->setScopes( array( \Google_Service_Gmail::MAIL_GOOGLE_COM ) ); + $client->setRedirectUri( self::get_plugin_auth_url() ); + + // Apply custom options to the client. + $client = apply_filters( 'wp_mail_smtp_providers_gmail_auth_get_client_custom_options', $client ); + + if ( + $this->is_auth_required() && + ! empty( $this->options['auth_code'] ) + ) { + try { + $creds = $client->fetchAccessTokenWithAuthCode( $this->options['auth_code'] ); + } catch ( \Exception $e ) { + $creds['error'] = $e->getMessage(); + Debug::set( + 'Mailer: Gmail' . "\r\n" . + $creds['error'] + ); + } + + // Bail if we have an error. + if ( ! empty( $creds['error'] ) ) { + return $client; + } + + $this->update_access_token( $client->getAccessToken() ); + $this->update_refresh_token( $client->getRefreshToken() ); + } + + if ( ! empty( $this->options['access_token'] ) ) { + $client->setAccessToken( $this->options['access_token'] ); + } + + // Refresh the token if it's expired. + if ( $client->isAccessTokenExpired() ) { + $refresh = $client->getRefreshToken(); + if ( empty( $refresh ) && isset( $this->options['refresh_token'] ) ) { + $refresh = $this->options['refresh_token']; + } + + if ( ! empty( $refresh ) ) { + try { + $creds = $client->fetchAccessTokenWithRefreshToken( $refresh ); + } catch ( \Exception $e ) { + $creds['error'] = $e->getMessage(); + Debug::set( + 'Mailer: Gmail' . "\r\n" . + $e->getMessage() + ); + } + + // Bail if we have an error. + if ( ! empty( $creds['error'] ) ) { + return $client; + } + + $this->update_access_token( $client->getAccessToken() ); + $this->update_refresh_token( $client->getRefreshToken() ); + } + } + + return $client; + } + + /** + * Get the auth code from the $_GET and save it. + * Redirect user back to settings with an error message, if failed. + * + * @since 1.0.0 + */ + public function process() { + + if ( ! ( isset( $_GET['tab'] ) && $_GET['tab'] === 'auth' ) ) { + wp_safe_redirect( wp_mail_smtp()->get_admin()->get_admin_page_url() ); + exit; + } + + // We can't process without saved client_id/secret. + if ( ! $this->is_clients_saved() ) { + Debug::set( + esc_html__( 'There was an error while processing the Google authentication request. Please make sure that you have Client ID and Client Secret both valid and saved.', 'wp-mail-smtp' ) + ); + wp_safe_redirect( + add_query_arg( + 'error', + 'google_no_clients', + wp_mail_smtp()->get_admin()->get_admin_page_url() + ) + ); + exit; + } + + $this->include_vendor_lib(); + + $code = ''; + $scope = ''; + $error = ''; + + if ( isset( $_GET['error'] ) ) { + $error = sanitize_key( $_GET['error'] ); + } + + // In case of any error: display a message to a user. + if ( ! empty( $error ) ) { + wp_safe_redirect( + add_query_arg( + 'error', + 'google_' . $error, + wp_mail_smtp()->get_admin()->get_admin_page_url() + ) + ); + exit; + } + + if ( isset( $_GET['code'] ) ) { + $code = $_GET['code']; + } + if ( isset( $_GET['scope'] ) ) { + $scope = urldecode( $_GET['scope'] ); + } + + // Let's try to get the access token. + if ( + ! empty( $code ) && + ( + $scope === \Google_Service_Gmail::MAIL_GOOGLE_COM . ' ' . \Google_Service_Gmail::GMAIL_SEND || + $scope === \Google_Service_Gmail::GMAIL_SEND . ' ' . \Google_Service_Gmail::MAIL_GOOGLE_COM || + $scope === \Google_Service_Gmail::GMAIL_SEND || + $scope === \Google_Service_Gmail::MAIL_GOOGLE_COM + ) + ) { + // Save the auth code. So \Google_Client can reuse it to retrieve the access token. + $this->update_auth_code( $code ); + } else { + wp_safe_redirect( + add_query_arg( + 'error', + 'google_no_code_scope', + wp_mail_smtp()->get_admin()->get_admin_page_url() + ) + ); + exit; + } + + wp_safe_redirect( + add_query_arg( + 'success', + 'google_site_linked', + wp_mail_smtp()->get_admin()->get_admin_page_url() + ) + ); + exit; + } + + /** + * Get the auth URL used to proceed to Provider to request access to send emails. + * + * @since 1.0.0 + * + * @return string + */ + public function get_auth_url() { + + if ( + ! empty( $this->client ) && + class_exists( 'Google_Client', false ) && + $this->client instanceof \Google_Client + ) { + return filter_var( $this->client->createAuthUrl(), FILTER_SANITIZE_URL ); + } + + return '#'; + } + + /** + * Get user information (like email etc) that is associated with the current connection. + * + * @since 1.5.0 + * + * @return array + */ + public function get_user_info() { + + $gmail = new \Google_Service_Gmail( $this->get_client() ); + + try { + $email = $gmail->users->getProfile( 'me' )->getEmailAddress(); + } catch ( \Exception $e ) { + $email = ''; + } + + return array( 'email' => $email ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Mailer.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Mailer.php new file mode 100644 index 0000000..d3e81b7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Mailer.php @@ -0,0 +1,222 @@ +is_php_compatible() ) { + return; + } + } + + /** + * Re-use the MailCatcher class methods and properties. + * + * @since 1.2.0 + * + * @param \WPMailSMTP\MailCatcher $phpmailer + */ + public function process_phpmailer( $phpmailer ) { + // Make sure that we have access to MailCatcher class methods. + if ( + ! $phpmailer instanceof MailCatcher && + ! $phpmailer instanceof \PHPMailer + ) { + return; + } + + $this->phpmailer = $phpmailer; + } + + /** + * Use Google API Services to send emails. + * + * @since 1.0.0 + */ + public function send() { + + // Include the Google library. + require_once wp_mail_smtp()->plugin_path . '/vendor/autoload.php'; + + $auth = new Auth(); + $message = new \Google_Service_Gmail_Message(); + + /* + * Right now Gmail doesn't allow to redefine From and Sender email headers. + * It always uses the email address that was used to connect to its API. + * With code below we are making sure that Email Log archive and single Email Log + * have the save value for From email header. + */ + $gmail_creds = $auth->get_user_info(); + + if ( ! empty( $gmail_creds['email'] ) ) { + $this->phpmailer->From = $gmail_creds['email']; + $this->phpmailer->Sender = $gmail_creds['email']; + } + + // Get the raw MIME email using MailCatcher data. + // We need here to make base64URL-safe string. + $base64 = str_replace( + array( '+', '/', '=' ), + array( '-', '_', '' ), + base64_encode( $this->phpmailer->getSentMIMEMessage() ) + ); + + $message->setRaw( $base64 ); + + $service = new \Google_Service_Gmail( $auth->get_client() ); + + try { + $response = $service->users_messages->send( 'me', $message ); + + $this->process_response( $response ); + } catch ( \Exception $e ) { + Debug::set( + 'Mailer: Gmail' . "\r\n" . + $e->getMessage() + ); + + return; + } + } + + /** + * Save response from the API to use it later. + * + * @since 1.0.0 + * @since 1.5.0 Added action "wp_mail_smtp_providers_gmail_mailer_process_response" with $response. + * + * @param \Google_Service_Gmail_Message $response + */ + protected function process_response( $response ) { + + $this->response = $response; + + do_action( 'wp_mail_smtp_providers_gmail_mailer_process_response', $this->response, $this->phpmailer ); + } + + /** + * Check whether the email was sent. + * + * @since 1.0.0 + * + * @return bool + */ + public function is_email_sent() { + + $is_sent = false; + + if ( method_exists( $this->response, 'getId' ) ) { + $message_id = $this->response->getId(); + if ( ! empty( $message_id ) ) { + $is_sent = true; + } + } + + // Clear debug messages if email is successfully sent. + if ( $is_sent ) { + Debug::clear(); + } + + return $is_sent; + } + + /** + * @inheritdoc + */ + public function get_debug_info() { + + $gmail_text = array(); + + $options = new \WPMailSMTP\Options(); + $gmail = $options->get_group( 'gmail' ); + $curl_ver = 'No'; + if ( function_exists( 'curl_version' ) ) { + $curl = curl_version(); // phpcs:ignore + $curl_ver = $curl['version']; + } + + $gmail_text[] = 'Client ID/Secret: ' . ( ! empty( $gmail['client_id'] ) && ! empty( $gmail['client_secret'] ) ? 'Yes' : 'No' ); + $gmail_text[] = 'Auth Code: ' . ( ! empty( $gmail['auth_code'] ) ? 'Yes' : 'No' ); + $gmail_text[] = 'Access Token: ' . ( ! empty( $gmail['access_token'] ) ? 'Yes' : 'No' ); + + $gmail_text[] = '
            Server:'; + + $gmail_text[] = 'OpenSSL: ' . ( extension_loaded( 'openssl' ) && defined( 'OPENSSL_VERSION_TEXT' ) ? OPENSSL_VERSION_TEXT : 'No' ); + $gmail_text[] = 'PHP.allow_url_fopen: ' . ( ini_get( 'allow_url_fopen' ) ? 'Yes' : 'No' ); + $gmail_text[] = 'PHP.stream_socket_client(): ' . ( function_exists( 'stream_socket_client' ) ? 'Yes' : 'No' ); + $gmail_text[] = 'PHP.fsockopen(): ' . ( function_exists( 'fsockopen' ) ? 'Yes' : 'No' ); + $gmail_text[] = 'PHP.curl_version(): ' . $curl_ver; // phpcs:ignore + if ( function_exists( 'apache_get_modules' ) ) { + $modules = apache_get_modules(); + $gmail_text[] = 'Apache.mod_security: ' . ( in_array( 'mod_security', $modules, true ) || in_array( 'mod_security2', $modules, true ) ? 'Yes' : 'No' ); + } + if ( function_exists( 'selinux_is_enabled' ) ) { + $gmail_text[] = 'OS.SELinux: ' . ( selinux_is_enabled() ? 'Yes' : 'No' ); + } + if ( function_exists( 'grsecurity_is_enabled' ) ) { + $gmail_text[] = 'OS.grsecurity: ' . ( grsecurity_is_enabled() ? 'Yes' : 'No' ); + } + + return implode( '
            ', $gmail_text ); + } + + /** + * @inheritdoc + */ + public function is_mailer_complete() { + + if ( ! $this->is_php_compatible() ) { + return false; + } + + $auth = new Auth(); + + if ( + $auth->is_clients_saved() && + ! $auth->is_auth_required() + ) { + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Options.php new file mode 100644 index 0000000..563712c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Options.php @@ -0,0 +1,234 @@ + wp_mail_smtp()->assets_url . '/images/providers/google.svg', + 'slug' => self::SLUG, + 'title' => esc_html__( 'Gmail', 'wp-mail-smtp' ), + 'description' => sprintf( + wp_kses( /* translators: %s - URL to our Gmail doc. */ + __( 'Send emails using your Gmail or G Suite (formerly Google Apps) account, all while keeping your login credentials safe. Other Google SMTP methods require enabling less secure apps in your account and entering your password. However, this integration uses the Google API to improve email delivery issues while keeping your site secure.

            Read our Gmail documentation to learn how to configure Gmail or G Suite.', 'wp-mail-smtp' ), + array( + 'br' => array(), + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://wpmailsmtp.com/docs/how-to-set-up-the-gmail-mailer-in-wp-mail-smtp/' + ), + 'notices' => array( + 'educational' => esc_html__( 'The Gmail mailer works well for sites that send low numbers of emails. However, Gmail\'s API has rate limitations and a number of additional restrictions that can lead to challenges during setup. If you expect to send a high volume of emails, or if you find that your web host is not compatible with the Gmail API restrictions, then we recommend considering a different mailer option.', 'wp-mail-smtp' ), + ), + 'php' => '5.5', + ) + ); + } + + /** + * @inheritdoc + */ + public function display_options() { + + // Do not display options if PHP version is not correct. + if ( ! $this->is_php_correct() ) { + $this->display_php_warning(); + + return; + } + ?> + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'client_id' ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-get_slug() ); ?>-client_id" spellcheck="false" + /> +
            +
            + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'client_secret' ) ) : ?> + + display_const_set_message( 'WPMS_GMAIL_CLIENT_SECRET' ); ?> + + + +
            +
            + + +
            +
            + +
            +
            + + +

            + +

            +
            +
            + + +
            +
            + +
            +
            + display_auth_setting_action(); ?> +
            +
            + + process_provider_remove(); + + $auth = new Auth(); + ?> + + is_clients_saved() ) : ?> + + is_auth_required() ) : ?> + + + + +

            + +

            + + + + + + + + get_user_info(); + + if ( ! empty( $user['email'] ) ) { + printf( + /* translators: %s - email address, as received from Google API. */ + esc_html__( 'Connected as %s', 'wp-mail-smtp' ), + '' . esc_html( $user['email'] ) . '' + ); + } + ?> + +

            + +

            + + + + + +

            + +

            + + get( 'mail', 'mailer' ) !== $this->get_slug() ) { + return; + } + + $old_opt = $options->get_all(); + + foreach ( $old_opt[ $this->get_slug() ] as $key => $value ) { + // Unset everything except Client ID and Secret. + if ( ! in_array( $key, array( 'client_id', 'client_secret' ), true ) ) { + unset( $old_opt[ $this->get_slug() ][ $key ] ); + } + } + + $options->set( $old_opt ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Loader.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Loader.php new file mode 100644 index 0000000..7a4983c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Loader.php @@ -0,0 +1,205 @@ + 'WPMailSMTP\Providers\Mail\\', + 'pepipostapi' => 'WPMailSMTP\Providers\PepipostAPI\\', + 'sendinblue' => 'WPMailSMTP\Providers\Sendinblue\\', + 'mailgun' => 'WPMailSMTP\Providers\Mailgun\\', + 'sendgrid' => 'WPMailSMTP\Providers\Sendgrid\\', + 'amazonses' => 'WPMailSMTP\Providers\AmazonSES\\', + 'gmail' => 'WPMailSMTP\Providers\Gmail\\', + 'outlook' => 'WPMailSMTP\Providers\Outlook\\', + 'smtp' => 'WPMailSMTP\Providers\SMTP\\', + 'pepipost' => 'WPMailSMTP\Providers\Pepipost\\', + ); + + /** + * @since 1.0.0 + * + * @var MailCatcher + */ + private $phpmailer; + + /** + * Get all the supported providers. + * + * @since 1.0.0 + * + * @return array + */ + public function get_providers() { + + if ( ! Options::init()->is_pepipost_active() ) { + unset( $this->providers['pepipost'] ); + } + + return apply_filters( 'wp_mail_smtp_providers_loader_get_providers', $this->providers ); + } + + /** + * Get a single provider FQN-path based on its name. + * + * @since 1.0.0 + * + * @param string $provider + * + * @return string|null + */ + public function get_provider_path( $provider ) { + + $provider = sanitize_key( $provider ); + + $providers = $this->get_providers(); + + return apply_filters( + 'wp_mail_smtp_providers_loader_get_provider_path', + isset( $providers[ $provider ] ) ? $providers[ $provider ] : null, + $provider + ); + } + + /** + * Get the provider options, if exists. + * + * @since 1.0.0 + * + * @param string $provider + * + * @return OptionsAbstract|null + */ + public function get_options( $provider ) { + + return $this->get_entity( $provider, 'Options' ); + } + + /** + * Get all options of all providers. + * + * @since 1.0.0 + * + * @return OptionsAbstract[] + */ + public function get_options_all() { + + $options = array(); + + foreach ( $this->get_providers() as $provider => $path ) { + + $option = $this->get_options( $provider ); + + if ( ! $option instanceof OptionsAbstract ) { + continue; + } + + $slug = $option->get_slug(); + $title = $option->get_title(); + + if ( empty( $title ) || empty( $slug ) ) { + continue; + } + + $options[] = $option; + } + + return apply_filters( 'wp_mail_smtp_providers_loader_get_providers_all', $options ); + } + + /** + * Get the provider mailer, if exists. + * + * @since 1.0.0 + * + * @param string $provider + * @param MailCatcher $phpmailer + * + * @return MailerAbstract|null + */ + public function get_mailer( $provider, $phpmailer ) { + + if ( + $phpmailer instanceof MailCatcher || + $phpmailer instanceof \PHPMailer + ) { + $this->phpmailer = $phpmailer; + } + + return $this->get_entity( $provider, 'Mailer' ); + } + + /** + * Get the provider auth, if exists. + * + * @param string $provider + * + * @return AuthAbstract|null + */ + public function get_auth( $provider ) { + + return $this->get_entity( $provider, 'Auth' ); + } + + /** + * Get a generic entity based on the request. + * + * @uses \ReflectionClass + * + * @since 1.0.0 + * + * @param string $provider + * @param string $request + * + * @return OptionsAbstract|MailerAbstract|AuthAbstract|null + */ + protected function get_entity( $provider, $request ) { + + $provider = sanitize_key( $provider ); + $request = sanitize_text_field( $request ); + $path = $this->get_provider_path( $provider ); + $entity = null; + + if ( empty( $path ) ) { + return $entity; + } + + try { + $reflection = new \ReflectionClass( $path . $request ); + + if ( file_exists( $reflection->getFileName() ) ) { + $class = $path . $request; + if ( $this->phpmailer ) { + $entity = new $class( $this->phpmailer ); + } else { + $entity = new $class(); + } + } + } + catch ( \Exception $e ) { + Debug::set( "There was a problem while retrieving {$request} for {$provider}: {$e->getMessage()}" ); + $entity = null; + } + + return apply_filters( 'wp_mail_smtp_providers_loader_get_entity', $entity, $provider, $request ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Mailer.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Mailer.php new file mode 100644 index 0000000..072c6db --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Mailer.php @@ -0,0 +1,49 @@ +Server:'; + + $disabled_functions = ini_get( 'disable_functions' ); + $disabled = (array) explode( ',', trim( $disabled_functions ) ); + + $mail_text[] = 'PHP.mail(): ' . ( in_array( 'mail', $disabled, true ) || ! function_exists( 'mail' ) ? 'No' : 'Yes' ); + if ( function_exists( 'apache_get_modules' ) ) { + $modules = apache_get_modules(); + $mail_text[] = 'Apache.mod_security: ' . ( in_array( 'mod_security', $modules, true ) || in_array( 'mod_security2', $modules, true ) ? 'Yes' : 'No' ); + } + if ( function_exists( 'selinux_is_enabled' ) ) { + $mail_text[] = 'OS.SELinux: ' . ( selinux_is_enabled() ? 'Yes' : 'No' ); + } + if ( function_exists( 'grsecurity_is_enabled' ) ) { + $mail_text[] = 'OS.grsecurity: ' . ( grsecurity_is_enabled() ? 'Yes' : 'No' ); + } + + return implode( '
            ', $mail_text ); + } + + /** + * @inheritdoc + */ + public function is_mailer_complete() { + + return true; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Options.php new file mode 100644 index 0000000..f5eda44 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Options.php @@ -0,0 +1,42 @@ + wp_mail_smtp()->assets_url . '/images/providers/php.svg', + 'slug' => 'mail', + 'title' => esc_html__( 'Default (none)', 'wp-mail-smtp' ), + ) + ); + } + + /** + * @inheritdoc + */ + public function display_options() { + ?> + +
            + +
            + + options = new Options(); + $this->mailer = $this->options->get( 'mail', 'mailer' ); + + // Only non-SMTP mailers need URL and extra processing for PHPMailer class. + if ( ! $this->options->is_mailer_smtp() && empty( $this->url ) ) { + return; + } + + $this->process_phpmailer( $phpmailer ); + } + + /** + * Re-use the MailCatcher class methods and properties. + * + * @since 1.0.0 + * + * @param MailCatcher $phpmailer + */ + public function process_phpmailer( $phpmailer ) { + + // Make sure that we have access to MailCatcher class methods. + if ( + ! $phpmailer instanceof MailCatcher && + ! $phpmailer instanceof \PHPMailer + ) { + return; + } + + $this->phpmailer = $phpmailer; + + // Prevent working with those methods, as they are not needed for SMTP-like mailers. + if ( $this->options->is_mailer_smtp() ) { + return; + } + + $this->set_headers( $this->phpmailer->getCustomHeaders() ); + $this->set_from( $this->phpmailer->From, $this->phpmailer->FromName ); + $this->set_recipients( + array( + 'to' => $this->phpmailer->getToAddresses(), + 'cc' => $this->phpmailer->getCcAddresses(), + 'bcc' => $this->phpmailer->getBccAddresses(), + ) + ); + $this->set_subject( $this->phpmailer->Subject ); + if ( $this->phpmailer->ContentType === 'text/plain' ) { + $this->set_content( $this->phpmailer->Body ); + } else { + $this->set_content( + array( + 'text' => $this->phpmailer->AltBody, + 'html' => $this->phpmailer->Body, + ) + ); + } + $this->set_return_path( $this->phpmailer->From ); + $this->set_reply_to( $this->phpmailer->getReplyToAddresses() ); + + /* + * In some cases we will need to modify the internal structure + * of the body content, if attachments are present. + * So lets make this call the last one. + */ + $this->set_attachments( $this->phpmailer->getAttachments() ); + } + + /** + * Set the email headers. + * + * @since 1.0.0 + * + * @param array $headers List of key=>value pairs. + */ + public function set_headers( $headers ) { + + foreach ( $headers as $header ) { + $name = isset( $header[0] ) ? $header[0] : false; + $value = isset( $header[1] ) ? $header[1] : false; + + if ( empty( $name ) || empty( $value ) ) { + continue; + } + + $this->set_header( $name, $value ); + } + } + + /** + * Set individual header key=>value pair for the email. + * + * @since 1.0.0 + * + * @param string $name + * @param string $value + */ + public function set_header( $name, $value ) { + + $name = sanitize_text_field( $name ); + + $this->headers[ $name ] = WP::sanitize_value( $value ); + } + + /** + * Set email subject. + * + * @since 1.0.0 + * + * @param string $subject + */ + public function set_subject( $subject ) { + + $this->set_body_param( + array( + 'subject' => $subject, + ) + ); + } + + /** + * Set the request params, that goes to the body of the HTTP request. + * + * @since 1.0.0 + * + * @param array $param Key=>value of what should be sent to a 3rd party API. + * + * @internal param array $params + */ + protected function set_body_param( $param ) { + + $this->body = Options::array_merge_recursive( $this->body, $param ); + } + + /** + * Get the email body. + * + * @since 1.0.0 + * + * @return string|array + */ + public function get_body() { + + return apply_filters( 'wp_mail_smtp_providers_mailer_get_body', $this->body, $this->mailer ); + } + + /** + * Get the email headers. + * + * @since 1.0.0 + * + * @return array + */ + public function get_headers() { + + return apply_filters( 'wp_mail_smtp_providers_mailer_get_headers', $this->headers, $this->mailer ); + } + + /** + * Send the email. + * + * @since 1.0.0 + * @since 1.8.0 Added timeout for requests, same as max_execution_time. + */ + public function send() { + + $timeout = (int) ini_get( 'max_execution_time' ); + + $params = Options::array_merge_recursive( + $this->get_default_params(), + array( + 'headers' => $this->get_headers(), + 'body' => $this->get_body(), + 'timeout' => $timeout ? $timeout : 30, + ) + ); + + $response = wp_safe_remote_post( $this->url, $params ); + + $this->process_response( $response ); + } + + /** + * We might need to do something after the email was sent to the API. + * In this method we preprocess the response from the API. + * + * @since 1.0.0 + * + * @param mixed $response + */ + protected function process_response( $response ) { + + if ( is_wp_error( $response ) ) { + // Save the error text. + $errors = $response->get_error_messages(); + foreach ( $errors as $error ) { + Debug::set( $error ); + } + + return; + } + + if ( isset( $response['body'] ) && WP::is_json( $response['body'] ) ) { + $response['body'] = \json_decode( $response['body'] ); + } + + $this->response = $response; + } + + /** + * Get the default params, required for wp_safe_remote_post(). + * + * @since 1.0.0 + * + * @return array + */ + protected function get_default_params() { + + return apply_filters( + 'wp_mail_smtp_providers_mailer_get_default_params', + array( + 'timeout' => 15, + 'httpversion' => '1.1', + 'blocking' => true, + ), + $this->mailer + ); + } + + /** + * Whether the email is sent or not. + * We basically check the response code from a request to provider. + * Might not be 100% correct, not guarantees that email is delivered. + * + * @since 1.0.0 + * + * @return bool + */ + public function is_email_sent() { + + $is_sent = false; + + if ( wp_remote_retrieve_response_code( $this->response ) === $this->email_sent_code ) { + $is_sent = true; + } else { + $error = $this->get_response_error(); + + if ( ! empty( $error ) ) { + // Add mailer to the beginning and save to display later. + $message = 'Mailer: ' . esc_html( wp_mail_smtp()->get_providers()->get_options( $this->mailer )->get_title() ) . "\r\n"; + + $conflicts = new Conflicts(); + if ( $conflicts->is_detected() ) { + $message .= 'Conflicts: ' . esc_html( $conflicts->get_conflict_name() ) . "\r\n"; + } + + Debug::set( $message . $error ); + } + } + + // Clear debug messages if email is successfully sent. + if ( $is_sent ) { + Debug::clear(); + } + + return apply_filters( 'wp_mail_smtp_providers_mailer_is_email_sent', $is_sent, $this->mailer ); + } + + /** + * Should be overwritten when appropriate. + * + * @since 1.2.0 + * + * @return string + */ + protected function get_response_error() { + + return ''; + } + + /** + * Whether the mailer supports the current PHP version or not. + * + * @since 1.0.0 + * + * @return bool + */ + public function is_php_compatible() { + + $options = wp_mail_smtp()->get_providers()->get_options( $this->mailer ); + + return version_compare( phpversion(), $options->get_php_version(), '>=' ); + } + + /** + * This method is relevant to SMTP and Pepipost. + * All other custom mailers should override it with own information. + * + * @since 1.2.0 + * + * @return string + */ + public function get_debug_info() { + + global $phpmailer; + + $smtp_text = array(); + + // Mail mailer has nothing to return. + if ( $this->options->is_mailer_smtp() ) { + // phpcs:disable + $smtp_text[] = 'ErrorInfo: ' . make_clickable( wp_strip_all_tags( $phpmailer->ErrorInfo ) ); + $smtp_text[] = 'Host: ' . $phpmailer->Host; + $smtp_text[] = 'Port: ' . $phpmailer->Port; + $smtp_text[] = 'SMTPSecure: ' . Debug::pvar( $phpmailer->SMTPSecure ); + $smtp_text[] = 'SMTPAutoTLS: ' . Debug::pvar( $phpmailer->SMTPAutoTLS ); + $smtp_text[] = 'SMTPAuth: ' . Debug::pvar( $phpmailer->SMTPAuth ); + if ( ! empty( $phpmailer->SMTPOptions ) ) { + $smtp_text[] = 'SMTPOptions: ' . wp_json_encode( $phpmailer->SMTPOptions ) . ''; + } + // phpcs:enable + } + + $smtp_text[] = '
            Server:'; + $smtp_text[] = 'OpenSSL: ' . ( extension_loaded( 'openssl' ) && defined( 'OPENSSL_VERSION_TEXT' ) ? OPENSSL_VERSION_TEXT : 'No' ); + if ( function_exists( 'apache_get_modules' ) ) { + $modules = apache_get_modules(); + $smtp_text[] = 'Apache.mod_security: ' . ( in_array( 'mod_security', $modules, true ) || in_array( 'mod_security2', $modules, true ) ? 'Yes' : 'No' ); + } + if ( function_exists( 'selinux_is_enabled' ) ) { + $smtp_text[] = 'OS.SELinux: ' . ( selinux_is_enabled() ? 'Yes' : 'No' ); + } + if ( function_exists( 'grsecurity_is_enabled' ) ) { + $smtp_text[] = 'OS.grsecurity: ' . ( grsecurity_is_enabled() ? 'Yes' : 'No' ); + } + + return implode( '
            ', $smtp_text ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/MailerInterface.php b/wp-content/plugins/wp-mail-smtp/src/Providers/MailerInterface.php new file mode 100644 index 0000000..a2aea08 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/MailerInterface.php @@ -0,0 +1,83 @@ +url = self::API_BASE_US; + + // We want to prefill everything from \WPMailSMTP\MailCatcher class, which extends \PHPMailer. + parent::__construct( $phpmailer ); + + // We have a special API URL to query in case of EU region. + if ( 'EU' === $this->options->get( $this->mailer, 'region' ) ) { + $this->url = self::API_BASE_EU; + } + + /* + * Append the url with a domain, + * to avoid passing the domain name as a query parameter with all requests. + */ + $this->url .= sanitize_text_field( $this->options->get( $this->mailer, 'domain' ) . '/messages' ); + + $this->set_header( 'Authorization', 'Basic ' . base64_encode( 'api:' . $this->options->get( $this->mailer, 'api_key' ) ) ); + } + + /** + * @inheritdoc + */ + public function set_from( $email, $name = '' ) { + + if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) { + return; + } + + if ( ! empty( $name ) ) { + $this->set_body_param( + array( + 'from' => $name . ' <' . $email . '>', + ) + ); + } else { + $this->set_body_param( + array( + 'from' => $email, + ) + ); + } + } + + /** + * @inheritdoc + */ + public function set_recipients( $recipients ) { + + if ( empty( $recipients ) ) { + return; + } + + $default = array( 'to', 'cc', 'bcc' ); + + foreach ( $recipients as $kind => $emails ) { + if ( + ! in_array( $kind, $default, true ) || + empty( $emails ) || + ! is_array( $emails ) + ) { + continue; + } + + $data = array(); + + foreach ( $emails as $email ) { + $addr = isset( $email[0] ) ? $email[0] : false; + $name = isset( $email[1] ) ? $email[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + if ( ! empty( $name ) ) { + $data[] = $name . ' <' . $addr . '>'; + } else { + $data[] = $addr; + } + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + $kind => implode( ', ', $data ), + ) + ); + } + } + } + + /** + * @inheritdoc + */ + public function set_content( $content ) { + + if ( is_array( $content ) ) { + + $default = array( 'text', 'html' ); + + foreach ( $content as $type => $mail ) { + if ( + ! in_array( $type, $default, true ) || + empty( $mail ) + ) { + continue; + } + + $this->set_body_param( + array( + $type => $mail, + ) + ); + } + } else { + + $type = 'html'; + + if ( $this->phpmailer->ContentType === 'text/plain' ) { + $type = 'text'; + } + + if ( ! empty( $content ) ) { + $this->set_body_param( + array( + $type => $content, + ) + ); + } + } + } + + /** + * Redefine the way custom headers are process for this mailer - they should be in body. + * + * @since 1.5.0 + * + * @param array $headers + */ + public function set_headers( $headers ) { + + foreach ( $headers as $header ) { + $name = isset( $header[0] ) ? $header[0] : false; + $value = isset( $header[1] ) ? $header[1] : false; + + $this->set_body_header( $name, $value ); + } + + // Add custom PHPMailer-specific header. + $this->set_body_header( 'X-Mailer', 'WPMailSMTP/Mailer/' . $this->mailer . ' ' . WPMS_PLUGIN_VER ); + } + + /** + * This mailer supports email-related custom headers inside a body of the message with a special prefix "h:". + * + * @since 1.5.0 + */ + public function set_body_header( $name, $value ) { + + $name = sanitize_text_field( $name ); + + $this->set_body_param( + array( + 'h:' . $name => WP::sanitize_value( $value ), + ) + ); + } + + /** + * It's the last one, so we can modify the whole body. + * + * @since 1.0.0 + * + * @param array $attachments + */ + public function set_attachments( $attachments ) { + + if ( empty( $attachments ) ) { + return; + } + + $payload = ''; + $data = array(); + + foreach ( $attachments as $attachment ) { + $file = false; + + /* + * We are not using WP_Filesystem API as we can't reliably work with it. + * It is not always available, same as credentials for FTP. + */ + try { + if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) { + $file = file_get_contents( $attachment[0] ); + } + } + catch ( \Exception $e ) { + $file = false; + } + + if ( $file === false ) { + continue; + } + + $data[] = array( + 'content' => $file, + 'name' => $attachment[2], + ); + } + + if ( ! empty( $data ) ) { + + // First, generate a boundary for the multipart message. + $boundary = base_convert( uniqid( 'boundary', true ), 10, 36 ); + + // Iterate through pre-built params and build a payload. + foreach ( $this->body as $key => $value ) { + if ( is_array( $value ) ) { + foreach ( $value as $child_key => $child_value ) { + $payload .= '--' . $boundary; + $payload .= "\r\n"; + $payload .= 'Content-Disposition: form-data; name="' . $key . "\"\r\n\r\n"; + $payload .= $child_value; + $payload .= "\r\n"; + } + } else { + $payload .= '--' . $boundary; + $payload .= "\r\n"; + $payload .= 'Content-Disposition: form-data; name="' . $key . '"' . "\r\n\r\n"; + $payload .= $value; + $payload .= "\r\n"; + } + } + + // Now iterate through our attachments, and add them too. + foreach ( $data as $key => $attachment ) { + $payload .= '--' . $boundary; + $payload .= "\r\n"; + $payload .= 'Content-Disposition: form-data; name="attachment[' . $key . ']"; filename="' . $attachment['name'] . '"' . "\r\n\r\n"; + $payload .= $attachment['content']; + $payload .= "\r\n"; + } + + $payload .= '--' . $boundary . '--'; + + // Redefine the body the "dirty way". + $this->body = $payload; + + $this->set_header( 'Content-Type', 'multipart/form-data; boundary=' . $boundary ); + } + } + + /** + * @inheritdoc + */ + public function set_reply_to( $reply_to ) { + + if ( empty( $reply_to ) ) { + return; + } + + $data = array(); + + foreach ( $reply_to as $key => $emails ) { + if ( + empty( $emails ) || + ! is_array( $emails ) + ) { + continue; + } + + $addr = isset( $emails[0] ) ? $emails[0] : false; + $name = isset( $emails[1] ) ? $emails[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + if ( ! empty( $name ) ) { + $data[] = $name . ' <' . $addr . '>'; + } else { + $data[] = $addr; + } + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + 'h:Reply-To' => implode( ',', $data ), + ) + ); + } + } + + /** + * @inheritdoc + */ + public function set_return_path( $email ) { + + if ( + $this->options->get( 'mail', 'return_path' ) !== true || + ! filter_var( $email, FILTER_VALIDATE_EMAIL ) + ) { + return; + } + + $this->set_body_param( + array( + 'sender' => $email, + ) + ); + } + + /** + * Get a Mailgun-specific response with a helpful error. + * + * @since 1.2.0 + * + * @return string + */ + protected function get_response_error() { + + $body = (array) wp_remote_retrieve_body( $this->response ); + + $error_text = array(); + + if ( ! empty( $body['message'] ) ) { + if ( is_string( $body['message'] ) ) { + $error_text[] = $body['message']; + } else { + $error_text[] = \json_encode( $body['message'] ); + } + } elseif ( ! empty( $body[0] ) ) { + if ( is_string( $body[0] ) ) { + $error_text[] = $body[0]; + } else { + $error_text[] = \json_encode( $body[0] ); + } + } + + return implode( '
            ', array_map( 'esc_textarea', $error_text ) ); + } + + /** + * @inheritdoc + */ + public function get_debug_info() { + + $mg_text = array(); + + $options = new \WPMailSMTP\Options(); + $mailgun = $options->get_group( 'mailgun' ); + + $mg_text[] = 'Api Key / Domain: ' . ( ! empty( $mailgun['api_key'] ) && ! empty( $mailgun['domain'] ) ? 'Yes' : 'No' ); + + return implode( '
            ', $mg_text ); + } + + /** + * @inheritdoc + */ + public function is_mailer_complete() { + + $options = $this->options->get_group( $this->mailer ); + + // API key is the only required option. + if ( + ! empty( $options['api_key'] ) && + ! empty( $options['domain'] ) + ) { + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Mailgun/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Mailgun/Options.php new file mode 100644 index 0000000..2619487 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Mailgun/Options.php @@ -0,0 +1,161 @@ + wp_mail_smtp()->assets_url . '/images/providers/mailgun.svg', + 'slug' => 'mailgun', + 'title' => esc_html__( 'Mailgun', 'wp-mail-smtp' ), + 'description' => sprintf( + wp_kses( + /* translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag. */ + __( '%1$sMailgun%2$s is one of the leading transactional email services trusted by over 150,000+ businesses. They provide 5,000 free emails per month for 3 months.

            Read our %3$sMailgun documentation%4$s to learn how to configure Mailgun and improve your email deliverability.', 'wp-mail-smtp' ), + array( + 'br' => array(), + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + '', + '', + '', + '' + ), + ) + ); + } + + /** + * @inheritdoc + */ + public function display_options() { + ?> + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'api_key' ) ) : ?> + + display_const_set_message( 'WPMS_MAILGUN_API_KEY' ); ?> + + + +

            + ' . + esc_html__( 'Get a Private API Key', 'wp-mail-smtp' ) . + '' + ); + ?> +

            +
            +
            + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'domain' ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-get_slug() ); ?>-domain" spellcheck="false" + /> +

            + ' . + esc_html__( 'Get a Domain Name', 'wp-mail-smtp' ) . + '' + ); + ?> +

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

            +
            + + More information on Mailgun.com.', 'wp-mail-smtp' ), + array( + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://www.mailgun.com/regions' + ); + ?> +

            +
            +
            + + slug = sanitize_key( $params['slug'] ); + $this->title = sanitize_text_field( $params['title'] ); + + if ( ! empty( $params['description'] ) ) { + $this->description = wp_kses_post( $params['description'] ); + } + + if ( ! empty( $params['notices'] ) ) { + foreach ( (array) $params['notices'] as $key => $notice ) { + $key = sanitize_key( $key ); + if ( empty( $key ) ) { + continue; + } + + $notice = wp_kses( + $notice, + array( + 'br' => true, + 'strong' => true, + 'em' => true, + 'a' => array( + 'href' => true, + 'rel' => true, + 'target' => true, + ), + ) + ); + if ( empty( $notice ) ) { + continue; + } + + $this->notices[ $key ] = $notice; + } + } + + if ( isset( $params['recommended'] ) ) { + $this->recommended = (bool) $params['recommended']; + } + if ( isset( $params['disabled'] ) ) { + $this->disabled = (bool) $params['disabled']; + } + + if ( ! empty( $params['php'] ) ) { + $this->php = sanitize_text_field( $params['php'] ); + } + + if ( ! empty( $params['logo_url'] ) ) { + $this->logo_url = esc_url_raw( $params['logo_url'] ); + } + + $this->options = new Options(); + } + + /** + * @inheritdoc + */ + public function get_logo_url() { + return apply_filters( 'wp_mail_smtp_providers_provider_get_logo_url', $this->logo_url, $this ); + } + + /** + * @inheritdoc + */ + public function get_slug() { + return apply_filters( 'wp_mail_smtp_providers_provider_get_slug', $this->slug, $this ); + } + + /** + * @inheritdoc + */ + public function get_title() { + return apply_filters( 'wp_mail_smtp_providers_provider_get_title', $this->title, $this ); + } + + /** + * @inheritdoc + */ + public function get_description() { + return apply_filters( 'wp_mail_smtp_providers_provider_get_description', $this->description, $this ); + } + + /** + * Some mailers may display a notice above its options. + * + * @since 1.6.0 + * + * @param string $type + * + * @return string + */ + public function get_notice( $type ) { + + $type = sanitize_key( $type ); + + return apply_filters( 'wp_mail_smtp_providers_provider_get_notice', isset( $this->notices[ $type ] ) ? $this->notices[ $type ] : '', $this ); + } + + /** + * @inheritdoc + */ + public function get_php_version() { + return apply_filters( 'wp_mail_smtp_providers_provider_get_php_version', $this->php, $this ); + } + + /** + * @inheritdoc + */ + public function display_options() { + ?> + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'host' ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-get_slug() ); ?>-host" spellcheck="false" + /> +
            +
            + + +
            +
            + +
            +
            + + + + + + + +

            + +

            +
            +
            + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'port' ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-get_slug() ); ?>-port" class="small-text" spellcheck="false" + /> +
            +
            + + +
            +
            + +
            +
            + +

            + +

            +
            +
            + + +
            +
            + +
            +
            + +
            +
            + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'user' ) ? 'disabled' : ''; ?> + id="wp-mail-smtp-setting-get_slug() ); ?>-user" spellcheck="false" autocomplete="new-password" + /> +
            +
            + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'pass' ) ) : ?> + + + display_const_set_message( 'WPMS_SMTP_PASS' ); ?> + +

            + define( \'WPMS_SMTP_PASS\', \'your_old_password\' );' + ); + ?> +
            + wp-config.php', + 'WPMS_ON' + ); + ?> +

            +
            +						define( 'WPMS_ON', false );
            +					
            +

            + +

            + + +

            + +
            + wp-config.php' + ); + ?> +

            +
            +						define( 'WPMS_ON', true );
            +						define( 'WPMS_SMTP_PASS', 'your_password' );
            +					
            + +
            +
            + + recommended, $this ); + } + + /** + * Whether this mailer is disabled or not. + * Used for displaying Pro mailers inside Lite plugin. + * + * @since 1.7.0 + * + * @return bool + */ + public function is_disabled() { + + return (bool) apply_filters( 'wp_mail_smtp_providers_provider_is_disabled', $this->disabled, $this ); + } + + /** + * Check whether we can use this provider based on the PHP version. + * Valid for those, that use SDK. + * + * @since 1.0.0 + * + * @return bool + */ + public function is_php_correct() { + return version_compare( phpversion(), $this->php, '>=' ); + } + + /** + * Display a helpful message to those users, that are using an outdated version of PHP, + * which is not supported by the currently selected Provider. + * + * @since 1.0.0 + */ + protected function display_php_warning() { + ?> + +
            + get_title() ), + esc_html( $this->php ), + esc_html( phpversion() ) + ); + ?> +
            + +
            + + + +
            + get_title() ) + ); + ?> +
            + +
            + + + +

            + ' . esc_attr( $constant ) . '', + 'wp-config.php' + ); + ?> +

            + + wp_mail_smtp()->assets_url . '/images/providers/microsoft.svg', + 'slug' => 'outlook', + 'title' => esc_html__( 'Outlook', 'wp-mail-smtp' ), + 'disabled' => true, + ) + ); + } + + /** + * @inheritdoc + */ + public function display_options() { + + ?> + +

            + +

            + + options->get_group( $this->mailer ); + + // Host and Port are the only really required options. + if ( + ! empty( $options['host'] ) && + ! empty( $options['port'] ) + ) { + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Pepipost/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Pepipost/Options.php new file mode 100644 index 0000000..e886ce3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Pepipost/Options.php @@ -0,0 +1,29 @@ + wp_mail_smtp()->assets_url . '/images/providers/pepipost-smtp.png', + 'slug' => 'pepipost', + 'title' => esc_html__( 'Pepipost SMTP', 'wp-mail-smtp' ), + ) + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Mailer.php b/wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Mailer.php new file mode 100644 index 0000000..c1c4476 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Mailer.php @@ -0,0 +1,440 @@ +set_header( 'Authorization', 'Bearer ' . $this->options->get( $this->mailer, 'api_key' ) ); + $this->set_header( 'content-type', 'application/json' ); + } + + /** + * Redefine the way email body is returned. + * By default we are sending an array of data. + * Pepipost requires a JSON, so we encode the body. + * + * @since 1.8.0 + * + * @return string + */ + public function get_body() { + + $body = parent::get_body(); + + return wp_json_encode( $body ); + } + + /** + * Set the FROM header of the email. + * + * @since 1.8.0 + * + * @param string $email From mail. + * @param string $name From name. + */ + public function set_from( $email, $name = '' ) { + + if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) { + return; + } + + $from['email'] = $email; + + if ( ! empty( $name ) ) { + $from['name'] = $name; + } + + $this->set_body_param( + array( + 'from' => $from, + ) + ); + } + + /** + * Set the names/emails of people who will receive the email. + * + * @since 1.8.0 + * + * @param array $recipients List of recipients: cc/bcc/to. + */ + public function set_recipients( $recipients ) { + + if ( empty( $recipients ) ) { + return; + } + + // Allow for now only these recipient types. + $default = array( 'to', 'cc', 'bcc' ); + $data = array(); + + foreach ( $recipients as $type => $emails ) { + if ( + ! in_array( $type, $default, true ) || + empty( $emails ) || + ! is_array( $emails ) + ) { + continue; + } + + $data[ $type ] = array(); + + // Iterate over all emails for each type. + // There might be multiple cc/to/bcc emails. + foreach ( $emails as $email ) { + $holder = array(); + $addr = isset( $email[0] ) ? $email[0] : false; + $name = isset( $email[1] ) ? $email[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + $holder['email'] = $addr; + if ( ! empty( $name ) ) { + $holder['name'] = $name; + } + + array_push( $data[ $type ], $holder ); + } + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + 'personalizations' => array( $data ), + ) + ); + + if ( ! empty( $data['bcc'] ) ) { + // Only the 1st BCC email address, ignore the rest - is not supported by Pepipost. + $bcc['mail_settings']['bcc']['email'] = $data['bcc'][0]['email']; + $this->set_body_param( + $bcc + ); + } + } + } + + /** + * Set the email content. + * + * @since 1.8.0 + * + * @param array|string $content Email content. + */ + public function set_content( $content ) { + + if ( empty( $content ) ) { + return; + } + + if ( is_array( $content ) ) { + + $default = array( 'text', 'html' ); + $data = array(); + + foreach ( $content as $type => $body ) { + if ( + ! in_array( $type, $default, true ) || + empty( $body ) + ) { + continue; + } + + $content_type = 'text/plain'; + $content_value = $body; + + if ( $type === 'html' ) { + $content_type = 'text/html'; + } + + $data[] = array( + 'type' => $content_type, + 'value' => $content_value, + ); + } + + $this->set_body_param( + array( + 'content' => $data, + ) + ); + } else { + $data['type'] = 'text/html'; + $data['value'] = $content; + + if ( $this->phpmailer->ContentType === 'text/plain' ) { + $data['type'] = 'text/plain'; + } + + $this->set_body_param( + array( + 'content' => array( $data ), + ) + ); + } + } + + /** + * Redefine the way custom headers are processed for this mailer - they should be in body. + * + * @since 1.8.0 + * + * @param array $headers + */ + public function set_headers( $headers ) { + + foreach ( $headers as $header ) { + $name = isset( $header[0] ) ? $header[0] : false; + $value = isset( $header[1] ) ? $header[1] : false; + + $this->set_body_header( $name, $value ); + } + + // Add custom PHPMailer-specific header. + $this->set_body_header( 'X-Mailer', 'WPMailSMTP/Mailer/' . $this->mailer . ' ' . WPMS_PLUGIN_VER ); + } + + /** + * This mailer supports email-related custom headers inside a body of the message. + * + * @since 1.8.0 + * + * @param string $name + * @param string $value + */ + public function set_body_header( $name, $value ) { + + $name = sanitize_text_field( $name ); + if ( empty( $name ) ) { + return; + } + + $headers = isset( $this->body['headers'] ) ? (array) $this->body['headers'] : array(); + + $headers[ $name ] = WP::sanitize_value( $value ); + + $this->set_body_param( + array( + 'headers' => $headers, + ) + ); + } + + /** + * Pepipost accepts an array of files content in body, so we will include all files and send. + * Doesn't handle exceeding the limits etc, as this is done and reported by SendGrid API. + * + * @since 1.8.0 + * + * @param array $attachments + */ + public function set_attachments( $attachments ) { + + if ( empty( $attachments ) ) { + return; + } + + $data = array(); + + foreach ( $attachments as $attachment ) { + $file = false; + + /* + * We are not using WP_Filesystem API as we can't reliably work with it. + * It is not always available, same as credentials for FTP. + */ + try { + if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) { + $file = file_get_contents( $attachment[0] ); // phpcs:ignore + } + } + catch ( \Exception $e ) { + $file = false; + } + + if ( $file === false ) { + continue; + } + + $data[] = array( + 'content' => base64_encode( $file ), + 'type' => $attachment[4], + 'filename' => $attachment[2], + 'disposition' => $attachment[6], + ); + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + 'attachments' => $data, + ) + ); + } + } + + /** + * Set the reply-to property of the email. + * + * @since 1.8.0 + * + * @param array $reply_to Name/email for reply-to feature. + */ + public function set_reply_to( $reply_to ) { + + if ( empty( $reply_to ) ) { + return; + } + + $data = array(); + + foreach ( $reply_to as $key => $emails ) { + if ( + empty( $emails ) || + ! is_array( $emails ) + ) { + continue; + } + + $addr = isset( $emails[0] ) ? $emails[0] : false; + $name = isset( $emails[1] ) ? $emails[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + $data['email'] = $addr; + if ( ! empty( $name ) ) { + $data['name'] = $name; + } + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + 'reply_to' => $data, + ) + ); + } + } + + /** + * Pepipost doesn't support sender or return_path params. + * So we do nothing. + * + * @since 1.8.0 + * + * @param string $from_email + */ + public function set_return_path( $from_email ) {} + + /** + * Get a Pepipost-specific response with a helpful error. + * + * @see https://developers.pepipost.com/migration-api/new-subpage/errorcodes + * + * @since 1.8.0 + * + * @return string + */ + protected function get_response_error() { + + $body = (array) wp_remote_retrieve_body( $this->response ); + + $error_text = array(); + + if ( ! empty( $body['errors'] ) ) { + foreach ( $body['errors'] as $error ) { + if ( property_exists( $error, 'message' ) ) { + // Prepare additional information from SendGrid API. + $extra = ''; + if ( property_exists( $error, 'field' ) && ! empty( $error->field ) ) { + $extra .= $error->field . '; '; + } + if ( property_exists( $error, 'help' ) && ! empty( $error->help ) ) { + $extra .= $error->help; + } + + // Assign both the main message and perhaps extra information, if exists. + $error_text[] = $error->message . ( ! empty( $extra ) ? ' - ' . $extra : '' ); + } + } + } + + return implode( '
            ', array_map( 'esc_textarea', $error_text ) ); + } + + /** + * Get mailer debug information, that is helpful during support. + * + * @since 1.8.0 + * + * @return string + */ + public function get_debug_info() { + + $sendgrid_text[] = 'Api Key: ' . ( $this->is_mailer_complete() ? 'Yes' : 'No' ); + + return implode( '
            ', $sendgrid_text ); + } + + /** + * Whether the mailer has all its settings correctly set up and saved. + * + * @since 1.8.0 + * + * @return bool + */ + public function is_mailer_complete() { + + $options = $this->options->get_group( $this->mailer ); + + // API key is the only required option. + if ( ! empty( $options['api_key'] ) ) { + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Options.php new file mode 100644 index 0000000..b4196eb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Options.php @@ -0,0 +1,119 @@ +Pepipost is a recommended transactional email service. Every month Pepipost delivers over 8 billion emails from 20,000+ customers. Their mission is to reliably send emails in the most efficient way and at the most disruptive pricing ever. Pepipost provides users 30,000 free emails the first 30 days.', 'wp-mail-smtp' ) . + '

            ' . + /* translators: %1$s - URL to wpmailsmtp.com doc. */ + __( 'Read our Pepipost documentation to learn how to configure Pepipost and improve your email deliverability.', 'wp-mail-smtp' ), + array( + 'br' => true, + 'strong' => true, + 'a' => array( + 'href' => true, + 'rel' => true, + 'target' => true, + ), + ) + ), + 'https://wpmailsmtp.com/go/pepipost/', + 'https://wpmailsmtp.com/docs/how-to-set-up-the-pepipost-mailer-in-wp-mail-smtp' + ); + + $api_key = PluginOptions::init()->get( self::SLUG, 'api_key' ); + + if ( empty( $api_key ) ) { + $description .= '

            ' . + esc_html__( 'Get Pepipost Now (Free)', 'wp-mail-smtp' ) . + '

            '; + } + + parent::__construct( + array( + 'logo_url' => wp_mail_smtp()->assets_url . '/images/providers/pepipost.png', + 'slug' => self::SLUG, + 'title' => esc_html__( 'Pepipost', 'wp-mail-smtp' ), + 'description' => $description, + 'recommended' => true, + 'php' => '5.3', + ) + ); + } + + /** + * Output the mailer provider options. + * + * @since 1.8.0 + */ + public function display_options() { + + // Do not display options if PHP version is not correct. + if ( ! $this->is_php_correct() ) { + $this->display_php_warning(); + + return; + } + ?> + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'api_key' ) ) : ?> + + display_const_set_message( 'WPMS_PEPIPOST_API_KEY' ); ?> + + + + +

            + ' . + esc_html__( 'Get the API Key', 'wp-mail-smtp' ) . + '' + ); + ?> +

            +
            +
            + + options->get_group( $this->mailer ); + + // Host and Port are the only really required options. + if ( + ! empty( $options['host'] ) && + ! empty( $options['port'] ) + ) { + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/SMTP/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/SMTP/Options.php new file mode 100644 index 0000000..5553e35 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/SMTP/Options.php @@ -0,0 +1,44 @@ + wp_mail_smtp()->assets_url . '/images/providers/smtp.svg', + 'slug' => 'smtp', + 'title' => esc_html__( 'Other SMTP', 'wp-mail-smtp' ), + 'description' => sprintf( + wp_kses( + /* translators: %s - URL to a related article on WPForms.com. */ + __( 'Use the SMTP details provided by your hosting provider or email service.

            To see recommended settings for the popular services as well as troubleshooting tips, check out our SMTP documentation.', 'wp-mail-smtp' ), + array( + 'br' => array(), + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + 'https://wpmailsmtp.com/docs/how-to-set-up-the-other-smtp-mailer-in-wp-mail-smtp/' + ), + ) + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Mailer.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Mailer.php new file mode 100644 index 0000000..b4b48a9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Mailer.php @@ -0,0 +1,409 @@ +set_header( 'Authorization', 'Bearer ' . $this->options->get( $this->mailer, 'api_key' ) ); + $this->set_header( 'content-type', 'application/json' ); + } + + /** + * Redefine the way email body is returned. + * By default we are sending an array of data. + * SendGrid requires a JSON, so we encode the body. + * + * @since 1.0.0 + */ + public function get_body() { + + $body = parent::get_body(); + + return wp_json_encode( $body ); + } + + /** + * @inheritdoc + */ + public function set_from( $email, $name = '' ) { + + if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) { + return; + } + + $from['email'] = $email; + + if ( ! empty( $name ) ) { + $from['name'] = $name; + } + + $this->set_body_param( + array( + 'from' => $from, + ) + ); + } + + /** + * @inheritdoc + */ + public function set_recipients( $recipients ) { + + if ( empty( $recipients ) ) { + return; + } + + // Allow for now only these recipient types. + $default = array( 'to', 'cc', 'bcc' ); + $data = array(); + + foreach ( $recipients as $type => $emails ) { + if ( + ! in_array( $type, $default, true ) || + empty( $emails ) || + ! is_array( $emails ) + ) { + continue; + } + + $data[ $type ] = array(); + + // Iterate over all emails for each type. + // There might be multiple cc/to/bcc emails. + foreach ( $emails as $email ) { + $holder = array(); + $addr = isset( $email[0] ) ? $email[0] : false; + $name = isset( $email[1] ) ? $email[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + $holder['email'] = $addr; + if ( ! empty( $name ) ) { + $holder['name'] = $name; + } + + array_push( $data[ $type ], $holder ); + } + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + 'personalizations' => array( $data ), + ) + ); + } + } + + /** + * @inheritdoc + */ + public function set_content( $content ) { + + if ( empty( $content ) ) { + return; + } + + if ( is_array( $content ) ) { + + $default = array( 'text', 'html' ); + $data = array(); + + foreach ( $content as $type => $body ) { + if ( + ! in_array( $type, $default, true ) || + empty( $body ) + ) { + continue; + } + + $content_type = 'text/plain'; + $content_value = $body; + + if ( $type === 'html' ) { + $content_type = 'text/html'; + } + + $data[] = array( + 'type' => $content_type, + 'value' => $content_value, + ); + } + + $this->set_body_param( + array( + 'content' => $data, + ) + ); + } else { + $data['type'] = 'text/html'; + $data['value'] = $content; + + if ( $this->phpmailer->ContentType === 'text/plain' ) { + $data['type'] = 'text/plain'; + } + + $this->set_body_param( + array( + 'content' => array( $data ), + ) + ); + } + } + + /** + * Redefine the way custom headers are processed for this mailer - they should be in body. + * + * @since 1.5.0 + * + * @param array $headers + */ + public function set_headers( $headers ) { + + foreach ( $headers as $header ) { + $name = isset( $header[0] ) ? $header[0] : false; + $value = isset( $header[1] ) ? $header[1] : false; + + $this->set_body_header( $name, $value ); + } + + // Add custom PHPMailer-specific header. + $this->set_body_header( 'X-Mailer', 'WPMailSMTP/Mailer/' . $this->mailer . ' ' . WPMS_PLUGIN_VER ); + } + + /** + * This mailer supports email-related custom headers inside a body of the message. + * + * @since 1.5.0 + * + * @param string $name + * @param string $value + */ + public function set_body_header( $name, $value ) { + + $name = sanitize_text_field( $name ); + if ( empty( $name ) ) { + return; + } + + $headers = isset( $this->body['headers'] ) ? (array) $this->body['headers'] : array(); + + $headers[ $name ] = WP::sanitize_value( $value ); + + $this->set_body_param( + array( + 'headers' => $headers, + ) + ); + } + + /** + * SendGrid accepts an array of files content in body, so we will include all files and send. + * Doesn't handle exceeding the limits etc, as this is done and reported by SendGrid API. + * + * @since 1.0.0 + * + * @param array $attachments + */ + public function set_attachments( $attachments ) { + + if ( empty( $attachments ) ) { + return; + } + + $data = array(); + + foreach ( $attachments as $attachment ) { + $file = false; + + /* + * We are not using WP_Filesystem API as we can't reliably work with it. + * It is not always available, same as credentials for FTP. + */ + try { + if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) { + $file = file_get_contents( $attachment[0] ); // phpcs:ignore + } + } + catch ( \Exception $e ) { + $file = false; + } + + if ( $file === false ) { + continue; + } + + $filetype = str_replace( ';', '', trim( $attachment[4] ) ); + + $data[] = array( + 'content' => base64_encode( $file ), // string, 1 character. + 'type' => $filetype, // string, no ;, no CRLF. + 'filename' => empty( $attachment[2] ) ? 'file-' . wp_hash( microtime() ) . '.' . $filetype : trim( $attachment[2] ), // required string, no CRLF. + 'disposition' => in_array( $attachment[6], array( 'inline', 'attachment' ), true ) ? $attachment[6] : 'attachment', // either inline or attachment. + 'content_id' => empty( $attachment[7] ) ? '' : trim( (string) $attachment[7] ), // string, no CRLF. + ); + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + 'attachments' => $data, + ) + ); + } + } + + /** + * @inheritdoc + */ + public function set_reply_to( $reply_to ) { + + if ( empty( $reply_to ) ) { + return; + } + + $data = array(); + + foreach ( $reply_to as $key => $emails ) { + if ( + empty( $emails ) || + ! is_array( $emails ) + ) { + continue; + } + + $addr = isset( $emails[0] ) ? $emails[0] : false; + $name = isset( $emails[1] ) ? $emails[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + $data['email'] = $addr; + if ( ! empty( $name ) ) { + $data['name'] = $name; + } + } + + if ( ! empty( $data ) ) { + $this->set_body_param( + array( + 'reply_to' => $data, + ) + ); + } + } + + /** + * SendGrid doesn't support sender or return_path params. + * So we do nothing. + * + * @since 1.0.0 + * + * @param string $from_email + */ + public function set_return_path( $from_email ) {} + + /** + * Get a SendGrid-specific response with a helpful error. + * + * @since 1.2.0 + * + * @return string + */ + protected function get_response_error() { + + $body = (array) wp_remote_retrieve_body( $this->response ); + + $error_text = array(); + + if ( ! empty( $body['errors'] ) ) { + foreach ( $body['errors'] as $error ) { + if ( property_exists( $error, 'message' ) ) { + // Prepare additional information from SendGrid API. + $extra = ''; + if ( property_exists( $error, 'field' ) && ! empty( $error->field ) ) { + $extra .= $error->field . '; '; + } + if ( property_exists( $error, 'help' ) && ! empty( $error->help ) ) { + $extra .= $error->help; + } + + // Assign both the main message and perhaps extra information, if exists. + $error_text[] = $error->message . ( ! empty( $extra ) ? ' - ' . $extra : '' ); + } + } + } + + return implode( '
            ', array_map( 'esc_textarea', $error_text ) ); + } + + /** + * Get mailer debug information, that is helpful during support. + * + * @since 1.2.0 + * + * @return string + */ + public function get_debug_info() { + + $sendgrid_text[] = 'Api Key: ' . ( $this->is_mailer_complete() ? 'Yes' : 'No' ); + + return implode( '
            ', $sendgrid_text ); + } + + /** + * @inheritdoc + */ + public function is_mailer_complete() { + + $options = $this->options->get_group( $this->mailer ); + + // API key is the only required option. + if ( ! empty( $options['api_key'] ) ) { + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Options.php new file mode 100644 index 0000000..70e2f19 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Options.php @@ -0,0 +1,96 @@ + wp_mail_smtp()->assets_url . '/images/providers/sendgrid.svg', + 'slug' => 'sendgrid', + 'title' => esc_html__( 'SendGrid', 'wp-mail-smtp' ), + 'description' => sprintf( + wp_kses( + /* translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag. */ + __( '%1$sSendGrid%2$s is one of the leading transactional email services, sending over 35 billion emails every month. They provide users 100 free emails per day.

            Read our %3$sSendGrid documentation%4$s to learn how to set up SendGrid and improve your email deliverability.', 'wp-mail-smtp' ), + array( + 'br' => array(), + 'a' => array( + 'href' => array(), + 'rel' => array(), + 'target' => array(), + ), + ) + ), + '', + '', + '', + '' + ), + ) + ); + } + + /** + * @inheritdoc + */ + public function display_options() { + ?> + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'api_key' ) ) : ?> + + display_const_set_message( 'WPMS_SENDGRID_API_KEY' ); ?> + + + +

            + ' . + esc_html__( 'Create API Key', 'wp-mail-smtp' ) . + '' + ); + ?> +
            + Mail Send' + ); + ?> +

            +
            +
            + + options = \WPMailSMTP\Options::init()->get_group( Options::SLUG ); + } + + /** + * Configure API key authorization: api-key. + * + * @since 1.6.0 + * + * @return \SendinBlue\Client\Configuration + */ + protected function get_api_config() { + + return \SendinBlue\Client\Configuration::getDefaultConfiguration()->setApiKey( 'api-key', isset( $this->options['api_key'] ) ? $this->options['api_key'] : '' ); + } + + /** + * Get the mailer client instance for Account API. + * + * @since 1.6.0 + */ + public function get_account_client() { + + // Include the library. + require_once wp_mail_smtp()->plugin_path . '/vendor/autoload.php'; + + return new \SendinBlue\Client\Api\AccountApi( null, $this->get_api_config() ); + } + + /** + * Get the mailer client instance for Sender API. + * + * @since 1.6.0 + */ + public function get_sender_client() { + + // Include the library. + require_once wp_mail_smtp()->plugin_path . '/vendor/autoload.php'; + + return new \SendinBlue\Client\Api\SendersApi( null, $this->get_api_config() ); + } + + /** + * Get the mailer client instance for SMTP API. + * + * @since 1.6.0 + */ + public function get_smtp_client() { + + // Include the library. + require_once wp_mail_smtp()->plugin_path . '/vendor/autoload.php'; + + return new \SendinBlue\Client\Api\SMTPApi( null, $this->get_api_config() ); + } + + /** + * Whether the mailer is ready to be used in API calls. + * + * @since 1.6.0 + * + * @return bool + */ + public function is_ready() { + + return ! empty( $this->options['api_key'] ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Mailer.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Mailer.php new file mode 100644 index 0000000..8459085 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Mailer.php @@ -0,0 +1,393 @@ +is_php_compatible() ) { + return; + } + } + + /** + * @inheritDoc + * + * @since 1.6.0 + */ + public function set_header( $name, $value ) { + + $name = sanitize_text_field( $name ); + + $this->body['headers'][ $name ] = WP::sanitize_value( $value ); + } + + /** + * Set the From information for an email. + * + * @since 1.6.0 + * + * @param string $email + * @param string $name + */ + public function set_from( $email, $name ) { + + if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) { + return; + } + + $this->body['sender'] = array( + 'email' => $email, + 'name' => ! empty( $name ) ? WP::sanitize_value( $name ) : '', + ); + } + + /** + * Set email recipients: to, cc, bcc. + * + * @since 1.6.0 + * + * @param array $recipients + */ + public function set_recipients( $recipients ) { + + if ( empty( $recipients ) ) { + return; + } + + // Allow for now only these recipient types. + $default = array( 'to', 'cc', 'bcc' ); + $data = array(); + + foreach ( $recipients as $type => $emails ) { + + if ( + ! in_array( $type, $default, true ) || + empty( $emails ) || + ! is_array( $emails ) + ) { + continue; + } + + $data[ $type ] = array(); + + // Iterate over all emails for each type. + // There might be multiple cc/to/bcc emails. + foreach ( $emails as $email ) { + $holder = array(); + $addr = isset( $email[0] ) ? $email[0] : false; + $name = isset( $email[1] ) ? $email[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + $holder['email'] = $addr; + if ( ! empty( $name ) ) { + $holder['name'] = $name; + } + + array_push( $data[ $type ], $holder ); + } + } + + foreach ( $data as $type => $type_recipients ) { + $this->body[ $type ] = $type_recipients; + } + } + + /** + * @inheritDoc + * + * @since 1.6.0 + */ + public function set_subject( $subject ) { + + $this->body['subject'] = $subject; + } + + /** + * Set email content. + * + * @since 1.6.0 + * + * @param string|array $content + */ + public function set_content( $content ) { + + if ( empty( $content ) ) { + return; + } + + if ( is_array( $content ) ) { + + if ( ! empty( $content['text'] ) ) { + $this->body['textContent'] = $content['text']; + } + + if ( ! empty( $content['html'] ) ) { + $this->body['htmlContent'] = $content['html']; + } + } else { + if ( $this->phpmailer->ContentType === 'text/plain' ) { + $this->body['textContent'] = $content; + } else { + $this->body['htmlContent'] = $content; + } + } + } + + /** + * Doesn't support this. + * + * @since 1.6.0 + * + * @param string $email + */ + public function set_return_path( $email ) { + + } + + /** + * Set the Reply To headers if not set already. + * + * @since 1.6.0 + * + * @param array $emails + */ + public function set_reply_to( $emails ) { + + if ( empty( $emails ) ) { + return; + } + + $data = array(); + + foreach ( $emails as $user ) { + $holder = array(); + $addr = isset( $user[0] ) ? $user[0] : false; + $name = isset( $user[1] ) ? $user[1] : false; + + if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) { + continue; + } + + $holder['email'] = $addr; + if ( ! empty( $name ) ) { + $holder['name'] = $name; + } + + $data[] = $holder; + } + + if ( ! empty( $data ) ) { + $this->body['replyTo'] = $data[0]; + } + } + + /** + * Set attachments for an email. + * + * @since 1.6.0 + * + * @param array $attachments + */ + public function set_attachments( $attachments ) { + + if ( empty( $attachments ) ) { + return; + } + + foreach ( $attachments as $attachment ) { + $file = false; + + /* + * We are not using WP_Filesystem API as we can't reliably work with it. + * It is not always available, same as credentials for FTP. + */ + try { + if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) { + $ext = pathinfo( $attachment[0], PATHINFO_EXTENSION ); + + if ( in_array( $ext, $this->allowed_attach_ext, true ) ) { + $file = file_get_contents( $attachment[0] ); // phpcs:ignore + } + } + } + catch ( \Exception $e ) { + $file = false; + } + + if ( $file === false ) { + continue; + } + + $this->body['attachment'][] = array( + 'name' => $attachment[2], + 'content' => base64_encode( $file ), + ); + } + } + + /** + * @inheritDoc + * + * @since 1.6.0 + * + * @return \SendinBlue\Client\Model\SendSmtpEmail + */ + public function get_body() { + + return new \SendinBlue\Client\Model\SendSmtpEmail( $this->body ); + } + + /** + * Use a library to send emails. + * + * @since 1.6.0 + */ + public function send() { + + try { + $api = new Api(); + + $response = $api->get_smtp_client()->sendTransacEmail( $this->get_body() ); + + $this->process_response( $response ); + } + catch ( \SendinBlue\Client\ApiException $e ) { + $error = json_decode( $e->getResponseBody() ); + if ( json_last_error() === JSON_ERROR_NONE ) { + Debug::set( + 'Mailer: Sendinblue' . "\r\n" . + '[' . sanitize_key( $error->code ) . ']: ' . esc_html( $error->message ) + ); + } + } + catch ( \Exception $e ) { + Debug::set( + 'Mailer: Sendinblue' . "\r\n" . + $e->getMessage() + ); + + return; + } + } + + /** + * Save response from the API to use it later. + * All the actually response processing is done in send() method, + * because SendinBlue throws exception if any error occurs. + * + * @since 1.6.0 + * + * @param \SendinBlue\Client\Model\CreateSmtpEmail $response + */ + protected function process_response( $response ) { + + $this->response = $response; + } + + /** + * Check whether the email was sent. + * + * @since 1.6.0 + * + * @return bool + */ + public function is_email_sent() { + + $is_sent = false; + + if ( $this->response instanceof \SendinBlue\Client\Model\CreateSmtpEmail ) { + $is_sent = $this->response->valid(); + } + + // Clear debug messages if email is successfully sent. + if ( $is_sent ) { + Debug::clear(); + } + + return $is_sent; + } + + /** + * @inheritdoc + * + * @since 1.6.0 + */ + public function get_debug_info() { + + $mailjet_text[] = 'API Key: ' . ( $this->is_mailer_complete() ? 'Yes' : 'No' ); + + return implode( '
            ', $mailjet_text ); + } + + /** + * @inheritdoc + * + * @since 1.6.0 + */ + public function is_mailer_complete() { + + $options = $this->options->get_group( $this->mailer ); + + // API key is the only required option. + if ( ! empty( $options['api_key'] ) ) { + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Options.php b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Options.php new file mode 100644 index 0000000..2287c72 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Options.php @@ -0,0 +1,119 @@ +Sendinblue is a recommended transactional email service. Founded in 2012, they serve 80,000+ growing companies around the world and send over 30 million emails each day. They understand that transactional emails are the heart of your customer relationships. Their email deliverability experts are constantly at work optimizing the reliability and speed of their SMTP infrastructure. Sendinblue provides users 300 free emails per day.', 'wp-mail-smtp' ) . + '

            ' . + /* translators: %2$s - URL to wpmailsmtp.com doc. */ + __( 'Read our Sendinblue documentation to learn how to configure Sendinblue and improve your email deliverability.', 'wp-mail-smtp' ), + array( + 'br' => true, + 'strong' => true, + 'a' => array( + 'href' => true, + 'rel' => true, + 'target' => true, + ), + ) + ), + 'https://wpmailsmtp.com/go/sendinblue/', + 'https://wpmailsmtp.com/docs/how-to-set-up-the-sendinblue-mailer-in-wp-mail-smtp' + ); + + $api_key = PluginOptions::init()->get( self::SLUG, 'api_key' ); + + if ( empty( $api_key ) ) { + $description .= '

            ' . + esc_html__( 'Get Sendinblue Now (Free)', 'wp-mail-smtp' ) . + '

            '; + } + + parent::__construct( + array( + 'logo_url' => wp_mail_smtp()->assets_url . '/images/providers/sendinblue.svg', + 'slug' => self::SLUG, + 'title' => esc_html__( 'Sendinblue', 'wp-mail-smtp' ), + 'description' => $description, + 'recommended' => true, + 'php' => '5.6', + ) + ); + } + + /** + * Output the mailer provider options. + * + * @since 1.6.0 + */ + public function display_options() { + + // Do not display options if PHP version is not correct. + if ( ! $this->is_php_correct() ) { + $this->display_php_warning(); + + return; + } + ?> + + +
            +
            + +
            +
            + options->is_const_defined( $this->get_slug(), 'api_key' ) ) : ?> + + display_const_set_message( 'WPMS_SENDINBLUE_API_KEY' ); ?> + + + + +

            + ' . + esc_html__( 'Get v3 API Key', 'wp-mail-smtp' ) . + '' + ); + ?> +

            +
            +
            + + esc_html__( 'Is WP Mail SMTP mailer setup complete?', 'wp-mail-smtp' ), + 'test' => array( $this, 'mailer_setup_complete_test' ), + ); + + return $tests; + } + + /** + * Register plugin WP Site Health debug information. + * This will be displayed in the "Info" tab of the WP Site Health page. + * + * @since {VERSION} + * + * @param array $debug_info Array of existing debug information. + * + * @return array + */ + public function register_debug_information( $debug_info ) { + + $debug_notices = Debug::get(); + + $debug_info[ self::DEBUG_INFO_SLUG ] = array( + 'label' => $this->get_label(), + 'fields' => array( + 'version' => array( + 'label' => esc_html__( 'Version', 'wp-mail-smtp' ), + 'value' => WPMS_PLUGIN_VER, + ), + 'license_key_type' => array( + 'label' => esc_html__( 'License key type', 'wp-mail-smtp' ), + 'value' => wp_mail_smtp()->get_license_type(), + ), + 'debug' => array( + 'label' => esc_html__( 'Debug', 'wp-mail-smtp' ), + 'value' => ! empty( $debug_notices ) ? implode( '. ', $debug_notices ) : esc_html__( 'No debug notices found.', 'wp-mail-smtp' ), + ), + ), + ); + + return $debug_info; + } + + /** + * Perform the WP site health test for checking, if the mailer setup is complete. + * + * @since {VERSION} + */ + public function mailer_setup_complete_test() { + + $mailer = Options::init()->get( 'mail', 'mailer' ); + $mailer_complete = wp_mail_smtp() + ->get_providers() + ->get_mailer( + $mailer, + wp_mail_smtp()->get_processor()->get_phpmailer() + )->is_mailer_complete(); + + // The default mailer should be considered as a non-complete mailer. + if ( $mailer === 'mail' ) { + $mailer_complete = false; + } + + $mailer_text = sprintf( + '%s: %s', + esc_html__( 'Current mailer', 'wp-mail-smtp' ), + esc_html( wp_mail_smtp()->get_providers()->get_options( $mailer )->get_title() ) + ); + + $result = array( + 'label' => esc_html__( 'WP Mail SMTP mailer setup is complete', 'wp-mail-smtp' ), + 'status' => 'good', + 'badge' => array( + 'label' => $this->get_label(), + 'color' => self::BADGE_COLOR, + ), + 'description' => sprintf( + '

            %s

            %s

            ', + $mailer_text, + esc_html__( 'The WP Mail SMTP plugin mailer setup is complete. You can send a test email, to make sure it\'s working properly.', 'wp-mail-smtp' ) + ), + 'actions' => sprintf( + '

            %s

            ', + esc_url( add_query_arg( 'tab', 'test', wp_mail_smtp()->get_admin()->get_admin_page_url() ) ), + esc_html__( 'Test email sending', 'wp-mail-smtp' ) + ), + 'test' => 'wp_mail_smtp_mailer_setup_complete', + ); + + if ( $mailer === 'mail' ) { + $mailer_text .= sprintf( /* translators: %s - explanation why default mailer is not a valid mailer option. */ + '

            %s

            ', + esc_html__( 'You currently have the default mailer selected, which means that you haven’t set up SMTP yet.', 'wp-mail-smtp' ) + ); + } + + if ( $mailer_complete === false ) { + $result['label'] = esc_html__( 'WP Mail SMTP mailer setup is incomplete', 'wp-mail-smtp' ); + $result['status'] = 'recommended'; + $result['badge']['color'] = 'orange'; + $result['description'] = sprintf( + '

            %s

            %s

            ', + $mailer_text, + esc_html__( 'The WP Mail SMTP plugin mailer setup is incomplete. Please click on the link below to access plugin settings and configure the mailer.', 'wp-mail-smtp' ) + ); + $result['actions'] = sprintf( + '

            %s

            ', + esc_url( wp_mail_smtp()->get_admin()->get_admin_page_url() ), + esc_html__( 'Configure mailer', 'wp-mail-smtp' ) + ); + } + + return $result; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/Upgrade.php b/wp-content/plugins/wp-mail-smtp/src/Upgrade.php new file mode 100644 index 0000000..cea152a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/Upgrade.php @@ -0,0 +1,71 @@ +upgrades(); + + if ( empty( $upgrades ) ) { + return; + } + + // Run any available upgrades. + foreach ( $upgrades as $upgrade ) { + $this->{$upgrade}(); + } + + // Update version post upgrade(s). + update_option( 'wp_mail_smtp_version', WPMS_PLUGIN_VER ); + } + + /** + * Whether we need to perform an upgrade. + * + * @since 1.1.0 + * + * @return array + */ + protected function upgrades() { + + $version = get_option( 'wp_mail_smtp_version' ); + $upgrades = array(); + + // Version 1.1.0 upgrade; prior to this the option was not available. + if ( empty( $version ) ) { + $upgrades[] = 'v110_upgrade'; + } + + return $upgrades; + } + + /** + * Upgrade routine for v1.1.0. + * + * Set SMTPAutoTLS to true. + * + * @since 1.1.0 + */ + public function v110_upgrade() { + + $values = Options::init()->get_all(); + + // Enable SMTPAutoTLS option. + $values['smtp']['autotls'] = true; + + Options::init()->set( $values ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/src/WP.php b/wp-content/plugins/wp-mail-smtp/src/WP.php new file mode 100644 index 0000000..58960fc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/src/WP.php @@ -0,0 +1,234 @@ + $message, + 'class' => $class, + 'is_dismissible' => (bool) $is_dismissible, + ); + } + + /** + * Display all notices. + * + * @since 1.0.0 + * @since 1.5.0 Allow the notice to be dismissible, remove the id attribute, which is not unique. + */ + public static function display_admin_notices() { + + foreach ( (array) self::$admin_notices as $notice ) : + $dismissible = $notice['is_dismissible'] ? 'is-dismissible' : ''; + ?> + +
            +

            + +

            +
            + + for non-HTML tags. + * + * @since 1.5.0 + * + * @param string $value + * + * @return mixed|string|string[]|null + */ + public static function sanitize_value( $value ) { + + // Remove HTML tags. + $filtered = wp_strip_all_tags( $value, false ); + // Remove multi-lines/tabs. + $filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered ); + // Remove whitespaces. + $filtered = trim( $filtered ); + + // Remove octets. + $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 $filtered; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/uninstall.php b/wp-content/plugins/wp-mail-smtp/uninstall.php new file mode 100644 index 0000000..466101c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/uninstall.php @@ -0,0 +1,80 @@ + array( 'amn_smtp' ), + 'post_status' => 'any', + 'numberposts' => - 1, + 'fields' => 'ids', + ) +); +if ( ! empty( $announcements ) ) { + foreach ( $announcements as $announcement ) { + wp_delete_post( $announcement, true ); + } +} + +/* + * Logs for Pro plugin only. + */ +if ( function_exists( 'wp_mail_smtp' ) && wp_mail_smtp()->is_pro() ) { + // DB version. + delete_option( 'wp_mail_smtp_logs_db_version' ); + // DB table. + global $wpdb; + $table = \WPMailSMTP\Pro\Emails\Logs\Logs::get_table_name(); + $wpdb->query( "DROP TABLE $table;" ); // phpcs:ignore +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/autoload.php b/wp-content/plugins/wp-mail-smtp/vendor/autoload.php new file mode 100644 index 0000000..3db465d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_classmap.php b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..b6d8155 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_classmap.php @@ -0,0 +1,11 @@ + $vendorDir . '/google/apiclient/src/Google/Service/Exception.php', + 'Google_Service_Resource' => $vendorDir . '/google/apiclient/src/Google/Service/Resource.php', +); diff --git a/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_files.php b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_files.php new file mode 100644 index 0000000..020463c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_files.php @@ -0,0 +1,14 @@ + $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', + 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', + 'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php', +); diff --git a/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_namespaces.php b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..aed9f84 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_namespaces.php @@ -0,0 +1,11 @@ + array($vendorDir . '/google/apiclient-services/src'), + 'Google_' => array($vendorDir . '/google/apiclient/src'), +); diff --git a/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_psr4.php b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..a361555 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_psr4.php @@ -0,0 +1,22 @@ + array($vendorDir . '/phpseclib/phpseclib/phpseclib'), + 'WPMailSMTP\\' => array($baseDir . '/src'), + 'SendinBlue\\Client\\' => array($vendorDir . '/sendinblue/api-v3-sdk/lib'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), + 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), + 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), + 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), + 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), + 'Google\\Auth\\' => array($vendorDir . '/google/auth/src'), + 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), + 'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'), +); diff --git a/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_real.php b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_real.php new file mode 100644 index 0000000..60e0b6e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_real.php @@ -0,0 +1,70 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit4589a9f05a03f0a29add21e0e493a064::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInit4589a9f05a03f0a29add21e0e493a064::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire4589a9f05a03f0a29add21e0e493a064($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequire4589a9f05a03f0a29add21e0e493a064($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_static.php b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_static.php new file mode 100644 index 0000000..05d9ad3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_static.php @@ -0,0 +1,141 @@ + __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', + 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', + 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'p' => + array ( + 'phpseclib\\' => 10, + ), + 'W' => + array ( + 'WPMailSMTP\\' => 11, + ), + 'S' => + array ( + 'SendinBlue\\Client\\' => 18, + ), + 'P' => + array ( + 'Psr\\Log\\' => 8, + 'Psr\\Http\\Message\\' => 17, + 'Psr\\Cache\\' => 10, + ), + 'M' => + array ( + 'Monolog\\' => 8, + ), + 'G' => + array ( + 'GuzzleHttp\\Psr7\\' => 16, + 'GuzzleHttp\\Promise\\' => 19, + 'GuzzleHttp\\' => 11, + 'Google\\Auth\\' => 12, + ), + 'F' => + array ( + 'Firebase\\JWT\\' => 13, + ), + 'C' => + array ( + 'Composer\\Installers\\' => 20, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'phpseclib\\' => + array ( + 0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib', + ), + 'WPMailSMTP\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + ), + 'SendinBlue\\Client\\' => + array ( + 0 => __DIR__ . '/..' . '/sendinblue/api-v3-sdk/lib', + ), + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', + ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-message/src', + ), + 'Psr\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/cache/src', + ), + 'Monolog\\' => + array ( + 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', + ), + 'GuzzleHttp\\Psr7\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', + ), + 'GuzzleHttp\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', + ), + 'GuzzleHttp\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', + ), + 'Google\\Auth\\' => + array ( + 0 => __DIR__ . '/..' . '/google/auth/src', + ), + 'Firebase\\JWT\\' => + array ( + 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', + ), + 'Composer\\Installers\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', + ), + ); + + public static $prefixesPsr0 = array ( + 'G' => + array ( + 'Google_Service_' => + array ( + 0 => __DIR__ . '/..' . '/google/apiclient-services/src', + ), + 'Google_' => + array ( + 0 => __DIR__ . '/..' . '/google/apiclient/src', + ), + ), + ); + + public static $classMap = array ( + 'Google_Service_Exception' => __DIR__ . '/..' . '/google/apiclient/src/Google/Service/Exception.php', + 'Google_Service_Resource' => __DIR__ . '/..' . '/google/apiclient/src/Google/Service/Resource.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit4589a9f05a03f0a29add21e0e493a064::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit4589a9f05a03f0a29add21e0e493a064::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInit4589a9f05a03f0a29add21e0e493a064::$prefixesPsr0; + $loader->classMap = ComposerStaticInit4589a9f05a03f0a29add21e0e493a064::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/LICENSE b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/LICENSE new file mode 100644 index 0000000..a148ba5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/LICENSE @@ -0,0 +1,203 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions: + +(a) You must give any other recipients of the Work or +Derivative Works a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail.php new file mode 100644 index 0000000..d63d83d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail.php @@ -0,0 +1,1219 @@ + + * Access Gmail mailboxes including sending user email.

            + * + *

            + * For more information about this service, see the API + * Documentation + *

            + * + * @author Google, Inc. + */ +class Google_Service_Gmail extends Google_Service +{ + /** Read, compose, send, and permanently delete all your email from Gmail. */ + const MAIL_GOOGLE_COM = + "https://mail.google.com/"; + /** Manage drafts and send emails. */ + const GMAIL_COMPOSE = + "https://www.googleapis.com/auth/gmail.compose"; + /** Insert mail into your mailbox. */ + const GMAIL_INSERT = + "https://www.googleapis.com/auth/gmail.insert"; + /** Manage mailbox labels. */ + const GMAIL_LABELS = + "https://www.googleapis.com/auth/gmail.labels"; + /** View your email message metadata such as labels and headers, but not the email body. */ + const GMAIL_METADATA = + "https://www.googleapis.com/auth/gmail.metadata"; + /** View and modify but not delete your email. */ + const GMAIL_MODIFY = + "https://www.googleapis.com/auth/gmail.modify"; + /** View your email messages and settings. */ + const GMAIL_READONLY = + "https://www.googleapis.com/auth/gmail.readonly"; + /** Send email on your behalf. */ + const GMAIL_SEND = + "https://www.googleapis.com/auth/gmail.send"; + /** Manage your basic mail settings. */ + const GMAIL_SETTINGS_BASIC = + "https://www.googleapis.com/auth/gmail.settings.basic"; + /** Manage your sensitive mail settings, including who can manage your mail. */ + const GMAIL_SETTINGS_SHARING = + "https://www.googleapis.com/auth/gmail.settings.sharing"; + + public $users; + public $users_drafts; + public $users_history; + public $users_labels; + public $users_messages; + public $users_messages_attachments; + public $users_settings; + public $users_settings_delegates; + public $users_settings_filters; + public $users_settings_forwardingAddresses; + public $users_settings_sendAs; + public $users_settings_sendAs_smimeInfo; + public $users_threads; + + /** + * Constructs the internal representation of the Gmail service. + * + * @param Google_Client $client The client used to deliver requests. + * @param string $rootUrl The root URL used for requests to the service. + */ + public function __construct(Google_Client $client, $rootUrl = null) + { + parent::__construct($client); + $this->rootUrl = $rootUrl ?: 'https://www.googleapis.com/'; + $this->servicePath = 'gmail/v1/users/'; + $this->batchPath = 'batch/gmail/v1'; + $this->version = 'v1'; + $this->serviceName = 'gmail'; + + $this->users = new Google_Service_Gmail_Resource_Users( + $this, + $this->serviceName, + 'users', + array( + 'methods' => array( + 'getProfile' => array( + 'path' => '{userId}/profile', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'stop' => array( + 'path' => '{userId}/stop', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'watch' => array( + 'path' => '{userId}/watch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_drafts = new Google_Service_Gmail_Resource_UsersDrafts( + $this, + $this->serviceName, + 'drafts', + array( + 'methods' => array( + 'create' => array( + 'path' => '{userId}/drafts', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => '{userId}/drafts/{id}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/drafts/{id}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'format' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'list' => array( + 'path' => '{userId}/drafts', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'includeSpamTrash' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'q' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'send' => array( + 'path' => '{userId}/drafts/send', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => '{userId}/drafts/{id}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_history = new Google_Service_Gmail_Resource_UsersHistory( + $this, + $this->serviceName, + 'history', + array( + 'methods' => array( + 'list' => array( + 'path' => '{userId}/history', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'historyTypes' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + 'labelId' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'startHistoryId' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->users_labels = new Google_Service_Gmail_Resource_UsersLabels( + $this, + $this->serviceName, + 'labels', + array( + 'methods' => array( + 'create' => array( + 'path' => '{userId}/labels', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => '{userId}/labels/{id}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/labels/{id}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => '{userId}/labels', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'patch' => array( + 'path' => '{userId}/labels/{id}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => '{userId}/labels/{id}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_messages = new Google_Service_Gmail_Resource_UsersMessages( + $this, + $this->serviceName, + 'messages', + array( + 'methods' => array( + 'batchDelete' => array( + 'path' => '{userId}/messages/batchDelete', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'batchModify' => array( + 'path' => '{userId}/messages/batchModify', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => '{userId}/messages/{id}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/messages/{id}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'format' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'metadataHeaders' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + ), + ),'import' => array( + 'path' => '{userId}/messages/import', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'deleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'internalDateSource' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'neverMarkSpam' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'processForCalendar' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'insert' => array( + 'path' => '{userId}/messages', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'deleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'internalDateSource' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'list' => array( + 'path' => '{userId}/messages', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'includeSpamTrash' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'labelIds' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'q' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'modify' => array( + 'path' => '{userId}/messages/{id}/modify', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'send' => array( + 'path' => '{userId}/messages/send', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'trash' => array( + 'path' => '{userId}/messages/{id}/trash', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'untrash' => array( + 'path' => '{userId}/messages/{id}/untrash', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_messages_attachments = new Google_Service_Gmail_Resource_UsersMessagesAttachments( + $this, + $this->serviceName, + 'attachments', + array( + 'methods' => array( + 'get' => array( + 'path' => '{userId}/messages/{messageId}/attachments/{id}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'messageId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_settings = new Google_Service_Gmail_Resource_UsersSettings( + $this, + $this->serviceName, + 'settings', + array( + 'methods' => array( + 'getAutoForwarding' => array( + 'path' => '{userId}/settings/autoForwarding', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'getImap' => array( + 'path' => '{userId}/settings/imap', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'getLanguage' => array( + 'path' => '{userId}/settings/language', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'getPop' => array( + 'path' => '{userId}/settings/pop', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'getVacation' => array( + 'path' => '{userId}/settings/vacation', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'updateAutoForwarding' => array( + 'path' => '{userId}/settings/autoForwarding', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'updateImap' => array( + 'path' => '{userId}/settings/imap', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'updateLanguage' => array( + 'path' => '{userId}/settings/language', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'updatePop' => array( + 'path' => '{userId}/settings/pop', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'updateVacation' => array( + 'path' => '{userId}/settings/vacation', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_settings_delegates = new Google_Service_Gmail_Resource_UsersSettingsDelegates( + $this, + $this->serviceName, + 'delegates', + array( + 'methods' => array( + 'create' => array( + 'path' => '{userId}/settings/delegates', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => '{userId}/settings/delegates/{delegateEmail}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'delegateEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/settings/delegates/{delegateEmail}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'delegateEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => '{userId}/settings/delegates', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_settings_filters = new Google_Service_Gmail_Resource_UsersSettingsFilters( + $this, + $this->serviceName, + 'filters', + array( + 'methods' => array( + 'create' => array( + 'path' => '{userId}/settings/filters', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => '{userId}/settings/filters/{id}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/settings/filters/{id}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => '{userId}/settings/filters', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_settings_forwardingAddresses = new Google_Service_Gmail_Resource_UsersSettingsForwardingAddresses( + $this, + $this->serviceName, + 'forwardingAddresses', + array( + 'methods' => array( + 'create' => array( + 'path' => '{userId}/settings/forwardingAddresses', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => '{userId}/settings/forwardingAddresses/{forwardingEmail}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'forwardingEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/settings/forwardingAddresses/{forwardingEmail}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'forwardingEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => '{userId}/settings/forwardingAddresses', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_settings_sendAs = new Google_Service_Gmail_Resource_UsersSettingsSendAs( + $this, + $this->serviceName, + 'sendAs', + array( + 'methods' => array( + 'create' => array( + 'path' => '{userId}/settings/sendAs', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => '{userId}/settings/sendAs', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'patch' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'verify' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}/verify', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_settings_sendAs_smimeInfo = new Google_Service_Gmail_Resource_UsersSettingsSendAsSmimeInfo( + $this, + $this->serviceName, + 'smimeInfo', + array( + 'methods' => array( + 'delete' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'insert' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}/smimeInfo', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}/smimeInfo', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'setDefault' => array( + 'path' => '{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendAsEmail' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->users_threads = new Google_Service_Gmail_Resource_UsersThreads( + $this, + $this->serviceName, + 'threads', + array( + 'methods' => array( + 'delete' => array( + 'path' => '{userId}/threads/{id}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => '{userId}/threads/{id}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'format' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'metadataHeaders' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + ), + ),'list' => array( + 'path' => '{userId}/threads', + 'httpMethod' => 'GET', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'includeSpamTrash' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'labelIds' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'q' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'modify' => array( + 'path' => '{userId}/threads/{id}/modify', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'trash' => array( + 'path' => '{userId}/threads/{id}/trash', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'untrash' => array( + 'path' => '{userId}/threads/{id}/untrash', + 'httpMethod' => 'POST', + 'parameters' => array( + 'userId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'id' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/AutoForwarding.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/AutoForwarding.php new file mode 100644 index 0000000..86afef2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/AutoForwarding.php @@ -0,0 +1,48 @@ +disposition = $disposition; + } + public function getDisposition() + { + return $this->disposition; + } + public function setEmailAddress($emailAddress) + { + $this->emailAddress = $emailAddress; + } + public function getEmailAddress() + { + return $this->emailAddress; + } + public function setEnabled($enabled) + { + $this->enabled = $enabled; + } + public function getEnabled() + { + return $this->enabled; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchDeleteMessagesRequest.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchDeleteMessagesRequest.php new file mode 100644 index 0000000..136acf6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchDeleteMessagesRequest.php @@ -0,0 +1,31 @@ +ids = $ids; + } + public function getIds() + { + return $this->ids; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchModifyMessagesRequest.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchModifyMessagesRequest.php new file mode 100644 index 0000000..911c221 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/BatchModifyMessagesRequest.php @@ -0,0 +1,49 @@ +addLabelIds = $addLabelIds; + } + public function getAddLabelIds() + { + return $this->addLabelIds; + } + public function setIds($ids) + { + $this->ids = $ids; + } + public function getIds() + { + return $this->ids; + } + public function setRemoveLabelIds($removeLabelIds) + { + $this->removeLabelIds = $removeLabelIds; + } + public function getRemoveLabelIds() + { + return $this->removeLabelIds; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Delegate.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Delegate.php new file mode 100644 index 0000000..72d6a4d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Delegate.php @@ -0,0 +1,39 @@ +delegateEmail = $delegateEmail; + } + public function getDelegateEmail() + { + return $this->delegateEmail; + } + public function setVerificationStatus($verificationStatus) + { + $this->verificationStatus = $verificationStatus; + } + public function getVerificationStatus() + { + return $this->verificationStatus; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Draft.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Draft.php new file mode 100644 index 0000000..b2f9cc6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Draft.php @@ -0,0 +1,46 @@ +id = $id; + } + public function getId() + { + return $this->id; + } + /** + * @param Google_Service_Gmail_Message + */ + public function setMessage(Google_Service_Gmail_Message $message) + { + $this->message = $message; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessage() + { + return $this->message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Filter.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Filter.php new file mode 100644 index 0000000..ee40b18 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Filter.php @@ -0,0 +1,62 @@ +action = $action; + } + /** + * @return Google_Service_Gmail_FilterAction + */ + public function getAction() + { + return $this->action; + } + /** + * @param Google_Service_Gmail_FilterCriteria + */ + public function setCriteria(Google_Service_Gmail_FilterCriteria $criteria) + { + $this->criteria = $criteria; + } + /** + * @return Google_Service_Gmail_FilterCriteria + */ + public function getCriteria() + { + return $this->criteria; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterAction.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterAction.php new file mode 100644 index 0000000..e11c467 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterAction.php @@ -0,0 +1,49 @@ +addLabelIds = $addLabelIds; + } + public function getAddLabelIds() + { + return $this->addLabelIds; + } + public function setForward($forward) + { + $this->forward = $forward; + } + public function getForward() + { + return $this->forward; + } + public function setRemoveLabelIds($removeLabelIds) + { + $this->removeLabelIds = $removeLabelIds; + } + public function getRemoveLabelIds() + { + return $this->removeLabelIds; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterCriteria.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterCriteria.php new file mode 100644 index 0000000..1b26c4d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/FilterCriteria.php @@ -0,0 +1,102 @@ +excludeChats = $excludeChats; + } + public function getExcludeChats() + { + return $this->excludeChats; + } + public function setFrom($from) + { + $this->from = $from; + } + public function getFrom() + { + return $this->from; + } + public function setHasAttachment($hasAttachment) + { + $this->hasAttachment = $hasAttachment; + } + public function getHasAttachment() + { + return $this->hasAttachment; + } + public function setNegatedQuery($negatedQuery) + { + $this->negatedQuery = $negatedQuery; + } + public function getNegatedQuery() + { + return $this->negatedQuery; + } + public function setQuery($query) + { + $this->query = $query; + } + public function getQuery() + { + return $this->query; + } + public function setSize($size) + { + $this->size = $size; + } + public function getSize() + { + return $this->size; + } + public function setSizeComparison($sizeComparison) + { + $this->sizeComparison = $sizeComparison; + } + public function getSizeComparison() + { + return $this->sizeComparison; + } + public function setSubject($subject) + { + $this->subject = $subject; + } + public function getSubject() + { + return $this->subject; + } + public function setTo($to) + { + $this->to = $to; + } + public function getTo() + { + return $this->to; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ForwardingAddress.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ForwardingAddress.php new file mode 100644 index 0000000..f2ea60e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ForwardingAddress.php @@ -0,0 +1,39 @@ +forwardingEmail = $forwardingEmail; + } + public function getForwardingEmail() + { + return $this->forwardingEmail; + } + public function setVerificationStatus($verificationStatus) + { + $this->verificationStatus = $verificationStatus; + } + public function getVerificationStatus() + { + return $this->verificationStatus; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/History.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/History.php new file mode 100644 index 0000000..35b65fa --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/History.php @@ -0,0 +1,111 @@ +id = $id; + } + public function getId() + { + return $this->id; + } + /** + * @param Google_Service_Gmail_HistoryLabelAdded + */ + public function setLabelsAdded($labelsAdded) + { + $this->labelsAdded = $labelsAdded; + } + /** + * @return Google_Service_Gmail_HistoryLabelAdded + */ + public function getLabelsAdded() + { + return $this->labelsAdded; + } + /** + * @param Google_Service_Gmail_HistoryLabelRemoved + */ + public function setLabelsRemoved($labelsRemoved) + { + $this->labelsRemoved = $labelsRemoved; + } + /** + * @return Google_Service_Gmail_HistoryLabelRemoved + */ + public function getLabelsRemoved() + { + return $this->labelsRemoved; + } + /** + * @param Google_Service_Gmail_Message + */ + public function setMessages($messages) + { + $this->messages = $messages; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessages() + { + return $this->messages; + } + /** + * @param Google_Service_Gmail_HistoryMessageAdded + */ + public function setMessagesAdded($messagesAdded) + { + $this->messagesAdded = $messagesAdded; + } + /** + * @return Google_Service_Gmail_HistoryMessageAdded + */ + public function getMessagesAdded() + { + return $this->messagesAdded; + } + /** + * @param Google_Service_Gmail_HistoryMessageDeleted + */ + public function setMessagesDeleted($messagesDeleted) + { + $this->messagesDeleted = $messagesDeleted; + } + /** + * @return Google_Service_Gmail_HistoryMessageDeleted + */ + public function getMessagesDeleted() + { + return $this->messagesDeleted; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelAdded.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelAdded.php new file mode 100644 index 0000000..8292377 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelAdded.php @@ -0,0 +1,47 @@ +labelIds = $labelIds; + } + public function getLabelIds() + { + return $this->labelIds; + } + /** + * @param Google_Service_Gmail_Message + */ + public function setMessage(Google_Service_Gmail_Message $message) + { + $this->message = $message; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessage() + { + return $this->message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelRemoved.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelRemoved.php new file mode 100644 index 0000000..873f6da --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryLabelRemoved.php @@ -0,0 +1,47 @@ +labelIds = $labelIds; + } + public function getLabelIds() + { + return $this->labelIds; + } + /** + * @param Google_Service_Gmail_Message + */ + public function setMessage(Google_Service_Gmail_Message $message) + { + $this->message = $message; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessage() + { + return $this->message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageAdded.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageAdded.php new file mode 100644 index 0000000..5f86357 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageAdded.php @@ -0,0 +1,37 @@ +message = $message; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessage() + { + return $this->message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageDeleted.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageDeleted.php new file mode 100644 index 0000000..0afa797 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/HistoryMessageDeleted.php @@ -0,0 +1,37 @@ +message = $message; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessage() + { + return $this->message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ImapSettings.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ImapSettings.php new file mode 100644 index 0000000..df939b7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ImapSettings.php @@ -0,0 +1,57 @@ +autoExpunge = $autoExpunge; + } + public function getAutoExpunge() + { + return $this->autoExpunge; + } + public function setEnabled($enabled) + { + $this->enabled = $enabled; + } + public function getEnabled() + { + return $this->enabled; + } + public function setExpungeBehavior($expungeBehavior) + { + $this->expungeBehavior = $expungeBehavior; + } + public function getExpungeBehavior() + { + return $this->expungeBehavior; + } + public function setMaxFolderSize($maxFolderSize) + { + $this->maxFolderSize = $maxFolderSize; + } + public function getMaxFolderSize() + { + return $this->maxFolderSize; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Label.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Label.php new file mode 100644 index 0000000..f428a93 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Label.php @@ -0,0 +1,118 @@ +color = $color; + } + /** + * @return Google_Service_Gmail_LabelColor + */ + public function getColor() + { + return $this->color; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setLabelListVisibility($labelListVisibility) + { + $this->labelListVisibility = $labelListVisibility; + } + public function getLabelListVisibility() + { + return $this->labelListVisibility; + } + public function setMessageListVisibility($messageListVisibility) + { + $this->messageListVisibility = $messageListVisibility; + } + public function getMessageListVisibility() + { + return $this->messageListVisibility; + } + public function setMessagesTotal($messagesTotal) + { + $this->messagesTotal = $messagesTotal; + } + public function getMessagesTotal() + { + return $this->messagesTotal; + } + public function setMessagesUnread($messagesUnread) + { + $this->messagesUnread = $messagesUnread; + } + public function getMessagesUnread() + { + return $this->messagesUnread; + } + public function setName($name) + { + $this->name = $name; + } + public function getName() + { + return $this->name; + } + public function setThreadsTotal($threadsTotal) + { + $this->threadsTotal = $threadsTotal; + } + public function getThreadsTotal() + { + return $this->threadsTotal; + } + public function setThreadsUnread($threadsUnread) + { + $this->threadsUnread = $threadsUnread; + } + public function getThreadsUnread() + { + return $this->threadsUnread; + } + public function setType($type) + { + $this->type = $type; + } + public function getType() + { + return $this->type; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LabelColor.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LabelColor.php new file mode 100644 index 0000000..10c3187 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LabelColor.php @@ -0,0 +1,39 @@ +backgroundColor = $backgroundColor; + } + public function getBackgroundColor() + { + return $this->backgroundColor; + } + public function setTextColor($textColor) + { + $this->textColor = $textColor; + } + public function getTextColor() + { + return $this->textColor; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LanguageSettings.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LanguageSettings.php new file mode 100644 index 0000000..077bd85 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/LanguageSettings.php @@ -0,0 +1,30 @@ +displayLanguage = $displayLanguage; + } + public function getDisplayLanguage() + { + return $this->displayLanguage; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDelegatesResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDelegatesResponse.php new file mode 100644 index 0000000..b0f19c1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDelegatesResponse.php @@ -0,0 +1,38 @@ +delegates = $delegates; + } + /** + * @return Google_Service_Gmail_Delegate + */ + public function getDelegates() + { + return $this->delegates; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDraftsResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDraftsResponse.php new file mode 100644 index 0000000..dbfce46 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListDraftsResponse.php @@ -0,0 +1,56 @@ +drafts = $drafts; + } + /** + * @return Google_Service_Gmail_Draft + */ + public function getDrafts() + { + return $this->drafts; + } + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } + public function setResultSizeEstimate($resultSizeEstimate) + { + $this->resultSizeEstimate = $resultSizeEstimate; + } + public function getResultSizeEstimate() + { + return $this->resultSizeEstimate; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListFiltersResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListFiltersResponse.php new file mode 100644 index 0000000..589d782 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListFiltersResponse.php @@ -0,0 +1,38 @@ +filter = $filter; + } + /** + * @return Google_Service_Gmail_Filter + */ + public function getFilter() + { + return $this->filter; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListForwardingAddressesResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListForwardingAddressesResponse.php new file mode 100644 index 0000000..477f861 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListForwardingAddressesResponse.php @@ -0,0 +1,38 @@ +forwardingAddresses = $forwardingAddresses; + } + /** + * @return Google_Service_Gmail_ForwardingAddress + */ + public function getForwardingAddresses() + { + return $this->forwardingAddresses; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListHistoryResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListHistoryResponse.php new file mode 100644 index 0000000..a0d7d67 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListHistoryResponse.php @@ -0,0 +1,56 @@ +history = $history; + } + /** + * @return Google_Service_Gmail_History + */ + public function getHistory() + { + return $this->history; + } + public function setHistoryId($historyId) + { + $this->historyId = $historyId; + } + public function getHistoryId() + { + return $this->historyId; + } + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListLabelsResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListLabelsResponse.php new file mode 100644 index 0000000..9075e9c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListLabelsResponse.php @@ -0,0 +1,38 @@ +labels = $labels; + } + /** + * @return Google_Service_Gmail_Label + */ + public function getLabels() + { + return $this->labels; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListMessagesResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListMessagesResponse.php new file mode 100644 index 0000000..e246fe1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListMessagesResponse.php @@ -0,0 +1,56 @@ +messages = $messages; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessages() + { + return $this->messages; + } + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } + public function setResultSizeEstimate($resultSizeEstimate) + { + $this->resultSizeEstimate = $resultSizeEstimate; + } + public function getResultSizeEstimate() + { + return $this->resultSizeEstimate; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSendAsResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSendAsResponse.php new file mode 100644 index 0000000..6048c42 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSendAsResponse.php @@ -0,0 +1,38 @@ +sendAs = $sendAs; + } + /** + * @return Google_Service_Gmail_SendAs + */ + public function getSendAs() + { + return $this->sendAs; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSmimeInfoResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSmimeInfoResponse.php new file mode 100644 index 0000000..277907a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListSmimeInfoResponse.php @@ -0,0 +1,38 @@ +smimeInfo = $smimeInfo; + } + /** + * @return Google_Service_Gmail_SmimeInfo + */ + public function getSmimeInfo() + { + return $this->smimeInfo; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListThreadsResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListThreadsResponse.php new file mode 100644 index 0000000..347a39c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ListThreadsResponse.php @@ -0,0 +1,56 @@ +nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } + public function setResultSizeEstimate($resultSizeEstimate) + { + $this->resultSizeEstimate = $resultSizeEstimate; + } + public function getResultSizeEstimate() + { + return $this->resultSizeEstimate; + } + /** + * @param Google_Service_Gmail_Thread + */ + public function setThreads($threads) + { + $this->threads = $threads; + } + /** + * @return Google_Service_Gmail_Thread + */ + public function getThreads() + { + return $this->threads; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Message.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Message.php new file mode 100644 index 0000000..b5d0bc8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Message.php @@ -0,0 +1,110 @@ +historyId = $historyId; + } + public function getHistoryId() + { + return $this->historyId; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setInternalDate($internalDate) + { + $this->internalDate = $internalDate; + } + public function getInternalDate() + { + return $this->internalDate; + } + public function setLabelIds($labelIds) + { + $this->labelIds = $labelIds; + } + public function getLabelIds() + { + return $this->labelIds; + } + /** + * @param Google_Service_Gmail_MessagePart + */ + public function setPayload(Google_Service_Gmail_MessagePart $payload) + { + $this->payload = $payload; + } + /** + * @return Google_Service_Gmail_MessagePart + */ + public function getPayload() + { + return $this->payload; + } + public function setRaw($raw) + { + $this->raw = $raw; + } + public function getRaw() + { + return $this->raw; + } + public function setSizeEstimate($sizeEstimate) + { + $this->sizeEstimate = $sizeEstimate; + } + public function getSizeEstimate() + { + return $this->sizeEstimate; + } + public function setSnippet($snippet) + { + $this->snippet = $snippet; + } + public function getSnippet() + { + return $this->snippet; + } + public function setThreadId($threadId) + { + $this->threadId = $threadId; + } + public function getThreadId() + { + return $this->threadId; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePart.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePart.php new file mode 100644 index 0000000..e8270e1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePart.php @@ -0,0 +1,97 @@ +body = $body; + } + /** + * @return Google_Service_Gmail_MessagePartBody + */ + public function getBody() + { + return $this->body; + } + public function setFilename($filename) + { + $this->filename = $filename; + } + public function getFilename() + { + return $this->filename; + } + /** + * @param Google_Service_Gmail_MessagePartHeader + */ + public function setHeaders($headers) + { + $this->headers = $headers; + } + /** + * @return Google_Service_Gmail_MessagePartHeader + */ + public function getHeaders() + { + return $this->headers; + } + public function setMimeType($mimeType) + { + $this->mimeType = $mimeType; + } + public function getMimeType() + { + return $this->mimeType; + } + public function setPartId($partId) + { + $this->partId = $partId; + } + public function getPartId() + { + return $this->partId; + } + /** + * @param Google_Service_Gmail_MessagePart + */ + public function setParts($parts) + { + $this->parts = $parts; + } + /** + * @return Google_Service_Gmail_MessagePart + */ + public function getParts() + { + return $this->parts; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartBody.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartBody.php new file mode 100644 index 0000000..89323ef --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartBody.php @@ -0,0 +1,48 @@ +attachmentId = $attachmentId; + } + public function getAttachmentId() + { + return $this->attachmentId; + } + public function setData($data) + { + $this->data = $data; + } + public function getData() + { + return $this->data; + } + public function setSize($size) + { + $this->size = $size; + } + public function getSize() + { + return $this->size; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartHeader.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartHeader.php new file mode 100644 index 0000000..8789faf --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/MessagePartHeader.php @@ -0,0 +1,39 @@ +name = $name; + } + public function getName() + { + return $this->name; + } + public function setValue($value) + { + $this->value = $value; + } + public function getValue() + { + return $this->value; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyMessageRequest.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyMessageRequest.php new file mode 100644 index 0000000..7f37a47 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyMessageRequest.php @@ -0,0 +1,40 @@ +addLabelIds = $addLabelIds; + } + public function getAddLabelIds() + { + return $this->addLabelIds; + } + public function setRemoveLabelIds($removeLabelIds) + { + $this->removeLabelIds = $removeLabelIds; + } + public function getRemoveLabelIds() + { + return $this->removeLabelIds; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyThreadRequest.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyThreadRequest.php new file mode 100644 index 0000000..a8fec01 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/ModifyThreadRequest.php @@ -0,0 +1,40 @@ +addLabelIds = $addLabelIds; + } + public function getAddLabelIds() + { + return $this->addLabelIds; + } + public function setRemoveLabelIds($removeLabelIds) + { + $this->removeLabelIds = $removeLabelIds; + } + public function getRemoveLabelIds() + { + return $this->removeLabelIds; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/PopSettings.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/PopSettings.php new file mode 100644 index 0000000..6069dc8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/PopSettings.php @@ -0,0 +1,39 @@ +accessWindow = $accessWindow; + } + public function getAccessWindow() + { + return $this->accessWindow; + } + public function setDisposition($disposition) + { + $this->disposition = $disposition; + } + public function getDisposition() + { + return $this->disposition; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Profile.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Profile.php new file mode 100644 index 0000000..7dda18c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Profile.php @@ -0,0 +1,57 @@ +emailAddress = $emailAddress; + } + public function getEmailAddress() + { + return $this->emailAddress; + } + public function setHistoryId($historyId) + { + $this->historyId = $historyId; + } + public function getHistoryId() + { + return $this->historyId; + } + public function setMessagesTotal($messagesTotal) + { + $this->messagesTotal = $messagesTotal; + } + public function getMessagesTotal() + { + return $this->messagesTotal; + } + public function setThreadsTotal($threadsTotal) + { + $this->threadsTotal = $threadsTotal; + } + public function getThreadsTotal() + { + return $this->threadsTotal; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/Users.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/Users.php new file mode 100644 index 0000000..947fc56 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/Users.php @@ -0,0 +1,71 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $users = $gmailService->users; + * + */ +class Google_Service_Gmail_Resource_Users extends Google_Service_Resource +{ + /** + * Gets the current user's Gmail profile. (users.getProfile) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Profile + */ + public function getProfile($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('getProfile', array($params), "Google_Service_Gmail_Profile"); + } + /** + * Stop receiving push notifications for the given user mailbox. (users.stop) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + */ + public function stop($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('stop', array($params)); + } + /** + * Set up or update a push notification watch on the given user mailbox. + * (users.watch) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_WatchRequest $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_WatchResponse + */ + public function watch($userId, Google_Service_Gmail_WatchRequest $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('watch', array($params), "Google_Service_Gmail_WatchResponse"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersDrafts.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersDrafts.php new file mode 100644 index 0000000..d0ec543 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersDrafts.php @@ -0,0 +1,130 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $drafts = $gmailService->drafts; + * + */ +class Google_Service_Gmail_Resource_UsersDrafts extends Google_Service_Resource +{ + /** + * Creates a new draft with the DRAFT label. (drafts.create) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Draft $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Draft + */ + public function create($userId, Google_Service_Gmail_Draft $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('create', array($params), "Google_Service_Gmail_Draft"); + } + /** + * Immediately and permanently deletes the specified draft. Does not simply + * trash it. (drafts.delete) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the draft to delete. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified draft. (drafts.get) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the draft to retrieve. + * @param array $optParams Optional parameters. + * + * @opt_param string format The format to return the draft in. + * @return Google_Service_Gmail_Draft + */ + public function get($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_Draft"); + } + /** + * Lists the drafts in the user's mailbox. (drafts.listUsersDrafts) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * + * @opt_param bool includeSpamTrash Include drafts from SPAM and TRASH in the + * results. + * @opt_param string maxResults Maximum number of drafts to return. + * @opt_param string pageToken Page token to retrieve a specific page of results + * in the list. + * @opt_param string q Only return draft messages matching the specified query. + * Supports the same query format as the Gmail search box. For example, + * "from:someuser@example.com rfc822msgid: is:unread". + * @return Google_Service_Gmail_ListDraftsResponse + */ + public function listUsersDrafts($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListDraftsResponse"); + } + /** + * Sends the specified, existing draft to the recipients in the To, Cc, and Bcc + * headers. (drafts.send) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Draft $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Message + */ + public function send($userId, Google_Service_Gmail_Draft $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('send', array($params), "Google_Service_Gmail_Message"); + } + /** + * Replaces a draft's content. (drafts.update) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the draft to update. + * @param Google_Service_Gmail_Draft $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Draft + */ + public function update($userId, $id, Google_Service_Gmail_Draft $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Gmail_Draft"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersHistory.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersHistory.php new file mode 100644 index 0000000..128bd17 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersHistory.php @@ -0,0 +1,61 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $history = $gmailService->history; + * + */ +class Google_Service_Gmail_Resource_UsersHistory extends Google_Service_Resource +{ + /** + * Lists the history of all changes to the given mailbox. History results are + * returned in chronological order (increasing historyId). + * (history.listUsersHistory) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * + * @opt_param string historyTypes History types to be returned by the function + * @opt_param string labelId Only return messages with a label matching the ID. + * @opt_param string maxResults The maximum number of history records to return. + * @opt_param string pageToken Page token to retrieve a specific page of results + * in the list. + * @opt_param string startHistoryId Required. Returns history records after the + * specified startHistoryId. The supplied startHistoryId should be obtained from + * the historyId of a message, thread, or previous list response. History IDs + * increase chronologically but are not contiguous with random gaps in between + * valid IDs. Supplying an invalid or out of date startHistoryId typically + * returns an HTTP 404 error code. A historyId is typically valid for at least a + * week, but in some rare circumstances may be valid for only a few hours. If + * you receive an HTTP 404 error response, your application should perform a + * full sync. If you receive no nextPageToken in the response, there are no + * updates to retrieve and you can store the returned historyId for a future + * request. + * @return Google_Service_Gmail_ListHistoryResponse + */ + public function listUsersHistory($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListHistoryResponse"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersLabels.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersLabels.php new file mode 100644 index 0000000..88b33ce --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersLabels.php @@ -0,0 +1,120 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $labels = $gmailService->labels; + * + */ +class Google_Service_Gmail_Resource_UsersLabels extends Google_Service_Resource +{ + /** + * Creates a new label. (labels.create) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Label $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Label + */ + public function create($userId, Google_Service_Gmail_Label $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('create', array($params), "Google_Service_Gmail_Label"); + } + /** + * Immediately and permanently deletes the specified label and removes it from + * any messages and threads that it is applied to. (labels.delete) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the label to delete. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified label. (labels.get) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the label to retrieve. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Label + */ + public function get($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_Label"); + } + /** + * Lists all labels in the user's mailbox. (labels.listUsersLabels) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ListLabelsResponse + */ + public function listUsersLabels($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListLabelsResponse"); + } + /** + * Updates the specified label. This method supports patch semantics. + * (labels.patch) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the label to update. + * @param Google_Service_Gmail_Label $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Label + */ + public function patch($userId, $id, Google_Service_Gmail_Label $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Gmail_Label"); + } + /** + * Updates the specified label. (labels.update) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the label to update. + * @param Google_Service_Gmail_Label $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Label + */ + public function update($userId, $id, Google_Service_Gmail_Label $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Gmail_Label"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessages.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessages.php new file mode 100644 index 0000000..67c737b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessages.php @@ -0,0 +1,229 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $messages = $gmailService->messages; + * + */ +class Google_Service_Gmail_Resource_UsersMessages extends Google_Service_Resource +{ + /** + * Deletes many messages by message ID. Provides no guarantees that messages + * were not already deleted or even existed at all. (messages.batchDelete) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_BatchDeleteMessagesRequest $postBody + * @param array $optParams Optional parameters. + */ + public function batchDelete($userId, Google_Service_Gmail_BatchDeleteMessagesRequest $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('batchDelete', array($params)); + } + /** + * Modifies the labels on the specified messages. (messages.batchModify) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_BatchModifyMessagesRequest $postBody + * @param array $optParams Optional parameters. + */ + public function batchModify($userId, Google_Service_Gmail_BatchModifyMessagesRequest $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('batchModify', array($params)); + } + /** + * Immediately and permanently deletes the specified message. This operation + * cannot be undone. Prefer messages.trash instead. (messages.delete) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the message to delete. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified message. (messages.get) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the message to retrieve. + * @param array $optParams Optional parameters. + * + * @opt_param string format The format to return the message in. + * @opt_param string metadataHeaders When given and format is METADATA, only + * include headers specified. + * @return Google_Service_Gmail_Message + */ + public function get($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_Message"); + } + /** + * Imports a message into only this user's mailbox, with standard email delivery + * scanning and classification similar to receiving via SMTP. Does not send a + * message. (messages.import) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Message $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool deleted Mark the email as permanently deleted (not TRASH) and + * only visible in Google Vault to a Vault administrator. Only used for G Suite + * accounts. + * @opt_param string internalDateSource Source for Gmail's internal date of the + * message. + * @opt_param bool neverMarkSpam Ignore the Gmail spam classifier decision and + * never mark this email as SPAM in the mailbox. + * @opt_param bool processForCalendar Process calendar invites in the email and + * add any extracted meetings to the Google Calendar for this user. + * @return Google_Service_Gmail_Message + */ + public function import($userId, Google_Service_Gmail_Message $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('import', array($params), "Google_Service_Gmail_Message"); + } + /** + * Directly inserts a message into only this user's mailbox similar to IMAP + * APPEND, bypassing most scanning and classification. Does not send a message. + * (messages.insert) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Message $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool deleted Mark the email as permanently deleted (not TRASH) and + * only visible in Google Vault to a Vault administrator. Only used for G Suite + * accounts. + * @opt_param string internalDateSource Source for Gmail's internal date of the + * message. + * @return Google_Service_Gmail_Message + */ + public function insert($userId, Google_Service_Gmail_Message $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Gmail_Message"); + } + /** + * Lists the messages in the user's mailbox. (messages.listUsersMessages) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * + * @opt_param bool includeSpamTrash Include messages from SPAM and TRASH in the + * results. + * @opt_param string labelIds Only return messages with labels that match all of + * the specified label IDs. + * @opt_param string maxResults Maximum number of messages to return. + * @opt_param string pageToken Page token to retrieve a specific page of results + * in the list. + * @opt_param string q Only return messages matching the specified query. + * Supports the same query format as the Gmail search box. For example, + * "from:someuser@example.com rfc822msgid: is:unread". Parameter cannot be used + * when accessing the api using the gmail.metadata scope. + * @return Google_Service_Gmail_ListMessagesResponse + */ + public function listUsersMessages($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListMessagesResponse"); + } + /** + * Modifies the labels on the specified message. (messages.modify) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the message to modify. + * @param Google_Service_Gmail_ModifyMessageRequest $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Message + */ + public function modify($userId, $id, Google_Service_Gmail_ModifyMessageRequest $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('modify', array($params), "Google_Service_Gmail_Message"); + } + /** + * Sends the specified message to the recipients in the To, Cc, and Bcc headers. + * (messages.send) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Message $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Message + */ + public function send($userId, Google_Service_Gmail_Message $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('send', array($params), "Google_Service_Gmail_Message"); + } + /** + * Moves the specified message to the trash. (messages.trash) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the message to Trash. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Message + */ + public function trash($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('trash', array($params), "Google_Service_Gmail_Message"); + } + /** + * Removes the specified message from the trash. (messages.untrash) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the message to remove from Trash. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Message + */ + public function untrash($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('untrash', array($params), "Google_Service_Gmail_Message"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessagesAttachments.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessagesAttachments.php new file mode 100644 index 0000000..6c3a5e4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersMessagesAttachments.php @@ -0,0 +1,44 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $attachments = $gmailService->attachments; + * + */ +class Google_Service_Gmail_Resource_UsersMessagesAttachments extends Google_Service_Resource +{ + /** + * Gets the specified message attachment. (attachments.get) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $messageId The ID of the message containing the attachment. + * @param string $id The ID of the attachment. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_MessagePartBody + */ + public function get($userId, $messageId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'messageId' => $messageId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_MessagePartBody"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettings.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettings.php new file mode 100644 index 0000000..ccf5d9b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettings.php @@ -0,0 +1,184 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $settings = $gmailService->settings; + * + */ +class Google_Service_Gmail_Resource_UsersSettings extends Google_Service_Resource +{ + /** + * Gets the auto-forwarding setting for the specified account. + * (settings.getAutoForwarding) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_AutoForwarding + */ + public function getAutoForwarding($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('getAutoForwarding', array($params), "Google_Service_Gmail_AutoForwarding"); + } + /** + * Gets IMAP settings. (settings.getImap) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ImapSettings + */ + public function getImap($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('getImap', array($params), "Google_Service_Gmail_ImapSettings"); + } + /** + * Gets language settings. (settings.getLanguage) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_LanguageSettings + */ + public function getLanguage($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('getLanguage', array($params), "Google_Service_Gmail_LanguageSettings"); + } + /** + * Gets POP settings. (settings.getPop) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_PopSettings + */ + public function getPop($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('getPop', array($params), "Google_Service_Gmail_PopSettings"); + } + /** + * Gets vacation responder settings. (settings.getVacation) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_VacationSettings + */ + public function getVacation($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('getVacation', array($params), "Google_Service_Gmail_VacationSettings"); + } + /** + * Updates the auto-forwarding setting for the specified account. A verified + * forwarding address must be specified when auto-forwarding is enabled. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (settings.updateAutoForwarding) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_AutoForwarding $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_AutoForwarding + */ + public function updateAutoForwarding($userId, Google_Service_Gmail_AutoForwarding $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('updateAutoForwarding', array($params), "Google_Service_Gmail_AutoForwarding"); + } + /** + * Updates IMAP settings. (settings.updateImap) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_ImapSettings $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ImapSettings + */ + public function updateImap($userId, Google_Service_Gmail_ImapSettings $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('updateImap', array($params), "Google_Service_Gmail_ImapSettings"); + } + /** + * Updates language settings. + * + * If successful, the return object contains the displayLanguage that was saved + * for the user, which may differ from the value passed into the request. This + * is because the requested displayLanguage may not be directly supported by + * Gmail but have a close variant that is, and so the variant may be chosen and + * saved instead. (settings.updateLanguage) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_LanguageSettings $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_LanguageSettings + */ + public function updateLanguage($userId, Google_Service_Gmail_LanguageSettings $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('updateLanguage', array($params), "Google_Service_Gmail_LanguageSettings"); + } + /** + * Updates POP settings. (settings.updatePop) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_PopSettings $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_PopSettings + */ + public function updatePop($userId, Google_Service_Gmail_PopSettings $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('updatePop', array($params), "Google_Service_Gmail_PopSettings"); + } + /** + * Updates vacation responder settings. (settings.updateVacation) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_VacationSettings $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_VacationSettings + */ + public function updateVacation($userId, Google_Service_Gmail_VacationSettings $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('updateVacation', array($params), "Google_Service_Gmail_VacationSettings"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsDelegates.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsDelegates.php new file mode 100644 index 0000000..1b363b5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsDelegates.php @@ -0,0 +1,119 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $delegates = $gmailService->delegates; + * + */ +class Google_Service_Gmail_Resource_UsersSettingsDelegates extends Google_Service_Resource +{ + /** + * Adds a delegate with its verification status set directly to accepted, + * without sending any verification email. The delegate user must be a member of + * the same G Suite organization as the delegator user. + * + * Gmail imposes limtations on the number of delegates and delegators each user + * in a G Suite organization can have. These limits depend on your organization, + * but in general each user can have up to 25 delegates and up to 10 delegators. + * + * Note that a delegate user must be referred to by their primary email address, + * and not an email alias. + * + * Also note that when a new delegate is created, there may be up to a one + * minute delay before the new delegate is available for use. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (delegates.create) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Delegate $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Delegate + */ + public function create($userId, Google_Service_Gmail_Delegate $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('create', array($params), "Google_Service_Gmail_Delegate"); + } + /** + * Removes the specified delegate (which can be of any verification status), and + * revokes any verification that may have been required for using it. + * + * Note that a delegate user must be referred to by their primary email address, + * and not an email alias. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (delegates.delete) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $delegateEmail The email address of the user to be removed as a + * delegate. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $delegateEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'delegateEmail' => $delegateEmail); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified delegate. + * + * Note that a delegate user must be referred to by their primary email address, + * and not an email alias. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (delegates.get) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $delegateEmail The email address of the user whose delegate + * relationship is to be retrieved. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Delegate + */ + public function get($userId, $delegateEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'delegateEmail' => $delegateEmail); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_Delegate"); + } + /** + * Lists the delegates for the specified account. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (delegates.listUsersSettingsDelegates) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ListDelegatesResponse + */ + public function listUsersSettingsDelegates($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListDelegatesResponse"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsFilters.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsFilters.php new file mode 100644 index 0000000..d142bc2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsFilters.php @@ -0,0 +1,86 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $filters = $gmailService->filters; + * + */ +class Google_Service_Gmail_Resource_UsersSettingsFilters extends Google_Service_Resource +{ + /** + * Creates a filter. (filters.create) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_Filter $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Filter + */ + public function create($userId, Google_Service_Gmail_Filter $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('create', array($params), "Google_Service_Gmail_Filter"); + } + /** + * Deletes a filter. (filters.delete) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $id The ID of the filter to be deleted. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a filter. (filters.get) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $id The ID of the filter to be fetched. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Filter + */ + public function get($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_Filter"); + } + /** + * Lists the message filters of a Gmail user. (filters.listUsersSettingsFilters) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ListFiltersResponse + */ + public function listUsersSettingsFilters($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListFiltersResponse"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsForwardingAddresses.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsForwardingAddresses.php new file mode 100644 index 0000000..b0e2508 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsForwardingAddresses.php @@ -0,0 +1,97 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $forwardingAddresses = $gmailService->forwardingAddresses; + * + */ +class Google_Service_Gmail_Resource_UsersSettingsForwardingAddresses extends Google_Service_Resource +{ + /** + * Creates a forwarding address. If ownership verification is required, a + * message will be sent to the recipient and the resource's verification status + * will be set to pending; otherwise, the resource will be created with + * verification status set to accepted. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (forwardingAddresses.create) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_ForwardingAddress $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ForwardingAddress + */ + public function create($userId, Google_Service_Gmail_ForwardingAddress $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('create', array($params), "Google_Service_Gmail_ForwardingAddress"); + } + /** + * Deletes the specified forwarding address and revokes any verification that + * may have been required. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (forwardingAddresses.delete) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $forwardingEmail The forwarding address to be deleted. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $forwardingEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'forwardingEmail' => $forwardingEmail); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified forwarding address. (forwardingAddresses.get) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $forwardingEmail The forwarding address to be retrieved. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ForwardingAddress + */ + public function get($userId, $forwardingEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'forwardingEmail' => $forwardingEmail); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_ForwardingAddress"); + } + /** + * Lists the forwarding addresses for the specified account. + * (forwardingAddresses.listUsersSettingsForwardingAddresses) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ListForwardingAddressesResponse + */ + public function listUsersSettingsForwardingAddresses($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListForwardingAddressesResponse"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAs.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAs.php new file mode 100644 index 0000000..f3c45cf --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAs.php @@ -0,0 +1,162 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $sendAs = $gmailService->sendAs; + * + */ +class Google_Service_Gmail_Resource_UsersSettingsSendAs extends Google_Service_Resource +{ + /** + * Creates a custom "from" send-as alias. If an SMTP MSA is specified, Gmail + * will attempt to connect to the SMTP service to validate the configuration + * before creating the alias. If ownership verification is required for the + * alias, a message will be sent to the email address and the resource's + * verification status will be set to pending; otherwise, the resource will be + * created with verification status set to accepted. If a signature is provided, + * Gmail will sanitize the HTML before saving it with the alias. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (sendAs.create) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param Google_Service_Gmail_SendAs $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_SendAs + */ + public function create($userId, Google_Service_Gmail_SendAs $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('create', array($params), "Google_Service_Gmail_SendAs"); + } + /** + * Deletes the specified send-as alias. Revokes any verification that may have + * been required for using it. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (sendAs.delete) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The send-as alias to be deleted. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $sendAsEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified send-as alias. Fails with an HTTP 404 error if the + * specified address is not a member of the collection. (sendAs.get) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The send-as alias to be retrieved. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_SendAs + */ + public function get($userId, $sendAsEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_SendAs"); + } + /** + * Lists the send-as aliases for the specified account. The result includes the + * primary send-as address associated with the account as well as any custom + * "from" aliases. (sendAs.listUsersSettingsSendAs) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ListSendAsResponse + */ + public function listUsersSettingsSendAs($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListSendAsResponse"); + } + /** + * Updates a send-as alias. If a signature is provided, Gmail will sanitize the + * HTML before saving it with the alias. + * + * Addresses other than the primary address for the account can only be updated + * by service account clients that have been delegated domain-wide authority. + * This method supports patch semantics. (sendAs.patch) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The send-as alias to be updated. + * @param Google_Service_Gmail_SendAs $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_SendAs + */ + public function patch($userId, $sendAsEmail, Google_Service_Gmail_SendAs $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Gmail_SendAs"); + } + /** + * Updates a send-as alias. If a signature is provided, Gmail will sanitize the + * HTML before saving it with the alias. + * + * Addresses other than the primary address for the account can only be updated + * by service account clients that have been delegated domain-wide authority. + * (sendAs.update) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The send-as alias to be updated. + * @param Google_Service_Gmail_SendAs $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_SendAs + */ + public function update($userId, $sendAsEmail, Google_Service_Gmail_SendAs $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Gmail_SendAs"); + } + /** + * Sends a verification email to the specified send-as alias address. The + * verification status must be pending. + * + * This method is only available to service account clients that have been + * delegated domain-wide authority. (sendAs.verify) + * + * @param string $userId User's email address. The special value "me" can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The send-as alias to be verified. + * @param array $optParams Optional parameters. + */ + public function verify($userId, $sendAsEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail); + $params = array_merge($params, $optParams); + return $this->call('verify', array($params)); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAsSmimeInfo.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAsSmimeInfo.php new file mode 100644 index 0000000..ffb17fa --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAsSmimeInfo.php @@ -0,0 +1,115 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $smimeInfo = $gmailService->smimeInfo; + * + */ +class Google_Service_Gmail_Resource_UsersSettingsSendAsSmimeInfo extends Google_Service_Resource +{ + /** + * Deletes the specified S/MIME config for the specified send-as alias. + * (smimeInfo.delete) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The email address that appears in the "From:" + * header for mail sent using this alias. + * @param string $id The immutable ID for the SmimeInfo. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $sendAsEmail, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified S/MIME config for the specified send-as alias. + * (smimeInfo.get) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The email address that appears in the "From:" + * header for mail sent using this alias. + * @param string $id The immutable ID for the SmimeInfo. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_SmimeInfo + */ + public function get($userId, $sendAsEmail, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_SmimeInfo"); + } + /** + * Insert (upload) the given S/MIME config for the specified send-as alias. Note + * that pkcs12 format is required for the key. (smimeInfo.insert) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The email address that appears in the "From:" + * header for mail sent using this alias. + * @param Google_Service_Gmail_SmimeInfo $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_SmimeInfo + */ + public function insert($userId, $sendAsEmail, Google_Service_Gmail_SmimeInfo $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Gmail_SmimeInfo"); + } + /** + * Lists S/MIME configs for the specified send-as alias. + * (smimeInfo.listUsersSettingsSendAsSmimeInfo) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The email address that appears in the "From:" + * header for mail sent using this alias. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_ListSmimeInfoResponse + */ + public function listUsersSettingsSendAsSmimeInfo($userId, $sendAsEmail, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListSmimeInfoResponse"); + } + /** + * Sets the default S/MIME config for the specified send-as alias. + * (smimeInfo.setDefault) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $sendAsEmail The email address that appears in the "From:" + * header for mail sent using this alias. + * @param string $id The immutable ID for the SmimeInfo. + * @param array $optParams Optional parameters. + */ + public function setDefault($userId, $sendAsEmail, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'sendAsEmail' => $sendAsEmail, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('setDefault', array($params)); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersThreads.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersThreads.php new file mode 100644 index 0000000..b8909c4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersThreads.php @@ -0,0 +1,135 @@ + + * $gmailService = new Google_Service_Gmail(...); + * $threads = $gmailService->threads; + * + */ +class Google_Service_Gmail_Resource_UsersThreads extends Google_Service_Resource +{ + /** + * Immediately and permanently deletes the specified thread. This operation + * cannot be undone. Prefer threads.trash instead. (threads.delete) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id ID of the Thread to delete. + * @param array $optParams Optional parameters. + */ + public function delete($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets the specified thread. (threads.get) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the thread to retrieve. + * @param array $optParams Optional parameters. + * + * @opt_param string format The format to return the messages in. + * @opt_param string metadataHeaders When given and format is METADATA, only + * include headers specified. + * @return Google_Service_Gmail_Thread + */ + public function get($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Gmail_Thread"); + } + /** + * Lists the threads in the user's mailbox. (threads.listUsersThreads) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param array $optParams Optional parameters. + * + * @opt_param bool includeSpamTrash Include threads from SPAM and TRASH in the + * results. + * @opt_param string labelIds Only return threads with labels that match all of + * the specified label IDs. + * @opt_param string maxResults Maximum number of threads to return. + * @opt_param string pageToken Page token to retrieve a specific page of results + * in the list. + * @opt_param string q Only return threads matching the specified query. + * Supports the same query format as the Gmail search box. For example, + * "from:someuser@example.com rfc822msgid: is:unread". Parameter cannot be used + * when accessing the api using the gmail.metadata scope. + * @return Google_Service_Gmail_ListThreadsResponse + */ + public function listUsersThreads($userId, $optParams = array()) + { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Gmail_ListThreadsResponse"); + } + /** + * Modifies the labels applied to the thread. This applies to all messages in + * the thread. (threads.modify) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the thread to modify. + * @param Google_Service_Gmail_ModifyThreadRequest $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Thread + */ + public function modify($userId, $id, Google_Service_Gmail_ModifyThreadRequest $postBody, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('modify', array($params), "Google_Service_Gmail_Thread"); + } + /** + * Moves the specified thread to the trash. (threads.trash) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the thread to Trash. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Thread + */ + public function trash($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('trash', array($params), "Google_Service_Gmail_Thread"); + } + /** + * Removes the specified thread from the trash. (threads.untrash) + * + * @param string $userId The user's email address. The special value me can be + * used to indicate the authenticated user. + * @param string $id The ID of the thread to remove from Trash. + * @param array $optParams Optional parameters. + * @return Google_Service_Gmail_Thread + */ + public function untrash($userId, $id, $optParams = array()) + { + $params = array('userId' => $userId, 'id' => $id); + $params = array_merge($params, $optParams); + return $this->call('untrash', array($params), "Google_Service_Gmail_Thread"); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SendAs.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SendAs.php new file mode 100644 index 0000000..82f96cd --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SendAs.php @@ -0,0 +1,109 @@ +displayName = $displayName; + } + public function getDisplayName() + { + return $this->displayName; + } + public function setIsDefault($isDefault) + { + $this->isDefault = $isDefault; + } + public function getIsDefault() + { + return $this->isDefault; + } + public function setIsPrimary($isPrimary) + { + $this->isPrimary = $isPrimary; + } + public function getIsPrimary() + { + return $this->isPrimary; + } + public function setReplyToAddress($replyToAddress) + { + $this->replyToAddress = $replyToAddress; + } + public function getReplyToAddress() + { + return $this->replyToAddress; + } + public function setSendAsEmail($sendAsEmail) + { + $this->sendAsEmail = $sendAsEmail; + } + public function getSendAsEmail() + { + return $this->sendAsEmail; + } + public function setSignature($signature) + { + $this->signature = $signature; + } + public function getSignature() + { + return $this->signature; + } + /** + * @param Google_Service_Gmail_SmtpMsa + */ + public function setSmtpMsa(Google_Service_Gmail_SmtpMsa $smtpMsa) + { + $this->smtpMsa = $smtpMsa; + } + /** + * @return Google_Service_Gmail_SmtpMsa + */ + public function getSmtpMsa() + { + return $this->smtpMsa; + } + public function setTreatAsAlias($treatAsAlias) + { + $this->treatAsAlias = $treatAsAlias; + } + public function getTreatAsAlias() + { + return $this->treatAsAlias; + } + public function setVerificationStatus($verificationStatus) + { + $this->verificationStatus = $verificationStatus; + } + public function getVerificationStatus() + { + return $this->verificationStatus; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmimeInfo.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmimeInfo.php new file mode 100644 index 0000000..0e21802 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmimeInfo.php @@ -0,0 +1,84 @@ +encryptedKeyPassword = $encryptedKeyPassword; + } + public function getEncryptedKeyPassword() + { + return $this->encryptedKeyPassword; + } + public function setExpiration($expiration) + { + $this->expiration = $expiration; + } + public function getExpiration() + { + return $this->expiration; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setIsDefault($isDefault) + { + $this->isDefault = $isDefault; + } + public function getIsDefault() + { + return $this->isDefault; + } + public function setIssuerCn($issuerCn) + { + $this->issuerCn = $issuerCn; + } + public function getIssuerCn() + { + return $this->issuerCn; + } + public function setPem($pem) + { + $this->pem = $pem; + } + public function getPem() + { + return $this->pem; + } + public function setPkcs12($pkcs12) + { + $this->pkcs12 = $pkcs12; + } + public function getPkcs12() + { + return $this->pkcs12; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmtpMsa.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmtpMsa.php new file mode 100644 index 0000000..c019138 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/SmtpMsa.php @@ -0,0 +1,66 @@ +host = $host; + } + public function getHost() + { + return $this->host; + } + public function setPassword($password) + { + $this->password = $password; + } + public function getPassword() + { + return $this->password; + } + public function setPort($port) + { + $this->port = $port; + } + public function getPort() + { + return $this->port; + } + public function setSecurityMode($securityMode) + { + $this->securityMode = $securityMode; + } + public function getSecurityMode() + { + return $this->securityMode; + } + public function setUsername($username) + { + $this->username = $username; + } + public function getUsername() + { + return $this->username; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Thread.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Thread.php new file mode 100644 index 0000000..74a0f0a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/Thread.php @@ -0,0 +1,65 @@ +historyId = $historyId; + } + public function getHistoryId() + { + return $this->historyId; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + /** + * @param Google_Service_Gmail_Message + */ + public function setMessages($messages) + { + $this->messages = $messages; + } + /** + * @return Google_Service_Gmail_Message + */ + public function getMessages() + { + return $this->messages; + } + public function setSnippet($snippet) + { + $this->snippet = $snippet; + } + public function getSnippet() + { + return $this->snippet; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/VacationSettings.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/VacationSettings.php new file mode 100644 index 0000000..1e990db --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/VacationSettings.php @@ -0,0 +1,93 @@ +enableAutoReply = $enableAutoReply; + } + public function getEnableAutoReply() + { + return $this->enableAutoReply; + } + public function setEndTime($endTime) + { + $this->endTime = $endTime; + } + public function getEndTime() + { + return $this->endTime; + } + public function setResponseBodyHtml($responseBodyHtml) + { + $this->responseBodyHtml = $responseBodyHtml; + } + public function getResponseBodyHtml() + { + return $this->responseBodyHtml; + } + public function setResponseBodyPlainText($responseBodyPlainText) + { + $this->responseBodyPlainText = $responseBodyPlainText; + } + public function getResponseBodyPlainText() + { + return $this->responseBodyPlainText; + } + public function setResponseSubject($responseSubject) + { + $this->responseSubject = $responseSubject; + } + public function getResponseSubject() + { + return $this->responseSubject; + } + public function setRestrictToContacts($restrictToContacts) + { + $this->restrictToContacts = $restrictToContacts; + } + public function getRestrictToContacts() + { + return $this->restrictToContacts; + } + public function setRestrictToDomain($restrictToDomain) + { + $this->restrictToDomain = $restrictToDomain; + } + public function getRestrictToDomain() + { + return $this->restrictToDomain; + } + public function setStartTime($startTime) + { + $this->startTime = $startTime; + } + public function getStartTime() + { + return $this->startTime; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchRequest.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchRequest.php new file mode 100644 index 0000000..5fa9144 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchRequest.php @@ -0,0 +1,49 @@ +labelFilterAction = $labelFilterAction; + } + public function getLabelFilterAction() + { + return $this->labelFilterAction; + } + public function setLabelIds($labelIds) + { + $this->labelIds = $labelIds; + } + public function getLabelIds() + { + return $this->labelIds; + } + public function setTopicName($topicName) + { + $this->topicName = $topicName; + } + public function getTopicName() + { + return $this->topicName; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchResponse.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchResponse.php new file mode 100644 index 0000000..d7dc3bf --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient-services/src/Google/Service/Gmail/WatchResponse.php @@ -0,0 +1,39 @@ +expiration = $expiration; + } + public function getExpiration() + { + return $this->expiration; + } + public function setHistoryId($historyId) + { + $this->historyId = $historyId; + } + public function getHistoryId() + { + return $this->historyId; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/LICENSE b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/LICENSE new file mode 100644 index 0000000..a148ba5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/LICENSE @@ -0,0 +1,203 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions: + +(a) You must give any other recipients of the Work or +Derivative Works a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Revoke.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Revoke.php new file mode 100644 index 0000000..29eb3fb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Revoke.php @@ -0,0 +1,78 @@ +http = $http; + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * + * @param string|array $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token) + { + if (is_array($token)) { + if (isset($token['refresh_token'])) { + $token = $token['refresh_token']; + } else { + $token = $token['access_token']; + } + } + + $body = Psr7\stream_for(http_build_query(array('token' => $token))); + $request = new Request( + 'POST', + Google_Client::OAUTH2_REVOKE_URI, + [ + 'Cache-Control' => 'no-store', + 'Content-Type' => 'application/x-www-form-urlencoded', + ], + $body + ); + + $httpHandler = HttpHandlerFactory::build($this->http); + + $response = $httpHandler($request); + + return $response->getStatusCode() == 200; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Verify.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Verify.php new file mode 100644 index 0000000..bc0afcb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AccessToken/Verify.php @@ -0,0 +1,273 @@ +http = $http; + $this->cache = $cache; + $this->jwt = $jwt ?: $this->getJwtService(); + } + + /** + * Verifies an id token and returns the authenticated apiLoginTicket. + * Throws an exception if the id token is not valid. + * The audience parameter can be used to control which id tokens are + * accepted. By default, the id token must have been issued to this OAuth2 client. + * + * @param $audience + * @return array the token payload, if successful + */ + public function verifyIdToken($idToken, $audience = null) + { + if (empty($idToken)) { + throw new LogicException('id_token cannot be null'); + } + + // set phpseclib constants if applicable + $this->setPhpsecConstants(); + + // Check signature + $certs = $this->getFederatedSignOnCerts(); + foreach ($certs as $cert) { + $bigIntClass = $this->getBigIntClass(); + $rsaClass = $this->getRsaClass(); + $modulus = new $bigIntClass($this->jwt->urlsafeB64Decode($cert['n']), 256); + $exponent = new $bigIntClass($this->jwt->urlsafeB64Decode($cert['e']), 256); + + $rsa = new $rsaClass(); + $rsa->loadKey(array('n' => $modulus, 'e' => $exponent)); + + try { + $payload = $this->jwt->decode( + $idToken, + $rsa->getPublicKey(), + array('RS256') + ); + + if (property_exists($payload, 'aud')) { + if ($audience && $payload->aud != $audience) { + return false; + } + } + + // support HTTP and HTTPS issuers + // @see https://developers.google.com/identity/sign-in/web/backend-auth + $issuers = array(self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS); + if (!isset($payload->iss) || !in_array($payload->iss, $issuers)) { + return false; + } + + return (array) $payload; + } catch (ExpiredException $e) { + return false; + } catch (ExpiredExceptionV3 $e) { + return false; + } catch (SignatureInvalidException $e) { + // continue + } catch (DomainException $e) { + // continue + } + } + + return false; + } + + private function getCache() + { + return $this->cache; + } + + /** + * Retrieve and cache a certificates file. + * + * @param $url string location + * @throws Google_Exception + * @return array certificates + */ + private function retrieveCertsFromLocation($url) + { + // If we're retrieving a local file, just grab it. + if (0 !== strpos($url, 'http')) { + if (!$file = file_get_contents($url)) { + throw new Google_Exception( + "Failed to retrieve verification certificates: '" . + $url . "'." + ); + } + + return json_decode($file, true); + } + + $response = $this->http->get($url); + + if ($response->getStatusCode() == 200) { + return json_decode((string) $response->getBody(), true); + } + throw new Google_Exception( + sprintf( + 'Failed to retrieve verification certificates: "%s".', + $response->getBody()->getContents() + ), + $response->getStatusCode() + ); + } + + // Gets federated sign-on certificates to use for verifying identity tokens. + // Returns certs as array structure, where keys are key ids, and values + // are PEM encoded certificates. + private function getFederatedSignOnCerts() + { + $certs = null; + if ($cache = $this->getCache()) { + $cacheItem = $cache->getItem('federated_signon_certs_v3'); + $certs = $cacheItem->get(); + } + + + if (!$certs) { + $certs = $this->retrieveCertsFromLocation( + self::FEDERATED_SIGNON_CERT_URL + ); + + if ($cache) { + $cacheItem->expiresAt(new DateTime('+1 hour')); + $cacheItem->set($certs); + $cache->save($cacheItem); + } + } + + if (!isset($certs['keys'])) { + throw new InvalidArgumentException( + 'federated sign-on certs expects "keys" to be set' + ); + } + + return $certs['keys']; + } + + private function getJwtService() + { + $jwtClass = 'JWT'; + if (class_exists('\Firebase\JWT\JWT')) { + $jwtClass = 'Firebase\JWT\JWT'; + } + + if (property_exists($jwtClass, 'leeway') && $jwtClass::$leeway < 1) { + // Ensures JWT leeway is at least 1 + // @see https://github.com/google/google-api-php-client/issues/827 + $jwtClass::$leeway = 1; + } + + return new $jwtClass; + } + + private function getRsaClass() + { + if (class_exists('phpseclib\Crypt\RSA')) { + return 'phpseclib\Crypt\RSA'; + } + + return 'Crypt_RSA'; + } + + private function getBigIntClass() + { + if (class_exists('phpseclib\Math\BigInteger')) { + return 'phpseclib\Math\BigInteger'; + } + + return 'Math_BigInteger'; + } + + private function getOpenSslConstant() + { + if (class_exists('phpseclib\Crypt\RSA')) { + return 'phpseclib\Crypt\RSA::MODE_OPENSSL'; + } + + if (class_exists('Crypt_RSA')) { + return 'CRYPT_RSA_MODE_OPENSSL'; + } + + throw new \Exception('Cannot find RSA class'); + } + + /** + * phpseclib calls "phpinfo" by default, which requires special + * whitelisting in the AppEngine VM environment. This function + * sets constants to bypass the need for phpseclib to check phpinfo + * + * @see phpseclib/Math/BigInteger + * @see https://github.com/GoogleCloudPlatform/getting-started-php/issues/85 + */ + private function setPhpsecConstants() + { + if (filter_var(getenv('GAE_VM'), FILTER_VALIDATE_BOOLEAN)) { + if (!defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); + } + if (!defined('CRYPT_RSA_MODE')) { + define('CRYPT_RSA_MODE', constant($this->getOpenSslConstant())); + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/AuthHandlerFactory.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/AuthHandlerFactory.php new file mode 100644 index 0000000..f1a3229 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/AuthHandlerFactory.php @@ -0,0 +1,42 @@ +cache = $cache; + $this->cacheConfig = $cacheConfig; + } + + public function attachCredentials( + ClientInterface $http, + CredentialsLoader $credentials, + callable $tokenCallback = null + ) { + // use the provided cache + if ($this->cache) { + $credentials = new FetchAuthTokenCache( + $credentials, + $this->cacheConfig, + $this->cache + ); + } + // if we end up needing to make an HTTP request to retrieve credentials, we + // can use our existing one, but we need to throw exceptions so the error + // bubbles up. + $authHttp = $this->createAuthHttp($http); + $authHttpHandler = HttpHandlerFactory::build($authHttp); + $subscriber = new AuthTokenSubscriber( + $credentials, + $authHttpHandler, + $tokenCallback + ); + + $http->setDefaultOption('auth', 'google_auth'); + $http->getEmitter()->attach($subscriber); + + return $http; + } + + public function attachToken(ClientInterface $http, array $token, array $scopes) + { + $tokenFunc = function ($scopes) use ($token) { + return $token['access_token']; + }; + + $subscriber = new ScopedAccessTokenSubscriber( + $tokenFunc, + $scopes, + $this->cacheConfig, + $this->cache + ); + + $http->setDefaultOption('auth', 'scoped'); + $http->getEmitter()->attach($subscriber); + + return $http; + } + + public function attachKey(ClientInterface $http, $key) + { + $subscriber = new SimpleSubscriber(['key' => $key]); + + $http->setDefaultOption('auth', 'simple'); + $http->getEmitter()->attach($subscriber); + + return $http; + } + + private function createAuthHttp(ClientInterface $http) + { + return new Client( + [ + 'base_url' => $http->getBaseUrl(), + 'defaults' => [ + 'exceptions' => true, + 'verify' => $http->getDefaultOption('verify'), + 'proxy' => $http->getDefaultOption('proxy'), + ] + ] + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/Guzzle6AuthHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/Guzzle6AuthHandler.php new file mode 100644 index 0000000..fcdfb3b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/AuthHandler/Guzzle6AuthHandler.php @@ -0,0 +1,106 @@ +cache = $cache; + $this->cacheConfig = $cacheConfig; + } + + public function attachCredentials( + ClientInterface $http, + CredentialsLoader $credentials, + callable $tokenCallback = null + ) { + // use the provided cache + if ($this->cache) { + $credentials = new FetchAuthTokenCache( + $credentials, + $this->cacheConfig, + $this->cache + ); + } + // if we end up needing to make an HTTP request to retrieve credentials, we + // can use our existing one, but we need to throw exceptions so the error + // bubbles up. + $authHttp = $this->createAuthHttp($http); + $authHttpHandler = HttpHandlerFactory::build($authHttp); + $middleware = new AuthTokenMiddleware( + $credentials, + $authHttpHandler, + $tokenCallback + ); + + $config = $http->getConfig(); + $config['handler']->remove('google_auth'); + $config['handler']->push($middleware, 'google_auth'); + $config['auth'] = 'google_auth'; + $http = new Client($config); + + return $http; + } + + public function attachToken(ClientInterface $http, array $token, array $scopes) + { + $tokenFunc = function ($scopes) use ($token) { + return $token['access_token']; + }; + + $middleware = new ScopedAccessTokenMiddleware( + $tokenFunc, + $scopes, + $this->cacheConfig, + $this->cache + ); + + $config = $http->getConfig(); + $config['handler']->remove('google_auth'); + $config['handler']->push($middleware, 'google_auth'); + $config['auth'] = 'scoped'; + $http = new Client($config); + + return $http; + } + + public function attachKey(ClientInterface $http, $key) + { + $middleware = new SimpleMiddleware(['key' => $key]); + + $config = $http->getConfig(); + $config['handler']->remove('google_auth'); + $config['handler']->push($middleware, 'google_auth'); + $config['auth'] = 'simple'; + $http = new Client($config); + + return $http; + } + + private function createAuthHttp(ClientInterface $http) + { + return new Client( + [ + 'base_uri' => $http->getConfig('base_uri'), + 'exceptions' => true, + 'verify' => $http->getConfig('verify'), + 'proxy' => $http->getConfig('proxy'), + ] + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Client.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Client.php new file mode 100644 index 0000000..e1acef1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Client.php @@ -0,0 +1,1139 @@ +config = array_merge( + [ + 'application_name' => '', + + // Don't change these unless you're working against a special development + // or testing environment. + 'base_path' => self::API_BASE_PATH, + + // https://developers.google.com/console + 'client_id' => '', + 'client_secret' => '', + 'redirect_uri' => null, + 'state' => null, + + // Simple API access key, also from the API console. Ensure you get + // a Server key, and not a Browser key. + 'developer_key' => '', + + // For use with Google Cloud Platform + // fetch the ApplicationDefaultCredentials, if applicable + // @see https://developers.google.com/identity/protocols/application-default-credentials + 'use_application_default_credentials' => false, + 'signing_key' => null, + 'signing_algorithm' => null, + 'subject' => null, + + // Other OAuth2 parameters. + 'hd' => '', + 'prompt' => '', + 'openid.realm' => '', + 'include_granted_scopes' => null, + 'login_hint' => '', + 'request_visible_actions' => '', + 'access_type' => 'online', + 'approval_prompt' => 'auto', + + // Task Runner retry configuration + // @see Google_Task_Runner + 'retry' => array(), + 'retry_map' => null, + + // cache config for downstream auth caching + 'cache_config' => [], + + // function to be called when an access token is fetched + // follows the signature function ($cacheKey, $accessToken) + 'token_callback' => null, + + // Service class used in Google_Client::verifyIdToken. + // Explicitly pass this in to avoid setting JWT::$leeway + 'jwt' => null, + ], + $config + ); + } + + /** + * Get a string containing the version of the library. + * + * @return string + */ + public function getLibraryVersion() + { + return self::LIBVER; + } + + /** + * For backwards compatibility + * alias for fetchAccessTokenWithAuthCode + * + * @param $code string code from accounts.google.com + * @return array access token + * @deprecated + */ + public function authenticate($code) + { + return $this->fetchAccessTokenWithAuthCode($code); + } + + /** + * Attempt to exchange a code for an valid authentication token. + * Helper wrapped around the OAuth 2.0 implementation. + * + * @param $code string code from accounts.google.com + * @return array access token + */ + public function fetchAccessTokenWithAuthCode($code) + { + if (strlen($code) == 0) { + throw new InvalidArgumentException("Invalid code"); + } + + $auth = $this->getOAuth2Service(); + $auth->setCode($code); + $auth->setRedirectUri($this->getRedirectUri()); + + $httpHandler = HttpHandlerFactory::build($this->getHttpClient()); + $creds = $auth->fetchAuthToken($httpHandler); + if ($creds && isset($creds['access_token'])) { + $creds['created'] = time(); + $this->setAccessToken($creds); + } + + return $creds; + } + + /** + * For backwards compatibility + * alias for fetchAccessTokenWithAssertion + * + * @return array access token + * @deprecated + */ + public function refreshTokenWithAssertion() + { + return $this->fetchAccessTokenWithAssertion(); + } + + /** + * Fetches a fresh access token with a given assertion token. + * @param ClientInterface $authHttp optional. + * @return array access token + */ + public function fetchAccessTokenWithAssertion(ClientInterface $authHttp = null) + { + if (!$this->isUsingApplicationDefaultCredentials()) { + throw new DomainException( + 'set the JSON service account credentials using' + . ' Google_Client::setAuthConfig or set the path to your JSON file' + . ' with the "GOOGLE_APPLICATION_CREDENTIALS" environment variable' + . ' and call Google_Client::useApplicationDefaultCredentials to' + . ' refresh a token with assertion.' + ); + } + + $this->getLogger()->log( + 'info', + 'OAuth2 access token refresh with Signed JWT assertion grants.' + ); + + $credentials = $this->createApplicationDefaultCredentials(); + + $httpHandler = HttpHandlerFactory::build($authHttp); + $creds = $credentials->fetchAuthToken($httpHandler); + if ($creds && isset($creds['access_token'])) { + $creds['created'] = time(); + $this->setAccessToken($creds); + } + + return $creds; + } + + /** + * For backwards compatibility + * alias for fetchAccessTokenWithRefreshToken + * + * @param string $refreshToken + * @return array access token + */ + public function refreshToken($refreshToken) + { + return $this->fetchAccessTokenWithRefreshToken($refreshToken); + } + + /** + * Fetches a fresh OAuth 2.0 access token with the given refresh token. + * @param string $refreshToken + * @return array access token + */ + public function fetchAccessTokenWithRefreshToken($refreshToken = null) + { + if (null === $refreshToken) { + if (!isset($this->token['refresh_token'])) { + throw new LogicException( + 'refresh token must be passed in or set as part of setAccessToken' + ); + } + $refreshToken = $this->token['refresh_token']; + } + $this->getLogger()->info('OAuth2 access token refresh'); + $auth = $this->getOAuth2Service(); + $auth->setRefreshToken($refreshToken); + + $httpHandler = HttpHandlerFactory::build($this->getHttpClient()); + $creds = $auth->fetchAuthToken($httpHandler); + if ($creds && isset($creds['access_token'])) { + $creds['created'] = time(); + if (!isset($creds['refresh_token'])) { + $creds['refresh_token'] = $refreshToken; + } + $this->setAccessToken($creds); + } + + return $creds; + } + + /** + * Create a URL to obtain user authorization. + * The authorization endpoint allows the user to first + * authenticate, and then grant/deny the access request. + * @param string|array $scope The scope is expressed as an array or list of space-delimited strings. + * @return string + */ + public function createAuthUrl($scope = null) + { + if (empty($scope)) { + $scope = $this->prepareScopes(); + } + if (is_array($scope)) { + $scope = implode(' ', $scope); + } + + // only accept one of prompt or approval_prompt + $approvalPrompt = $this->config['prompt'] + ? null + : $this->config['approval_prompt']; + + // include_granted_scopes should be string "true", string "false", or null + $includeGrantedScopes = $this->config['include_granted_scopes'] === null + ? null + : var_export($this->config['include_granted_scopes'], true); + + $params = array_filter( + [ + 'access_type' => $this->config['access_type'], + 'approval_prompt' => $approvalPrompt, + 'hd' => $this->config['hd'], + 'include_granted_scopes' => $includeGrantedScopes, + 'login_hint' => $this->config['login_hint'], + 'openid.realm' => $this->config['openid.realm'], + 'prompt' => $this->config['prompt'], + 'response_type' => 'code', + 'scope' => $scope, + 'state' => $this->config['state'], + ] + ); + + // If the list of scopes contains plus.login, add request_visible_actions + // to auth URL. + $rva = $this->config['request_visible_actions']; + if (strlen($rva) > 0 && false !== strpos($scope, 'plus.login')) { + $params['request_visible_actions'] = $rva; + } + + $auth = $this->getOAuth2Service(); + + return (string) $auth->buildFullAuthorizationUri($params); + } + + /** + * Adds auth listeners to the HTTP client based on the credentials + * set in the Google API Client object + * + * @param GuzzleHttp\ClientInterface $http the http client object. + * @return GuzzleHttp\ClientInterface the http client object + */ + public function authorize(ClientInterface $http = null) + { + $credentials = null; + $token = null; + $scopes = null; + if (null === $http) { + $http = $this->getHttpClient(); + } + + // These conditionals represent the decision tree for authentication + // 1. Check for Application Default Credentials + // 2. Check for API Key + // 3a. Check for an Access Token + // 3b. If access token exists but is expired, try to refresh it + if ($this->isUsingApplicationDefaultCredentials()) { + $credentials = $this->createApplicationDefaultCredentials(); + } elseif ($token = $this->getAccessToken()) { + $scopes = $this->prepareScopes(); + // add refresh subscriber to request a new token + if (isset($token['refresh_token']) && $this->isAccessTokenExpired()) { + $credentials = $this->createUserRefreshCredentials( + $scopes, + $token['refresh_token'] + ); + } + } + + $authHandler = $this->getAuthHandler(); + + if ($credentials) { + $callback = $this->config['token_callback']; + $http = $authHandler->attachCredentials($http, $credentials, $callback); + } elseif ($token) { + $http = $authHandler->attachToken($http, $token, (array) $scopes); + } elseif ($key = $this->config['developer_key']) { + $http = $authHandler->attachKey($http, $key); + } + + return $http; + } + + /** + * Set the configuration to use application default credentials for + * authentication + * + * @see https://developers.google.com/identity/protocols/application-default-credentials + * @param boolean $useAppCreds + */ + public function useApplicationDefaultCredentials($useAppCreds = true) + { + $this->config['use_application_default_credentials'] = $useAppCreds; + } + + /** + * To prevent useApplicationDefaultCredentials from inappropriately being + * called in a conditional + * + * @see https://developers.google.com/identity/protocols/application-default-credentials + */ + public function isUsingApplicationDefaultCredentials() + { + return $this->config['use_application_default_credentials']; + } + + /** + * @param string|array $token + * @throws InvalidArgumentException + */ + public function setAccessToken($token) + { + if (is_string($token)) { + if ($json = json_decode($token, true)) { + $token = $json; + } else { + // assume $token is just the token string + $token = array( + 'access_token' => $token, + ); + } + } + if ($token == null) { + throw new InvalidArgumentException('invalid json token'); + } + if (!isset($token['access_token'])) { + throw new InvalidArgumentException("Invalid token format"); + } + $this->token = $token; + } + + public function getAccessToken() + { + return $this->token; + } + + /** + * @return string|null + */ + public function getRefreshToken() + { + if (isset($this->token['refresh_token'])) { + return $this->token['refresh_token']; + } + + return null; + } + + /** + * Returns if the access_token is expired. + * @return bool Returns True if the access_token is expired. + */ + public function isAccessTokenExpired() + { + if (!$this->token) { + return true; + } + + $created = 0; + if (isset($this->token['created'])) { + $created = $this->token['created']; + } elseif (isset($this->token['id_token'])) { + // check the ID token for "iat" + // signature verification is not required here, as we are just + // using this for convenience to save a round trip request + // to the Google API server + $idToken = $this->token['id_token']; + if (substr_count($idToken, '.') == 2) { + $parts = explode('.', $idToken); + $payload = json_decode(base64_decode($parts[1]), true); + if ($payload && isset($payload['iat'])) { + $created = $payload['iat']; + } + } + } + + // If the token is set to expire in the next 30 seconds. + return ($created + ($this->token['expires_in'] - 30)) < time(); + } + + /** + * @deprecated See UPGRADING.md for more information + */ + public function getAuth() + { + throw new BadMethodCallException( + 'This function no longer exists. See UPGRADING.md for more information' + ); + } + + /** + * @deprecated See UPGRADING.md for more information + */ + public function setAuth($auth) + { + throw new BadMethodCallException( + 'This function no longer exists. See UPGRADING.md for more information' + ); + } + + /** + * Set the OAuth 2.0 Client ID. + * @param string $clientId + */ + public function setClientId($clientId) + { + $this->config['client_id'] = $clientId; + } + + public function getClientId() + { + return $this->config['client_id']; + } + + /** + * Set the OAuth 2.0 Client Secret. + * @param string $clientSecret + */ + public function setClientSecret($clientSecret) + { + $this->config['client_secret'] = $clientSecret; + } + + public function getClientSecret() + { + return $this->config['client_secret']; + } + + /** + * Set the OAuth 2.0 Redirect URI. + * @param string $redirectUri + */ + public function setRedirectUri($redirectUri) + { + $this->config['redirect_uri'] = $redirectUri; + } + + public function getRedirectUri() + { + return $this->config['redirect_uri']; + } + + /** + * Set OAuth 2.0 "state" parameter to achieve per-request customization. + * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2 + * @param string $state + */ + public function setState($state) + { + $this->config['state'] = $state; + } + + /** + * @param string $accessType Possible values for access_type include: + * {@code "offline"} to request offline access from the user. + * {@code "online"} to request online access from the user. + */ + public function setAccessType($accessType) + { + $this->config['access_type'] = $accessType; + } + + /** + * @param string $approvalPrompt Possible values for approval_prompt include: + * {@code "force"} to force the approval UI to appear. + * {@code "auto"} to request auto-approval when possible. (This is the default value) + */ + public function setApprovalPrompt($approvalPrompt) + { + $this->config['approval_prompt'] = $approvalPrompt; + } + + /** + * Set the login hint, email address or sub id. + * @param string $loginHint + */ + public function setLoginHint($loginHint) + { + $this->config['login_hint'] = $loginHint; + } + + /** + * Set the application name, this is included in the User-Agent HTTP header. + * @param string $applicationName + */ + public function setApplicationName($applicationName) + { + $this->config['application_name'] = $applicationName; + } + + /** + * If 'plus.login' is included in the list of requested scopes, you can use + * this method to define types of app activities that your app will write. + * You can find a list of available types here: + * @link https://developers.google.com/+/api/moment-types + * + * @param array $requestVisibleActions Array of app activity types + */ + public function setRequestVisibleActions($requestVisibleActions) + { + if (is_array($requestVisibleActions)) { + $requestVisibleActions = implode(" ", $requestVisibleActions); + } + $this->config['request_visible_actions'] = $requestVisibleActions; + } + + /** + * Set the developer key to use, these are obtained through the API Console. + * @see http://code.google.com/apis/console-help/#generatingdevkeys + * @param string $developerKey + */ + public function setDeveloperKey($developerKey) + { + $this->config['developer_key'] = $developerKey; + } + + /** + * Set the hd (hosted domain) parameter streamlines the login process for + * Google Apps hosted accounts. By including the domain of the user, you + * restrict sign-in to accounts at that domain. + * @param $hd string - the domain to use. + */ + public function setHostedDomain($hd) + { + $this->config['hd'] = $hd; + } + + /** + * Set the prompt hint. Valid values are none, consent and select_account. + * If no value is specified and the user has not previously authorized + * access, then the user is shown a consent screen. + * @param $prompt string + * {@code "none"} Do not display any authentication or consent screens. Must not be specified with other values. + * {@code "consent"} Prompt the user for consent. + * {@code "select_account"} Prompt the user to select an account. + */ + public function setPrompt($prompt) + { + $this->config['prompt'] = $prompt; + } + + /** + * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth + * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which + * an authentication request is valid. + * @param $realm string - the URL-space to use. + */ + public function setOpenidRealm($realm) + { + $this->config['openid.realm'] = $realm; + } + + /** + * If this is provided with the value true, and the authorization request is + * granted, the authorization will include any previous authorizations + * granted to this user/application combination for other scopes. + * @param $include boolean - the URL-space to use. + */ + public function setIncludeGrantedScopes($include) + { + $this->config['include_granted_scopes'] = $include; + } + + /** + * sets function to be called when an access token is fetched + * @param callable $tokenCallback - function ($cacheKey, $accessToken) + */ + public function setTokenCallback(callable $tokenCallback) + { + $this->config['token_callback'] = $tokenCallback; + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * + * @param string|array|null $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token = null) + { + $tokenRevoker = new Google_AccessToken_Revoke( + $this->getHttpClient() + ); + + return $tokenRevoker->revokeToken($token ?: $this->getAccessToken()); + } + + /** + * Verify an id_token. This method will verify the current id_token, if one + * isn't provided. + * + * @throws LogicException If no token was provided and no token was set using `setAccessToken`. + * @throws UnexpectedValueException If the token is not a valid JWT. + * @param string|null $idToken The token (id_token) that should be verified. + * @return array|false Returns the token payload as an array if the verification was + * successful, false otherwise. + */ + public function verifyIdToken($idToken = null) + { + $tokenVerifier = new Google_AccessToken_Verify( + $this->getHttpClient(), + $this->getCache(), + $this->config['jwt'] + ); + + if (null === $idToken) { + $token = $this->getAccessToken(); + if (!isset($token['id_token'])) { + throw new LogicException( + 'id_token must be passed in or set as part of setAccessToken' + ); + } + $idToken = $token['id_token']; + } + + return $tokenVerifier->verifyIdToken( + $idToken, + $this->getClientId() + ); + } + + /** + * Set the scopes to be requested. Must be called before createAuthUrl(). + * Will remove any previously configured scopes. + * @param string|array $scope_or_scopes, ie: array('https://www.googleapis.com/auth/plus.login', + * 'https://www.googleapis.com/auth/moderator') + */ + public function setScopes($scope_or_scopes) + { + $this->requestedScopes = array(); + $this->addScope($scope_or_scopes); + } + + /** + * This functions adds a scope to be requested as part of the OAuth2.0 flow. + * Will append any scopes not previously requested to the scope parameter. + * A single string will be treated as a scope to request. An array of strings + * will each be appended. + * @param $scope_or_scopes string|array e.g. "profile" + */ + public function addScope($scope_or_scopes) + { + if (is_string($scope_or_scopes) && !in_array($scope_or_scopes, $this->requestedScopes)) { + $this->requestedScopes[] = $scope_or_scopes; + } else if (is_array($scope_or_scopes)) { + foreach ($scope_or_scopes as $scope) { + $this->addScope($scope); + } + } + } + + /** + * Returns the list of scopes requested by the client + * @return array the list of scopes + * + */ + public function getScopes() + { + return $this->requestedScopes; + } + + /** + * @return string|null + * @visible For Testing + */ + public function prepareScopes() + { + if (empty($this->requestedScopes)) { + return null; + } + + return implode(' ', $this->requestedScopes); + } + + /** + * Helper method to execute deferred HTTP requests. + * + * @param $request Psr\Http\Message\RequestInterface|Google_Http_Batch + * @throws Google_Exception + * @return object of the type of the expected class or Psr\Http\Message\ResponseInterface. + */ + public function execute(RequestInterface $request, $expectedClass = null) + { + $request = $request->withHeader( + 'User-Agent', + $this->config['application_name'] + . " " . self::USER_AGENT_SUFFIX + . $this->getLibraryVersion() + ); + + // call the authorize method + // this is where most of the grunt work is done + $http = $this->authorize(); + + return Google_Http_REST::execute( + $http, + $request, + $expectedClass, + $this->config['retry'], + $this->config['retry_map'] + ); + } + + /** + * Declare whether batch calls should be used. This may increase throughput + * by making multiple requests in one connection. + * + * @param boolean $useBatch True if the batch support should + * be enabled. Defaults to False. + */ + public function setUseBatch($useBatch) + { + // This is actually an alias for setDefer. + $this->setDefer($useBatch); + } + + /** + * Are we running in Google AppEngine? + * return bool + */ + public function isAppEngine() + { + return (isset($_SERVER['SERVER_SOFTWARE']) && + strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false); + } + + public function setConfig($name, $value) + { + $this->config[$name] = $value; + } + + public function getConfig($name, $default = null) + { + return isset($this->config[$name]) ? $this->config[$name] : $default; + } + + /** + * For backwards compatibility + * alias for setAuthConfig + * + * @param string $file the configuration file + * @throws Google_Exception + * @deprecated + */ + public function setAuthConfigFile($file) + { + $this->setAuthConfig($file); + } + + /** + * Set the auth config from new or deprecated JSON config. + * This structure should match the file downloaded from + * the "Download JSON" button on in the Google Developer + * Console. + * @param string|array $config the configuration json + * @throws Google_Exception + */ + public function setAuthConfig($config) + { + if (is_string($config)) { + if (!file_exists($config)) { + throw new InvalidArgumentException(sprintf('file "%s" does not exist', $config)); + } + + $json = file_get_contents($config); + + if (!$config = json_decode($json, true)) { + throw new LogicException('invalid json for auth config'); + } + } + + $key = isset($config['installed']) ? 'installed' : 'web'; + if (isset($config['type']) && $config['type'] == 'service_account') { + // application default credentials + $this->useApplicationDefaultCredentials(); + + // set the information from the config + $this->setClientId($config['client_id']); + $this->config['client_email'] = $config['client_email']; + $this->config['signing_key'] = $config['private_key']; + $this->config['signing_algorithm'] = 'HS256'; + } elseif (isset($config[$key])) { + // old-style + $this->setClientId($config[$key]['client_id']); + $this->setClientSecret($config[$key]['client_secret']); + if (isset($config[$key]['redirect_uris'])) { + $this->setRedirectUri($config[$key]['redirect_uris'][0]); + } + } else { + // new-style + $this->setClientId($config['client_id']); + $this->setClientSecret($config['client_secret']); + if (isset($config['redirect_uris'])) { + $this->setRedirectUri($config['redirect_uris'][0]); + } + } + } + + /** + * Use when the service account has been delegated domain wide access. + * + * @param string $subject an email address account to impersonate + */ + public function setSubject($subject) + { + $this->config['subject'] = $subject; + } + + /** + * Declare whether making API calls should make the call immediately, or + * return a request which can be called with ->execute(); + * + * @param boolean $defer True if calls should not be executed right away. + */ + public function setDefer($defer) + { + $this->deferExecution = $defer; + } + + /** + * Whether or not to return raw requests + * @return boolean + */ + public function shouldDefer() + { + return $this->deferExecution; + } + + /** + * @return Google\Auth\OAuth2 implementation + */ + public function getOAuth2Service() + { + if (!isset($this->auth)) { + $this->auth = $this->createOAuth2Service(); + } + + return $this->auth; + } + + /** + * create a default google auth object + */ + protected function createOAuth2Service() + { + $auth = new OAuth2( + [ + 'clientId' => $this->getClientId(), + 'clientSecret' => $this->getClientSecret(), + 'authorizationUri' => self::OAUTH2_AUTH_URL, + 'tokenCredentialUri' => self::OAUTH2_TOKEN_URI, + 'redirectUri' => $this->getRedirectUri(), + 'issuer' => $this->config['client_id'], + 'signingKey' => $this->config['signing_key'], + 'signingAlgorithm' => $this->config['signing_algorithm'], + ] + ); + + return $auth; + } + + /** + * Set the Cache object + * @param Psr\Cache\CacheItemPoolInterface $cache + */ + public function setCache(CacheItemPoolInterface $cache) + { + $this->cache = $cache; + } + + /** + * @return Psr\Cache\CacheItemPoolInterface Cache implementation + */ + public function getCache() + { + if (!$this->cache) { + $this->cache = $this->createDefaultCache(); + } + + return $this->cache; + } + + /** + * @param array $cacheConfig + */ + public function setCacheConfig(array $cacheConfig) + { + $this->config['cache_config'] = $cacheConfig; + } + + /** + * Set the Logger object + * @param Psr\Log\LoggerInterface $logger + */ + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * @return Psr\Log\LoggerInterface implementation + */ + public function getLogger() + { + if (!isset($this->logger)) { + $this->logger = $this->createDefaultLogger(); + } + + return $this->logger; + } + + protected function createDefaultLogger() + { + $logger = new Logger('google-api-php-client'); + if ($this->isAppEngine()) { + $handler = new MonologSyslogHandler('app', LOG_USER, Logger::NOTICE); + } else { + $handler = new MonologStreamHandler('php://stderr', Logger::NOTICE); + } + $logger->pushHandler($handler); + + return $logger; + } + + protected function createDefaultCache() + { + return new MemoryCacheItemPool; + } + + /** + * Set the Http Client object + * @param GuzzleHttp\ClientInterface $http + */ + public function setHttpClient(ClientInterface $http) + { + $this->http = $http; + } + + /** + * @return GuzzleHttp\ClientInterface implementation + */ + public function getHttpClient() + { + if (null === $this->http) { + $this->http = $this->createDefaultHttpClient(); + } + + return $this->http; + } + + protected function createDefaultHttpClient() + { + $options = ['exceptions' => false]; + + $version = ClientInterface::VERSION; + if ('5' === $version[0]) { + $options = [ + 'base_url' => $this->config['base_path'], + 'defaults' => $options, + ]; + if ($this->isAppEngine()) { + // set StreamHandler on AppEngine by default + $options['handler'] = new StreamHandler(); + $options['defaults']['verify'] = '/etc/ca-certificates.crt'; + } + } else { + // guzzle 6 + $options['base_uri'] = $this->config['base_path']; + } + + return new Client($options); + } + + private function createApplicationDefaultCredentials() + { + $scopes = $this->prepareScopes(); + $sub = $this->config['subject']; + $signingKey = $this->config['signing_key']; + + // create credentials using values supplied in setAuthConfig + if ($signingKey) { + $serviceAccountCredentials = array( + 'client_id' => $this->config['client_id'], + 'client_email' => $this->config['client_email'], + 'private_key' => $signingKey, + 'type' => 'service_account', + ); + $credentials = CredentialsLoader::makeCredentials($scopes, $serviceAccountCredentials); + } else { + $credentials = ApplicationDefaultCredentials::getCredentials($scopes); + } + + // for service account domain-wide authority (impersonating a user) + // @see https://developers.google.com/identity/protocols/OAuth2ServiceAccount + if ($sub) { + if (!$credentials instanceof ServiceAccountCredentials) { + throw new DomainException('domain-wide authority requires service account credentials'); + } + + $credentials->setSub($sub); + } + + return $credentials; + } + + protected function getAuthHandler() + { + // Be very careful using the cache, as the underlying auth library's cache + // implementation is naive, and the cache keys do not account for user + // sessions. + // + // @see https://github.com/google/google-api-php-client/issues/821 + return Google_AuthHandler_AuthHandlerFactory::build( + $this->getCache(), + $this->config['cache_config'] + ); + } + + private function createUserRefreshCredentials($scope, $refreshToken) + { + $creds = array_filter( + array( + 'client_id' => $this->getClientId(), + 'client_secret' => $this->getClientSecret(), + 'refresh_token' => $refreshToken, + ) + ); + + return new UserRefreshCredentials($scope, $creds); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Collection.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Collection.php new file mode 100644 index 0000000..df8d444 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Collection.php @@ -0,0 +1,100 @@ +{$this->collection_key}) + && is_array($this->{$this->collection_key})) { + reset($this->{$this->collection_key}); + } + } + + public function current() + { + $this->coerceType($this->key()); + if (is_array($this->{$this->collection_key})) { + return current($this->{$this->collection_key}); + } + } + + public function key() + { + if (isset($this->{$this->collection_key}) + && is_array($this->{$this->collection_key})) { + return key($this->{$this->collection_key}); + } + } + + public function next() + { + return next($this->{$this->collection_key}); + } + + public function valid() + { + $key = $this->key(); + return $key !== null && $key !== false; + } + + public function count() + { + if (!isset($this->{$this->collection_key})) { + return 0; + } + return count($this->{$this->collection_key}); + } + + public function offsetExists($offset) + { + if (!is_numeric($offset)) { + return parent::offsetExists($offset); + } + return isset($this->{$this->collection_key}[$offset]); + } + + public function offsetGet($offset) + { + if (!is_numeric($offset)) { + return parent::offsetGet($offset); + } + $this->coerceType($offset); + return $this->{$this->collection_key}[$offset]; + } + + public function offsetSet($offset, $value) + { + if (!is_numeric($offset)) { + return parent::offsetSet($offset, $value); + } + $this->{$this->collection_key}[$offset] = $value; + } + + public function offsetUnset($offset) + { + if (!is_numeric($offset)) { + return parent::offsetUnset($offset); + } + unset($this->{$this->collection_key}[$offset]); + } + + private function coerceType($offset) + { + $keyType = $this->keyType($this->collection_key); + if ($keyType && !is_object($this->{$this->collection_key}[$offset])) { + $this->{$this->collection_key}[$offset] = + new $keyType($this->{$this->collection_key}[$offset]); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Exception.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Exception.php new file mode 100644 index 0000000..af80269 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Exception.php @@ -0,0 +1,20 @@ +client = $client; + $this->boundary = $boundary ?: mt_rand(); + $this->rootUrl = rtrim($rootUrl ?: $this->client->getConfig('base_path'), '/'); + $this->batchPath = $batchPath ?: self::BATCH_PATH; + } + + public function add(RequestInterface $request, $key = false) + { + if (false == $key) { + $key = mt_rand(); + } + + $this->requests[$key] = $request; + } + + public function execute() + { + $body = ''; + $classes = array(); + $batchHttpTemplate = <<requests as $key => $request) { + $firstLine = sprintf( + '%s %s HTTP/%s', + $request->getMethod(), + $request->getRequestTarget(), + $request->getProtocolVersion() + ); + + $content = (string) $request->getBody(); + + $headers = ''; + foreach ($request->getHeaders() as $name => $values) { + $headers .= sprintf("%s:%s\r\n", $name, implode(', ', $values)); + } + + $body .= sprintf( + $batchHttpTemplate, + $this->boundary, + $key, + $firstLine, + $headers, + $content ? "\n".$content : '' + ); + + $classes['response-' . $key] = $request->getHeaderLine('X-Php-Expected-Class'); + } + + $body .= "--{$this->boundary}--"; + $body = trim($body); + $url = $this->rootUrl . '/' . $this->batchPath; + $headers = array( + 'Content-Type' => sprintf('multipart/mixed; boundary=%s', $this->boundary), + 'Content-Length' => strlen($body), + ); + + $request = new Request( + 'POST', + $url, + $headers, + $body + ); + + $response = $this->client->execute($request); + + return $this->parseResponse($response, $classes); + } + + public function parseResponse(ResponseInterface $response, $classes = array()) + { + $contentType = $response->getHeaderLine('content-type'); + $contentType = explode(';', $contentType); + $boundary = false; + foreach ($contentType as $part) { + $part = explode('=', $part, 2); + if (isset($part[0]) && 'boundary' == trim($part[0])) { + $boundary = $part[1]; + } + } + + $body = (string) $response->getBody(); + if (!empty($body)) { + $body = str_replace("--$boundary--", "--$boundary", $body); + $parts = explode("--$boundary", $body); + $responses = array(); + $requests = array_values($this->requests); + + foreach ($parts as $i => $part) { + $part = trim($part); + if (!empty($part)) { + list($rawHeaders, $part) = explode("\r\n\r\n", $part, 2); + $headers = $this->parseRawHeaders($rawHeaders); + + $status = substr($part, 0, strpos($part, "\n")); + $status = explode(" ", $status); + $status = $status[1]; + + list($partHeaders, $partBody) = $this->parseHttpResponse($part, false); + $response = new Response( + $status, + $partHeaders, + Psr7\stream_for($partBody) + ); + + // Need content id. + $key = $headers['content-id']; + + try { + $response = Google_Http_REST::decodeHttpResponse($response, $requests[$i-1]); + } catch (Google_Service_Exception $e) { + // Store the exception as the response, so successful responses + // can be processed. + $response = $e; + } + + $responses[$key] = $response; + } + } + + return $responses; + } + + return null; + } + + private function parseRawHeaders($rawHeaders) + { + $headers = array(); + $responseHeaderLines = explode("\r\n", $rawHeaders); + foreach ($responseHeaderLines as $headerLine) { + if ($headerLine && strpos($headerLine, ':') !== false) { + list($header, $value) = explode(': ', $headerLine, 2); + $header = strtolower($header); + if (isset($headers[$header])) { + $headers[$header] .= "\n" . $value; + } else { + $headers[$header] = $value; + } + } + } + return $headers; + } + + /** + * Used by the IO lib and also the batch processing. + * + * @param $respData + * @param $headerSize + * @return array + */ + private function parseHttpResponse($respData, $headerSize) + { + // check proxy header + foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) { + if (stripos($respData, $established_header) !== false) { + // existed, remove it + $respData = str_ireplace($established_header, '', $respData); + // Subtract the proxy header size unless the cURL bug prior to 7.30.0 + // is present which prevented the proxy header size from being taken into + // account. + // @TODO look into this + // if (!$this->needsQuirk()) { + // $headerSize -= strlen($established_header); + // } + break; + } + } + + if ($headerSize) { + $responseBody = substr($respData, $headerSize); + $responseHeaders = substr($respData, 0, $headerSize); + } else { + $responseSegments = explode("\r\n\r\n", $respData, 2); + $responseHeaders = $responseSegments[0]; + $responseBody = isset($responseSegments[1]) ? $responseSegments[1] : + null; + } + + $responseHeaders = $this->parseRawHeaders($responseHeaders); + + return array($responseHeaders, $responseBody); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/MediaFileUpload.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/MediaFileUpload.php new file mode 100644 index 0000000..600e678 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/MediaFileUpload.php @@ -0,0 +1,351 @@ +client = $client; + $this->request = $request; + $this->mimeType = $mimeType; + $this->data = $data; + $this->resumable = $resumable; + $this->chunkSize = $chunkSize; + $this->progress = 0; + + $this->process(); + } + + /** + * Set the size of the file that is being uploaded. + * @param $size - int file size in bytes + */ + public function setFileSize($size) + { + $this->size = $size; + } + + /** + * Return the progress on the upload + * @return int progress in bytes uploaded. + */ + public function getProgress() + { + return $this->progress; + } + + /** + * Send the next part of the file to upload. + * @param [$chunk] the next set of bytes to send. If false will used $data passed + * at construct time. + */ + public function nextChunk($chunk = false) + { + $resumeUri = $this->getResumeUri(); + + if (false == $chunk) { + $chunk = substr($this->data, $this->progress, $this->chunkSize); + } + + $lastBytePos = $this->progress + strlen($chunk) - 1; + $headers = array( + 'content-range' => "bytes $this->progress-$lastBytePos/$this->size", + 'content-length' => strlen($chunk), + 'expect' => '', + ); + + $request = new Request( + 'PUT', + $resumeUri, + $headers, + Psr7\stream_for($chunk) + ); + + return $this->makePutRequest($request); + } + + /** + * Return the HTTP result code from the last call made. + * @return int code + */ + public function getHttpResultCode() + { + return $this->httpResultCode; + } + + /** + * Sends a PUT-Request to google drive and parses the response, + * setting the appropiate variables from the response() + * + * @param Google_Http_Request $httpRequest the Reuqest which will be send + * + * @return false|mixed false when the upload is unfinished or the decoded http response + * + */ + private function makePutRequest(RequestInterface $request) + { + $response = $this->client->execute($request); + $this->httpResultCode = $response->getStatusCode(); + + if (308 == $this->httpResultCode) { + // Track the amount uploaded. + $range = $response->getHeaderLine('range'); + if ($range) { + $range_array = explode('-', $range); + $this->progress = $range_array[1] + 1; + } + + // Allow for changing upload URLs. + $location = $response->getHeaderLine('location'); + if ($location) { + $this->resumeUri = $location; + } + + // No problems, but upload not complete. + return false; + } + + return Google_Http_REST::decodeHttpResponse($response, $this->request); + } + + /** + * Resume a previously unfinished upload + * @param $resumeUri the resume-URI of the unfinished, resumable upload. + */ + public function resume($resumeUri) + { + $this->resumeUri = $resumeUri; + $headers = array( + 'content-range' => "bytes */$this->size", + 'content-length' => 0, + ); + $httpRequest = new Request( + 'PUT', + $this->resumeUri, + $headers + ); + + return $this->makePutRequest($httpRequest); + } + + /** + * @return Psr\Http\Message\RequestInterface $request + * @visible for testing + */ + private function process() + { + $this->transformToUploadUrl(); + $request = $this->request; + + $postBody = ''; + $contentType = false; + + $meta = (string) $request->getBody(); + $meta = is_string($meta) ? json_decode($meta, true) : $meta; + + $uploadType = $this->getUploadType($meta); + $request = $request->withUri( + Uri::withQueryValue($request->getUri(), 'uploadType', $uploadType) + ); + + $mimeType = $this->mimeType ?: $request->getHeaderLine('content-type'); + + if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) { + $contentType = $mimeType; + $postBody = is_string($meta) ? $meta : json_encode($meta); + } else if (self::UPLOAD_MEDIA_TYPE == $uploadType) { + $contentType = $mimeType; + $postBody = $this->data; + } else if (self::UPLOAD_MULTIPART_TYPE == $uploadType) { + // This is a multipart/related upload. + $boundary = $this->boundary ?: mt_rand(); + $boundary = str_replace('"', '', $boundary); + $contentType = 'multipart/related; boundary=' . $boundary; + $related = "--$boundary\r\n"; + $related .= "Content-Type: application/json; charset=UTF-8\r\n"; + $related .= "\r\n" . json_encode($meta) . "\r\n"; + $related .= "--$boundary\r\n"; + $related .= "Content-Type: $mimeType\r\n"; + $related .= "Content-Transfer-Encoding: base64\r\n"; + $related .= "\r\n" . base64_encode($this->data) . "\r\n"; + $related .= "--$boundary--"; + $postBody = $related; + } + + $request = $request->withBody(Psr7\stream_for($postBody)); + + if (isset($contentType) && $contentType) { + $request = $request->withHeader('content-type', $contentType); + } + + return $this->request = $request; + } + + /** + * Valid upload types: + * - resumable (UPLOAD_RESUMABLE_TYPE) + * - media (UPLOAD_MEDIA_TYPE) + * - multipart (UPLOAD_MULTIPART_TYPE) + * @param $meta + * @return string + * @visible for testing + */ + public function getUploadType($meta) + { + if ($this->resumable) { + return self::UPLOAD_RESUMABLE_TYPE; + } + + if (false == $meta && $this->data) { + return self::UPLOAD_MEDIA_TYPE; + } + + return self::UPLOAD_MULTIPART_TYPE; + } + + public function getResumeUri() + { + if (null === $this->resumeUri) { + $this->resumeUri = $this->fetchResumeUri(); + } + + return $this->resumeUri; + } + + private function fetchResumeUri() + { + $body = $this->request->getBody(); + if ($body) { + $headers = array( + 'content-type' => 'application/json; charset=UTF-8', + 'content-length' => $body->getSize(), + 'x-upload-content-type' => $this->mimeType, + 'x-upload-content-length' => $this->size, + 'expect' => '', + ); + foreach ($headers as $key => $value) { + $this->request = $this->request->withHeader($key, $value); + } + } + + $response = $this->client->execute($this->request, false); + $location = $response->getHeaderLine('location'); + $code = $response->getStatusCode(); + + if (200 == $code && true == $location) { + return $location; + } + + $message = $code; + $body = json_decode((string) $this->request->getBody(), true); + if (isset($body['error']['errors'])) { + $message .= ': '; + foreach ($body['error']['errors'] as $error) { + $message .= "{$error['domain']}, {$error['message']};"; + } + $message = rtrim($message, ';'); + } + + $error = "Failed to start the resumable upload (HTTP {$message})"; + $this->client->getLogger()->error($error); + + throw new Google_Exception($error); + } + + private function transformToUploadUrl() + { + $parts = parse_url((string) $this->request->getUri()); + if (!isset($parts['path'])) { + $parts['path'] = ''; + } + $parts['path'] = '/upload' . $parts['path']; + $uri = Uri::fromParts($parts); + $this->request = $this->request->withUri($uri); + } + + public function setChunkSize($chunkSize) + { + $this->chunkSize = $chunkSize; + } + + public function getRequest() + { + return $this->request; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/REST.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/REST.php new file mode 100644 index 0000000..c2156a2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Http/REST.php @@ -0,0 +1,182 @@ +getMethod(), (string) $request->getUri()), + array(get_class(), 'doExecute'), + array($client, $request, $expectedClass) + ); + + if (null !== $retryMap) { + $runner->setRetryMap($retryMap); + } + + return $runner->run(); + } + + /** + * Executes a Psr\Http\Message\RequestInterface + * + * @param Google_Client $client + * @param Psr\Http\Message\RequestInterface $request + * @return array decoded result + * @throws Google_Service_Exception on server side error (ie: not authenticated, + * invalid or malformed post body, invalid url) + */ + public static function doExecute(ClientInterface $client, RequestInterface $request, $expectedClass = null) + { + try { + $httpHandler = HttpHandlerFactory::build($client); + $response = $httpHandler($request); + } catch (RequestException $e) { + // if Guzzle throws an exception, catch it and handle the response + if (!$e->hasResponse()) { + throw $e; + } + + $response = $e->getResponse(); + // specific checking for Guzzle 5: convert to PSR7 response + if ($response instanceof \GuzzleHttp\Message\ResponseInterface) { + $response = new Response( + $response->getStatusCode(), + $response->getHeaders() ?: [], + $response->getBody(), + $response->getProtocolVersion(), + $response->getReasonPhrase() + ); + } + } + + return self::decodeHttpResponse($response, $request, $expectedClass); + } + + /** + * Decode an HTTP Response. + * @static + * @throws Google_Service_Exception + * @param Psr\Http\Message\RequestInterface $response The http response to be decoded. + * @param Psr\Http\Message\ResponseInterface $response + * @return mixed|null + */ + public static function decodeHttpResponse( + ResponseInterface $response, + RequestInterface $request = null, + $expectedClass = null + ) { + $code = $response->getStatusCode(); + + // retry strategy + if (intVal($code) >= 400) { + // if we errored out, it should be safe to grab the response body + $body = (string) $response->getBody(); + + // Check if we received errors, and add those to the Exception for convenience + throw new Google_Service_Exception($body, $code, null, self::getResponseErrors($body)); + } + + // Ensure we only pull the entire body into memory if the request is not + // of media type + $body = self::decodeBody($response, $request); + + if ($expectedClass = self::determineExpectedClass($expectedClass, $request)) { + $json = json_decode($body, true); + + return new $expectedClass($json); + } + + return $response; + } + + private static function decodeBody(ResponseInterface $response, RequestInterface $request = null) + { + if (self::isAltMedia($request)) { + // don't decode the body, it's probably a really long string + return ''; + } + + return (string) $response->getBody(); + } + + private static function determineExpectedClass($expectedClass, RequestInterface $request = null) + { + // "false" is used to explicitly prevent an expected class from being returned + if (false === $expectedClass) { + return null; + } + + // if we don't have a request, we just use what's passed in + if (null === $request) { + return $expectedClass; + } + + // return what we have in the request header if one was not supplied + return $expectedClass ?: $request->getHeaderLine('X-Php-Expected-Class'); + } + + private static function getResponseErrors($body) + { + $json = json_decode($body, true); + + if (isset($json['error']['errors'])) { + return $json['error']['errors']; + } + + return null; + } + + private static function isAltMedia(RequestInterface $request = null) + { + if ($request && $qs = $request->getUri()->getQuery()) { + parse_str($qs, $query); + if (isset($query['alt']) && $query['alt'] == 'media') { + return true; + } + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Model.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Model.php new file mode 100644 index 0000000..1826260 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Model.php @@ -0,0 +1,317 @@ +mapTypes($array); + } + $this->gapiInit(); + } + + /** + * Getter that handles passthrough access to the data array, and lazy object creation. + * @param string $key Property name. + * @return mixed The value if any, or null. + */ + public function __get($key) + { + $keyType = $this->keyType($key); + $keyDataType = $this->dataType($key); + if ($keyType && !isset($this->processed[$key])) { + if (isset($this->modelData[$key])) { + $val = $this->modelData[$key]; + } elseif ($keyDataType == 'array' || $keyDataType == 'map') { + $val = array(); + } else { + $val = null; + } + + if ($this->isAssociativeArray($val)) { + if ($keyDataType && 'map' == $keyDataType) { + foreach ($val as $arrayKey => $arrayItem) { + $this->modelData[$key][$arrayKey] = + new $keyType($arrayItem); + } + } else { + $this->modelData[$key] = new $keyType($val); + } + } else if (is_array($val)) { + $arrayObject = array(); + foreach ($val as $arrayIndex => $arrayItem) { + $arrayObject[$arrayIndex] = new $keyType($arrayItem); + } + $this->modelData[$key] = $arrayObject; + } + $this->processed[$key] = true; + } + + return isset($this->modelData[$key]) ? $this->modelData[$key] : null; + } + + /** + * Initialize this object's properties from an array. + * + * @param array $array Used to seed this object's properties. + * @return void + */ + protected function mapTypes($array) + { + // Hard initialise simple types, lazy load more complex ones. + foreach ($array as $key => $val) { + if ($keyType = $this->keyType($key)) { + $dataType = $this->dataType($key); + if ($dataType == 'array' || $dataType == 'map') { + $this->$key = array(); + foreach ($val as $itemKey => $itemVal) { + if ($itemVal instanceof $keyType) { + $this->{$key}[$itemKey] = $itemVal; + } else { + $this->{$key}[$itemKey] = new $keyType($itemVal); + } + } + } elseif ($val instanceof $keyType) { + $this->$key = $val; + } else { + $this->$key = new $keyType($val); + } + unset($array[$key]); + } elseif (property_exists($this, $key)) { + $this->$key = $val; + unset($array[$key]); + } elseif (property_exists($this, $camelKey = $this->camelCase($key))) { + // This checks if property exists as camelCase, leaving it in array as snake_case + // in case of backwards compatibility issues. + $this->$camelKey = $val; + } + } + $this->modelData = $array; + } + + /** + * Blank initialiser to be used in subclasses to do post-construction initialisation - this + * avoids the need for subclasses to have to implement the variadics handling in their + * constructors. + */ + protected function gapiInit() + { + return; + } + + /** + * Create a simplified object suitable for straightforward + * conversion to JSON. This is relatively expensive + * due to the usage of reflection, but shouldn't be called + * a whole lot, and is the most straightforward way to filter. + */ + public function toSimpleObject() + { + $object = new stdClass(); + + // Process all other data. + foreach ($this->modelData as $key => $val) { + $result = $this->getSimpleValue($val); + if ($result !== null) { + $object->$key = $this->nullPlaceholderCheck($result); + } + } + + // Process all public properties. + $reflect = new ReflectionObject($this); + $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); + foreach ($props as $member) { + $name = $member->getName(); + $result = $this->getSimpleValue($this->$name); + if ($result !== null) { + $name = $this->getMappedName($name); + $object->$name = $this->nullPlaceholderCheck($result); + } + } + + return $object; + } + + /** + * Handle different types of values, primarily + * other objects and map and array data types. + */ + private function getSimpleValue($value) + { + if ($value instanceof Google_Model) { + return $value->toSimpleObject(); + } else if (is_array($value)) { + $return = array(); + foreach ($value as $key => $a_value) { + $a_value = $this->getSimpleValue($a_value); + if ($a_value !== null) { + $key = $this->getMappedName($key); + $return[$key] = $this->nullPlaceholderCheck($a_value); + } + } + return $return; + } + return $value; + } + + /** + * Check whether the value is the null placeholder and return true null. + */ + private function nullPlaceholderCheck($value) + { + if ($value === self::NULL_VALUE) { + return null; + } + return $value; + } + + /** + * If there is an internal name mapping, use that. + */ + private function getMappedName($key) + { + if (isset($this->internal_gapi_mappings, $this->internal_gapi_mappings[$key])) { + $key = $this->internal_gapi_mappings[$key]; + } + return $key; + } + + /** + * Returns true only if the array is associative. + * @param array $array + * @return bool True if the array is associative. + */ + protected function isAssociativeArray($array) + { + if (!is_array($array)) { + return false; + } + $keys = array_keys($array); + foreach ($keys as $key) { + if (is_string($key)) { + return true; + } + } + return false; + } + + /** + * Verify if $obj is an array. + * @throws Google_Exception Thrown if $obj isn't an array. + * @param array $obj Items that should be validated. + * @param string $method Method expecting an array as an argument. + */ + public function assertIsArray($obj, $method) + { + if ($obj && !is_array($obj)) { + throw new Google_Exception( + "Incorrect parameter type passed to $method(). Expected an array." + ); + } + } + + public function offsetExists($offset) + { + return isset($this->$offset) || isset($this->modelData[$offset]); + } + + public function offsetGet($offset) + { + return isset($this->$offset) ? + $this->$offset : + $this->__get($offset); + } + + public function offsetSet($offset, $value) + { + if (property_exists($this, $offset)) { + $this->$offset = $value; + } else { + $this->modelData[$offset] = $value; + $this->processed[$offset] = true; + } + } + + public function offsetUnset($offset) + { + unset($this->modelData[$offset]); + } + + protected function keyType($key) + { + $keyType = $key . "Type"; + + // ensure keyType is a valid class + if (property_exists($this, $keyType) && class_exists($this->$keyType)) { + return $this->$keyType; + } + } + + protected function dataType($key) + { + $dataType = $key . "DataType"; + + if (property_exists($this, $dataType)) { + return $this->$dataType; + } + } + + public function __isset($key) + { + return isset($this->modelData[$key]); + } + + public function __unset($key) + { + unset($this->modelData[$key]); + } + + /** + * Convert a string to camelCase + * @param string $value + * @return string + */ + private function camelCase($value) + { + $value = ucwords(str_replace(array('-', '_'), ' ', $value)); + $value = str_replace(' ', '', $value); + $value[0] = strtolower($value[0]); + return $value; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service.php new file mode 100644 index 0000000..d3fd3b4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service.php @@ -0,0 +1,56 @@ +client = $client; + } + + /** + * Return the associated Google_Client class. + * @return Google_Client + */ + public function getClient() + { + return $this->client; + } + + /** + * Create a new HTTP Batch handler for this service + * + * @return Google_Http_Batch + */ + public function createBatch() + { + return new Google_Http_Batch( + $this->client, + false, + $this->rootUrl, + $this->batchPath + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Exception.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Exception.php new file mode 100644 index 0000000..abfd3f7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Exception.php @@ -0,0 +1,68 @@ += 0) { + parent::__construct($message, $code, $previous); + } else { + parent::__construct($message, $code); + } + + $this->errors = $errors; + } + + /** + * An example of the possible errors returned. + * + * { + * "domain": "global", + * "reason": "authError", + * "message": "Invalid Credentials", + * "locationType": "header", + * "location": "Authorization", + * } + * + * @return [{string, string}] List of errors return in an HTTP response or []. + */ + public function getErrors() + { + return $this->errors; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Resource.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Resource.php new file mode 100644 index 0000000..1f3d371 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Service/Resource.php @@ -0,0 +1,302 @@ + array('type' => 'string', 'location' => 'query'), + 'fields' => array('type' => 'string', 'location' => 'query'), + 'trace' => array('type' => 'string', 'location' => 'query'), + 'userIp' => array('type' => 'string', 'location' => 'query'), + 'quotaUser' => array('type' => 'string', 'location' => 'query'), + 'data' => array('type' => 'string', 'location' => 'body'), + 'mimeType' => array('type' => 'string', 'location' => 'header'), + 'uploadType' => array('type' => 'string', 'location' => 'query'), + 'mediaUpload' => array('type' => 'complex', 'location' => 'query'), + 'prettyPrint' => array('type' => 'string', 'location' => 'query'), + ); + + /** @var string $rootUrl */ + private $rootUrl; + + /** @var Google_Client $client */ + private $client; + + /** @var string $serviceName */ + private $serviceName; + + /** @var string $servicePath */ + private $servicePath; + + /** @var string $resourceName */ + private $resourceName; + + /** @var array $methods */ + private $methods; + + public function __construct($service, $serviceName, $resourceName, $resource) + { + $this->rootUrl = $service->rootUrl; + $this->client = $service->getClient(); + $this->servicePath = $service->servicePath; + $this->serviceName = $serviceName; + $this->resourceName = $resourceName; + $this->methods = is_array($resource) && isset($resource['methods']) ? + $resource['methods'] : + array($resourceName => $resource); + } + + /** + * TODO: This function needs simplifying. + * @param $name + * @param $arguments + * @param $expectedClass - optional, the expected class name + * @return Google_Http_Request|expectedClass + * @throws Google_Exception + */ + public function call($name, $arguments, $expectedClass = null) + { + if (! isset($this->methods[$name])) { + $this->client->getLogger()->error( + 'Service method unknown', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name + ) + ); + + throw new Google_Exception( + "Unknown function: " . + "{$this->serviceName}->{$this->resourceName}->{$name}()" + ); + } + $method = $this->methods[$name]; + $parameters = $arguments[0]; + + // postBody is a special case since it's not defined in the discovery + // document as parameter, but we abuse the param entry for storing it. + $postBody = null; + if (isset($parameters['postBody'])) { + if ($parameters['postBody'] instanceof Google_Model) { + // In the cases the post body is an existing object, we want + // to use the smart method to create a simple object for + // for JSONification. + $parameters['postBody'] = $parameters['postBody']->toSimpleObject(); + } else if (is_object($parameters['postBody'])) { + // If the post body is another kind of object, we will try and + // wrangle it into a sensible format. + $parameters['postBody'] = + $this->convertToArrayAndStripNulls($parameters['postBody']); + } + $postBody = (array) $parameters['postBody']; + unset($parameters['postBody']); + } + + // TODO: optParams here probably should have been + // handled already - this may well be redundant code. + if (isset($parameters['optParams'])) { + $optParams = $parameters['optParams']; + unset($parameters['optParams']); + $parameters = array_merge($parameters, $optParams); + } + + if (!isset($method['parameters'])) { + $method['parameters'] = array(); + } + + $method['parameters'] = array_merge( + $this->stackParameters, + $method['parameters'] + ); + + foreach ($parameters as $key => $val) { + if ($key != 'postBody' && ! isset($method['parameters'][$key])) { + $this->client->getLogger()->error( + 'Service parameter unknown', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name, + 'parameter' => $key + ) + ); + throw new Google_Exception("($name) unknown parameter: '$key'"); + } + } + + foreach ($method['parameters'] as $paramName => $paramSpec) { + if (isset($paramSpec['required']) && + $paramSpec['required'] && + ! isset($parameters[$paramName]) + ) { + $this->client->getLogger()->error( + 'Service parameter missing', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name, + 'parameter' => $paramName + ) + ); + throw new Google_Exception("($name) missing required param: '$paramName'"); + } + if (isset($parameters[$paramName])) { + $value = $parameters[$paramName]; + $parameters[$paramName] = $paramSpec; + $parameters[$paramName]['value'] = $value; + unset($parameters[$paramName]['required']); + } else { + // Ensure we don't pass nulls. + unset($parameters[$paramName]); + } + } + + $this->client->getLogger()->info( + 'Service Call', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name, + 'arguments' => $parameters, + ) + ); + + // build the service uri + $url = $this->createRequestUri( + $method['path'], + $parameters + ); + + // NOTE: because we're creating the request by hand, + // and because the service has a rootUrl property + // the "base_uri" of the Http Client is not accounted for + $request = new Request( + $method['httpMethod'], + $url, + ['content-type' => 'application/json'], + $postBody ? json_encode($postBody) : '' + ); + + // support uploads + if (isset($parameters['data'])) { + $mimeType = isset($parameters['mimeType']) + ? $parameters['mimeType']['value'] + : 'application/octet-stream'; + $data = $parameters['data']['value']; + $upload = new Google_Http_MediaFileUpload($this->client, $request, $mimeType, $data); + + // pull down the modified request + $request = $upload->getRequest(); + } + + // if this is a media type, we will return the raw response + // rather than using an expected class + if (isset($parameters['alt']) && $parameters['alt']['value'] == 'media') { + $expectedClass = null; + } + + // if the client is marked for deferring, rather than + // execute the request, return the response + if ($this->client->shouldDefer()) { + // @TODO find a better way to do this + $request = $request + ->withHeader('X-Php-Expected-Class', $expectedClass); + + return $request; + } + + return $this->client->execute($request, $expectedClass); + } + + protected function convertToArrayAndStripNulls($o) + { + $o = (array) $o; + foreach ($o as $k => $v) { + if ($v === null) { + unset($o[$k]); + } elseif (is_object($v) || is_array($v)) { + $o[$k] = $this->convertToArrayAndStripNulls($o[$k]); + } + } + return $o; + } + + /** + * Parse/expand request parameters and create a fully qualified + * request uri. + * @static + * @param string $restPath + * @param array $params + * @return string $requestUrl + */ + public function createRequestUri($restPath, $params) + { + // Override the default servicePath address if the $restPath use a / + if ('/' == substr($restPath, 0, 1)) { + $requestUrl = substr($restPath, 1); + } else { + $requestUrl = $this->servicePath . $restPath; + } + + // code for leading slash + if ($this->rootUrl) { + if ('/' !== substr($this->rootUrl, -1) && '/' !== substr($requestUrl, 0, 1)) { + $requestUrl = '/' . $requestUrl; + } + $requestUrl = $this->rootUrl . $requestUrl; + } + $uriTemplateVars = array(); + $queryVars = array(); + foreach ($params as $paramName => $paramSpec) { + if ($paramSpec['type'] == 'boolean') { + $paramSpec['value'] = $paramSpec['value'] ? 'true' : 'false'; + } + if ($paramSpec['location'] == 'path') { + $uriTemplateVars[$paramName] = $paramSpec['value']; + } else if ($paramSpec['location'] == 'query') { + if (is_array($paramSpec['value'])) { + foreach ($paramSpec['value'] as $value) { + $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value)); + } + } else { + $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value'])); + } + } + } + + if (count($uriTemplateVars)) { + $uriTemplateParser = new Google_Utils_UriTemplate(); + $requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars); + } + + if (count($queryVars)) { + $requestUrl .= '?' . implode($queryVars, '&'); + } + + return $requestUrl; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Task/Exception.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Task/Exception.php new file mode 100644 index 0000000..5422e6f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Task/Exception.php @@ -0,0 +1,20 @@ + self::TASK_RETRY_ALWAYS, + '503' => self::TASK_RETRY_ALWAYS, + 'rateLimitExceeded' => self::TASK_RETRY_ALWAYS, + 'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS, + 6 => self::TASK_RETRY_ALWAYS, // CURLE_COULDNT_RESOLVE_HOST + 7 => self::TASK_RETRY_ALWAYS, // CURLE_COULDNT_CONNECT + 28 => self::TASK_RETRY_ALWAYS, // CURLE_OPERATION_TIMEOUTED + 35 => self::TASK_RETRY_ALWAYS, // CURLE_SSL_CONNECT_ERROR + 52 => self::TASK_RETRY_ALWAYS // CURLE_GOT_NOTHING + ]; + + /** + * Creates a new task runner with exponential backoff support. + * + * @param array $config The task runner config + * @param string $name The name of the current task (used for logging) + * @param callable $action The task to run and possibly retry + * @param array $arguments The task arguments + * @throws Google_Task_Exception when misconfigured + */ + public function __construct( + $config, + $name, + $action, + array $arguments = array() + ) { + if (isset($config['initial_delay'])) { + if ($config['initial_delay'] < 0) { + throw new Google_Task_Exception( + 'Task configuration `initial_delay` must not be negative.' + ); + } + + $this->delay = $config['initial_delay']; + } + + if (isset($config['max_delay'])) { + if ($config['max_delay'] <= 0) { + throw new Google_Task_Exception( + 'Task configuration `max_delay` must be greater than 0.' + ); + } + + $this->maxDelay = $config['max_delay']; + } + + if (isset($config['factor'])) { + if ($config['factor'] <= 0) { + throw new Google_Task_Exception( + 'Task configuration `factor` must be greater than 0.' + ); + } + + $this->factor = $config['factor']; + } + + if (isset($config['jitter'])) { + if ($config['jitter'] <= 0) { + throw new Google_Task_Exception( + 'Task configuration `jitter` must be greater than 0.' + ); + } + + $this->jitter = $config['jitter']; + } + + if (isset($config['retries'])) { + if ($config['retries'] < 0) { + throw new Google_Task_Exception( + 'Task configuration `retries` must not be negative.' + ); + } + $this->maxAttempts += $config['retries']; + } + + if (!is_callable($action)) { + throw new Google_Task_Exception( + 'Task argument `$action` must be a valid callable.' + ); + } + + $this->action = $action; + $this->arguments = $arguments; + } + + /** + * Checks if a retry can be attempted. + * + * @return boolean + */ + public function canAttempt() + { + return $this->attempts < $this->maxAttempts; + } + + /** + * Runs the task and (if applicable) automatically retries when errors occur. + * + * @return mixed + * @throws Google_Task_Retryable on failure when no retries are available. + */ + public function run() + { + while ($this->attempt()) { + try { + return call_user_func_array($this->action, $this->arguments); + } catch (Google_Service_Exception $exception) { + $allowedRetries = $this->allowedRetries( + $exception->getCode(), + $exception->getErrors() + ); + + if (!$this->canAttempt() || !$allowedRetries) { + throw $exception; + } + + if ($allowedRetries > 0) { + $this->maxAttempts = min( + $this->maxAttempts, + $this->attempts + $allowedRetries + ); + } + } + } + } + + /** + * Runs a task once, if possible. This is useful for bypassing the `run()` + * loop. + * + * NOTE: If this is not the first attempt, this function will sleep in + * accordance to the backoff configurations before running the task. + * + * @return boolean + */ + public function attempt() + { + if (!$this->canAttempt()) { + return false; + } + + if ($this->attempts > 0) { + $this->backOff(); + } + + $this->attempts++; + return true; + } + + /** + * Sleeps in accordance to the backoff configurations. + */ + private function backOff() + { + $delay = $this->getDelay(); + + usleep($delay * 1000000); + } + + /** + * Gets the delay (in seconds) for the current backoff period. + * + * @return float + */ + private function getDelay() + { + $jitter = $this->getJitter(); + $factor = $this->attempts > 1 ? $this->factor + $jitter : 1 + abs($jitter); + + return $this->delay = min($this->maxDelay, $this->delay * $factor); + } + + /** + * Gets the current jitter (random number between -$this->jitter and + * $this->jitter). + * + * @return float + */ + private function getJitter() + { + return $this->jitter * 2 * mt_rand() / mt_getrandmax() - $this->jitter; + } + + /** + * Gets the number of times the associated task can be retried. + * + * NOTE: -1 is returned if the task can be retried indefinitely + * + * @return integer + */ + public function allowedRetries($code, $errors = array()) + { + if (isset($this->retryMap[$code])) { + return $this->retryMap[$code]; + } + + if ( + !empty($errors) && + isset($errors[0]['reason'], $this->retryMap[$errors[0]['reason']]) + ) { + return $this->retryMap[$errors[0]['reason']]; + } + + return 0; + } + + public function setRetryMap($retryMap) + { + $this->retryMap = $retryMap; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Utils/UriTemplate.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Utils/UriTemplate.php new file mode 100644 index 0000000..e59fe9f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/Utils/UriTemplate.php @@ -0,0 +1,333 @@ + "reserved", + "/" => "segments", + "." => "dotprefix", + "#" => "fragment", + ";" => "semicolon", + "?" => "form", + "&" => "continuation" + ); + + /** + * @var reserved array + * These are the characters which should not be URL encoded in reserved + * strings. + */ + private $reserved = array( + "=", ",", "!", "@", "|", ":", "/", "?", "#", + "[", "]",'$', "&", "'", "(", ")", "*", "+", ";" + ); + private $reservedEncoded = array( + "%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F", + "%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29", + "%2A", "%2B", "%3B" + ); + + public function parse($string, array $parameters) + { + return $this->resolveNextSection($string, $parameters); + } + + /** + * This function finds the first matching {...} block and + * executes the replacement. It then calls itself to find + * subsequent blocks, if any. + */ + private function resolveNextSection($string, $parameters) + { + $start = strpos($string, "{"); + if ($start === false) { + return $string; + } + $end = strpos($string, "}"); + if ($end === false) { + return $string; + } + $string = $this->replace($string, $start, $end, $parameters); + return $this->resolveNextSection($string, $parameters); + } + + private function replace($string, $start, $end, $parameters) + { + // We know a data block will have {} round it, so we can strip that. + $data = substr($string, $start + 1, $end - $start - 1); + + // If the first character is one of the reserved operators, it effects + // the processing of the stream. + if (isset($this->operators[$data[0]])) { + $op = $this->operators[$data[0]]; + $data = substr($data, 1); + $prefix = ""; + $prefix_on_missing = false; + + switch ($op) { + case "reserved": + // Reserved means certain characters should not be URL encoded + $data = $this->replaceVars($data, $parameters, ",", null, true); + break; + case "fragment": + // Comma separated with fragment prefix. Bare values only. + $prefix = "#"; + $prefix_on_missing = true; + $data = $this->replaceVars($data, $parameters, ",", null, true); + break; + case "segments": + // Slash separated data. Bare values only. + $prefix = "/"; + $data =$this->replaceVars($data, $parameters, "/"); + break; + case "dotprefix": + // Dot separated data. Bare values only. + $prefix = "."; + $prefix_on_missing = true; + $data = $this->replaceVars($data, $parameters, "."); + break; + case "semicolon": + // Semicolon prefixed and separated. Uses the key name + $prefix = ";"; + $data = $this->replaceVars($data, $parameters, ";", "=", false, true, false); + break; + case "form": + // Standard URL format. Uses the key name + $prefix = "?"; + $data = $this->replaceVars($data, $parameters, "&", "="); + break; + case "continuation": + // Standard URL, but with leading ampersand. Uses key name. + $prefix = "&"; + $data = $this->replaceVars($data, $parameters, "&", "="); + break; + } + + // Add the initial prefix character if data is valid. + if ($data || ($data !== false && $prefix_on_missing)) { + $data = $prefix . $data; + } + + } else { + // If no operator we replace with the defaults. + $data = $this->replaceVars($data, $parameters); + } + // This is chops out the {...} and replaces with the new section. + return substr($string, 0, $start) . $data . substr($string, $end + 1); + } + + private function replaceVars( + $section, + $parameters, + $sep = ",", + $combine = null, + $reserved = false, + $tag_empty = false, + $combine_on_empty = true + ) { + if (strpos($section, ",") === false) { + // If we only have a single value, we can immediately process. + return $this->combine( + $section, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ); + } else { + // If we have multiple values, we need to split and loop over them. + // Each is treated individually, then glued together with the + // separator character. + $vars = explode(",", $section); + return $this->combineList( + $vars, + $sep, + $parameters, + $combine, + $reserved, + false, // Never emit empty strings in multi-param replacements + $combine_on_empty + ); + } + } + + public function combine( + $key, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ) { + $length = false; + $explode = false; + $skip_final_combine = false; + $value = false; + + // Check for length restriction. + if (strpos($key, ":") !== false) { + list($key, $length) = explode(":", $key); + } + + // Check for explode parameter. + if ($key[strlen($key) - 1] == "*") { + $explode = true; + $key = substr($key, 0, -1); + $skip_final_combine = true; + } + + // Define the list separator. + $list_sep = $explode ? $sep : ","; + + if (isset($parameters[$key])) { + $data_type = $this->getDataType($parameters[$key]); + switch ($data_type) { + case self::TYPE_SCALAR: + $value = $this->getValue($parameters[$key], $length); + break; + case self::TYPE_LIST: + $values = array(); + foreach ($parameters[$key] as $pkey => $pvalue) { + $pvalue = $this->getValue($pvalue, $length); + if ($combine && $explode) { + $values[$pkey] = $key . $combine . $pvalue; + } else { + $values[$pkey] = $pvalue; + } + } + $value = implode($list_sep, $values); + if ($value == '') { + return ''; + } + break; + case self::TYPE_MAP: + $values = array(); + foreach ($parameters[$key] as $pkey => $pvalue) { + $pvalue = $this->getValue($pvalue, $length); + if ($explode) { + $pkey = $this->getValue($pkey, $length); + $values[] = $pkey . "=" . $pvalue; // Explode triggers = combine. + } else { + $values[] = $pkey; + $values[] = $pvalue; + } + } + $value = implode($list_sep, $values); + if ($value == '') { + return false; + } + break; + } + } else if ($tag_empty) { + // If we are just indicating empty values with their key name, return that. + return $key; + } else { + // Otherwise we can skip this variable due to not being defined. + return false; + } + + if ($reserved) { + $value = str_replace($this->reservedEncoded, $this->reserved, $value); + } + + // If we do not need to include the key name, we just return the raw + // value. + if (!$combine || $skip_final_combine) { + return $value; + } + + // Else we combine the key name: foo=bar, if value is not the empty string. + return $key . ($value != '' || $combine_on_empty ? $combine . $value : ''); + } + + /** + * Return the type of a passed in value + */ + private function getDataType($data) + { + if (is_array($data)) { + reset($data); + if (key($data) !== 0) { + return self::TYPE_MAP; + } + return self::TYPE_LIST; + } + return self::TYPE_SCALAR; + } + + /** + * Utility function that merges multiple combine calls + * for multi-key templates. + */ + private function combineList( + $vars, + $sep, + $parameters, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ) { + $ret = array(); + foreach ($vars as $var) { + $response = $this->combine( + $var, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ); + if ($response === false) { + continue; + } + $ret[] = $response; + } + return implode($sep, $ret); + } + + /** + * Utility function to encode and trim values + */ + private function getValue($value, $length) + { + if ($length) { + $value = substr($value, 0, $length); + } + $value = rawurlencode($value); + return $value; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/autoload.php b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/autoload.php new file mode 100644 index 0000000..8b49301 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/apiclient/src/Google/autoload.php @@ -0,0 +1,21 @@ + 3) { + // Maximum class file path depth in this project is 3. + $classPath = array_slice($classPath, 0, 3); + } + $filePath = dirname(__FILE__) . '/src/' . implode('/', $classPath) . '.php'; + if (file_exists($filePath)) { + require_once $filePath; + } +} + +spl_autoload_register('oauth2client_php_autoload'); diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/AccessToken.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/AccessToken.php new file mode 100644 index 0000000..a60494c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/AccessToken.php @@ -0,0 +1,320 @@ +httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + $this->cache = $cache ?: new MemoryCacheItemPool(); + $this->configureJwtService(); + + // set phpseclib constants if applicable + $this->setPhpsecConstants(); + } + + /** + * Verifies an id token and returns the authenticated apiLoginTicket. + * Throws an exception if the id token is not valid. + * The audience parameter can be used to control which id tokens are + * accepted. By default, the id token must have been issued to this OAuth2 client. + * + * @param string $token The JSON Web Token to be verified. + * @param array $options [optional] { + * Configuration options. + * + * @type string $audience The indended recipient of the token. + * @type string $certsLocation The location (remote or local) from which + * to retrieve certificates, if not cached. This value should only be + * provided in limited circumstances in which you are sure of the + * behavior. + * } + * @return array|bool the token payload, if successful, or false if not. + * @throws \InvalidArgumentException If certs could not be retrieved from a local file. + * @throws \InvalidArgumentException If received certs are in an invalid format. + * @throws \RuntimeException If certs could not be retrieved from a remote location. + */ + public function verify($token, array $options = []) + { + $audience = isset($options['audience']) + ? $options['audience'] + : null; + $certsLocation = isset($options['certsLocation']) + ? $options['certsLocation'] + : self::FEDERATED_SIGNON_CERT_URL; + + unset($options['audience'], $options['certsLocation']); + + // Check signature against each available cert. + // allow the loop to complete unless a known bad result is encountered. + $certs = $this->getFederatedSignOnCerts($certsLocation, $options); + foreach ($certs as $cert) { + $rsa = new RSA(); + $rsa->loadKey([ + 'n' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [ + $cert['n'] + ]), 256), + 'e' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [ + $cert['e'] + ]), 256) + ]); + + try { + $pubkey = $rsa->getPublicKey(); + $payload = $this->callJwtStatic('decode', [ + $token, + $pubkey, + ['RS256'] + ]); + + if (property_exists($payload, 'aud')) { + if ($audience && $payload->aud != $audience) { + return false; + } + } + + // support HTTP and HTTPS issuers + // @see https://developers.google.com/identity/sign-in/web/backend-auth + $issuers = [self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS]; + if (!isset($payload->iss) || !in_array($payload->iss, $issuers)) { + return false; + } + + return (array) $payload; + } catch (ExpiredException $e) { + return false; + } catch (\ExpiredException $e) { + // (firebase/php-jwt 2) + return false; + } catch (SignatureInvalidException $e) { + // continue + } catch (\SignatureInvalidException $e) { + // continue (firebase/php-jwt 2) + } catch (\DomainException $e) { + // continue + } + } + + return false; + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * + * @param string|array $token The token (access token or a refresh token) that should be revoked. + * @param array $options [optional] Configuration options. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revoke($token, array $options = []) + { + if (is_array($token)) { + if (isset($token['refresh_token'])) { + $token = $token['refresh_token']; + } else { + $token = $token['access_token']; + } + } + + $body = Psr7\stream_for(http_build_query(['token' => $token])); + $request = new Request('POST', self::OAUTH2_REVOKE_URI, [ + 'Cache-Control' => 'no-store', + 'Content-Type' => 'application/x-www-form-urlencoded', + ], $body); + + $httpHandler = $this->httpHandler; + + $response = $httpHandler($request, $options); + + return $response->getStatusCode() == 200; + } + + /** + * Gets federated sign-on certificates to use for verifying identity tokens. + * Returns certs as array structure, where keys are key ids, and values + * are PEM encoded certificates. + * + * @param string $location The location from which to retrieve certs. + * @param array $options [optional] Configuration options. + * @return array + * @throws \InvalidArgumentException If received certs are in an invalid format. + */ + private function getFederatedSignOnCerts($location, array $options = []) + { + $cacheItem = $this->cache->getItem('federated_signon_certs_v3'); + $certs = $cacheItem ? $cacheItem->get() : null; + + $gotNewCerts = false; + if (!$certs) { + $certs = $this->retrieveCertsFromLocation($location, $options); + + $gotNewCerts = true; + } + + if (!isset($certs['keys'])) { + throw new \InvalidArgumentException( + 'federated sign-on certs expects "keys" to be set' + ); + } + + // Push caching off until after verifying certs are in a valid format. + // Don't want to cache bad data. + if ($gotNewCerts) { + $cacheItem->expiresAt(new \DateTime('+1 hour')); + $cacheItem->set($certs); + $this->cache->save($cacheItem); + } + + return $certs['keys']; + } + + /** + * Retrieve and cache a certificates file. + * + * @param $url string location + * @param array $options [optional] Configuration options. + * @throws \RuntimeException + * @return array certificates + * @throws \InvalidArgumentException If certs could not be retrieved from a local file. + * @throws \RuntimeException If certs could not be retrieved from a remote location. + */ + private function retrieveCertsFromLocation($url, array $options = []) + { + // If we're retrieving a local file, just grab it. + if (strpos($url, 'http') !== 0) { + if (!file_exists($url)) { + throw new \InvalidArgumentException(sprintf( + 'Failed to retrieve verification certificates from path: %s.', + $url + )); + } + + return json_decode(file_get_contents($url), true); + } + + $httpHandler = $this->httpHandler; + $response = $httpHandler(new Request('GET', $url), $options); + + if ($response->getStatusCode() == 200) { + return json_decode((string) $response->getBody(), true); + } + + throw new \RuntimeException(sprintf( + 'Failed to retrieve verification certificates: "%s".', + $response->getBody()->getContents() + ), $response->getStatusCode()); + } + + /** + * Set required defaults for JWT. + */ + private function configureJwtService() + { + $class = class_exists('Firebase\JWT\JWT') + ? 'Firebase\JWT\JWT' + : '\JWT'; + + if (property_exists($class, 'leeway') && $class::$leeway < 1) { + // Ensures JWT leeway is at least 1 + // @see https://github.com/google/google-api-php-client/issues/827 + $class::$leeway = 1; + } + } + + /** + * phpseclib calls "phpinfo" by default, which requires special + * whitelisting in the AppEngine VM environment. This function + * sets constants to bypass the need for phpseclib to check phpinfo + * + * @see phpseclib/Math/BigInteger + * @see https://github.com/GoogleCloudPlatform/getting-started-php/issues/85 + * @codeCoverageIgnore + */ + private function setPhpsecConstants() + { + if (filter_var(getenv('GAE_VM'), FILTER_VALIDATE_BOOLEAN)) { + if (!defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); + } + if (!defined('CRYPT_RSA_MODE')) { + define('CRYPT_RSA_MODE', RSA::MODE_OPENSSL); + } + } + } + + /** + * Provide a hook to mock calls to the JWT static methods. + * + * @param string $method + * @param array $args + * @return mixed + */ + protected function callJwtStatic($method, array $args = []) + { + $class = class_exists('Firebase\JWT\JWT') + ? 'Firebase\JWT\JWT' + : 'JWT'; + return call_user_func_array([$class, $method], $args); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ApplicationDefaultCredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ApplicationDefaultCredentials.php new file mode 100644 index 0000000..1cfca8e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ApplicationDefaultCredentials.php @@ -0,0 +1,185 @@ +push($middleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'auth' => 'google_auth' // authorize all requests + * ]); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + */ +class ApplicationDefaultCredentials +{ + /** + * Obtains an AuthTokenSubscriber that uses the default FetchAuthTokenInterface + * implementation to use in this environment. + * + * If supplied, $scope is used to in creating the credentials instance if + * this does not fallback to the compute engine defaults. + * + * @param string|array scope the scope of the access request, expressed + * either as an Array or as a space-delimited String. + * @param callable $httpHandler callback which delivers psr7 request + * @param array $cacheConfig configuration for the cache when it's present + * @param CacheItemPoolInterface $cache an implementation of CacheItemPoolInterface + * + * @return AuthTokenSubscriber + * + * @throws DomainException if no implementation can be obtained. + */ + public static function getSubscriber( + $scope = null, + callable $httpHandler = null, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache); + + return new AuthTokenSubscriber($creds, $httpHandler); + } + + /** + * Obtains an AuthTokenMiddleware that uses the default FetchAuthTokenInterface + * implementation to use in this environment. + * + * If supplied, $scope is used to in creating the credentials instance if + * this does not fallback to the compute engine defaults. + * + * @param string|array scope the scope of the access request, expressed + * either as an Array or as a space-delimited String. + * @param callable $httpHandler callback which delivers psr7 request + * @param array $cacheConfig configuration for the cache when it's present + * @param CacheItemPoolInterface $cache + * + * @return AuthTokenMiddleware + * + * @throws DomainException if no implementation can be obtained. + */ + public static function getMiddleware( + $scope = null, + callable $httpHandler = null, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache); + + return new AuthTokenMiddleware($creds, $httpHandler); + } + + /** + * Obtains the default FetchAuthTokenInterface implementation to use + * in this environment. + * + * If supplied, $scope is used to in creating the credentials instance if + * this does not fallback to the Compute Engine defaults. + * + * @param string|array scope the scope of the access request, expressed + * either as an Array or as a space-delimited String. + * @param callable $httpHandler callback which delivers psr7 request + * @param array $cacheConfig configuration for the cache when it's present + * @param CacheItemPoolInterface $cache + * + * @return CredentialsLoader + * + * @throws DomainException if no implementation can be obtained. + */ + public static function getCredentials( + $scope = null, + callable $httpHandler = null, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $creds = null; + $jsonKey = CredentialsLoader::fromEnv() + ?: CredentialsLoader::fromWellKnownFile(); + + if (!$httpHandler) { + if (!($client = HttpClientCache::getHttpClient())) { + $client = new Client(); + HttpClientCache::setHttpClient($client); + } + + $httpHandler = HttpHandlerFactory::build($client); + } + + if (!is_null($jsonKey)) { + $creds = CredentialsLoader::makeCredentials($scope, $jsonKey); + } elseif (AppIdentityCredentials::onAppEngine() && !GCECredentials::onAppEngineFlexible()) { + $creds = new AppIdentityCredentials($scope); + } elseif (GCECredentials::onGce($httpHandler)) { + $creds = new GCECredentials(null, $scope); + } + + if (is_null($creds)) { + throw new \DomainException(self::notFound()); + } + if (!is_null($cache)) { + $creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache); + } + return $creds; + } + + private static function notFound() + { + $msg = 'Could not load the default credentials. Browse to '; + $msg .= 'https://developers.google.com'; + $msg .= '/accounts/docs/application-default-credentials'; + $msg .= ' for more information'; + + return $msg; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/InvalidArgumentException.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/InvalidArgumentException.php new file mode 100644 index 0000000..331e561 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/InvalidArgumentException.php @@ -0,0 +1,24 @@ +key = $key; + } + + /** + * {@inheritdoc} + */ + public function getKey() + { + return $this->key; + } + + /** + * {@inheritdoc} + */ + public function get() + { + return $this->isHit() ? $this->value : null; + } + + /** + * {@inheritdoc} + */ + public function isHit() + { + if (!$this->isHit) { + return false; + } + + if ($this->expiration === null) { + return true; + } + + return $this->currentTime()->getTimestamp() < $this->expiration->getTimestamp(); + } + + /** + * {@inheritdoc} + */ + public function set($value) + { + $this->isHit = true; + $this->value = $value; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function expiresAt($expiration) + { + if ($this->isValidExpiration($expiration)) { + $this->expiration = $expiration; + + return $this; + } + + $implementationMessage = interface_exists('DateTimeInterface') + ? 'implement interface DateTimeInterface' + : 'be an instance of DateTime'; + + $error = sprintf( + 'Argument 1 passed to %s::expiresAt() must %s, %s given', + get_class($this), + $implementationMessage, + gettype($expiration) + ); + + $this->handleError($error); + } + + /** + * {@inheritdoc} + */ + public function expiresAfter($time) + { + if (is_int($time)) { + $this->expiration = $this->currentTime()->add(new \DateInterval("PT{$time}S")); + } elseif ($time instanceof \DateInterval) { + $this->expiration = $this->currentTime()->add($time); + } elseif ($time === null) { + $this->expiration = $time; + } else { + $message = 'Argument 1 passed to %s::expiresAfter() must be an ' . + 'instance of DateInterval or of the type integer, %s given'; + $error = sprintf($message, get_class($this), gettype($time)); + + $this->handleError($error); + } + + return $this; + } + + /** + * Handles an error. + * + * @param string $error + * @throws \TypeError + */ + private function handleError($error) + { + if (class_exists('TypeError')) { + throw new \TypeError($error); + } + + trigger_error($error, E_USER_ERROR); + } + + /** + * Determines if an expiration is valid based on the rules defined by PSR6. + * + * @param mixed $expiration + * @return bool + */ + private function isValidExpiration($expiration) + { + if ($expiration === null) { + return true; + } + + // We test for two types here due to the fact the DateTimeInterface + // was not introduced until PHP 5.5. Checking for the DateTime type as + // well allows us to support 5.4. + if ($expiration instanceof \DateTimeInterface) { + return true; + } + + if ($expiration instanceof \DateTime) { + return true; + } + + return false; + } + + protected function currentTime() + { + return new \DateTime('now', new \DateTimeZone('UTC')); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/MemoryCacheItemPool.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/MemoryCacheItemPool.php new file mode 100644 index 0000000..0af2930 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/MemoryCacheItemPool.php @@ -0,0 +1,154 @@ +getItems([$key])); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []) + { + $items = []; + + foreach ($keys as $key) { + $items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new Item($key); + } + + return $items; + } + + /** + * {@inheritdoc} + */ + public function hasItem($key) + { + $this->isValidKey($key); + + return isset($this->items[$key]) && $this->items[$key]->isHit(); + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $this->items = []; + $this->deferredItems = []; + + return true; + } + + /** + * {@inheritdoc} + */ + public function deleteItem($key) + { + return $this->deleteItems([$key]); + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys) + { + array_walk($keys, [$this, 'isValidKey']); + + foreach ($keys as $key) { + unset($this->items[$key]); + } + + return true; + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item) + { + $this->items[$item->getKey()] = $item; + + return true; + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item) + { + $this->deferredItems[$item->getKey()] = $item; + + return true; + } + + /** + * {@inheritdoc} + */ + public function commit() + { + foreach ($this->deferredItems as $item) { + $this->save($item); + } + + $this->deferredItems = []; + + return true; + } + + /** + * Determines if the provided key is valid. + * + * @param string $key + * @return bool + * @throws InvalidArgumentException + */ + private function isValidKey($key) + { + $invalidCharacters = '{}()/\\\\@:'; + + if (!is_string($key) || preg_match("#[$invalidCharacters]#", $key)) { + throw new InvalidArgumentException('The provided key is not valid: ' . var_export($key, true)); + } + + return true; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/SysVCacheItemPool.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/SysVCacheItemPool.php new file mode 100644 index 0000000..361dcfb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Cache/SysVCacheItemPool.php @@ -0,0 +1,244 @@ +options = $options + [ + 'variableKey' => self::VAR_KEY, + 'proj' => self::DEFAULT_PROJ, + 'memsize' => self::DEFAULT_MEMSIZE, + 'perm' => self::DEFAULT_PERM + ]; + $this->items = []; + $this->deferredItems = []; + $this->sysvKey = ftok(__FILE__, $this->options['proj']); + } + + /** + * {@inheritdoc} + */ + public function getItem($key) + { + $this->loadItems(); + return current($this->getItems([$key])); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []) + { + $this->loadItems(); + $items = []; + foreach ($keys as $key) { + $items[$key] = $this->hasItem($key) ? + clone $this->items[$key] : + new Item($key); + } + return $items; + } + + /** + * {@inheritdoc} + */ + public function hasItem($key) + { + $this->loadItems(); + return isset($this->items[$key]) && $this->items[$key]->isHit(); + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $this->items = []; + $this->deferredItems = []; + return $this->saveCurrentItems(); + } + + /** + * {@inheritdoc} + */ + public function deleteItem($key) + { + return $this->deleteItems([$key]); + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys) + { + if (!$this->hasLoadedItems) { + $this->loadItems(); + } + + foreach ($keys as $key) { + unset($this->items[$key]); + } + return $this->saveCurrentItems(); + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item) + { + if (!$this->hasLoadedItems) { + $this->loadItems(); + } + + $this->items[$item->getKey()] = $item; + return $this->saveCurrentItems(); + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item) + { + $this->deferredItems[$item->getKey()] = $item; + return true; + } + + /** + * {@inheritdoc} + */ + public function commit() + { + foreach ($this->deferredItems as $item) { + if ($this->save($item) === false) { + return false; + } + } + $this->deferredItems = []; + return true; + } + + /** + * Save the current items. + * + * @return bool true when success, false upon failure + */ + private function saveCurrentItems() + { + $shmid = shm_attach( + $this->sysvKey, + $this->options['memsize'], + $this->options['perm'] + ); + if ($shmid !== false) { + $ret = shm_put_var( + $shmid, + $this->options['variableKey'], + $this->items + ); + shm_detach($shmid); + return $ret; + } + return false; + } + + /** + * Load the items from the shared memory. + * + * @return bool true when success, false upon failure + */ + private function loadItems() + { + $shmid = shm_attach( + $this->sysvKey, + $this->options['memsize'], + $this->options['perm'] + ); + if ($shmid !== false) { + $data = @shm_get_var($shmid, $this->options['variableKey']); + if (!empty($data)) { + $this->items = $data; + } else { + $this->items = []; + } + shm_detach($shmid); + $this->hasLoadedItems = true; + return true; + } + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CacheTrait.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CacheTrait.php new file mode 100644 index 0000000..217ce8e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CacheTrait.php @@ -0,0 +1,83 @@ +cache)) { + return; + } + + $key = $this->getFullCacheKey($k); + if (is_null($key)) { + return; + } + + $cacheItem = $this->cache->getItem($key); + if ($cacheItem->isHit()) { + return $cacheItem->get(); + } + } + + /** + * Saves the value in the cache when that is available. + */ + private function setCachedValue($k, $v) + { + if (is_null($this->cache)) { + return; + } + + $key = $this->getFullCacheKey($k); + if (is_null($key)) { + return; + } + + $cacheItem = $this->cache->getItem($key); + $cacheItem->set($v); + $cacheItem->expiresAfter($this->cacheConfig['lifetime']); + return $this->cache->save($cacheItem); + } + + private function getFullCacheKey($key) + { + if (is_null($key)) { + return; + } + + $key = $this->cacheConfig['prefix'] . $key; + + // ensure we do not have illegal characters + $key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $key); + + // Hash keys if they exceed $maxKeyLength (defaults to 64) + if ($this->maxKeyLength && strlen($key) > $this->maxKeyLength) { + $key = substr(hash('sha256', $key), 0, $this->maxKeyLength); + } + + return $key; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/AppIdentityCredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/AppIdentityCredentials.php new file mode 100644 index 0000000..31342e6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/AppIdentityCredentials.php @@ -0,0 +1,201 @@ +push($middleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/books/v1', + * 'auth' => 'google_auth' + * ]); + * + * $res = $client->get('volumes?q=Henry+David+Thoreau&country=US'); + */ +class AppIdentityCredentials extends CredentialsLoader implements SignBlobInterface +{ + /** + * Result of fetchAuthToken. + * + * @array + */ + protected $lastReceivedToken; + + /** + * Array of OAuth2 scopes to be requested. + */ + private $scope; + + /** + * @var string + */ + private $clientName; + + public function __construct($scope = array()) + { + $this->scope = $scope; + } + + /** + * Determines if this an App Engine instance, by accessing the + * SERVER_SOFTWARE environment variable (prod) or the APPENGINE_RUNTIME + * environment variable (dev). + * + * @return true if this an App Engine Instance, false otherwise + */ + public static function onAppEngine() + { + $appEngineProduction = isset($_SERVER['SERVER_SOFTWARE']) && + 0 === strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine'); + if ($appEngineProduction) { + return true; + } + $appEngineDevAppServer = isset($_SERVER['APPENGINE_RUNTIME']) && + $_SERVER['APPENGINE_RUNTIME'] == 'php'; + if ($appEngineDevAppServer) { + return true; + } + return false; + } + + /** + * Implements FetchAuthTokenInterface#fetchAuthToken. + * + * Fetches the auth tokens using the AppIdentityService if available. + * As the AppIdentityService uses protobufs to fetch the access token, + * the GuzzleHttp\ClientInterface instance passed in will not be used. + * + * @param callable $httpHandler callback which delivers psr7 request + * + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + * - expiration_time (string) + */ + public function fetchAuthToken(callable $httpHandler = null) + { + try { + $this->checkAppEngineContext(); + } catch (\Exception $e) { + return []; + } + + // AppIdentityService expects an array when multiple scopes are supplied + $scope = is_array($this->scope) ? $this->scope : explode(' ', $this->scope); + + $token = AppIdentityService::getAccessToken($scope); + $this->lastReceivedToken = $token; + + return $token; + } + + /** + * Sign a string using AppIdentityService. + * + * @param string $stringToSign The string to sign. + * @param bool $forceOpenSsl [optional] Does not apply to this credentials + * type. + * @return string The signature, base64-encoded. + * @throws \Exception If AppEngine SDK or mock is not available. + */ + public function signBlob($stringToSign, $forceOpenSsl = false) + { + $this->checkAppEngineContext(); + + return base64_encode(AppIdentityService::signForApp($stringToSign)['signature']); + } + + /** + * Get the client name from AppIdentityService. + * + * Subsequent calls to this method will return a cached value. + * + * @param callable $httpHandler Not used in this implementation. + * @return string + * @throws \Exception If AppEngine SDK or mock is not available. + */ + public function getClientName(callable $httpHandler = null) + { + $this->checkAppEngineContext(); + + if (!$this->clientName) { + $this->clientName = AppIdentityService::getServiceAccountName(); + } + + return $this->clientName; + } + + /** + * @return array|null + */ + public function getLastReceivedToken() + { + if ($this->lastReceivedToken) { + return [ + 'access_token' => $this->lastReceivedToken['access_token'], + 'expires_at' => $this->lastReceivedToken['expiration_time'], + ]; + } + + return null; + } + + /** + * Caching is handled by the underlying AppIdentityService, return empty string + * to prevent caching. + * + * @return string + */ + public function getCacheKey() + { + return ''; + } + + private function checkAppEngineContext() + { + if (!self::onAppEngine() || !class_exists('google\appengine\api\app_identity\AppIdentityService')) { + throw new \Exception( + 'This class must be run in App Engine, or you must include the AppIdentityService ' + . 'mock class defined in tests/mocks/AppIdentityService.php' + ); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/GCECredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/GCECredentials.php new file mode 100644 index 0000000..24cdd4a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/GCECredentials.php @@ -0,0 +1,373 @@ +push($middleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'auth' => 'google_auth' + * ]); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + */ +class GCECredentials extends CredentialsLoader implements SignBlobInterface +{ + const cacheKey = 'GOOGLE_AUTH_PHP_GCE'; + + /** + * The metadata IP address on appengine instances. + * + * The IP is used instead of the domain 'metadata' to avoid slow responses + * when not on Compute Engine. + */ + const METADATA_IP = '169.254.169.254'; + + /** + * The metadata path of the default token. + */ + const TOKEN_URI_PATH = 'v1/instance/service-accounts/default/token'; + + /** + * The metadata path of the client ID. + */ + const CLIENT_ID_URI_PATH = 'v1/instance/service-accounts/default/email'; + + /** + * The header whose presence indicates GCE presence. + */ + const FLAVOR_HEADER = 'Metadata-Flavor'; + + /** + * Note: the explicit `timeout` and `tries` below is a workaround. The underlying + * issue is that resolving an unknown host on some networks will take + * 20-30 seconds; making this timeout short fixes the issue, but + * could lead to false negatives in the event that we are on GCE, but + * the metadata resolution was particularly slow. The latter case is + * "unlikely" since the expected 4-nines time is about 0.5 seconds. + * This allows us to limit the total ping maximum timeout to 1.5 seconds + * for developer desktop scenarios. + */ + const MAX_COMPUTE_PING_TRIES = 3; + const COMPUTE_PING_CONNECTION_TIMEOUT_S = 0.5; + + /** + * Flag used to ensure that the onGCE test is only done once;. + * + * @var bool + */ + private $hasCheckedOnGce = false; + + /** + * Flag that stores the value of the onGCE check. + * + * @var bool + */ + private $isOnGce = false; + + /** + * Result of fetchAuthToken. + */ + protected $lastReceivedToken; + + /** + * @var string + */ + private $clientName; + + /** + * @var Iam|null + */ + private $iam; + + /** + * @var string + */ + private $tokenUri; + + /** + * @param Iam $iam [optional] An IAM instance. + * @param string|array $scope [optional] the scope of the access request, + * expressed either as an array or as a space-delimited string. + */ + public function __construct(Iam $iam = null, $scope = null) + { + $this->iam = $iam; + + $tokenUri = self::getTokenUri(); + if ($scope) { + if (is_string($scope)) { + $scope = explode(' ', $scope); + } + + $scope = implode(',', $scope); + + $tokenUri = $tokenUri . '?scopes='. $scope; + } + + $this->tokenUri = $tokenUri; + } + + /** + * The full uri for accessing the default token. + * + * @return string + */ + public static function getTokenUri() + { + $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; + + return $base . self::TOKEN_URI_PATH; + } + + /** + * The full uri for accessing the default service account. + * + * @return string + */ + public static function getClientNameUri() + { + $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; + + return $base . self::CLIENT_ID_URI_PATH; + } + + /** + * Determines if this an App Engine Flexible instance, by accessing the + * GAE_INSTANCE environment variable. + * + * @return true if this an App Engine Flexible Instance, false otherwise + */ + public static function onAppEngineFlexible() + { + return substr(getenv('GAE_INSTANCE'), 0, 4) === 'aef-'; + } + + /** + * Determines if this a GCE instance, by accessing the expected metadata + * host. + * If $httpHandler is not specified a the default HttpHandler is used. + * + * @param callable $httpHandler callback which delivers psr7 request + * + * @return true if this a GCEInstance false otherwise + */ + public static function onGce(callable $httpHandler = null) + { + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + $checkUri = 'http://' . self::METADATA_IP; + for ($i = 1; $i <= self::MAX_COMPUTE_PING_TRIES; $i++) { + try { + // Comment from: oauth2client/client.py + // + // Note: the explicit `timeout` below is a workaround. The underlying + // issue is that resolving an unknown host on some networks will take + // 20-30 seconds; making this timeout short fixes the issue, but + // could lead to false negatives in the event that we are on GCE, but + // the metadata resolution was particularly slow. The latter case is + // "unlikely". + $resp = $httpHandler( + new Request( + 'GET', + $checkUri, + [self::FLAVOR_HEADER => 'Google'] + ), + ['timeout' => self::COMPUTE_PING_CONNECTION_TIMEOUT_S] + ); + + return $resp->getHeaderLine(self::FLAVOR_HEADER) == 'Google'; + } catch (ClientException $e) { + } catch (ServerException $e) { + } catch (RequestException $e) { + } + } + return false; + } + + /** + * Implements FetchAuthTokenInterface#fetchAuthToken. + * + * Fetches the auth tokens from the GCE metadata host if it is available. + * If $httpHandler is not specified a the default HttpHandler is used. + * + * @param callable $httpHandler callback which delivers psr7 request + * + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + * - expires_in (int) + * - token_type (string) + * + * @throws \Exception + */ + public function fetchAuthToken(callable $httpHandler = null) + { + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + if (!$this->hasCheckedOnGce) { + $this->isOnGce = self::onGce($httpHandler); + $this->hasCheckedOnGce = true; + } + if (!$this->isOnGce) { + return array(); // return an empty array with no access token + } + + $json = $this->getFromMetadata($httpHandler, $this->tokenUri); + if (null === $json = json_decode($json, true)) { + throw new \Exception('Invalid JSON response'); + } + + // store this so we can retrieve it later + $this->lastReceivedToken = $json; + $this->lastReceivedToken['expires_at'] = time() + $json['expires_in']; + + return $json; + } + + /** + * @return string + */ + public function getCacheKey() + { + return self::cacheKey; + } + + /** + * @return array|null + */ + public function getLastReceivedToken() + { + if ($this->lastReceivedToken) { + return [ + 'access_token' => $this->lastReceivedToken['access_token'], + 'expires_at' => $this->lastReceivedToken['expires_at'], + ]; + } + + return null; + } + + /** + * Get the client name from GCE metadata. + * + * Subsequent calls will return a cached value. + * + * @param callable $httpHandler callback which delivers psr7 request + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + if ($this->clientName) { + return $this->clientName; + } + + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + if (!$this->hasCheckedOnGce) { + $this->isOnGce = self::onGce($httpHandler); + $this->hasCheckedOnGce = true; + } + + if (!$this->isOnGce) { + return ''; + } + + $this->clientName = $this->getFromMetadata($httpHandler, self::getClientNameUri()); + + return $this->clientName; + } + + /** + * Sign a string using the default service account private key. + * + * This implementation uses IAM's signBlob API. + * + * @see https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/signBlob SignBlob + * + * @param string $stringToSign The string to sign. + * @param bool $forceOpenSsl [optional] Does not apply to this credentials + * type. + * @return string + */ + public function signBlob($stringToSign, $forceOpenSsl = false) + { + $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + // Providing a signer is useful for testing, but it's undocumented + // because it's not something a user would generally need to do. + $signer = $this->iam ?: new Iam($httpHandler); + + $email = $this->getClientName($httpHandler); + + $previousToken = $this->getLastReceivedToken(); + $accessToken = $previousToken + ? $previousToken['access_token'] + : $this->fetchAuthToken($httpHandler)['access_token']; + + return $signer->signBlob($email, $accessToken, $stringToSign); + } + + /** + * Fetch the value of a GCE metadata server URI. + * + * @param callable $httpHandler An HTTP Handler to deliver PSR7 requests. + * @param string $uri The metadata URI. + * @return string + */ + private function getFromMetadata(callable $httpHandler, $uri) + { + $resp = $httpHandler( + new Request( + 'GET', + $uri, + [self::FLAVOR_HEADER => 'Google'] + ) + ); + + return (string) $resp->getBody(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/IAMCredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/IAMCredentials.php new file mode 100644 index 0000000..0d2a37d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/IAMCredentials.php @@ -0,0 +1,89 @@ +selector = $selector; + $this->token = $token; + } + + /** + * export a callback function which updates runtime metadata. + * + * @return array updateMetadata function + */ + public function getUpdateMetadataFunc() + { + return array($this, 'updateMetadata'); + } + + /** + * Updates metadata with the appropriate header metadata. + * + * @param array $metadata metadata hashmap + * @param string $unusedAuthUri optional auth uri + * @param callable $httpHandler callback which delivers psr7 request + * Note: this param is unused here, only included here for + * consistency with other credentials class + * + * @return array updated metadata hashmap + */ + public function updateMetadata( + $metadata, + $unusedAuthUri = null, + callable $httpHandler = null + ) { + $metadata_copy = $metadata; + $metadata_copy[self::SELECTOR_KEY] = $this->selector; + $metadata_copy[self::TOKEN_KEY] = $this->token; + + return $metadata_copy; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/InsecureCredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/InsecureCredentials.php new file mode 100644 index 0000000..dae894f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/InsecureCredentials.php @@ -0,0 +1,70 @@ + '' + ]; + + /** + * Fetches the auth token. In this case it returns an empty string. + * + * @param callable $httpHandler + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + */ + public function fetchAuthToken(callable $httpHandler = null) + { + return $this->token; + } + + /** + * Returns the cache key. In this case it returns a null value, disabling + * caching. + * + * @return string|null + */ + public function getCacheKey() + { + return null; + } + + /** + * Fetches the last received token. In this case, it returns the same empty string + * auth token. + * + * @return array + */ + public function getLastReceivedToken() + { + return $this->token; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php new file mode 100644 index 0000000..7e801b7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php @@ -0,0 +1,198 @@ +push($middleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'auth' => 'google_auth' // authorize all requests + * ]); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + */ +class ServiceAccountCredentials extends CredentialsLoader implements SignBlobInterface +{ + use ServiceAccountSignerTrait; + + /** + * The OAuth2 instance used to conduct authorization. + * + * @var OAuth2 + */ + protected $auth; + + /** + * Create a new ServiceAccountCredentials. + * + * @param string|array $scope the scope of the access request, expressed + * either as an Array or as a space-delimited String. + * @param string|array $jsonKey JSON credential file path or JSON credentials + * as an associative array + * @param string $sub an email address account to impersonate, in situations when + * the service account has been delegated domain wide access. + */ + public function __construct( + $scope, + $jsonKey, + $sub = null + ) { + if (is_string($jsonKey)) { + if (!file_exists($jsonKey)) { + throw new \InvalidArgumentException('file does not exist'); + } + $jsonKeyStream = file_get_contents($jsonKey); + if (!$jsonKey = json_decode($jsonKeyStream, true)) { + throw new \LogicException('invalid json for auth config'); + } + } + if (!array_key_exists('client_email', $jsonKey)) { + throw new \InvalidArgumentException( + 'json key is missing the client_email field'); + } + if (!array_key_exists('private_key', $jsonKey)) { + throw new \InvalidArgumentException( + 'json key is missing the private_key field'); + } + $this->auth = new OAuth2([ + 'audience' => self::TOKEN_CREDENTIAL_URI, + 'issuer' => $jsonKey['client_email'], + 'scope' => $scope, + 'signingAlgorithm' => 'RS256', + 'signingKey' => $jsonKey['private_key'], + 'sub' => $sub, + 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI, + ]); + } + + /** + * @param callable $httpHandler + * + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + * - expires_in (int) + * - token_type (string) + */ + public function fetchAuthToken(callable $httpHandler = null) + { + return $this->auth->fetchAuthToken($httpHandler); + } + + /** + * @return string + */ + public function getCacheKey() + { + $key = $this->auth->getIssuer() . ':' . $this->auth->getCacheKey(); + if ($sub = $this->auth->getSub()) { + $key .= ':' . $sub; + } + + return $key; + } + + /** + * @return array + */ + public function getLastReceivedToken() + { + return $this->auth->getLastReceivedToken(); + } + + /** + * Updates metadata with the authorization token. + * + * @param array $metadata metadata hashmap + * @param string $authUri optional auth uri + * @param callable $httpHandler callback which delivers psr7 request + * + * @return array updated metadata hashmap + */ + public function updateMetadata( + $metadata, + $authUri = null, + callable $httpHandler = null + ) { + // scope exists. use oauth implementation + $scope = $this->auth->getScope(); + if (!is_null($scope)) { + return parent::updateMetadata($metadata, $authUri, $httpHandler); + } + + // no scope found. create jwt with the auth uri + $credJson = array( + 'private_key' => $this->auth->getSigningKey(), + 'client_email' => $this->auth->getIssuer(), + ); + $jwtCreds = new ServiceAccountJwtAccessCredentials($credJson); + + return $jwtCreds->updateMetadata($metadata, $authUri, $httpHandler); + } + + /** + * @param string $sub an email address account to impersonate, in situations when + * the service account has been delegated domain wide access. + */ + public function setSub($sub) + { + $this->auth->setSub($sub); + } + + /** + * Get the client name from the keyfile. + * + * In this case, it returns the keyfile's client_email key. + * + * @param callable $httpHandler Not used by this credentials type. + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + return $this->auth->getIssuer(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php new file mode 100644 index 0000000..cf9e06a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php @@ -0,0 +1,150 @@ +auth = new OAuth2([ + 'issuer' => $jsonKey['client_email'], + 'sub' => $jsonKey['client_email'], + 'signingAlgorithm' => 'RS256', + 'signingKey' => $jsonKey['private_key'], + ]); + } + + /** + * Updates metadata with the authorization token. + * + * @param array $metadata metadata hashmap + * @param string $authUri optional auth uri + * @param callable $httpHandler callback which delivers psr7 request + * + * @return array updated metadata hashmap + */ + public function updateMetadata( + $metadata, + $authUri = null, + callable $httpHandler = null + ) { + if (empty($authUri)) { + return $metadata; + } + + $this->auth->setAudience($authUri); + + return parent::updateMetadata($metadata, $authUri, $httpHandler); + } + + /** + * Implements FetchAuthTokenInterface#fetchAuthToken. + * + * @param callable $httpHandler + * + * @return array|void A set of auth related metadata, containing the + * following keys: + * - access_token (string) + */ + public function fetchAuthToken(callable $httpHandler = null) + { + $audience = $this->auth->getAudience(); + if (empty($audience)) { + return null; + } + + $access_token = $this->auth->toJwt(); + + return array('access_token' => $access_token); + } + + /** + * @return string + */ + public function getCacheKey() + { + return $this->auth->getCacheKey(); + } + + /** + * @return array + */ + public function getLastReceivedToken() + { + return $this->auth->getLastReceivedToken(); + } + + /** + * Get the client name from the keyfile. + * + * In this case, it returns the keyfile's client_email key. + * + * @param callable $httpHandler Not used by this credentials type. + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + return $this->auth->getIssuer(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/UserRefreshCredentials.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/UserRefreshCredentials.php new file mode 100644 index 0000000..74dcad8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Credentials/UserRefreshCredentials.php @@ -0,0 +1,137 @@ +auth = new OAuth2([ + 'clientId' => $jsonKey['client_id'], + 'clientSecret' => $jsonKey['client_secret'], + 'refresh_token' => $jsonKey['refresh_token'], + 'scope' => $scope, + 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI, + ]); + if ($jsonKey['client_id'] === self::CLOUD_SDK_CLIENT_ID + && getenv(self::SUPPRESS_CLOUD_SDK_CREDS_WARNING_ENV) !== 'true') { + trigger_error( + 'Your application has authenticated using end user credentials ' + . 'from Google Cloud SDK. We recommend that most server ' + . 'applications use service accounts instead. If your ' + . 'application continues to use end user credentials ' + . 'from Cloud SDK, you might receive a "quota exceeded" ' + . 'or "API not enabled" error. For more information about ' + . 'service accounts, see ' + . 'https://cloud.google.com/docs/authentication/. ' + . 'To disable this warning, set ' + . self::SUPPRESS_CLOUD_SDK_CREDS_WARNING_ENV + . ' environment variable to "true".', + E_USER_WARNING); + } + } + + /** + * @param callable $httpHandler + * + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + * - expires_in (int) + * - scope (string) + * - token_type (string) + * - id_token (string) + */ + public function fetchAuthToken(callable $httpHandler = null) + { + return $this->auth->fetchAuthToken($httpHandler); + } + + /** + * @return string + */ + public function getCacheKey() + { + return $this->auth->getClientId() . ':' . $this->auth->getCacheKey(); + } + + /** + * @return array + */ + public function getLastReceivedToken() + { + return $this->auth->getLastReceivedToken(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CredentialsLoader.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CredentialsLoader.php new file mode 100644 index 0000000..a81d88f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/CredentialsLoader.php @@ -0,0 +1,223 @@ +setDefaultOption('auth', 'google_auth'); + $subscriber = new Subscriber\AuthTokenSubscriber( + $fetcher, + $httpHandler, + $tokenCallback + ); + $client->getEmitter()->attach($subscriber); + return $client; + case '6': + $middleware = new Middleware\AuthTokenMiddleware( + $fetcher, + $httpHandler, + $tokenCallback + ); + $stack = \GuzzleHttp\HandlerStack::create(); + $stack->push($middleware); + + return new \GuzzleHttp\Client([ + 'handler' => $stack, + 'auth' => 'google_auth', + ] + $httpClientOptions); + default: + throw new \Exception('Version not supported'); + } + } + + /** + * Create a new instance of InsecureCredentials. + * + * @return InsecureCredentials + */ + public static function makeInsecureCredentials() + { + return new InsecureCredentials(); + } + + /** + * export a callback function which updates runtime metadata. + * + * @return array updateMetadata function + */ + public function getUpdateMetadataFunc() + { + return array($this, 'updateMetadata'); + } + + /** + * Updates metadata with the authorization token. + * + * @param array $metadata metadata hashmap + * @param string $authUri optional auth uri + * @param callable $httpHandler callback which delivers psr7 request + * + * @return array updated metadata hashmap + */ + public function updateMetadata( + $metadata, + $authUri = null, + callable $httpHandler = null + ) { + $result = $this->fetchAuthToken($httpHandler); + if (!isset($result['access_token'])) { + return $metadata; + } + $metadata_copy = $metadata; + $metadata_copy[self::AUTH_METADATA_KEY] = array('Bearer ' . $result['access_token']); + + return $metadata_copy; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenCache.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenCache.php new file mode 100644 index 0000000..7824d15 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenCache.php @@ -0,0 +1,142 @@ +fetcher = $fetcher; + $this->cache = $cache; + $this->cacheConfig = array_merge([ + 'lifetime' => 1500, + 'prefix' => '', + ], (array) $cacheConfig); + } + + /** + * Implements FetchAuthTokenInterface#fetchAuthToken. + * + * Checks the cache for a valid auth token and fetches the auth tokens + * from the supplied fetcher. + * + * @param callable $httpHandler callback which delivers psr7 request + * + * @return array the response + * + * @throws \Exception + */ + public function fetchAuthToken(callable $httpHandler = null) + { + // Use the cached value if its available. + // + // TODO: correct caching; update the call to setCachedValue to set the expiry + // to the value returned with the auth token. + // + // TODO: correct caching; enable the cache to be cleared. + $cacheKey = $this->fetcher->getCacheKey(); + $cached = $this->getCachedValue($cacheKey); + if (!empty($cached)) { + return ['access_token' => $cached]; + } + + $auth_token = $this->fetcher->fetchAuthToken($httpHandler); + + if (isset($auth_token['access_token'])) { + $this->setCachedValue($cacheKey, $auth_token['access_token']); + } + + return $auth_token; + } + + /** + * @return string + */ + public function getCacheKey() + { + return $this->getFullCacheKey($this->fetcher->getCacheKey()); + } + + /** + * @return array|null + */ + public function getLastReceivedToken() + { + return $this->fetcher->getLastReceivedToken(); + } + + /** + * Get the client name from the fetcher. + * + * @param callable $httpHandler An HTTP handler to deliver PSR7 requests. + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + return $this->fetcher->getClientName($httpHandler); + } + + /** + * Sign a blob using the fetcher. + * + * @param string $stringToSign The string to sign. + * @param bool $forceOpenssl Require use of OpenSSL for local signing. Does + * not apply to signing done using external services. **Defaults to** + * `false`. + * @return string The resulting signature. + * @throws \RuntimeException If the fetcher does not implement + * `Google\Auth\SignBlobInterface`. + */ + public function signBlob($stringToSign, $forceOpenSsl = false) + { + if (!$this->fetcher instanceof SignBlobInterface) { + throw new \RuntimeException( + 'Credentials fetcher does not implement ' . + 'Google\Auth\SignBlobInterface' + ); + } + + return $this->fetcher->signBlob($stringToSign, $forceOpenSsl); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenInterface.php new file mode 100644 index 0000000..e3d8d28 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/FetchAuthTokenInterface.php @@ -0,0 +1,55 @@ +client = $client; + } + + /** + * Accepts a PSR-7 Request and an array of options and returns a PSR-7 response. + * + * @param RequestInterface $request + * @param array $options + * + * @return ResponseInterface + */ + public function __invoke(RequestInterface $request, array $options = []) + { + $response = $this->client->send( + $this->createGuzzle5Request($request, $options) + ); + + return $this->createPsr7Response($response); + } + + /** + * Accepts a PSR-7 request and an array of options and returns a PromiseInterface + * + * @param RequestInterface $request + * @param array $options + * + * @return Promise + */ + public function async(RequestInterface $request, array $options = []) + { + if (!class_exists('GuzzleHttp\Promise\Promise')) { + throw new Exception('Install guzzlehttp/promises to use async with Guzzle 5'); + } + + $futureResponse = $this->client->send( + $this->createGuzzle5Request( + $request, + ['future' => true] + $options + ) + ); + + $promise = new Promise( + function () use ($futureResponse) { + try { + $futureResponse->wait(); + } catch (Exception $e) { + // The promise is already delivered when the exception is + // thrown, so don't rethrow it. + } + }, + [$futureResponse, 'cancel'] + ); + + $futureResponse->then([$promise, 'resolve'], [$promise, 'reject']); + + return $promise->then( + function (Guzzle5ResponseInterface $response) { + // Adapt the Guzzle 5 Response to a PSR-7 Response. + return $this->createPsr7Response($response); + }, + function (Exception $e) { + return new RejectedPromise($e); + } + ); + } + + private function createGuzzle5Request(RequestInterface $request, array $options) + { + return $this->client->createRequest( + $request->getMethod(), + $request->getUri(), + array_merge_recursive([ + 'headers' => $request->getHeaders(), + 'body' => $request->getBody(), + ], $options) + ); + } + + private function createPsr7Response(Guzzle5ResponseInterface $response) + { + return new Response( + $response->getStatusCode(), + $response->getHeaders() ?: [], + $response->getBody(), + $response->getProtocolVersion(), + $response->getReasonPhrase() + ); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php new file mode 100644 index 0000000..6dfe9a8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php @@ -0,0 +1,49 @@ +client = $client; + } + + /** + * Accepts a PSR-7 request and an array of options and returns a PSR-7 response. + * + * @param RequestInterface $request + * @param array $options + * + * @return ResponseInterface + */ + public function __invoke(RequestInterface $request, array $options = []) + { + return $this->client->send($request, $options); + } + + /** + * Accepts a PSR-7 request and an array of options and returns a PromiseInterface + * + * @param RequestInterface $request + * @param array $options + * + * @return \GuzzleHttp\Promise\Promise + */ + public function async(RequestInterface $request, array $options = []) + { + return $this->client->sendAsync($request, $options); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/HttpClientCache.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/HttpClientCache.php new file mode 100644 index 0000000..f4a62b9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/HttpHandler/HttpClientCache.php @@ -0,0 +1,54 @@ +httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + } + + /** + * Sign a string using the IAM signBlob API. + * + * Note that signing using IAM requires your service account to have the + * `iam.serviceAccounts.signBlob` permission, part of the "Service Account + * Token Creator" IAM role. + * + * @param string $email The service account email. + * @param string $accessToken An access token from the service account. + * @param string $stringToSign The string to be signed. + * @param array $delegates [optional] A list of service account emails to + * add to the delegate chain. If omitted, the value of `$email` will + * be used. + * @return string The signed string, base64-encoded. + */ + public function signBlob($email, $accessToken, $stringToSign, array $delegates = []) + { + $httpHandler = $this->httpHandler; + $name = sprintf(self::SERVICE_ACCOUNT_NAME, $email); + $uri = self::IAM_API_ROOT . '/' . sprintf(self::SIGN_BLOB_PATH, $name); + + if ($delegates) { + foreach ($delegates as &$delegate) { + $delegate = sprintf(self::SERVICE_ACCOUNT_NAME, $delegate); + } + } else { + $delegates = [$name]; + } + + $body = [ + 'delegates' => $delegates, + 'payload' => base64_encode($stringToSign), + ]; + + $headers = [ + 'Authorization' => 'Bearer ' . $accessToken + ]; + + $request = new Psr7\Request( + 'POST', + $uri, + $headers, + Psr7\stream_for(json_encode($body)) + ); + + $res = $httpHandler($request); + $body = json_decode((string) $res->getBody(), true); + + return $body['signedBlob']; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php new file mode 100644 index 0000000..ee2cf94 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php @@ -0,0 +1,126 @@ +' + */ +class AuthTokenMiddleware +{ + /** + * @var callback + */ + private $httpHandler; + + /** + * @var FetchAuthTokenInterface + */ + private $fetcher; + + /** + * @var callable + */ + private $tokenCallback; + + /** + * Creates a new AuthTokenMiddleware. + * + * @param FetchAuthTokenInterface $fetcher is used to fetch the auth token + * @param callable $httpHandler (optional) callback which delivers psr7 request + * @param callable $tokenCallback (optional) function to be called when a new token is fetched. + */ + public function __construct( + FetchAuthTokenInterface $fetcher, + callable $httpHandler = null, + callable $tokenCallback = null + ) { + $this->fetcher = $fetcher; + $this->httpHandler = $httpHandler; + $this->tokenCallback = $tokenCallback; + } + + /** + * Updates the request with an Authorization header when auth is 'google_auth'. + * + * use Google\Auth\Middleware\AuthTokenMiddleware; + * use Google\Auth\OAuth2; + * use GuzzleHttp\Client; + * use GuzzleHttp\HandlerStack; + * + * $config = [...]; + * $oauth2 = new OAuth2($config) + * $middleware = new AuthTokenMiddleware($oauth2); + * $stack = HandlerStack::create(); + * $stack->push($middleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'auth' => 'google_auth' // authorize all requests + * ]); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + * + * @param callable $handler + * + * @return \Closure + */ + public function __invoke(callable $handler) + { + return function (RequestInterface $request, array $options) use ($handler) { + // Requests using "auth"="google_auth" will be authorized. + if (!isset($options['auth']) || $options['auth'] !== 'google_auth') { + return $handler($request, $options); + } + + $request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken()); + + return $handler($request, $options); + }; + } + + /** + * Call fetcher to fetch the token. + * + * @return string + */ + private function fetchToken() + { + $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler); + + if (array_key_exists('access_token', $auth_tokens)) { + // notify the callback if applicable + if ($this->tokenCallback) { + call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']); + } + + return $auth_tokens['access_token']; + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php new file mode 100644 index 0000000..55f04d1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php @@ -0,0 +1,175 @@ +' + */ +class ScopedAccessTokenMiddleware +{ + use CacheTrait; + + const DEFAULT_CACHE_LIFETIME = 1500; + + /** + * @var CacheItemPoolInterface + */ + private $cache; + + /** + * @var array configuration + */ + private $cacheConfig; + + /** + * @var callable + */ + private $tokenFunc; + + /** + * @var array|string + */ + private $scopes; + + /** + * Creates a new ScopedAccessTokenMiddleware. + * + * @param callable $tokenFunc a token generator function + * @param array|string $scopes the token authentication scopes + * @param array $cacheConfig configuration for the cache when it's present + * @param CacheItemPoolInterface $cache an implementation of CacheItemPoolInterface + */ + public function __construct( + callable $tokenFunc, + $scopes, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $this->tokenFunc = $tokenFunc; + if (!(is_string($scopes) || is_array($scopes))) { + throw new \InvalidArgumentException( + 'wants scope should be string or array'); + } + $this->scopes = $scopes; + + if (!is_null($cache)) { + $this->cache = $cache; + $this->cacheConfig = array_merge([ + 'lifetime' => self::DEFAULT_CACHE_LIFETIME, + 'prefix' => '', + ], $cacheConfig); + } + } + + /** + * Updates the request with an Authorization header when auth is 'scoped'. + * + * E.g this could be used to authenticate using the AppEngine + * AppIdentityService. + * + * use google\appengine\api\app_identity\AppIdentityService; + * use Google\Auth\Middleware\ScopedAccessTokenMiddleware; + * use GuzzleHttp\Client; + * use GuzzleHttp\HandlerStack; + * + * $scope = 'https://www.googleapis.com/auth/taskqueue' + * $middleware = new ScopedAccessTokenMiddleware( + * 'AppIdentityService::getAccessToken', + * $scope, + * [ 'prefix' => 'Google\Auth\ScopedAccessToken::' ], + * $cache = new Memcache() + * ); + * $stack = HandlerStack::create(); + * $stack->push($middleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'auth' => 'scoped' // authorize all requests + * ]); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + * + * @param callable $handler + * + * @return \Closure + */ + public function __invoke(callable $handler) + { + return function (RequestInterface $request, array $options) use ($handler) { + // Requests using "auth"="scoped" will be authorized. + if (!isset($options['auth']) || $options['auth'] !== 'scoped') { + return $handler($request, $options); + } + + $request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken()); + + return $handler($request, $options); + }; + } + + /** + * @return string + */ + private function getCacheKey() + { + $key = null; + + if (is_string($this->scopes)) { + $key .= $this->scopes; + } elseif (is_array($this->scopes)) { + $key .= implode(':', $this->scopes); + } + + return $key; + } + + /** + * Determine if token is available in the cache, if not call tokenFunc to + * fetch it. + * + * @return string + */ + private function fetchToken() + { + $cacheKey = $this->getCacheKey(); + $cached = $this->getCachedValue($cacheKey); + + if (!empty($cached)) { + return $cached; + } + + $token = call_user_func($this->tokenFunc, $this->scopes); + $this->setCachedValue($cacheKey, $token); + + return $token; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/SimpleMiddleware.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/SimpleMiddleware.php new file mode 100644 index 0000000..c31fc65 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Middleware/SimpleMiddleware.php @@ -0,0 +1,93 @@ +config = array_merge(['key' => null], $config); + } + + /** + * Updates the request query with the developer key if auth is set to simple. + * + * use Google\Auth\Middleware\SimpleMiddleware; + * use GuzzleHttp\Client; + * use GuzzleHttp\HandlerStack; + * + * $my_key = 'is not the same as yours'; + * $middleware = new SimpleMiddleware(['key' => $my_key]); + * $stack = HandlerStack::create(); + * $stack->push($middleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/discovery/v1/', + * 'auth' => 'simple' + * ]); + * + * $res = $client->get('drive/v2/rest'); + * + * @param callable $handler + * + * @return \Closure + */ + public function __invoke(callable $handler) + { + return function (RequestInterface $request, array $options) use ($handler) { + // Requests using "auth"="scoped" will be authorized. + if (!isset($options['auth']) || $options['auth'] !== 'simple') { + return $handler($request, $options); + } + + $query = Psr7\parse_query($request->getUri()->getQuery()); + $params = array_merge($query, $this->config); + $uri = $request->getUri()->withQuery(Psr7\build_query($params)); + $request = $request->withUri($uri); + + return $handler($request, $options); + }; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/OAuth2.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/OAuth2.php new file mode 100644 index 0000000..fa3f593 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/OAuth2.php @@ -0,0 +1,1360 @@ + self::DEFAULT_EXPIRY_SECONDS, + 'extensionParams' => [], + 'authorizationUri' => null, + 'redirectUri' => null, + 'tokenCredentialUri' => null, + 'state' => null, + 'username' => null, + 'password' => null, + 'clientId' => null, + 'clientSecret' => null, + 'issuer' => null, + 'sub' => null, + 'audience' => null, + 'signingKey' => null, + 'signingAlgorithm' => null, + 'scope' => null, + 'additionalClaims' => [], + ], $config); + + $this->setAuthorizationUri($opts['authorizationUri']); + $this->setRedirectUri($opts['redirectUri']); + $this->setTokenCredentialUri($opts['tokenCredentialUri']); + $this->setState($opts['state']); + $this->setUsername($opts['username']); + $this->setPassword($opts['password']); + $this->setClientId($opts['clientId']); + $this->setClientSecret($opts['clientSecret']); + $this->setIssuer($opts['issuer']); + $this->setSub($opts['sub']); + $this->setExpiry($opts['expiry']); + $this->setAudience($opts['audience']); + $this->setSigningKey($opts['signingKey']); + $this->setSigningAlgorithm($opts['signingAlgorithm']); + $this->setScope($opts['scope']); + $this->setExtensionParams($opts['extensionParams']); + $this->setAdditionalClaims($opts['additionalClaims']); + $this->updateToken($opts); + } + + /** + * Verifies the idToken if present. + * + * - if none is present, return null + * - if present, but invalid, raises DomainException. + * - otherwise returns the payload in the idtoken as a PHP object. + * + * if $publicKey is null, the key is decoded without being verified. + * + * @param string $publicKey The public key to use to authenticate the token + * @param array $allowed_algs List of supported verification algorithms + * + * @return null|object + */ + public function verifyIdToken($publicKey = null, $allowed_algs = array()) + { + $idToken = $this->getIdToken(); + if (is_null($idToken)) { + return null; + } + + $resp = $this->jwtDecode($idToken, $publicKey, $allowed_algs); + if (!property_exists($resp, 'aud')) { + throw new \DomainException('No audience found the id token'); + } + if ($resp->aud != $this->getAudience()) { + throw new \DomainException('Wrong audience present in the id token'); + } + + return $resp; + } + + /** + * Obtains the encoded jwt from the instance data. + * + * @param array $config array optional configuration parameters + * + * @return string + */ + public function toJwt(array $config = []) + { + if (is_null($this->getSigningKey())) { + throw new \DomainException('No signing key available'); + } + if (is_null($this->getSigningAlgorithm())) { + throw new \DomainException('No signing algorithm specified'); + } + $now = time(); + + $opts = array_merge([ + 'skew' => self::DEFAULT_SKEW_SECONDS, + ], $config); + + $assertion = [ + 'iss' => $this->getIssuer(), + 'aud' => $this->getAudience(), + 'exp' => ($now + $this->getExpiry()), + 'iat' => ($now - $opts['skew']), + ]; + foreach ($assertion as $k => $v) { + if (is_null($v)) { + throw new \DomainException($k . ' should not be null'); + } + } + if (!(is_null($this->getScope()))) { + $assertion['scope'] = $this->getScope(); + } + if (!(is_null($this->getSub()))) { + $assertion['sub'] = $this->getSub(); + } + $assertion += $this->getAdditionalClaims(); + + return $this->jwtEncode($assertion, $this->getSigningKey(), + $this->getSigningAlgorithm()); + } + + /** + * Generates a request for token credentials. + * + * @return RequestInterface the authorization Url. + */ + public function generateCredentialsRequest() + { + $uri = $this->getTokenCredentialUri(); + if (is_null($uri)) { + throw new \DomainException('No token credential URI was set.'); + } + + $grantType = $this->getGrantType(); + $params = array('grant_type' => $grantType); + switch ($grantType) { + case 'authorization_code': + $params['code'] = $this->getCode(); + $params['redirect_uri'] = $this->getRedirectUri(); + $this->addClientCredentials($params); + break; + case 'password': + $params['username'] = $this->getUsername(); + $params['password'] = $this->getPassword(); + $this->addClientCredentials($params); + break; + case 'refresh_token': + $params['refresh_token'] = $this->getRefreshToken(); + $this->addClientCredentials($params); + break; + case self::JWT_URN: + $params['assertion'] = $this->toJwt(); + break; + default: + if (!is_null($this->getRedirectUri())) { + # Grant type was supposed to be 'authorization_code', as there + # is a redirect URI. + throw new \DomainException('Missing authorization code'); + } + unset($params['grant_type']); + if (!is_null($grantType)) { + $params['grant_type'] = $grantType; + } + $params = array_merge($params, $this->getExtensionParams()); + } + + $headers = [ + 'Cache-Control' => 'no-store', + 'Content-Type' => 'application/x-www-form-urlencoded', + ]; + + return new Request( + 'POST', + $uri, + $headers, + Psr7\build_query($params) + ); + } + + /** + * Fetches the auth tokens based on the current state. + * + * @param callable $httpHandler callback which delivers psr7 request + * + * @return array the response + */ + public function fetchAuthToken(callable $httpHandler = null) + { + if (is_null($httpHandler)) { + $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + } + + $response = $httpHandler($this->generateCredentialsRequest()); + $credentials = $this->parseTokenResponse($response); + $this->updateToken($credentials); + + return $credentials; + } + + /** + * Obtains a key that can used to cache the results of #fetchAuthToken. + * + * The key is derived from the scopes. + * + * @return string a key that may be used to cache the auth token. + */ + public function getCacheKey() + { + if (is_string($this->scope)) { + return $this->scope; + } + + if (is_array($this->scope)) { + return implode(':', $this->scope); + } + + // If scope has not set, return null to indicate no caching. + return null; + } + + /** + * Parses the fetched tokens. + * + * @param ResponseInterface $resp the response. + * + * @return array the tokens parsed from the response body. + * + * @throws \Exception + */ + public function parseTokenResponse(ResponseInterface $resp) + { + $body = (string)$resp->getBody(); + if ($resp->hasHeader('Content-Type') && + $resp->getHeaderLine('Content-Type') == 'application/x-www-form-urlencoded' + ) { + $res = array(); + parse_str($body, $res); + + return $res; + } + + // Assume it's JSON; if it's not throw an exception + if (null === $res = json_decode($body, true)) { + throw new \Exception('Invalid JSON response'); + } + + return $res; + } + + /** + * Updates an OAuth 2.0 client. + * + * @example + * client.updateToken([ + * 'refresh_token' => 'n4E9O119d', + * 'access_token' => 'FJQbwq9', + * 'expires_in' => 3600 + * ]) + * + * @param array $config + * The configuration parameters related to the token. + * + * - refresh_token + * The refresh token associated with the access token + * to be refreshed. + * + * - access_token + * The current access token for this client. + * + * - id_token + * The current ID token for this client. + * + * - expires_in + * The time in seconds until access token expiration. + * + * - expires_at + * The time as an integer number of seconds since the Epoch + * + * - issued_at + * The timestamp that the token was issued at. + */ + public function updateToken(array $config) + { + $opts = array_merge([ + 'extensionParams' => [], + 'access_token' => null, + 'id_token' => null, + 'expires_in' => null, + 'expires_at' => null, + 'issued_at' => null, + ], $config); + + $this->setExpiresAt($opts['expires_at']); + $this->setExpiresIn($opts['expires_in']); + // By default, the token is issued at `Time.now` when `expiresIn` is set, + // but this can be used to supply a more precise time. + if (!is_null($opts['issued_at'])) { + $this->setIssuedAt($opts['issued_at']); + } + + $this->setAccessToken($opts['access_token']); + $this->setIdToken($opts['id_token']); + // The refresh token should only be updated if a value is explicitly + // passed in, as some access token responses do not include a refresh + // token. + if (array_key_exists('refresh_token', $opts)) { + $this->setRefreshToken($opts['refresh_token']); + } + } + + /** + * Builds the authorization Uri that the user should be redirected to. + * + * @param array $config configuration options that customize the return url + * + * @return UriInterface the authorization Url. + * + * @throws InvalidArgumentException + */ + public function buildFullAuthorizationUri(array $config = []) + { + if (is_null($this->getAuthorizationUri())) { + throw new InvalidArgumentException( + 'requires an authorizationUri to have been set'); + } + + $params = array_merge([ + 'response_type' => 'code', + 'access_type' => 'offline', + 'client_id' => $this->clientId, + 'redirect_uri' => $this->redirectUri, + 'state' => $this->state, + 'scope' => $this->getScope(), + ], $config); + + // Validate the auth_params + if (is_null($params['client_id'])) { + throw new InvalidArgumentException( + 'missing the required client identifier'); + } + if (is_null($params['redirect_uri'])) { + throw new InvalidArgumentException('missing the required redirect URI'); + } + if (!empty($params['prompt']) && !empty($params['approval_prompt'])) { + throw new InvalidArgumentException( + 'prompt and approval_prompt are mutually exclusive'); + } + + // Construct the uri object; return it if it is valid. + $result = clone $this->authorizationUri; + $existingParams = Psr7\parse_query($result->getQuery()); + + $result = $result->withQuery( + Psr7\build_query(array_merge($existingParams, $params)) + ); + + if ($result->getScheme() != 'https') { + throw new InvalidArgumentException( + 'Authorization endpoint must be protected by TLS'); + } + + return $result; + } + + /** + * Sets the authorization server's HTTP endpoint capable of authenticating + * the end-user and obtaining authorization. + * + * @param string $uri + */ + public function setAuthorizationUri($uri) + { + $this->authorizationUri = $this->coerceUri($uri); + } + + /** + * Gets the authorization server's HTTP endpoint capable of authenticating + * the end-user and obtaining authorization. + * + * @return UriInterface + */ + public function getAuthorizationUri() + { + return $this->authorizationUri; + } + + /** + * Gets the authorization server's HTTP endpoint capable of issuing tokens + * and refreshing expired tokens. + * + * @return string + */ + public function getTokenCredentialUri() + { + return $this->tokenCredentialUri; + } + + /** + * Sets the authorization server's HTTP endpoint capable of issuing tokens + * and refreshing expired tokens. + * + * @param string $uri + */ + public function setTokenCredentialUri($uri) + { + $this->tokenCredentialUri = $this->coerceUri($uri); + } + + /** + * Gets the redirection URI used in the initial request. + * + * @return string + */ + public function getRedirectUri() + { + return $this->redirectUri; + } + + /** + * Sets the redirection URI used in the initial request. + * + * @param string $uri + */ + public function setRedirectUri($uri) + { + if (is_null($uri)) { + $this->redirectUri = null; + + return; + } + // redirect URI must be absolute + if (!$this->isAbsoluteUri($uri)) { + // "postmessage" is a reserved URI string in Google-land + // @see https://developers.google.com/identity/sign-in/web/server-side-flow + if ('postmessage' !== (string)$uri) { + throw new InvalidArgumentException( + 'Redirect URI must be absolute'); + } + } + $this->redirectUri = (string)$uri; + } + + /** + * Gets the scope of the access requests as a space-delimited String. + * + * @return string + */ + public function getScope() + { + if (is_null($this->scope)) { + return $this->scope; + } + + return implode(' ', $this->scope); + } + + /** + * Sets the scope of the access request, expressed either as an Array or as + * a space-delimited String. + * + * @param string|array $scope + * + * @throws InvalidArgumentException + */ + public function setScope($scope) + { + if (is_null($scope)) { + $this->scope = null; + } elseif (is_string($scope)) { + $this->scope = explode(' ', $scope); + } elseif (is_array($scope)) { + foreach ($scope as $s) { + $pos = strpos($s, ' '); + if ($pos !== false) { + throw new InvalidArgumentException( + 'array scope values should not contain spaces'); + } + } + $this->scope = $scope; + } else { + throw new InvalidArgumentException( + 'scopes should be a string or array of strings'); + } + } + + /** + * Gets the current grant type. + * + * @return string + */ + public function getGrantType() + { + if (!is_null($this->grantType)) { + return $this->grantType; + } + + // Returns the inferred grant type, based on the current object instance + // state. + if (!is_null($this->code)) { + return 'authorization_code'; + } + + if (!is_null($this->refreshToken)) { + return 'refresh_token'; + } + + if (!is_null($this->username) && !is_null($this->password)) { + return 'password'; + } + + if (!is_null($this->issuer) && !is_null($this->signingKey)) { + return self::JWT_URN; + } + + return null; + } + + /** + * Sets the current grant type. + * + * @param $grantType + * + * @throws InvalidArgumentException + */ + public function setGrantType($grantType) + { + if (in_array($grantType, self::$knownGrantTypes)) { + $this->grantType = $grantType; + } else { + // validate URI + if (!$this->isAbsoluteUri($grantType)) { + throw new InvalidArgumentException( + 'invalid grant type'); + } + $this->grantType = (string)$grantType; + } + } + + /** + * Gets an arbitrary string designed to allow the client to maintain state. + * + * @return string + */ + public function getState() + { + return $this->state; + } + + /** + * Sets an arbitrary string designed to allow the client to maintain state. + * + * @param string $state + */ + public function setState($state) + { + $this->state = $state; + } + + /** + * Gets the authorization code issued to this client. + */ + public function getCode() + { + return $this->code; + } + + /** + * Sets the authorization code issued to this client. + * + * @param string $code + */ + public function setCode($code) + { + $this->code = $code; + } + + /** + * Gets the resource owner's username. + */ + public function getUsername() + { + return $this->username; + } + + /** + * Sets the resource owner's username. + * + * @param string $username + */ + public function setUsername($username) + { + $this->username = $username; + } + + /** + * Gets the resource owner's password. + */ + public function getPassword() + { + return $this->password; + } + + /** + * Sets the resource owner's password. + * + * @param $password + */ + public function setPassword($password) + { + $this->password = $password; + } + + /** + * Sets a unique identifier issued to the client to identify itself to the + * authorization server. + */ + public function getClientId() + { + return $this->clientId; + } + + /** + * Sets a unique identifier issued to the client to identify itself to the + * authorization server. + * + * @param $clientId + */ + public function setClientId($clientId) + { + $this->clientId = $clientId; + } + + /** + * Gets a shared symmetric secret issued by the authorization server, which + * is used to authenticate the client. + */ + public function getClientSecret() + { + return $this->clientSecret; + } + + /** + * Sets a shared symmetric secret issued by the authorization server, which + * is used to authenticate the client. + * + * @param $clientSecret + */ + public function setClientSecret($clientSecret) + { + $this->clientSecret = $clientSecret; + } + + /** + * Gets the Issuer ID when using assertion profile. + */ + public function getIssuer() + { + return $this->issuer; + } + + /** + * Sets the Issuer ID when using assertion profile. + * + * @param string $issuer + */ + public function setIssuer($issuer) + { + $this->issuer = $issuer; + } + + /** + * Gets the target sub when issuing assertions. + */ + public function getSub() + { + return $this->sub; + } + + /** + * Sets the target sub when issuing assertions. + * + * @param string $sub + */ + public function setSub($sub) + { + $this->sub = $sub; + } + + /** + * Gets the target audience when issuing assertions. + */ + public function getAudience() + { + return $this->audience; + } + + /** + * Sets the target audience when issuing assertions. + * + * @param string $audience + */ + public function setAudience($audience) + { + $this->audience = $audience; + } + + /** + * Gets the signing key when using an assertion profile. + */ + public function getSigningKey() + { + return $this->signingKey; + } + + /** + * Sets the signing key when using an assertion profile. + * + * @param string $signingKey + */ + public function setSigningKey($signingKey) + { + $this->signingKey = $signingKey; + } + + /** + * Gets the signing algorithm when using an assertion profile. + * + * @return string + */ + public function getSigningAlgorithm() + { + return $this->signingAlgorithm; + } + + /** + * Sets the signing algorithm when using an assertion profile. + * + * @param string $signingAlgorithm + */ + public function setSigningAlgorithm($signingAlgorithm) + { + if (is_null($signingAlgorithm)) { + $this->signingAlgorithm = null; + } elseif (!in_array($signingAlgorithm, self::$knownSigningAlgorithms)) { + throw new InvalidArgumentException('unknown signing algorithm'); + } else { + $this->signingAlgorithm = $signingAlgorithm; + } + } + + /** + * Gets the set of parameters used by extension when using an extension + * grant type. + */ + public function getExtensionParams() + { + return $this->extensionParams; + } + + /** + * Sets the set of parameters used by extension when using an extension + * grant type. + * + * @param $extensionParams + */ + public function setExtensionParams($extensionParams) + { + $this->extensionParams = $extensionParams; + } + + /** + * Gets the number of seconds assertions are valid for. + */ + public function getExpiry() + { + return $this->expiry; + } + + /** + * Sets the number of seconds assertions are valid for. + * + * @param int $expiry + */ + public function setExpiry($expiry) + { + $this->expiry = $expiry; + } + + /** + * Gets the lifetime of the access token in seconds. + */ + public function getExpiresIn() + { + return $this->expiresIn; + } + + /** + * Sets the lifetime of the access token in seconds. + * + * @param int $expiresIn + */ + public function setExpiresIn($expiresIn) + { + if (is_null($expiresIn)) { + $this->expiresIn = null; + $this->issuedAt = null; + } else { + $this->issuedAt = time(); + $this->expiresIn = (int)$expiresIn; + } + } + + /** + * Gets the time the current access token expires at. + * + * @return int + */ + public function getExpiresAt() + { + if (!is_null($this->expiresAt)) { + return $this->expiresAt; + } + + if (!is_null($this->issuedAt) && !is_null($this->expiresIn)) { + return $this->issuedAt + $this->expiresIn; + } + + return null; + } + + /** + * Returns true if the acccess token has expired. + * + * @return bool + */ + public function isExpired() + { + $expiration = $this->getExpiresAt(); + $now = time(); + + return !is_null($expiration) && $now >= $expiration; + } + + /** + * Sets the time the current access token expires at. + * + * @param int $expiresAt + */ + public function setExpiresAt($expiresAt) + { + $this->expiresAt = $expiresAt; + } + + /** + * Gets the time the current access token was issued at. + */ + public function getIssuedAt() + { + return $this->issuedAt; + } + + /** + * Sets the time the current access token was issued at. + * + * @param int $issuedAt + */ + public function setIssuedAt($issuedAt) + { + $this->issuedAt = $issuedAt; + } + + /** + * Gets the current access token. + */ + public function getAccessToken() + { + return $this->accessToken; + } + + /** + * Sets the current access token. + * + * @param string $accessToken + */ + public function setAccessToken($accessToken) + { + $this->accessToken = $accessToken; + } + + /** + * Gets the current ID token. + */ + public function getIdToken() + { + return $this->idToken; + } + + /** + * Sets the current ID token. + * + * @param $idToken + */ + public function setIdToken($idToken) + { + $this->idToken = $idToken; + } + + /** + * Gets the refresh token associated with the current access token. + */ + public function getRefreshToken() + { + return $this->refreshToken; + } + + /** + * Sets the refresh token associated with the current access token. + * + * @param $refreshToken + */ + public function setRefreshToken($refreshToken) + { + $this->refreshToken = $refreshToken; + } + + /** + * Sets additional claims to be included in the JWT token + * + * @param array $additionalClaims + */ + public function setAdditionalClaims(array $additionalClaims) + { + $this->additionalClaims = $additionalClaims; + } + + /** + * Gets the additional claims to be included in the JWT token. + * + * @return array + */ + public function getAdditionalClaims() + { + return $this->additionalClaims; + } + + /** + * The expiration of the last received token. + * + * @return array + */ + public function getLastReceivedToken() + { + if ($token = $this->getAccessToken()) { + return [ + 'access_token' => $token, + 'expires_at' => $this->getExpiresAt(), + ]; + } + + return null; + } + + /** + * Get the client ID. + * + * Alias of {@see Google\Auth\OAuth2::getClientId()}. + * + * @param callable $httpHandler + * @return string + * @access private + */ + public function getClientName(callable $httpHandler = null) + { + return $this->getClientId(); + } + + /** + * @todo handle uri as array + * + * @param string $uri + * + * @return null|UriInterface + */ + private function coerceUri($uri) + { + if (is_null($uri)) { + return; + } + + return Psr7\uri_for($uri); + } + + /** + * @param string $idToken + * @param string|array|null $publicKey + * @param array $allowedAlgs + * + * @return object + */ + private function jwtDecode($idToken, $publicKey, $allowedAlgs) + { + if (class_exists('Firebase\JWT\JWT')) { + return \Firebase\JWT\JWT::decode($idToken, $publicKey, $allowedAlgs); + } + + return \JWT::decode($idToken, $publicKey, $allowedAlgs); + } + + private function jwtEncode($assertion, $signingKey, $signingAlgorithm) + { + if (class_exists('Firebase\JWT\JWT')) { + return \Firebase\JWT\JWT::encode($assertion, $signingKey, + $signingAlgorithm); + } + + return \JWT::encode($assertion, $signingKey, $signingAlgorithm); + } + + /** + * Determines if the URI is absolute based on its scheme and host or path + * (RFC 3986). + * + * @param string $uri + * + * @return bool + */ + private function isAbsoluteUri($uri) + { + $uri = $this->coerceUri($uri); + + return $uri->getScheme() && ($uri->getHost() || $uri->getPath()); + } + + /** + * @param array $params + * + * @return array + */ + private function addClientCredentials(&$params) + { + $clientId = $this->getClientId(); + $clientSecret = $this->getClientSecret(); + + if ($clientId && $clientSecret) { + $params['client_id'] = $clientId; + $params['client_secret'] = $clientSecret; + } + + return $params; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ServiceAccountSignerTrait.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ServiceAccountSignerTrait.php new file mode 100644 index 0000000..72fb142 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/ServiceAccountSignerTrait.php @@ -0,0 +1,57 @@ +auth->getSigningKey(); + + $signedString = ''; + if (class_exists('\\phpseclib\\Crypt\\RSA') && !$forceOpenssl) { + $rsa = new RSA; + $rsa->loadKey($privateKey); + $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1); + $rsa->setHash('sha256'); + + $signedString = $rsa->sign($stringToSign); + } elseif (extension_loaded('openssl')) { + openssl_sign($stringToSign, $signedString, $privateKey, 'sha256WithRSAEncryption'); + } else { + // @codeCoverageIgnoreStart + throw new \RuntimeException('OpenSSL is not installed.'); + } + // @codeCoverageIgnoreEnd + + return base64_encode($signedString); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/SignBlobInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/SignBlobInterface.php new file mode 100644 index 0000000..5f2c944 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/SignBlobInterface.php @@ -0,0 +1,44 @@ +' + */ +class AuthTokenSubscriber implements SubscriberInterface +{ + /** + * @var callable + */ + private $httpHandler; + + /** + * @var FetchAuthTokenInterface + */ + private $fetcher; + + /** + * @var callable + */ + private $tokenCallback; + + /** + * Creates a new AuthTokenSubscriber. + * + * @param FetchAuthTokenInterface $fetcher is used to fetch the auth token + * @param callable $httpHandler (optional) http client to fetch the token. + * @param callable $tokenCallback (optional) function to be called when a new token is fetched. + */ + public function __construct( + FetchAuthTokenInterface $fetcher, + callable $httpHandler = null, + callable $tokenCallback = null + ) { + $this->fetcher = $fetcher; + $this->httpHandler = $httpHandler; + $this->tokenCallback = $tokenCallback; + } + + /** + * @return array + */ + public function getEvents() + { + return ['before' => ['onBefore', RequestEvents::SIGN_REQUEST]]; + } + + /** + * Updates the request with an Authorization header when auth is 'fetched_auth_token'. + * + * use GuzzleHttp\Client; + * use Google\Auth\OAuth2; + * use Google\Auth\Subscriber\AuthTokenSubscriber; + * + * $config = [...]; + * $oauth2 = new OAuth2($config) + * $subscriber = new AuthTokenSubscriber($oauth2); + * + * $client = new Client([ + * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'defaults' => ['auth' => 'google_auth'] + * ]); + * $client->getEmitter()->attach($subscriber); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + * + * @param BeforeEvent $event + */ + public function onBefore(BeforeEvent $event) + { + // Requests using "auth"="google_auth" will be authorized. + $request = $event->getRequest(); + if ($request->getConfig()['auth'] != 'google_auth') { + return; + } + + // Fetch the auth token. + $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler); + if (array_key_exists('access_token', $auth_tokens)) { + $request->setHeader('authorization', 'Bearer ' . $auth_tokens['access_token']); + + // notify the callback if applicable + if ($this->tokenCallback) { + call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']); + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php new file mode 100644 index 0000000..63b4ca2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php @@ -0,0 +1,177 @@ +' + */ +class ScopedAccessTokenSubscriber implements SubscriberInterface +{ + use CacheTrait; + + const DEFAULT_CACHE_LIFETIME = 1500; + + /** + * @var CacheItemPoolInterface + */ + private $cache; + + /** + * @var callable The access token generator function + */ + private $tokenFunc; + + /** + * @var array|string The scopes used to generate the token + */ + private $scopes; + + /** + * @var array + */ + private $cacheConfig; + + /** + * Creates a new ScopedAccessTokenSubscriber. + * + * @param callable $tokenFunc a token generator function + * @param array|string $scopes the token authentication scopes + * @param array $cacheConfig configuration for the cache when it's present + * @param CacheItemPoolInterface $cache an implementation of CacheItemPoolInterface + */ + public function __construct( + callable $tokenFunc, + $scopes, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $this->tokenFunc = $tokenFunc; + if (!(is_string($scopes) || is_array($scopes))) { + throw new \InvalidArgumentException( + 'wants scope should be string or array'); + } + $this->scopes = $scopes; + + if (!is_null($cache)) { + $this->cache = $cache; + $this->cacheConfig = array_merge([ + 'lifetime' => self::DEFAULT_CACHE_LIFETIME, + 'prefix' => '', + ], $cacheConfig); + } + } + + /** + * @return array + */ + public function getEvents() + { + return ['before' => ['onBefore', RequestEvents::SIGN_REQUEST]]; + } + + /** + * Updates the request with an Authorization header when auth is 'scoped'. + * + * E.g this could be used to authenticate using the AppEngine + * AppIdentityService. + * + * use google\appengine\api\app_identity\AppIdentityService; + * use Google\Auth\Subscriber\ScopedAccessTokenSubscriber; + * use GuzzleHttp\Client; + * + * $scope = 'https://www.googleapis.com/auth/taskqueue' + * $subscriber = new ScopedAccessToken( + * 'AppIdentityService::getAccessToken', + * $scope, + * ['prefix' => 'Google\Auth\ScopedAccessToken::'], + * $cache = new Memcache() + * ); + * + * $client = new Client([ + * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'defaults' => ['auth' => 'scoped'] + * ]); + * $client->getEmitter()->attach($subscriber); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + * + * @param BeforeEvent $event + */ + public function onBefore(BeforeEvent $event) + { + // Requests using "auth"="scoped" will be authorized. + $request = $event->getRequest(); + if ($request->getConfig()['auth'] != 'scoped') { + return; + } + $auth_header = 'Bearer ' . $this->fetchToken(); + $request->setHeader('authorization', $auth_header); + } + + /** + * @return string + */ + private function getCacheKey() + { + $key = null; + + if (is_string($this->scopes)) { + $key .= $this->scopes; + } elseif (is_array($this->scopes)) { + $key .= implode(':', $this->scopes); + } + + return $key; + } + + /** + * Determine if token is available in the cache, if not call tokenFunc to + * fetch it. + * + * @return string + */ + private function fetchToken() + { + $cacheKey = $this->getCacheKey(); + $cached = $this->getCachedValue($cacheKey); + + if (!empty($cached)) { + return $cached; + } + + $token = call_user_func($this->tokenFunc, $this->scopes); + $this->setCachedValue($cacheKey, $token); + + return $token; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/SimpleSubscriber.php b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/SimpleSubscriber.php new file mode 100644 index 0000000..0c56731 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/google/auth/src/Subscriber/SimpleSubscriber.php @@ -0,0 +1,90 @@ +config = array_merge([], $config); + } + + /** + * @return array + */ + public function getEvents() + { + return ['before' => ['onBefore', RequestEvents::SIGN_REQUEST]]; + } + + /** + * Updates the request query with the developer key if auth is set to simple. + * + * use Google\Auth\Subscriber\SimpleSubscriber; + * use GuzzleHttp\Client; + * + * $my_key = 'is not the same as yours'; + * $subscriber = new SimpleSubscriber(['key' => $my_key]); + * + * $client = new Client([ + * 'base_url' => 'https://www.googleapis.com/discovery/v1/', + * 'defaults' => ['auth' => 'simple'] + * ]); + * $client->getEmitter()->attach($subscriber); + * + * $res = $client->get('drive/v2/rest'); + * + * @param BeforeEvent $event + */ + public function onBefore(BeforeEvent $event) + { + // Requests using "auth"="simple" with the developer key. + $request = $event->getRequest(); + if ($request->getConfig()['auth'] != 'simple') { + return; + } + $request->getQuery()->overwriteWith($this->config); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/Dockerfile b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/Dockerfile new file mode 100644 index 0000000..f6a0952 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/Dockerfile @@ -0,0 +1,18 @@ +FROM composer:latest as setup + +RUN mkdir /guzzle + +WORKDIR /guzzle + +RUN set -xe \ + && composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="Márk Sági-Kazár " --no-interaction \ + && composer require guzzlehttp/guzzle + + +FROM php:7.3 + +RUN mkdir /guzzle + +WORKDIR /guzzle + +COPY --from=setup /guzzle /guzzle diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/LICENSE b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/LICENSE new file mode 100644 index 0000000..50a177b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Client.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Client.php new file mode 100644 index 0000000..0f43c71 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Client.php @@ -0,0 +1,422 @@ + 'http://www.foo.com/1.0/', + * 'timeout' => 0, + * 'allow_redirects' => false, + * 'proxy' => '192.168.16.1:10' + * ]); + * + * Client configuration settings include the following options: + * + * - handler: (callable) Function that transfers HTTP requests over the + * wire. The function is called with a Psr7\Http\Message\RequestInterface + * and array of transfer options, and must return a + * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a + * Psr7\Http\Message\ResponseInterface on success. "handler" is a + * constructor only option that cannot be overridden in per/request + * options. If no handler is provided, a default handler will be created + * that enables all of the request options below by attaching all of the + * default middleware to the handler. + * - base_uri: (string|UriInterface) Base URI of the client that is merged + * into relative URIs. Can be a string or instance of UriInterface. + * - **: any request option + * + * @param array $config Client configuration settings. + * + * @see \GuzzleHttp\RequestOptions for a list of available request options. + */ + public function __construct(array $config = []) + { + if (!isset($config['handler'])) { + $config['handler'] = HandlerStack::create(); + } elseif (!is_callable($config['handler'])) { + throw new \InvalidArgumentException('handler must be a callable'); + } + + // Convert the base_uri to a UriInterface + if (isset($config['base_uri'])) { + $config['base_uri'] = Psr7\uri_for($config['base_uri']); + } + + $this->configureDefaults($config); + } + + public function __call($method, $args) + { + if (count($args) < 1) { + throw new \InvalidArgumentException('Magic request methods require a URI and optional options array'); + } + + $uri = $args[0]; + $opts = isset($args[1]) ? $args[1] : []; + + return substr($method, -5) === 'Async' + ? $this->requestAsync(substr($method, 0, -5), $uri, $opts) + : $this->request($method, $uri, $opts); + } + + public function sendAsync(RequestInterface $request, array $options = []) + { + // Merge the base URI into the request URI if needed. + $options = $this->prepareDefaults($options); + + return $this->transfer( + $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), + $options + ); + } + + public function send(RequestInterface $request, array $options = []) + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->sendAsync($request, $options)->wait(); + } + + public function requestAsync($method, $uri = '', array $options = []) + { + $options = $this->prepareDefaults($options); + // Remove request modifying parameter because it can be done up-front. + $headers = isset($options['headers']) ? $options['headers'] : []; + $body = isset($options['body']) ? $options['body'] : null; + $version = isset($options['version']) ? $options['version'] : '1.1'; + // Merge the URI into the base URI. + $uri = $this->buildUri($uri, $options); + if (is_array($body)) { + $this->invalidBody(); + } + $request = new Psr7\Request($method, $uri, $headers, $body, $version); + // Remove the option so that they are not doubly-applied. + unset($options['headers'], $options['body'], $options['version']); + + return $this->transfer($request, $options); + } + + public function request($method, $uri = '', array $options = []) + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->requestAsync($method, $uri, $options)->wait(); + } + + public function getConfig($option = null) + { + return $option === null + ? $this->config + : (isset($this->config[$option]) ? $this->config[$option] : null); + } + + private function buildUri($uri, array $config) + { + // for BC we accept null which would otherwise fail in uri_for + $uri = Psr7\uri_for($uri === null ? '' : $uri); + + if (isset($config['base_uri'])) { + $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); + } + + return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; + } + + /** + * Configures the default options for a client. + * + * @param array $config + */ + private function configureDefaults(array $config) + { + $defaults = [ + 'allow_redirects' => RedirectMiddleware::$defaultSettings, + 'http_errors' => true, + 'decode_content' => true, + 'verify' => true, + 'cookies' => false + ]; + + // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. + + // We can only trust the HTTP_PROXY environment variable in a CLI + // process due to the fact that PHP has no reliable mechanism to + // get environment variables that start with "HTTP_". + if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) { + $defaults['proxy']['http'] = getenv('HTTP_PROXY'); + } + + if ($proxy = getenv('HTTPS_PROXY')) { + $defaults['proxy']['https'] = $proxy; + } + + if ($noProxy = getenv('NO_PROXY')) { + $cleanedNoProxy = str_replace(' ', '', $noProxy); + $defaults['proxy']['no'] = explode(',', $cleanedNoProxy); + } + + $this->config = $config + $defaults; + + if (!empty($config['cookies']) && $config['cookies'] === true) { + $this->config['cookies'] = new CookieJar(); + } + + // Add the default user-agent header. + if (!isset($this->config['headers'])) { + $this->config['headers'] = ['User-Agent' => default_user_agent()]; + } else { + // Add the User-Agent header if one was not already set. + foreach (array_keys($this->config['headers']) as $name) { + if (strtolower($name) === 'user-agent') { + return; + } + } + $this->config['headers']['User-Agent'] = default_user_agent(); + } + } + + /** + * Merges default options into the array. + * + * @param array $options Options to modify by reference + * + * @return array + */ + private function prepareDefaults(array $options) + { + $defaults = $this->config; + + if (!empty($defaults['headers'])) { + // Default headers are only added if they are not present. + $defaults['_conditional'] = $defaults['headers']; + unset($defaults['headers']); + } + + // Special handling for headers is required as they are added as + // conditional headers and as headers passed to a request ctor. + if (array_key_exists('headers', $options)) { + // Allows default headers to be unset. + if ($options['headers'] === null) { + $defaults['_conditional'] = null; + unset($options['headers']); + } elseif (!is_array($options['headers'])) { + throw new \InvalidArgumentException('headers must be an array'); + } + } + + // Shallow merge defaults underneath options. + $result = $options + $defaults; + + // Remove null values. + foreach ($result as $k => $v) { + if ($v === null) { + unset($result[$k]); + } + } + + return $result; + } + + /** + * Transfers the given request and applies request options. + * + * The URI of the request is not modified and the request options are used + * as-is without merging in default options. + * + * @param RequestInterface $request + * @param array $options + * + * @return Promise\PromiseInterface + */ + private function transfer(RequestInterface $request, array $options) + { + // save_to -> sink + if (isset($options['save_to'])) { + $options['sink'] = $options['save_to']; + unset($options['save_to']); + } + + // exceptions -> http_errors + if (isset($options['exceptions'])) { + $options['http_errors'] = $options['exceptions']; + unset($options['exceptions']); + } + + $request = $this->applyOptions($request, $options); + $handler = $options['handler']; + + try { + return Promise\promise_for($handler($request, $options)); + } catch (\Exception $e) { + return Promise\rejection_for($e); + } + } + + /** + * Applies the array of request options to a request. + * + * @param RequestInterface $request + * @param array $options + * + * @return RequestInterface + */ + private function applyOptions(RequestInterface $request, array &$options) + { + $modify = [ + 'set_headers' => [], + ]; + + if (isset($options['headers'])) { + $modify['set_headers'] = $options['headers']; + unset($options['headers']); + } + + if (isset($options['form_params'])) { + if (isset($options['multipart'])) { + throw new \InvalidArgumentException('You cannot use ' + . 'form_params and multipart at the same time. Use the ' + . 'form_params option if you want to send application/' + . 'x-www-form-urlencoded requests, and the multipart ' + . 'option to send multipart/form-data requests.'); + } + $options['body'] = http_build_query($options['form_params'], '', '&'); + unset($options['form_params']); + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + if (isset($options['multipart'])) { + $options['body'] = new Psr7\MultipartStream($options['multipart']); + unset($options['multipart']); + } + + if (isset($options['json'])) { + $options['body'] = \GuzzleHttp\json_encode($options['json']); + unset($options['json']); + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'application/json'; + } + + if (!empty($options['decode_content']) + && $options['decode_content'] !== true + ) { + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); + $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; + } + + if (isset($options['body'])) { + if (is_array($options['body'])) { + $this->invalidBody(); + } + $modify['body'] = Psr7\stream_for($options['body']); + unset($options['body']); + } + + if (!empty($options['auth']) && is_array($options['auth'])) { + $value = $options['auth']; + $type = isset($value[2]) ? strtolower($value[2]) : 'basic'; + switch ($type) { + case 'basic': + // Ensure that we don't have the header in different case and set the new value. + $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']); + $modify['set_headers']['Authorization'] = 'Basic ' + . base64_encode("$value[0]:$value[1]"); + break; + case 'digest': + // @todo: Do not rely on curl + $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST; + $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; + break; + case 'ntlm': + $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM; + $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; + break; + } + } + + if (isset($options['query'])) { + $value = $options['query']; + if (is_array($value)) { + $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986); + } + if (!is_string($value)) { + throw new \InvalidArgumentException('query must be a string or array'); + } + $modify['query'] = $value; + unset($options['query']); + } + + // Ensure that sink is not an invalid value. + if (isset($options['sink'])) { + // TODO: Add more sink validation? + if (is_bool($options['sink'])) { + throw new \InvalidArgumentException('sink must not be a boolean'); + } + } + + $request = Psr7\modify_request($request, $modify); + if ($request->getBody() instanceof Psr7\MultipartStream) { + // Use a multipart/form-data POST if a Content-Type is not set. + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' + . $request->getBody()->getBoundary(); + } + + // Merge in conditional headers if they are not present. + if (isset($options['_conditional'])) { + // Build up the changes so it's in a single clone of the message. + $modify = []; + foreach ($options['_conditional'] as $k => $v) { + if (!$request->hasHeader($k)) { + $modify['set_headers'][$k] = $v; + } + } + $request = Psr7\modify_request($request, $modify); + // Don't pass this internal value along to middleware/handlers. + unset($options['_conditional']); + } + + return $request; + } + + private function invalidBody() + { + throw new \InvalidArgumentException('Passing in the "body" request ' + . 'option as an array to send a POST request has been deprecated. ' + . 'Please use the "form_params" request option to send a ' + . 'application/x-www-form-urlencoded request, or the "multipart" ' + . 'request option to send a multipart/form-data request.'); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/ClientInterface.php new file mode 100644 index 0000000..5b37085 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/ClientInterface.php @@ -0,0 +1,84 @@ +strictMode = $strictMode; + + foreach ($cookieArray as $cookie) { + if (!($cookie instanceof SetCookie)) { + $cookie = new SetCookie($cookie); + } + $this->setCookie($cookie); + } + } + + /** + * Create a new Cookie jar from an associative array and domain. + * + * @param array $cookies Cookies to create the jar from + * @param string $domain Domain to set the cookies to + * + * @return self + */ + public static function fromArray(array $cookies, $domain) + { + $cookieJar = new self(); + foreach ($cookies as $name => $value) { + $cookieJar->setCookie(new SetCookie([ + 'Domain' => $domain, + 'Name' => $name, + 'Value' => $value, + 'Discard' => true + ])); + } + + return $cookieJar; + } + + /** + * @deprecated + */ + public static function getCookieValue($value) + { + return $value; + } + + /** + * Evaluate if this cookie should be persisted to storage + * that survives between requests. + * + * @param SetCookie $cookie Being evaluated. + * @param bool $allowSessionCookies If we should persist session cookies + * @return bool + */ + public static function shouldPersist( + SetCookie $cookie, + $allowSessionCookies = false + ) { + if ($cookie->getExpires() || $allowSessionCookies) { + if (!$cookie->getDiscard()) { + return true; + } + } + + return false; + } + + /** + * Finds and returns the cookie based on the name + * + * @param string $name cookie name to search for + * @return SetCookie|null cookie that was found or null if not found + */ + public function getCookieByName($name) + { + // don't allow a null name + if ($name === null) { + return null; + } + foreach ($this->cookies as $cookie) { + if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) { + return $cookie; + } + } + } + + public function toArray() + { + return array_map(function (SetCookie $cookie) { + return $cookie->toArray(); + }, $this->getIterator()->getArrayCopy()); + } + + public function clear($domain = null, $path = null, $name = null) + { + if (!$domain) { + $this->cookies = []; + return; + } elseif (!$path) { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($domain) { + return !$cookie->matchesDomain($domain); + } + ); + } elseif (!$name) { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($path, $domain) { + return !($cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } else { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($path, $domain, $name) { + return !($cookie->getName() == $name && + $cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } + } + + public function clearSessionCookies() + { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) { + return !$cookie->getDiscard() && $cookie->getExpires(); + } + ); + } + + public function setCookie(SetCookie $cookie) + { + // If the name string is empty (but not 0), ignore the set-cookie + // string entirely. + $name = $cookie->getName(); + if (!$name && $name !== '0') { + return false; + } + + // Only allow cookies with set and valid domain, name, value + $result = $cookie->validate(); + if ($result !== true) { + if ($this->strictMode) { + throw new \RuntimeException('Invalid cookie: ' . $result); + } else { + $this->removeCookieIfEmpty($cookie); + return false; + } + } + + // Resolve conflicts with previously set cookies + foreach ($this->cookies as $i => $c) { + + // Two cookies are identical, when their path, and domain are + // identical. + if ($c->getPath() != $cookie->getPath() || + $c->getDomain() != $cookie->getDomain() || + $c->getName() != $cookie->getName() + ) { + continue; + } + + // The previously set cookie is a discard cookie and this one is + // not so allow the new cookie to be set + if (!$cookie->getDiscard() && $c->getDiscard()) { + unset($this->cookies[$i]); + continue; + } + + // If the new cookie's expiration is further into the future, then + // replace the old cookie + if ($cookie->getExpires() > $c->getExpires()) { + unset($this->cookies[$i]); + continue; + } + + // If the value has changed, we better change it + if ($cookie->getValue() !== $c->getValue()) { + unset($this->cookies[$i]); + continue; + } + + // The cookie exists, so no need to continue + return false; + } + + $this->cookies[] = $cookie; + + return true; + } + + public function count() + { + return count($this->cookies); + } + + public function getIterator() + { + return new \ArrayIterator(array_values($this->cookies)); + } + + public function extractCookies( + RequestInterface $request, + ResponseInterface $response + ) { + if ($cookieHeader = $response->getHeader('Set-Cookie')) { + foreach ($cookieHeader as $cookie) { + $sc = SetCookie::fromString($cookie); + if (!$sc->getDomain()) { + $sc->setDomain($request->getUri()->getHost()); + } + if (0 !== strpos($sc->getPath(), '/')) { + $sc->setPath($this->getCookiePathFromRequest($request)); + } + $this->setCookie($sc); + } + } + } + + /** + * Computes cookie path following RFC 6265 section 5.1.4 + * + * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 + * + * @param RequestInterface $request + * @return string + */ + private function getCookiePathFromRequest(RequestInterface $request) + { + $uriPath = $request->getUri()->getPath(); + if ('' === $uriPath) { + return '/'; + } + if (0 !== strpos($uriPath, '/')) { + return '/'; + } + if ('/' === $uriPath) { + return '/'; + } + if (0 === $lastSlashPos = strrpos($uriPath, '/')) { + return '/'; + } + + return substr($uriPath, 0, $lastSlashPos); + } + + public function withCookieHeader(RequestInterface $request) + { + $values = []; + $uri = $request->getUri(); + $scheme = $uri->getScheme(); + $host = $uri->getHost(); + $path = $uri->getPath() ?: '/'; + + foreach ($this->cookies as $cookie) { + if ($cookie->matchesPath($path) && + $cookie->matchesDomain($host) && + !$cookie->isExpired() && + (!$cookie->getSecure() || $scheme === 'https') + ) { + $values[] = $cookie->getName() . '=' + . $cookie->getValue(); + } + } + + return $values + ? $request->withHeader('Cookie', implode('; ', $values)) + : $request; + } + + /** + * If a cookie already exists and the server asks to set it again with a + * null value, the cookie must be deleted. + * + * @param SetCookie $cookie + */ + private function removeCookieIfEmpty(SetCookie $cookie) + { + $cookieValue = $cookie->getValue(); + if ($cookieValue === null || $cookieValue === '') { + $this->clear( + $cookie->getDomain(), + $cookie->getPath(), + $cookie->getName() + ); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php new file mode 100644 index 0000000..2cf298a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php @@ -0,0 +1,84 @@ +filename = $cookieFile; + $this->storeSessionCookies = $storeSessionCookies; + + if (file_exists($cookieFile)) { + $this->load($cookieFile); + } + } + + /** + * Saves the file when shutting down + */ + public function __destruct() + { + $this->save($this->filename); + } + + /** + * Saves the cookies to a file. + * + * @param string $filename File to save + * @throws \RuntimeException if the file cannot be found or created + */ + public function save($filename) + { + $json = []; + foreach ($this as $cookie) { + /** @var SetCookie $cookie */ + if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { + $json[] = $cookie->toArray(); + } + } + + $jsonStr = \GuzzleHttp\json_encode($json); + if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) { + throw new \RuntimeException("Unable to save file {$filename}"); + } + } + + /** + * Load cookies from a JSON formatted file. + * + * Old cookies are kept unless overwritten by newly loaded ones. + * + * @param string $filename Cookie file to load. + * @throws \RuntimeException if the file cannot be loaded. + */ + public function load($filename) + { + $json = file_get_contents($filename); + if (false === $json) { + throw new \RuntimeException("Unable to load file {$filename}"); + } elseif ($json === '') { + return; + } + + $data = \GuzzleHttp\json_decode($json, true); + if (is_array($data)) { + foreach (json_decode($json, true) as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (strlen($data)) { + throw new \RuntimeException("Invalid cookie file: {$filename}"); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php new file mode 100644 index 0000000..0224a24 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php @@ -0,0 +1,72 @@ +sessionKey = $sessionKey; + $this->storeSessionCookies = $storeSessionCookies; + $this->load(); + } + + /** + * Saves cookies to session when shutting down + */ + public function __destruct() + { + $this->save(); + } + + /** + * Save cookies to the client session + */ + public function save() + { + $json = []; + foreach ($this as $cookie) { + /** @var SetCookie $cookie */ + if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { + $json[] = $cookie->toArray(); + } + } + + $_SESSION[$this->sessionKey] = json_encode($json); + } + + /** + * Load the contents of the client session into the data array + */ + protected function load() + { + if (!isset($_SESSION[$this->sessionKey])) { + return; + } + $data = json_decode($_SESSION[$this->sessionKey], true); + if (is_array($data)) { + foreach ($data as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (strlen($data)) { + throw new \RuntimeException("Invalid cookie data"); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php new file mode 100644 index 0000000..3d776a7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -0,0 +1,403 @@ + null, + 'Value' => null, + 'Domain' => null, + 'Path' => '/', + 'Max-Age' => null, + 'Expires' => null, + 'Secure' => false, + 'Discard' => false, + 'HttpOnly' => false + ]; + + /** @var array Cookie data */ + private $data; + + /** + * Create a new SetCookie object from a string + * + * @param string $cookie Set-Cookie header string + * + * @return self + */ + public static function fromString($cookie) + { + // Create the default return array + $data = self::$defaults; + // Explode the cookie string using a series of semicolons + $pieces = array_filter(array_map('trim', explode(';', $cookie))); + // The name of the cookie (first kvp) must exist and include an equal sign. + if (empty($pieces[0]) || !strpos($pieces[0], '=')) { + return new self($data); + } + + // Add the cookie pieces into the parsed data array + foreach ($pieces as $part) { + $cookieParts = explode('=', $part, 2); + $key = trim($cookieParts[0]); + $value = isset($cookieParts[1]) + ? trim($cookieParts[1], " \n\r\t\0\x0B") + : true; + + // Only check for non-cookies when cookies have been found + if (empty($data['Name'])) { + $data['Name'] = $key; + $data['Value'] = $value; + } else { + foreach (array_keys(self::$defaults) as $search) { + if (!strcasecmp($search, $key)) { + $data[$search] = $value; + continue 2; + } + } + $data[$key] = $value; + } + } + + return new self($data); + } + + /** + * @param array $data Array of cookie data provided by a Cookie parser + */ + public function __construct(array $data = []) + { + $this->data = array_replace(self::$defaults, $data); + // Extract the Expires value and turn it into a UNIX timestamp if needed + if (!$this->getExpires() && $this->getMaxAge()) { + // Calculate the Expires date + $this->setExpires(time() + $this->getMaxAge()); + } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { + $this->setExpires($this->getExpires()); + } + } + + public function __toString() + { + $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; + foreach ($this->data as $k => $v) { + if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) { + if ($k === 'Expires') { + $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; + } else { + $str .= ($v === true ? $k : "{$k}={$v}") . '; '; + } + } + } + + return rtrim($str, '; '); + } + + public function toArray() + { + return $this->data; + } + + /** + * Get the cookie name + * + * @return string + */ + public function getName() + { + return $this->data['Name']; + } + + /** + * Set the cookie name + * + * @param string $name Cookie name + */ + public function setName($name) + { + $this->data['Name'] = $name; + } + + /** + * Get the cookie value + * + * @return string + */ + public function getValue() + { + return $this->data['Value']; + } + + /** + * Set the cookie value + * + * @param string $value Cookie value + */ + public function setValue($value) + { + $this->data['Value'] = $value; + } + + /** + * Get the domain + * + * @return string|null + */ + public function getDomain() + { + return $this->data['Domain']; + } + + /** + * Set the domain of the cookie + * + * @param string $domain + */ + public function setDomain($domain) + { + $this->data['Domain'] = $domain; + } + + /** + * Get the path + * + * @return string + */ + public function getPath() + { + return $this->data['Path']; + } + + /** + * Set the path of the cookie + * + * @param string $path Path of the cookie + */ + public function setPath($path) + { + $this->data['Path'] = $path; + } + + /** + * Maximum lifetime of the cookie in seconds + * + * @return int|null + */ + public function getMaxAge() + { + return $this->data['Max-Age']; + } + + /** + * Set the max-age of the cookie + * + * @param int $maxAge Max age of the cookie in seconds + */ + public function setMaxAge($maxAge) + { + $this->data['Max-Age'] = $maxAge; + } + + /** + * The UNIX timestamp when the cookie Expires + * + * @return mixed + */ + public function getExpires() + { + return $this->data['Expires']; + } + + /** + * Set the unix timestamp for which the cookie will expire + * + * @param int $timestamp Unix timestamp + */ + public function setExpires($timestamp) + { + $this->data['Expires'] = is_numeric($timestamp) + ? (int) $timestamp + : strtotime($timestamp); + } + + /** + * Get whether or not this is a secure cookie + * + * @return bool|null + */ + public function getSecure() + { + return $this->data['Secure']; + } + + /** + * Set whether or not the cookie is secure + * + * @param bool $secure Set to true or false if secure + */ + public function setSecure($secure) + { + $this->data['Secure'] = $secure; + } + + /** + * Get whether or not this is a session cookie + * + * @return bool|null + */ + public function getDiscard() + { + return $this->data['Discard']; + } + + /** + * Set whether or not this is a session cookie + * + * @param bool $discard Set to true or false if this is a session cookie + */ + public function setDiscard($discard) + { + $this->data['Discard'] = $discard; + } + + /** + * Get whether or not this is an HTTP only cookie + * + * @return bool + */ + public function getHttpOnly() + { + return $this->data['HttpOnly']; + } + + /** + * Set whether or not this is an HTTP only cookie + * + * @param bool $httpOnly Set to true or false if this is HTTP only + */ + public function setHttpOnly($httpOnly) + { + $this->data['HttpOnly'] = $httpOnly; + } + + /** + * Check if the cookie matches a path value. + * + * A request-path path-matches a given cookie-path if at least one of + * the following conditions holds: + * + * - The cookie-path and the request-path are identical. + * - The cookie-path is a prefix of the request-path, and the last + * character of the cookie-path is %x2F ("/"). + * - The cookie-path is a prefix of the request-path, and the first + * character of the request-path that is not included in the cookie- + * path is a %x2F ("/") character. + * + * @param string $requestPath Path to check against + * + * @return bool + */ + public function matchesPath($requestPath) + { + $cookiePath = $this->getPath(); + + // Match on exact matches or when path is the default empty "/" + if ($cookiePath === '/' || $cookiePath == $requestPath) { + return true; + } + + // Ensure that the cookie-path is a prefix of the request path. + if (0 !== strpos($requestPath, $cookiePath)) { + return false; + } + + // Match if the last character of the cookie-path is "/" + if (substr($cookiePath, -1, 1) === '/') { + return true; + } + + // Match if the first character not included in cookie path is "/" + return substr($requestPath, strlen($cookiePath), 1) === '/'; + } + + /** + * Check if the cookie matches a domain value + * + * @param string $domain Domain to check against + * + * @return bool + */ + public function matchesDomain($domain) + { + // Remove the leading '.' as per spec in RFC 6265. + // http://tools.ietf.org/html/rfc6265#section-5.2.3 + $cookieDomain = ltrim($this->getDomain(), '.'); + + // Domain not set or exact match. + if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { + return true; + } + + // Matching the subdomain according to RFC 6265. + // http://tools.ietf.org/html/rfc6265#section-5.1.3 + if (filter_var($domain, FILTER_VALIDATE_IP)) { + return false; + } + + return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain); + } + + /** + * Check if the cookie is expired + * + * @return bool + */ + public function isExpired() + { + return $this->getExpires() !== null && time() > $this->getExpires(); + } + + /** + * Check if the cookie is valid according to RFC 6265 + * + * @return bool|string Returns true if valid or an error message if invalid + */ + public function validate() + { + // Names must not be empty, but can be 0 + $name = $this->getName(); + if (empty($name) && !is_numeric($name)) { + return 'The cookie name must not be empty'; + } + + // Check if any of the invalid characters are present in the cookie name + if (preg_match( + '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/', + $name + )) { + return 'Cookie name must not contain invalid characters: ASCII ' + . 'Control characters (0-31;127), space, tab and the ' + . 'following characters: ()<>@,;:\"/?={}'; + } + + // Value must not be empty, but can be 0 + $value = $this->getValue(); + if (empty($value) && !is_numeric($value)) { + return 'The cookie value must not be empty'; + } + + // Domains must not be empty, but can be 0 + // A "0" is not a valid internet domain, but may be used as server name + // in a private network. + $domain = $this->getDomain(); + if (empty($domain) && !is_numeric($domain)) { + return 'The cookie domain must not be empty'; + } + + return true; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php new file mode 100644 index 0000000..427d896 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php @@ -0,0 +1,27 @@ +getStatusCode() + : 0; + parent::__construct($message, $code, $previous); + $this->request = $request; + $this->response = $response; + $this->handlerContext = $handlerContext; + } + + /** + * Wrap non-RequestExceptions with a RequestException + * + * @param RequestInterface $request + * @param \Exception $e + * + * @return RequestException + */ + public static function wrapException(RequestInterface $request, \Exception $e) + { + return $e instanceof RequestException + ? $e + : new RequestException($e->getMessage(), $request, null, $e); + } + + /** + * Factory method to create a new exception with a normalized error message + * + * @param RequestInterface $request Request + * @param ResponseInterface $response Response received + * @param \Exception $previous Previous exception + * @param array $ctx Optional handler context. + * + * @return self + */ + public static function create( + RequestInterface $request, + ResponseInterface $response = null, + \Exception $previous = null, + array $ctx = [] + ) { + if (!$response) { + return new self( + 'Error completing request', + $request, + null, + $previous, + $ctx + ); + } + + $level = (int) floor($response->getStatusCode() / 100); + if ($level === 4) { + $label = 'Client error'; + $className = ClientException::class; + } elseif ($level === 5) { + $label = 'Server error'; + $className = ServerException::class; + } else { + $label = 'Unsuccessful request'; + $className = __CLASS__; + } + + $uri = $request->getUri(); + $uri = static::obfuscateUri($uri); + + // Client Error: `GET /` resulted in a `404 Not Found` response: + // ... (truncated) + $message = sprintf( + '%s: `%s %s` resulted in a `%s %s` response', + $label, + $request->getMethod(), + $uri, + $response->getStatusCode(), + $response->getReasonPhrase() + ); + + $summary = static::getResponseBodySummary($response); + + if ($summary !== null) { + $message .= ":\n{$summary}\n"; + } + + return new $className($message, $request, $response, $previous, $ctx); + } + + /** + * Get a short summary of the response + * + * Will return `null` if the response is not printable. + * + * @param ResponseInterface $response + * + * @return string|null + */ + public static function getResponseBodySummary(ResponseInterface $response) + { + $body = $response->getBody(); + + if (!$body->isSeekable() || !$body->isReadable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $summary = $body->read(120); + $body->rewind(); + + if ($size > 120) { + $summary .= ' (truncated...)'; + } + + // Matches any printable character, including unicode characters: + // letters, marks, numbers, punctuation, spacing, and separators. + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) { + return null; + } + + return $summary; + } + + /** + * Obfuscates URI if there is an username and a password present + * + * @param UriInterface $uri + * + * @return UriInterface + */ + private static function obfuscateUri($uri) + { + $userInfo = $uri->getUserInfo(); + + if (false !== ($pos = strpos($userInfo, ':'))) { + return $uri->withUserInfo(substr($userInfo, 0, $pos), '***'); + } + + return $uri; + } + + /** + * Get the request that caused the exception + * + * @return RequestInterface + */ + public function getRequest() + { + return $this->request; + } + + /** + * Get the associated response + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } + + /** + * Check if a response was received + * + * @return bool + */ + public function hasResponse() + { + return $this->response !== null; + } + + /** + * Get contextual information about the error from the underlying handler. + * + * The contents of this array will vary depending on which handler you are + * using. It may also be just an empty array. Relying on this data will + * couple you to a specific handler, but can give more debug information + * when needed. + * + * @return array + */ + public function getHandlerContext() + { + return $this->handlerContext; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php new file mode 100644 index 0000000..a77c289 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php @@ -0,0 +1,27 @@ +stream = $stream; + $msg = $msg ?: 'Could not seek the stream to position ' . $pos; + parent::__construct($msg); + } + + /** + * @return StreamInterface + */ + public function getStream() + { + return $this->stream; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php new file mode 100644 index 0000000..127094c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php @@ -0,0 +1,9 @@ +maxHandles = $maxHandles; + } + + public function create(RequestInterface $request, array $options) + { + if (isset($options['curl']['body_as_string'])) { + $options['_body_as_string'] = $options['curl']['body_as_string']; + unset($options['curl']['body_as_string']); + } + + $easy = new EasyHandle; + $easy->request = $request; + $easy->options = $options; + $conf = $this->getDefaultConf($easy); + $this->applyMethod($easy, $conf); + $this->applyHandlerOptions($easy, $conf); + $this->applyHeaders($easy, $conf); + unset($conf['_headers']); + + // Add handler options from the request configuration options + if (isset($options['curl'])) { + $conf = array_replace($conf, $options['curl']); + } + + $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); + $easy->handle = $this->handles + ? array_pop($this->handles) + : curl_init(); + curl_setopt_array($easy->handle, $conf); + + return $easy; + } + + public function release(EasyHandle $easy) + { + $resource = $easy->handle; + unset($easy->handle); + + if (count($this->handles) >= $this->maxHandles) { + curl_close($resource); + } else { + // Remove all callback functions as they can hold onto references + // and are not cleaned up by curl_reset. Using curl_setopt_array + // does not work for some reason, so removing each one + // individually. + curl_setopt($resource, CURLOPT_HEADERFUNCTION, null); + curl_setopt($resource, CURLOPT_READFUNCTION, null); + curl_setopt($resource, CURLOPT_WRITEFUNCTION, null); + curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null); + curl_reset($resource); + $this->handles[] = $resource; + } + } + + /** + * Completes a cURL transaction, either returning a response promise or a + * rejected promise. + * + * @param callable $handler + * @param EasyHandle $easy + * @param CurlFactoryInterface $factory Dictates how the handle is released + * + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public static function finish( + callable $handler, + EasyHandle $easy, + CurlFactoryInterface $factory + ) { + if (isset($easy->options['on_stats'])) { + self::invokeStats($easy); + } + + if (!$easy->response || $easy->errno) { + return self::finishError($handler, $easy, $factory); + } + + // Return the response if it is present and there is no error. + $factory->release($easy); + + // Rewind the body of the response if possible. + $body = $easy->response->getBody(); + if ($body->isSeekable()) { + $body->rewind(); + } + + return new FulfilledPromise($easy->response); + } + + private static function invokeStats(EasyHandle $easy) + { + $curlStats = curl_getinfo($easy->handle); + $curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME); + $stats = new TransferStats( + $easy->request, + $easy->response, + $curlStats['total_time'], + $easy->errno, + $curlStats + ); + call_user_func($easy->options['on_stats'], $stats); + } + + private static function finishError( + callable $handler, + EasyHandle $easy, + CurlFactoryInterface $factory + ) { + // Get error information and release the handle to the factory. + $ctx = [ + 'errno' => $easy->errno, + 'error' => curl_error($easy->handle), + 'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME), + ] + curl_getinfo($easy->handle); + $ctx[self::CURL_VERSION_STR] = curl_version()['version']; + $factory->release($easy); + + // Retry when nothing is present or when curl failed to rewind. + if (empty($easy->options['_err_message']) + && (!$easy->errno || $easy->errno == 65) + ) { + return self::retryFailedRewind($handler, $easy, $ctx); + } + + return self::createRejection($easy, $ctx); + } + + private static function createRejection(EasyHandle $easy, array $ctx) + { + static $connectionErrors = [ + CURLE_OPERATION_TIMEOUTED => true, + CURLE_COULDNT_RESOLVE_HOST => true, + CURLE_COULDNT_CONNECT => true, + CURLE_SSL_CONNECT_ERROR => true, + CURLE_GOT_NOTHING => true, + ]; + + // If an exception was encountered during the onHeaders event, then + // return a rejected promise that wraps that exception. + if ($easy->onHeadersException) { + return \GuzzleHttp\Promise\rejection_for( + new RequestException( + 'An error was encountered during the on_headers event', + $easy->request, + $easy->response, + $easy->onHeadersException, + $ctx + ) + ); + } + if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { + $message = sprintf( + 'cURL error %s: %s (%s)', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' + ); + } else { + $message = sprintf( + 'cURL error %s: %s (%s) for %s', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', + $easy->request->getUri() + ); + } + + // Create a connection exception if it was a specific error code. + $error = isset($connectionErrors[$easy->errno]) + ? new ConnectException($message, $easy->request, null, $ctx) + : new RequestException($message, $easy->request, $easy->response, null, $ctx); + + return \GuzzleHttp\Promise\rejection_for($error); + } + + private function getDefaultConf(EasyHandle $easy) + { + $conf = [ + '_headers' => $easy->request->getHeaders(), + CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), + CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), + CURLOPT_RETURNTRANSFER => false, + CURLOPT_HEADER => false, + CURLOPT_CONNECTTIMEOUT => 150, + ]; + + if (defined('CURLOPT_PROTOCOLS')) { + $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; + } + + $version = $easy->request->getProtocolVersion(); + if ($version == 1.1) { + $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1; + } elseif ($version == 2.0) { + $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0; + } else { + $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0; + } + + return $conf; + } + + private function applyMethod(EasyHandle $easy, array &$conf) + { + $body = $easy->request->getBody(); + $size = $body->getSize(); + + if ($size === null || $size > 0) { + $this->applyBody($easy->request, $easy->options, $conf); + return; + } + + $method = $easy->request->getMethod(); + if ($method === 'PUT' || $method === 'POST') { + // See http://tools.ietf.org/html/rfc7230#section-3.3.2 + if (!$easy->request->hasHeader('Content-Length')) { + $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; + } + } elseif ($method === 'HEAD') { + $conf[CURLOPT_NOBODY] = true; + unset( + $conf[CURLOPT_WRITEFUNCTION], + $conf[CURLOPT_READFUNCTION], + $conf[CURLOPT_FILE], + $conf[CURLOPT_INFILE] + ); + } + } + + private function applyBody(RequestInterface $request, array $options, array &$conf) + { + $size = $request->hasHeader('Content-Length') + ? (int) $request->getHeaderLine('Content-Length') + : null; + + // Send the body as a string if the size is less than 1MB OR if the + // [curl][body_as_string] request value is set. + if (($size !== null && $size < 1000000) || + !empty($options['_body_as_string']) + ) { + $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody(); + // Don't duplicate the Content-Length header + $this->removeHeader('Content-Length', $conf); + $this->removeHeader('Transfer-Encoding', $conf); + } else { + $conf[CURLOPT_UPLOAD] = true; + if ($size !== null) { + $conf[CURLOPT_INFILESIZE] = $size; + $this->removeHeader('Content-Length', $conf); + } + $body = $request->getBody(); + if ($body->isSeekable()) { + $body->rewind(); + } + $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) { + return $body->read($length); + }; + } + + // If the Expect header is not present, prevent curl from adding it + if (!$request->hasHeader('Expect')) { + $conf[CURLOPT_HTTPHEADER][] = 'Expect:'; + } + + // cURL sometimes adds a content-type by default. Prevent this. + if (!$request->hasHeader('Content-Type')) { + $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:'; + } + } + + private function applyHeaders(EasyHandle $easy, array &$conf) + { + foreach ($conf['_headers'] as $name => $values) { + foreach ($values as $value) { + $value = (string) $value; + if ($value === '') { + // cURL requires a special format for empty headers. + // See https://github.com/guzzle/guzzle/issues/1882 for more details. + $conf[CURLOPT_HTTPHEADER][] = "$name;"; + } else { + $conf[CURLOPT_HTTPHEADER][] = "$name: $value"; + } + } + } + + // Remove the Accept header if one was not set + if (!$easy->request->hasHeader('Accept')) { + $conf[CURLOPT_HTTPHEADER][] = 'Accept:'; + } + } + + /** + * Remove a header from the options array. + * + * @param string $name Case-insensitive header to remove + * @param array $options Array of options to modify + */ + private function removeHeader($name, array &$options) + { + foreach (array_keys($options['_headers']) as $key) { + if (!strcasecmp($key, $name)) { + unset($options['_headers'][$key]); + return; + } + } + } + + private function applyHandlerOptions(EasyHandle $easy, array &$conf) + { + $options = $easy->options; + if (isset($options['verify'])) { + if ($options['verify'] === false) { + unset($conf[CURLOPT_CAINFO]); + $conf[CURLOPT_SSL_VERIFYHOST] = 0; + $conf[CURLOPT_SSL_VERIFYPEER] = false; + } else { + $conf[CURLOPT_SSL_VERIFYHOST] = 2; + $conf[CURLOPT_SSL_VERIFYPEER] = true; + if (is_string($options['verify'])) { + // Throw an error if the file/folder/link path is not valid or doesn't exist. + if (!file_exists($options['verify'])) { + throw new \InvalidArgumentException( + "SSL CA bundle not found: {$options['verify']}" + ); + } + // If it's a directory or a link to a directory use CURLOPT_CAPATH. + // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. + if (is_dir($options['verify']) || + (is_link($options['verify']) && is_dir(readlink($options['verify'])))) { + $conf[CURLOPT_CAPATH] = $options['verify']; + } else { + $conf[CURLOPT_CAINFO] = $options['verify']; + } + } + } + } + + if (!empty($options['decode_content'])) { + $accept = $easy->request->getHeaderLine('Accept-Encoding'); + if ($accept) { + $conf[CURLOPT_ENCODING] = $accept; + } else { + $conf[CURLOPT_ENCODING] = ''; + // Don't let curl send the header over the wire + $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; + } + } + + if (isset($options['sink'])) { + $sink = $options['sink']; + if (!is_string($sink)) { + $sink = \GuzzleHttp\Psr7\stream_for($sink); + } elseif (!is_dir(dirname($sink))) { + // Ensure that the directory exists before failing in curl. + throw new \RuntimeException(sprintf( + 'Directory %s does not exist for sink value of %s', + dirname($sink), + $sink + )); + } else { + $sink = new LazyOpenStream($sink, 'w+'); + } + $easy->sink = $sink; + $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) { + return $sink->write($write); + }; + } else { + // Use a default temp stream if no sink was set. + $conf[CURLOPT_FILE] = fopen('php://temp', 'w+'); + $easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]); + } + $timeoutRequiresNoSignal = false; + if (isset($options['timeout'])) { + $timeoutRequiresNoSignal |= $options['timeout'] < 1; + $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; + } + + // CURL default value is CURL_IPRESOLVE_WHATEVER + if (isset($options['force_ip_resolve'])) { + if ('v4' === $options['force_ip_resolve']) { + $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4; + } elseif ('v6' === $options['force_ip_resolve']) { + $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6; + } + } + + if (isset($options['connect_timeout'])) { + $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; + $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; + } + + if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { + $conf[CURLOPT_NOSIGNAL] = true; + } + + if (isset($options['proxy'])) { + if (!is_array($options['proxy'])) { + $conf[CURLOPT_PROXY] = $options['proxy']; + } else { + $scheme = $easy->request->getUri()->getScheme(); + if (isset($options['proxy'][$scheme])) { + $host = $easy->request->getUri()->getHost(); + if (!isset($options['proxy']['no']) || + !\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no']) + ) { + $conf[CURLOPT_PROXY] = $options['proxy'][$scheme]; + } + } + } + } + + if (isset($options['cert'])) { + $cert = $options['cert']; + if (is_array($cert)) { + $conf[CURLOPT_SSLCERTPASSWD] = $cert[1]; + $cert = $cert[0]; + } + if (!file_exists($cert)) { + throw new \InvalidArgumentException( + "SSL certificate not found: {$cert}" + ); + } + $conf[CURLOPT_SSLCERT] = $cert; + } + + if (isset($options['ssl_key'])) { + $sslKey = $options['ssl_key']; + if (is_array($sslKey)) { + $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1]; + $sslKey = $sslKey[0]; + } + if (!file_exists($sslKey)) { + throw new \InvalidArgumentException( + "SSL private key not found: {$sslKey}" + ); + } + $conf[CURLOPT_SSLKEY] = $sslKey; + } + + if (isset($options['progress'])) { + $progress = $options['progress']; + if (!is_callable($progress)) { + throw new \InvalidArgumentException( + 'progress client option must be callable' + ); + } + $conf[CURLOPT_NOPROGRESS] = false; + $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) { + $args = func_get_args(); + // PHP 5.5 pushed the handle onto the start of the args + if (is_resource($args[0])) { + array_shift($args); + } + call_user_func_array($progress, $args); + }; + } + + if (!empty($options['debug'])) { + $conf[CURLOPT_STDERR] = \GuzzleHttp\debug_resource($options['debug']); + $conf[CURLOPT_VERBOSE] = true; + } + } + + /** + * This function ensures that a response was set on a transaction. If one + * was not set, then the request is retried if possible. This error + * typically means you are sending a payload, curl encountered a + * "Connection died, retrying a fresh connect" error, tried to rewind the + * stream, and then encountered a "necessary data rewind wasn't possible" + * error, causing the request to be sent through curl_multi_info_read() + * without an error status. + */ + private static function retryFailedRewind( + callable $handler, + EasyHandle $easy, + array $ctx + ) { + try { + // Only rewind if the body has been read from. + $body = $easy->request->getBody(); + if ($body->tell() > 0) { + $body->rewind(); + } + } catch (\RuntimeException $e) { + $ctx['error'] = 'The connection unexpectedly failed without ' + . 'providing an error. The request would have been retried, ' + . 'but attempting to rewind the request body failed. ' + . 'Exception: ' . $e; + return self::createRejection($easy, $ctx); + } + + // Retry no more than 3 times before giving up. + if (!isset($easy->options['_curl_retries'])) { + $easy->options['_curl_retries'] = 1; + } elseif ($easy->options['_curl_retries'] == 2) { + $ctx['error'] = 'The cURL request was retried 3 times ' + . 'and did not succeed. The most likely reason for the failure ' + . 'is that cURL was unable to rewind the body of the request ' + . 'and subsequent retries resulted in the same error. Turn on ' + . 'the debug option to see what went wrong. See ' + . 'https://bugs.php.net/bug.php?id=47204 for more information.'; + return self::createRejection($easy, $ctx); + } else { + $easy->options['_curl_retries']++; + } + + return $handler($easy->request, $easy->options); + } + + private function createHeaderFn(EasyHandle $easy) + { + if (isset($easy->options['on_headers'])) { + $onHeaders = $easy->options['on_headers']; + + if (!is_callable($onHeaders)) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + } else { + $onHeaders = null; + } + + return function ($ch, $h) use ( + $onHeaders, + $easy, + &$startingResponse + ) { + $value = trim($h); + if ($value === '') { + $startingResponse = true; + $easy->createResponse(); + if ($onHeaders !== null) { + try { + $onHeaders($easy->response); + } catch (\Exception $e) { + // Associate the exception with the handle and trigger + // a curl header write error by returning 0. + $easy->onHeadersException = $e; + return -1; + } + } + } elseif ($startingResponse) { + $startingResponse = false; + $easy->headers = [$value]; + } else { + $easy->headers[] = $value; + } + return strlen($h); + }; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php new file mode 100644 index 0000000..b0fc236 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php @@ -0,0 +1,27 @@ +factory = isset($options['handle_factory']) + ? $options['handle_factory'] + : new CurlFactory(3); + } + + public function __invoke(RequestInterface $request, array $options) + { + if (isset($options['delay'])) { + usleep($options['delay'] * 1000); + } + + $easy = $this->factory->create($request, $options); + curl_exec($easy->handle); + $easy->errno = curl_errno($easy->handle); + + return CurlFactory::finish($this, $easy, $this->factory); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php new file mode 100644 index 0000000..d829762 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -0,0 +1,205 @@ +factory = isset($options['handle_factory']) + ? $options['handle_factory'] : new CurlFactory(50); + + if (isset($options['select_timeout'])) { + $this->selectTimeout = $options['select_timeout']; + } elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { + $this->selectTimeout = $selectTimeout; + } else { + $this->selectTimeout = 1; + } + } + + public function __get($name) + { + if ($name === '_mh') { + return $this->_mh = curl_multi_init(); + } + + throw new \BadMethodCallException(); + } + + public function __destruct() + { + if (isset($this->_mh)) { + curl_multi_close($this->_mh); + unset($this->_mh); + } + } + + public function __invoke(RequestInterface $request, array $options) + { + $easy = $this->factory->create($request, $options); + $id = (int) $easy->handle; + + $promise = new Promise( + [$this, 'execute'], + function () use ($id) { + return $this->cancel($id); + } + ); + + $this->addRequest(['easy' => $easy, 'deferred' => $promise]); + + return $promise; + } + + /** + * Ticks the curl event loop. + */ + public function tick() + { + // Add any delayed handles if needed. + if ($this->delays) { + $currentTime = \GuzzleHttp\_current_time(); + foreach ($this->delays as $id => $delay) { + if ($currentTime >= $delay) { + unset($this->delays[$id]); + curl_multi_add_handle( + $this->_mh, + $this->handles[$id]['easy']->handle + ); + } + } + } + + // Step through the task queue which may add additional requests. + P\queue()->run(); + + if ($this->active && + curl_multi_select($this->_mh, $this->selectTimeout) === -1 + ) { + // Perform a usleep if a select returns -1. + // See: https://bugs.php.net/bug.php?id=61141 + usleep(250); + } + + while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM); + + $this->processMessages(); + } + + /** + * Runs until all outstanding connections have completed. + */ + public function execute() + { + $queue = P\queue(); + + while ($this->handles || !$queue->isEmpty()) { + // If there are no transfers, then sleep for the next delay + if (!$this->active && $this->delays) { + usleep($this->timeToNext()); + } + $this->tick(); + } + } + + private function addRequest(array $entry) + { + $easy = $entry['easy']; + $id = (int) $easy->handle; + $this->handles[$id] = $entry; + if (empty($easy->options['delay'])) { + curl_multi_add_handle($this->_mh, $easy->handle); + } else { + $this->delays[$id] = \GuzzleHttp\_current_time() + ($easy->options['delay'] / 1000); + } + } + + /** + * Cancels a handle from sending and removes references to it. + * + * @param int $id Handle ID to cancel and remove. + * + * @return bool True on success, false on failure. + */ + private function cancel($id) + { + // Cannot cancel if it has been processed. + if (!isset($this->handles[$id])) { + return false; + } + + $handle = $this->handles[$id]['easy']->handle; + unset($this->delays[$id], $this->handles[$id]); + curl_multi_remove_handle($this->_mh, $handle); + curl_close($handle); + + return true; + } + + private function processMessages() + { + while ($done = curl_multi_info_read($this->_mh)) { + $id = (int) $done['handle']; + curl_multi_remove_handle($this->_mh, $done['handle']); + + if (!isset($this->handles[$id])) { + // Probably was cancelled. + continue; + } + + $entry = $this->handles[$id]; + unset($this->handles[$id], $this->delays[$id]); + $entry['easy']->errno = $done['result']; + $entry['deferred']->resolve( + CurlFactory::finish( + $this, + $entry['easy'], + $this->factory + ) + ); + } + } + + private function timeToNext() + { + $currentTime = \GuzzleHttp\_current_time(); + $nextTime = PHP_INT_MAX; + foreach ($this->delays as $time) { + if ($time < $nextTime) { + $nextTime = $time; + } + } + + return max(0, $nextTime - $currentTime) * 1000000; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php new file mode 100644 index 0000000..7754e91 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php @@ -0,0 +1,92 @@ +headers)) { + throw new \RuntimeException('No headers have been received'); + } + + // HTTP-version SP status-code SP reason-phrase + $startLine = explode(' ', array_shift($this->headers), 3); + $headers = \GuzzleHttp\headers_from_lines($this->headers); + $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); + + if (!empty($this->options['decode_content']) + && isset($normalizedKeys['content-encoding']) + ) { + $headers['x-encoded-content-encoding'] + = $headers[$normalizedKeys['content-encoding']]; + unset($headers[$normalizedKeys['content-encoding']]); + if (isset($normalizedKeys['content-length'])) { + $headers['x-encoded-content-length'] + = $headers[$normalizedKeys['content-length']]; + + $bodyLength = (int) $this->sink->getSize(); + if ($bodyLength) { + $headers[$normalizedKeys['content-length']] = $bodyLength; + } else { + unset($headers[$normalizedKeys['content-length']]); + } + } + } + + // Attach a response to the easy handle with the parsed headers. + $this->response = new Response( + $startLine[1], + $headers, + $this->sink, + substr($startLine[0], 5), + isset($startLine[2]) ? (string) $startLine[2] : null + ); + } + + public function __get($name) + { + $msg = $name === 'handle' + ? 'The EasyHandle has been released' + : 'Invalid property: ' . $name; + throw new \BadMethodCallException($msg); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php new file mode 100644 index 0000000..d5c449c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php @@ -0,0 +1,190 @@ +onFulfilled = $onFulfilled; + $this->onRejected = $onRejected; + + if ($queue) { + call_user_func_array([$this, 'append'], $queue); + } + } + + public function __invoke(RequestInterface $request, array $options) + { + if (!$this->queue) { + throw new \OutOfBoundsException('Mock queue is empty'); + } + + if (isset($options['delay'])) { + usleep($options['delay'] * 1000); + } + + $this->lastRequest = $request; + $this->lastOptions = $options; + $response = array_shift($this->queue); + + if (isset($options['on_headers'])) { + if (!is_callable($options['on_headers'])) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + try { + $options['on_headers']($response); + } catch (\Exception $e) { + $msg = 'An error was encountered during the on_headers event'; + $response = new RequestException($msg, $request, $response, $e); + } + } + + if (is_callable($response)) { + $response = call_user_func($response, $request, $options); + } + + $response = $response instanceof \Exception + ? \GuzzleHttp\Promise\rejection_for($response) + : \GuzzleHttp\Promise\promise_for($response); + + return $response->then( + function ($value) use ($request, $options) { + $this->invokeStats($request, $options, $value); + if ($this->onFulfilled) { + call_user_func($this->onFulfilled, $value); + } + if (isset($options['sink'])) { + $contents = (string) $value->getBody(); + $sink = $options['sink']; + + if (is_resource($sink)) { + fwrite($sink, $contents); + } elseif (is_string($sink)) { + file_put_contents($sink, $contents); + } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) { + $sink->write($contents); + } + } + + return $value; + }, + function ($reason) use ($request, $options) { + $this->invokeStats($request, $options, null, $reason); + if ($this->onRejected) { + call_user_func($this->onRejected, $reason); + } + return \GuzzleHttp\Promise\rejection_for($reason); + } + ); + } + + /** + * Adds one or more variadic requests, exceptions, callables, or promises + * to the queue. + */ + public function append() + { + foreach (func_get_args() as $value) { + if ($value instanceof ResponseInterface + || $value instanceof \Exception + || $value instanceof PromiseInterface + || is_callable($value) + ) { + $this->queue[] = $value; + } else { + throw new \InvalidArgumentException('Expected a response or ' + . 'exception. Found ' . \GuzzleHttp\describe_type($value)); + } + } + } + + /** + * Get the last received request. + * + * @return RequestInterface + */ + public function getLastRequest() + { + return $this->lastRequest; + } + + /** + * Get the last received request options. + * + * @return array + */ + public function getLastOptions() + { + return $this->lastOptions; + } + + /** + * Returns the number of remaining items in the queue. + * + * @return int + */ + public function count() + { + return count($this->queue); + } + + private function invokeStats( + RequestInterface $request, + array $options, + ResponseInterface $response = null, + $reason = null + ) { + if (isset($options['on_stats'])) { + $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; + $stats = new TransferStats($request, $response, $transferTime, $reason); + call_user_func($options['on_stats'], $stats); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php new file mode 100644 index 0000000..f8b00be --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php @@ -0,0 +1,55 @@ +withoutHeader('Expect'); + + // Append a content-length header if body size is zero to match + // cURL's behavior. + if (0 === $request->getBody()->getSize()) { + $request = $request->withHeader('Content-Length', '0'); + } + + return $this->createResponse( + $request, + $options, + $this->createStream($request, $options), + $startTime + ); + } catch (\InvalidArgumentException $e) { + throw $e; + } catch (\Exception $e) { + // Determine if the error was a networking error. + $message = $e->getMessage(); + // This list can probably get more comprehensive. + if (strpos($message, 'getaddrinfo') // DNS lookup failed + || strpos($message, 'Connection refused') + || strpos($message, "couldn't connect to host") // error on HHVM + || strpos($message, "connection attempt failed") + ) { + $e = new ConnectException($e->getMessage(), $request, $e); + } + $e = RequestException::wrapException($request, $e); + $this->invokeStats($options, $request, $startTime, null, $e); + + return \GuzzleHttp\Promise\rejection_for($e); + } + } + + private function invokeStats( + array $options, + RequestInterface $request, + $startTime, + ResponseInterface $response = null, + $error = null + ) { + if (isset($options['on_stats'])) { + $stats = new TransferStats( + $request, + $response, + \GuzzleHttp\_current_time() - $startTime, + $error, + [] + ); + call_user_func($options['on_stats'], $stats); + } + } + + private function createResponse( + RequestInterface $request, + array $options, + $stream, + $startTime + ) { + $hdrs = $this->lastHeaders; + $this->lastHeaders = []; + $parts = explode(' ', array_shift($hdrs), 3); + $ver = explode('/', $parts[0])[1]; + $status = $parts[1]; + $reason = isset($parts[2]) ? $parts[2] : null; + $headers = \GuzzleHttp\headers_from_lines($hdrs); + list($stream, $headers) = $this->checkDecode($options, $headers, $stream); + $stream = Psr7\stream_for($stream); + $sink = $stream; + + if (strcasecmp('HEAD', $request->getMethod())) { + $sink = $this->createSink($stream, $options); + } + + $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); + + if (isset($options['on_headers'])) { + try { + $options['on_headers']($response); + } catch (\Exception $e) { + $msg = 'An error was encountered during the on_headers event'; + $ex = new RequestException($msg, $request, $response, $e); + return \GuzzleHttp\Promise\rejection_for($ex); + } + } + + // Do not drain when the request is a HEAD request because they have + // no body. + if ($sink !== $stream) { + $this->drain( + $stream, + $sink, + $response->getHeaderLine('Content-Length') + ); + } + + $this->invokeStats($options, $request, $startTime, $response, null); + + return new FulfilledPromise($response); + } + + private function createSink(StreamInterface $stream, array $options) + { + if (!empty($options['stream'])) { + return $stream; + } + + $sink = isset($options['sink']) + ? $options['sink'] + : fopen('php://temp', 'r+'); + + return is_string($sink) + ? new Psr7\LazyOpenStream($sink, 'w+') + : Psr7\stream_for($sink); + } + + private function checkDecode(array $options, array $headers, $stream) + { + // Automatically decode responses when instructed. + if (!empty($options['decode_content'])) { + $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); + if (isset($normalizedKeys['content-encoding'])) { + $encoding = $headers[$normalizedKeys['content-encoding']]; + if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { + $stream = new Psr7\InflateStream( + Psr7\stream_for($stream) + ); + $headers['x-encoded-content-encoding'] + = $headers[$normalizedKeys['content-encoding']]; + // Remove content-encoding header + unset($headers[$normalizedKeys['content-encoding']]); + // Fix content-length header + if (isset($normalizedKeys['content-length'])) { + $headers['x-encoded-content-length'] + = $headers[$normalizedKeys['content-length']]; + + $length = (int) $stream->getSize(); + if ($length === 0) { + unset($headers[$normalizedKeys['content-length']]); + } else { + $headers[$normalizedKeys['content-length']] = [$length]; + } + } + } + } + } + + return [$stream, $headers]; + } + + /** + * Drains the source stream into the "sink" client option. + * + * @param StreamInterface $source + * @param StreamInterface $sink + * @param string $contentLength Header specifying the amount of + * data to read. + * + * @return StreamInterface + * @throws \RuntimeException when the sink option is invalid. + */ + private function drain( + StreamInterface $source, + StreamInterface $sink, + $contentLength + ) { + // If a content-length header is provided, then stop reading once + // that number of bytes has been read. This can prevent infinitely + // reading from a stream when dealing with servers that do not honor + // Connection: Close headers. + Psr7\copy_to_stream( + $source, + $sink, + (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1 + ); + + $sink->seek(0); + $source->close(); + + return $sink; + } + + /** + * Create a resource and check to ensure it was created successfully + * + * @param callable $callback Callable that returns stream resource + * + * @return resource + * @throws \RuntimeException on error + */ + private function createResource(callable $callback) + { + $errors = null; + set_error_handler(function ($_, $msg, $file, $line) use (&$errors) { + $errors[] = [ + 'message' => $msg, + 'file' => $file, + 'line' => $line + ]; + return true; + }); + + $resource = $callback(); + restore_error_handler(); + + if (!$resource) { + $message = 'Error creating resource: '; + foreach ($errors as $err) { + foreach ($err as $key => $value) { + $message .= "[$key] $value" . PHP_EOL; + } + } + throw new \RuntimeException(trim($message)); + } + + return $resource; + } + + private function createStream(RequestInterface $request, array $options) + { + static $methods; + if (!$methods) { + $methods = array_flip(get_class_methods(__CLASS__)); + } + + // HTTP/1.1 streams using the PHP stream wrapper require a + // Connection: close header + if ($request->getProtocolVersion() == '1.1' + && !$request->hasHeader('Connection') + ) { + $request = $request->withHeader('Connection', 'close'); + } + + // Ensure SSL is verified by default + if (!isset($options['verify'])) { + $options['verify'] = true; + } + + $params = []; + $context = $this->getDefaultContext($request); + + if (isset($options['on_headers']) && !is_callable($options['on_headers'])) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + + if (!empty($options)) { + foreach ($options as $key => $value) { + $method = "add_{$key}"; + if (isset($methods[$method])) { + $this->{$method}($request, $context, $value, $params); + } + } + } + + if (isset($options['stream_context'])) { + if (!is_array($options['stream_context'])) { + throw new \InvalidArgumentException('stream_context must be an array'); + } + $context = array_replace_recursive( + $context, + $options['stream_context'] + ); + } + + // Microsoft NTLM authentication only supported with curl handler + if (isset($options['auth']) + && is_array($options['auth']) + && isset($options['auth'][2]) + && 'ntlm' == $options['auth'][2] + ) { + throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); + } + + $uri = $this->resolveHost($request, $options); + + $context = $this->createResource( + function () use ($context, $params) { + return stream_context_create($context, $params); + } + ); + + return $this->createResource( + function () use ($uri, &$http_response_header, $context, $options) { + $resource = fopen((string) $uri, 'r', null, $context); + $this->lastHeaders = $http_response_header; + + if (isset($options['read_timeout'])) { + $readTimeout = $options['read_timeout']; + $sec = (int) $readTimeout; + $usec = ($readTimeout - $sec) * 100000; + stream_set_timeout($resource, $sec, $usec); + } + + return $resource; + } + ); + } + + private function resolveHost(RequestInterface $request, array $options) + { + $uri = $request->getUri(); + + if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) { + if ('v4' === $options['force_ip_resolve']) { + $records = dns_get_record($uri->getHost(), DNS_A); + if (!isset($records[0]['ip'])) { + throw new ConnectException( + sprintf( + "Could not resolve IPv4 address for host '%s'", + $uri->getHost() + ), + $request + ); + } + $uri = $uri->withHost($records[0]['ip']); + } elseif ('v6' === $options['force_ip_resolve']) { + $records = dns_get_record($uri->getHost(), DNS_AAAA); + if (!isset($records[0]['ipv6'])) { + throw new ConnectException( + sprintf( + "Could not resolve IPv6 address for host '%s'", + $uri->getHost() + ), + $request + ); + } + $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); + } + } + + return $uri; + } + + private function getDefaultContext(RequestInterface $request) + { + $headers = ''; + foreach ($request->getHeaders() as $name => $value) { + foreach ($value as $val) { + $headers .= "$name: $val\r\n"; + } + } + + $context = [ + 'http' => [ + 'method' => $request->getMethod(), + 'header' => $headers, + 'protocol_version' => $request->getProtocolVersion(), + 'ignore_errors' => true, + 'follow_location' => 0, + ], + ]; + + $body = (string) $request->getBody(); + + if (!empty($body)) { + $context['http']['content'] = $body; + // Prevent the HTTP handler from adding a Content-Type header. + if (!$request->hasHeader('Content-Type')) { + $context['http']['header'] .= "Content-Type:\r\n"; + } + } + + $context['http']['header'] = rtrim($context['http']['header']); + + return $context; + } + + private function add_proxy(RequestInterface $request, &$options, $value, &$params) + { + if (!is_array($value)) { + $options['http']['proxy'] = $value; + } else { + $scheme = $request->getUri()->getScheme(); + if (isset($value[$scheme])) { + if (!isset($value['no']) + || !\GuzzleHttp\is_host_in_noproxy( + $request->getUri()->getHost(), + $value['no'] + ) + ) { + $options['http']['proxy'] = $value[$scheme]; + } + } + } + } + + private function add_timeout(RequestInterface $request, &$options, $value, &$params) + { + if ($value > 0) { + $options['http']['timeout'] = $value; + } + } + + private function add_verify(RequestInterface $request, &$options, $value, &$params) + { + if ($value === true) { + // PHP 5.6 or greater will find the system cert by default. When + // < 5.6, use the Guzzle bundled cacert. + if (PHP_VERSION_ID < 50600) { + $options['ssl']['cafile'] = \GuzzleHttp\default_ca_bundle(); + } + } elseif (is_string($value)) { + $options['ssl']['cafile'] = $value; + if (!file_exists($value)) { + throw new \RuntimeException("SSL CA bundle not found: $value"); + } + } elseif ($value === false) { + $options['ssl']['verify_peer'] = false; + $options['ssl']['verify_peer_name'] = false; + return; + } else { + throw new \InvalidArgumentException('Invalid verify request option'); + } + + $options['ssl']['verify_peer'] = true; + $options['ssl']['verify_peer_name'] = true; + $options['ssl']['allow_self_signed'] = false; + } + + private function add_cert(RequestInterface $request, &$options, $value, &$params) + { + if (is_array($value)) { + $options['ssl']['passphrase'] = $value[1]; + $value = $value[0]; + } + + if (!file_exists($value)) { + throw new \RuntimeException("SSL certificate not found: {$value}"); + } + + $options['ssl']['local_cert'] = $value; + } + + private function add_progress(RequestInterface $request, &$options, $value, &$params) + { + $this->addNotification( + $params, + function ($code, $a, $b, $c, $transferred, $total) use ($value) { + if ($code == STREAM_NOTIFY_PROGRESS) { + $value($total, $transferred, null, null); + } + } + ); + } + + private function add_debug(RequestInterface $request, &$options, $value, &$params) + { + if ($value === false) { + return; + } + + static $map = [ + STREAM_NOTIFY_CONNECT => 'CONNECT', + STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', + STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', + STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', + STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', + STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', + STREAM_NOTIFY_PROGRESS => 'PROGRESS', + STREAM_NOTIFY_FAILURE => 'FAILURE', + STREAM_NOTIFY_COMPLETED => 'COMPLETED', + STREAM_NOTIFY_RESOLVE => 'RESOLVE', + ]; + static $args = ['severity', 'message', 'message_code', + 'bytes_transferred', 'bytes_max']; + + $value = \GuzzleHttp\debug_resource($value); + $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); + $this->addNotification( + $params, + function () use ($ident, $value, $map, $args) { + $passed = func_get_args(); + $code = array_shift($passed); + fprintf($value, '<%s> [%s] ', $ident, $map[$code]); + foreach (array_filter($passed) as $i => $v) { + fwrite($value, $args[$i] . ': "' . $v . '" '); + } + fwrite($value, "\n"); + } + ); + } + + private function addNotification(array &$params, callable $notify) + { + // Wrap the existing function if needed. + if (!isset($params['notification'])) { + $params['notification'] = $notify; + } else { + $params['notification'] = $this->callArray([ + $params['notification'], + $notify + ]); + } + } + + private function callArray(array $functions) + { + return function () use ($functions) { + $args = func_get_args(); + foreach ($functions as $fn) { + call_user_func_array($fn, $args); + } + }; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/HandlerStack.php new file mode 100644 index 0000000..f001686 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/HandlerStack.php @@ -0,0 +1,273 @@ +push(Middleware::httpErrors(), 'http_errors'); + $stack->push(Middleware::redirect(), 'allow_redirects'); + $stack->push(Middleware::cookies(), 'cookies'); + $stack->push(Middleware::prepareBody(), 'prepare_body'); + + return $stack; + } + + /** + * @param callable $handler Underlying HTTP handler. + */ + public function __construct(callable $handler = null) + { + $this->handler = $handler; + } + + /** + * Invokes the handler stack as a composed handler + * + * @param RequestInterface $request + * @param array $options + */ + public function __invoke(RequestInterface $request, array $options) + { + $handler = $this->resolve(); + + return $handler($request, $options); + } + + /** + * Dumps a string representation of the stack. + * + * @return string + */ + public function __toString() + { + $depth = 0; + $stack = []; + if ($this->handler) { + $stack[] = "0) Handler: " . $this->debugCallable($this->handler); + } + + $result = ''; + foreach (array_reverse($this->stack) as $tuple) { + $depth++; + $str = "{$depth}) Name: '{$tuple[1]}', "; + $str .= "Function: " . $this->debugCallable($tuple[0]); + $result = "> {$str}\n{$result}"; + $stack[] = $str; + } + + foreach (array_keys($stack) as $k) { + $result .= "< {$stack[$k]}\n"; + } + + return $result; + } + + /** + * Set the HTTP handler that actually returns a promise. + * + * @param callable $handler Accepts a request and array of options and + * returns a Promise. + */ + public function setHandler(callable $handler) + { + $this->handler = $handler; + $this->cached = null; + } + + /** + * Returns true if the builder has a handler. + * + * @return bool + */ + public function hasHandler() + { + return (bool) $this->handler; + } + + /** + * Unshift a middleware to the bottom of the stack. + * + * @param callable $middleware Middleware function + * @param string $name Name to register for this middleware. + */ + public function unshift(callable $middleware, $name = null) + { + array_unshift($this->stack, [$middleware, $name]); + $this->cached = null; + } + + /** + * Push a middleware to the top of the stack. + * + * @param callable $middleware Middleware function + * @param string $name Name to register for this middleware. + */ + public function push(callable $middleware, $name = '') + { + $this->stack[] = [$middleware, $name]; + $this->cached = null; + } + + /** + * Add a middleware before another middleware by name. + * + * @param string $findName Middleware to find + * @param callable $middleware Middleware function + * @param string $withName Name to register for this middleware. + */ + public function before($findName, callable $middleware, $withName = '') + { + $this->splice($findName, $withName, $middleware, true); + } + + /** + * Add a middleware after another middleware by name. + * + * @param string $findName Middleware to find + * @param callable $middleware Middleware function + * @param string $withName Name to register for this middleware. + */ + public function after($findName, callable $middleware, $withName = '') + { + $this->splice($findName, $withName, $middleware, false); + } + + /** + * Remove a middleware by instance or name from the stack. + * + * @param callable|string $remove Middleware to remove by instance or name. + */ + public function remove($remove) + { + $this->cached = null; + $idx = is_callable($remove) ? 0 : 1; + $this->stack = array_values(array_filter( + $this->stack, + function ($tuple) use ($idx, $remove) { + return $tuple[$idx] !== $remove; + } + )); + } + + /** + * Compose the middleware and handler into a single callable function. + * + * @return callable + */ + public function resolve() + { + if (!$this->cached) { + if (!($prev = $this->handler)) { + throw new \LogicException('No handler has been specified'); + } + + foreach (array_reverse($this->stack) as $fn) { + $prev = $fn[0]($prev); + } + + $this->cached = $prev; + } + + return $this->cached; + } + + /** + * @param string $name + * @return int + */ + private function findByName($name) + { + foreach ($this->stack as $k => $v) { + if ($v[1] === $name) { + return $k; + } + } + + throw new \InvalidArgumentException("Middleware not found: $name"); + } + + /** + * Splices a function into the middleware list at a specific position. + * + * @param string $findName + * @param string $withName + * @param callable $middleware + * @param bool $before + */ + private function splice($findName, $withName, callable $middleware, $before) + { + $this->cached = null; + $idx = $this->findByName($findName); + $tuple = [$middleware, $withName]; + + if ($before) { + if ($idx === 0) { + array_unshift($this->stack, $tuple); + } else { + $replacement = [$tuple, $this->stack[$idx]]; + array_splice($this->stack, $idx, 1, $replacement); + } + } elseif ($idx === count($this->stack) - 1) { + $this->stack[] = $tuple; + } else { + $replacement = [$this->stack[$idx], $tuple]; + array_splice($this->stack, $idx, 1, $replacement); + } + } + + /** + * Provides a debug string for a given callable. + * + * @param array|callable $fn Function to write as a string. + * + * @return string + */ + private function debugCallable($fn) + { + if (is_string($fn)) { + return "callable({$fn})"; + } + + if (is_array($fn)) { + return is_string($fn[0]) + ? "callable({$fn[0]}::{$fn[1]})" + : "callable(['" . get_class($fn[0]) . "', '{$fn[1]}'])"; + } + + return 'callable(' . spl_object_hash($fn) . ')'; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/MessageFormatter.php new file mode 100644 index 0000000..663ac73 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/MessageFormatter.php @@ -0,0 +1,180 @@ +>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; + const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; + + /** @var string Template used to format log messages */ + private $template; + + /** + * @param string $template Log message template + */ + public function __construct($template = self::CLF) + { + $this->template = $template ?: self::CLF; + } + + /** + * Returns a formatted message string. + * + * @param RequestInterface $request Request that was sent + * @param ResponseInterface $response Response that was received + * @param \Exception $error Exception that was received + * + * @return string + */ + public function format( + RequestInterface $request, + ResponseInterface $response = null, + \Exception $error = null + ) { + $cache = []; + + return preg_replace_callback( + '/{\s*([A-Za-z_\-\.0-9]+)\s*}/', + function (array $matches) use ($request, $response, $error, &$cache) { + if (isset($cache[$matches[1]])) { + return $cache[$matches[1]]; + } + + $result = ''; + switch ($matches[1]) { + case 'request': + $result = Psr7\str($request); + break; + case 'response': + $result = $response ? Psr7\str($response) : ''; + break; + case 'req_headers': + $result = trim($request->getMethod() + . ' ' . $request->getRequestTarget()) + . ' HTTP/' . $request->getProtocolVersion() . "\r\n" + . $this->headers($request); + break; + case 'res_headers': + $result = $response ? + sprintf( + 'HTTP/%s %d %s', + $response->getProtocolVersion(), + $response->getStatusCode(), + $response->getReasonPhrase() + ) . "\r\n" . $this->headers($response) + : 'NULL'; + break; + case 'req_body': + $result = $request->getBody(); + break; + case 'res_body': + $result = $response ? $response->getBody() : 'NULL'; + break; + case 'ts': + case 'date_iso_8601': + $result = gmdate('c'); + break; + case 'date_common_log': + $result = date('d/M/Y:H:i:s O'); + break; + case 'method': + $result = $request->getMethod(); + break; + case 'version': + $result = $request->getProtocolVersion(); + break; + case 'uri': + case 'url': + $result = $request->getUri(); + break; + case 'target': + $result = $request->getRequestTarget(); + break; + case 'req_version': + $result = $request->getProtocolVersion(); + break; + case 'res_version': + $result = $response + ? $response->getProtocolVersion() + : 'NULL'; + break; + case 'host': + $result = $request->getHeaderLine('Host'); + break; + case 'hostname': + $result = gethostname(); + break; + case 'code': + $result = $response ? $response->getStatusCode() : 'NULL'; + break; + case 'phrase': + $result = $response ? $response->getReasonPhrase() : 'NULL'; + break; + case 'error': + $result = $error ? $error->getMessage() : 'NULL'; + break; + default: + // handle prefixed dynamic headers + if (strpos($matches[1], 'req_header_') === 0) { + $result = $request->getHeaderLine(substr($matches[1], 11)); + } elseif (strpos($matches[1], 'res_header_') === 0) { + $result = $response + ? $response->getHeaderLine(substr($matches[1], 11)) + : 'NULL'; + } + } + + $cache[$matches[1]] = $result; + return $result; + }, + $this->template + ); + } + + private function headers(MessageInterface $message) + { + $result = ''; + foreach ($message->getHeaders() as $name => $values) { + $result .= $name . ': ' . implode(', ', $values) . "\r\n"; + } + + return trim($result); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Middleware.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Middleware.php new file mode 100644 index 0000000..bffc197 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Middleware.php @@ -0,0 +1,254 @@ +withCookieHeader($request); + return $handler($request, $options) + ->then( + function ($response) use ($cookieJar, $request) { + $cookieJar->extractCookies($request, $response); + return $response; + } + ); + }; + }; + } + + /** + * Middleware that throws exceptions for 4xx or 5xx responses when the + * "http_error" request option is set to true. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function httpErrors() + { + return function (callable $handler) { + return function ($request, array $options) use ($handler) { + if (empty($options['http_errors'])) { + return $handler($request, $options); + } + return $handler($request, $options)->then( + function (ResponseInterface $response) use ($request) { + $code = $response->getStatusCode(); + if ($code < 400) { + return $response; + } + throw RequestException::create($request, $response); + } + ); + }; + }; + } + + /** + * Middleware that pushes history data to an ArrayAccess container. + * + * @param array|\ArrayAccess $container Container to hold the history (by reference). + * + * @return callable Returns a function that accepts the next handler. + * @throws \InvalidArgumentException if container is not an array or ArrayAccess. + */ + public static function history(&$container) + { + if (!is_array($container) && !$container instanceof \ArrayAccess) { + throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); + } + + return function (callable $handler) use (&$container) { + return function ($request, array $options) use ($handler, &$container) { + return $handler($request, $options)->then( + function ($value) use ($request, &$container, $options) { + $container[] = [ + 'request' => $request, + 'response' => $value, + 'error' => null, + 'options' => $options + ]; + return $value; + }, + function ($reason) use ($request, &$container, $options) { + $container[] = [ + 'request' => $request, + 'response' => null, + 'error' => $reason, + 'options' => $options + ]; + return \GuzzleHttp\Promise\rejection_for($reason); + } + ); + }; + }; + } + + /** + * Middleware that invokes a callback before and after sending a request. + * + * The provided listener cannot modify or alter the response. It simply + * "taps" into the chain to be notified before returning the promise. The + * before listener accepts a request and options array, and the after + * listener accepts a request, options array, and response promise. + * + * @param callable $before Function to invoke before forwarding the request. + * @param callable $after Function invoked after forwarding. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function tap(callable $before = null, callable $after = null) + { + return function (callable $handler) use ($before, $after) { + return function ($request, array $options) use ($handler, $before, $after) { + if ($before) { + $before($request, $options); + } + $response = $handler($request, $options); + if ($after) { + $after($request, $options, $response); + } + return $response; + }; + }; + } + + /** + * Middleware that handles request redirects. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function redirect() + { + return function (callable $handler) { + return new RedirectMiddleware($handler); + }; + } + + /** + * Middleware that retries requests based on the boolean result of + * invoking the provided "decider" function. + * + * If no delay function is provided, a simple implementation of exponential + * backoff will be utilized. + * + * @param callable $decider Function that accepts the number of retries, + * a request, [response], and [exception] and + * returns true if the request is to be retried. + * @param callable $delay Function that accepts the number of retries and + * returns the number of milliseconds to delay. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function retry(callable $decider, callable $delay = null) + { + return function (callable $handler) use ($decider, $delay) { + return new RetryMiddleware($decider, $handler, $delay); + }; + } + + /** + * Middleware that logs requests, responses, and errors using a message + * formatter. + * + * @param LoggerInterface $logger Logs messages. + * @param MessageFormatter $formatter Formatter used to create message strings. + * @param string $logLevel Level at which to log requests. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \Psr\Log\LogLevel::INFO */) + { + return function (callable $handler) use ($logger, $formatter, $logLevel) { + return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) { + return $handler($request, $options)->then( + function ($response) use ($logger, $request, $formatter, $logLevel) { + $message = $formatter->format($request, $response); + $logger->log($logLevel, $message); + return $response; + }, + function ($reason) use ($logger, $request, $formatter) { + $response = $reason instanceof RequestException + ? $reason->getResponse() + : null; + $message = $formatter->format($request, $response, $reason); + $logger->notice($message); + return \GuzzleHttp\Promise\rejection_for($reason); + } + ); + }; + }; + } + + /** + * This middleware adds a default content-type if possible, a default + * content-length or transfer-encoding header, and the expect header. + * + * @return callable + */ + public static function prepareBody() + { + return function (callable $handler) { + return new PrepareBodyMiddleware($handler); + }; + } + + /** + * Middleware that applies a map function to the request before passing to + * the next handler. + * + * @param callable $fn Function that accepts a RequestInterface and returns + * a RequestInterface. + * @return callable + */ + public static function mapRequest(callable $fn) + { + return function (callable $handler) use ($fn) { + return function ($request, array $options) use ($handler, $fn) { + return $handler($fn($request), $options); + }; + }; + } + + /** + * Middleware that applies a map function to the resolved promise's + * response. + * + * @param callable $fn Function that accepts a ResponseInterface and + * returns a ResponseInterface. + * @return callable + */ + public static function mapResponse(callable $fn) + { + return function (callable $handler) use ($fn) { + return function ($request, array $options) use ($handler, $fn) { + return $handler($request, $options)->then($fn); + }; + }; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Pool.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Pool.php new file mode 100644 index 0000000..05c854a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/Pool.php @@ -0,0 +1,123 @@ + $rfn) { + if ($rfn instanceof RequestInterface) { + yield $key => $client->sendAsync($rfn, $opts); + } elseif (is_callable($rfn)) { + yield $key => $rfn($opts); + } else { + throw new \InvalidArgumentException('Each value yielded by ' + . 'the iterator must be a Psr7\Http\Message\RequestInterface ' + . 'or a callable that returns a promise that fulfills ' + . 'with a Psr7\Message\Http\ResponseInterface object.'); + } + } + }; + + $this->each = new EachPromise($requests(), $config); + } + + public function promise() + { + return $this->each->promise(); + } + + /** + * Sends multiple requests concurrently and returns an array of responses + * and exceptions that uses the same ordering as the provided requests. + * + * IMPORTANT: This method keeps every request and response in memory, and + * as such, is NOT recommended when sending a large number or an + * indeterminate number of requests concurrently. + * + * @param ClientInterface $client Client used to send the requests + * @param array|\Iterator $requests Requests to send concurrently. + * @param array $options Passes through the options available in + * {@see GuzzleHttp\Pool::__construct} + * + * @return array Returns an array containing the response or an exception + * in the same order that the requests were sent. + * @throws \InvalidArgumentException if the event format is incorrect. + */ + public static function batch( + ClientInterface $client, + $requests, + array $options = [] + ) { + $res = []; + self::cmpCallback($options, 'fulfilled', $res); + self::cmpCallback($options, 'rejected', $res); + $pool = new static($client, $requests, $options); + $pool->promise()->wait(); + ksort($res); + + return $res; + } + + private static function cmpCallback(array &$options, $name, array &$results) + { + if (!isset($options[$name])) { + $options[$name] = function ($v, $k) use (&$results) { + $results[$k] = $v; + }; + } else { + $currentFn = $options[$name]; + $options[$name] = function ($v, $k) use (&$results, $currentFn) { + $currentFn($v, $k); + $results[$k] = $v; + }; + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php new file mode 100644 index 0000000..2eb95f9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @@ -0,0 +1,106 @@ +nextHandler = $nextHandler; + } + + /** + * @param RequestInterface $request + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + $fn = $this->nextHandler; + + // Don't do anything if the request has no body. + if ($request->getBody()->getSize() === 0) { + return $fn($request, $options); + } + + $modify = []; + + // Add a default content-type if possible. + if (!$request->hasHeader('Content-Type')) { + if ($uri = $request->getBody()->getMetadata('uri')) { + if ($type = Psr7\mimetype_from_filename($uri)) { + $modify['set_headers']['Content-Type'] = $type; + } + } + } + + // Add a default content-length or transfer-encoding header. + if (!$request->hasHeader('Content-Length') + && !$request->hasHeader('Transfer-Encoding') + ) { + $size = $request->getBody()->getSize(); + if ($size !== null) { + $modify['set_headers']['Content-Length'] = $size; + } else { + $modify['set_headers']['Transfer-Encoding'] = 'chunked'; + } + } + + // Add the expect header if needed. + $this->addExpectHeader($request, $options, $modify); + + return $fn(Psr7\modify_request($request, $modify), $options); + } + + private function addExpectHeader( + RequestInterface $request, + array $options, + array &$modify + ) { + // Determine if the Expect header should be used + if ($request->hasHeader('Expect')) { + return; + } + + $expect = isset($options['expect']) ? $options['expect'] : null; + + // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 + if ($expect === false || $request->getProtocolVersion() < 1.1) { + return; + } + + // The expect header is unconditionally enabled + if ($expect === true) { + $modify['set_headers']['Expect'] = '100-Continue'; + return; + } + + // By default, send the expect header when the payload is > 1mb + if ($expect === null) { + $expect = 1048576; + } + + // Always add if the body cannot be rewound, the size cannot be + // determined, or the size is greater than the cutoff threshold + $body = $request->getBody(); + $size = $body->getSize(); + + if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { + $modify['set_headers']['Expect'] = '100-Continue'; + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php new file mode 100644 index 0000000..bff4e4e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -0,0 +1,237 @@ + 5, + 'protocols' => ['http', 'https'], + 'strict' => false, + 'referer' => false, + 'track_redirects' => false, + ]; + + /** @var callable */ + private $nextHandler; + + /** + * @param callable $nextHandler Next handler to invoke. + */ + public function __construct(callable $nextHandler) + { + $this->nextHandler = $nextHandler; + } + + /** + * @param RequestInterface $request + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + $fn = $this->nextHandler; + + if (empty($options['allow_redirects'])) { + return $fn($request, $options); + } + + if ($options['allow_redirects'] === true) { + $options['allow_redirects'] = self::$defaultSettings; + } elseif (!is_array($options['allow_redirects'])) { + throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); + } else { + // Merge the default settings with the provided settings + $options['allow_redirects'] += self::$defaultSettings; + } + + if (empty($options['allow_redirects']['max'])) { + return $fn($request, $options); + } + + return $fn($request, $options) + ->then(function (ResponseInterface $response) use ($request, $options) { + return $this->checkRedirect($request, $options, $response); + }); + } + + /** + * @param RequestInterface $request + * @param array $options + * @param ResponseInterface|PromiseInterface $response + * + * @return ResponseInterface|PromiseInterface + */ + public function checkRedirect( + RequestInterface $request, + array $options, + ResponseInterface $response + ) { + if (substr($response->getStatusCode(), 0, 1) != '3' + || !$response->hasHeader('Location') + ) { + return $response; + } + + $this->guardMax($request, $options); + $nextRequest = $this->modifyRequest($request, $options, $response); + + if (isset($options['allow_redirects']['on_redirect'])) { + call_user_func( + $options['allow_redirects']['on_redirect'], + $request, + $response, + $nextRequest->getUri() + ); + } + + /** @var PromiseInterface|ResponseInterface $promise */ + $promise = $this($nextRequest, $options); + + // Add headers to be able to track history of redirects. + if (!empty($options['allow_redirects']['track_redirects'])) { + return $this->withTracking( + $promise, + (string) $nextRequest->getUri(), + $response->getStatusCode() + ); + } + + return $promise; + } + + private function withTracking(PromiseInterface $promise, $uri, $statusCode) + { + return $promise->then( + function (ResponseInterface $response) use ($uri, $statusCode) { + // Note that we are pushing to the front of the list as this + // would be an earlier response than what is currently present + // in the history header. + $historyHeader = $response->getHeader(self::HISTORY_HEADER); + $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); + array_unshift($historyHeader, $uri); + array_unshift($statusHeader, $statusCode); + return $response->withHeader(self::HISTORY_HEADER, $historyHeader) + ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); + } + ); + } + + private function guardMax(RequestInterface $request, array &$options) + { + $current = isset($options['__redirect_count']) + ? $options['__redirect_count'] + : 0; + $options['__redirect_count'] = $current + 1; + $max = $options['allow_redirects']['max']; + + if ($options['__redirect_count'] > $max) { + throw new TooManyRedirectsException( + "Will not follow more than {$max} redirects", + $request + ); + } + } + + /** + * @param RequestInterface $request + * @param array $options + * @param ResponseInterface $response + * + * @return RequestInterface + */ + public function modifyRequest( + RequestInterface $request, + array $options, + ResponseInterface $response + ) { + // Request modifications to apply. + $modify = []; + $protocols = $options['allow_redirects']['protocols']; + + // Use a GET request if this is an entity enclosing request and we are + // not forcing RFC compliance, but rather emulating what all browsers + // would do. + $statusCode = $response->getStatusCode(); + if ($statusCode == 303 || + ($statusCode <= 302 && $request->getBody() && !$options['allow_redirects']['strict']) + ) { + $modify['method'] = 'GET'; + $modify['body'] = ''; + } + + $modify['uri'] = $this->redirectUri($request, $response, $protocols); + Psr7\rewind_body($request); + + // Add the Referer header if it is told to do so and only + // add the header if we are not redirecting from https to http. + if ($options['allow_redirects']['referer'] + && $modify['uri']->getScheme() === $request->getUri()->getScheme() + ) { + $uri = $request->getUri()->withUserInfo(''); + $modify['set_headers']['Referer'] = (string) $uri; + } else { + $modify['remove_headers'][] = 'Referer'; + } + + // Remove Authorization header if host is different. + if ($request->getUri()->getHost() !== $modify['uri']->getHost()) { + $modify['remove_headers'][] = 'Authorization'; + } + + return Psr7\modify_request($request, $modify); + } + + /** + * Set the appropriate URL on the request based on the location header + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @param array $protocols + * + * @return UriInterface + */ + private function redirectUri( + RequestInterface $request, + ResponseInterface $response, + array $protocols + ) { + $location = Psr7\UriResolver::resolve( + $request->getUri(), + new Psr7\Uri($response->getHeaderLine('Location')) + ); + + // Ensure that the redirect URI is allowed based on the protocols. + if (!in_array($location->getScheme(), $protocols)) { + throw new BadResponseException( + sprintf( + 'Redirect URI, %s, does not use one of the allowed redirect protocols: %s', + $location, + implode(', ', $protocols) + ), + $request, + $response + ); + } + + return $location; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RequestOptions.php new file mode 100644 index 0000000..5c0fd19 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/RequestOptions.php @@ -0,0 +1,255 @@ +decider = $decider; + $this->nextHandler = $nextHandler; + $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; + } + + /** + * Default exponential backoff delay function. + * + * @param int $retries + * + * @return int + */ + public static function exponentialDelay($retries) + { + return (int) pow(2, $retries - 1); + } + + /** + * @param RequestInterface $request + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + if (!isset($options['retries'])) { + $options['retries'] = 0; + } + + $fn = $this->nextHandler; + return $fn($request, $options) + ->then( + $this->onFulfilled($request, $options), + $this->onRejected($request, $options) + ); + } + + private function onFulfilled(RequestInterface $req, array $options) + { + return function ($value) use ($req, $options) { + if (!call_user_func( + $this->decider, + $options['retries'], + $req, + $value, + null + )) { + return $value; + } + return $this->doRetry($req, $options, $value); + }; + } + + private function onRejected(RequestInterface $req, array $options) + { + return function ($reason) use ($req, $options) { + if (!call_user_func( + $this->decider, + $options['retries'], + $req, + null, + $reason + )) { + return \GuzzleHttp\Promise\rejection_for($reason); + } + return $this->doRetry($req, $options); + }; + } + + private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) + { + $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response); + + return $this($request, $options); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/TransferStats.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/TransferStats.php new file mode 100644 index 0000000..23a22a3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/TransferStats.php @@ -0,0 +1,126 @@ +request = $request; + $this->response = $response; + $this->transferTime = $transferTime; + $this->handlerErrorData = $handlerErrorData; + $this->handlerStats = $handlerStats; + } + + /** + * @return RequestInterface + */ + public function getRequest() + { + return $this->request; + } + + /** + * Returns the response that was received (if any). + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } + + /** + * Returns true if a response was received. + * + * @return bool + */ + public function hasResponse() + { + return $this->response !== null; + } + + /** + * Gets handler specific error data. + * + * This might be an exception, a integer representing an error code, or + * anything else. Relying on this value assumes that you know what handler + * you are using. + * + * @return mixed + */ + public function getHandlerErrorData() + { + return $this->handlerErrorData; + } + + /** + * Get the effective URI the request was sent to. + * + * @return UriInterface + */ + public function getEffectiveUri() + { + return $this->request->getUri(); + } + + /** + * Get the estimated time the request was being transferred by the handler. + * + * @return float Time in seconds. + */ + public function getTransferTime() + { + return $this->transferTime; + } + + /** + * Gets an array of all of the handler specific transfer data. + * + * @return array + */ + public function getHandlerStats() + { + return $this->handlerStats; + } + + /** + * Get a specific handler statistic from the handler by name. + * + * @param string $stat Handler specific transfer stat to retrieve. + * + * @return mixed|null + */ + public function getHandlerStat($stat) + { + return isset($this->handlerStats[$stat]) + ? $this->handlerStats[$stat] + : null; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/UriTemplate.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/UriTemplate.php new file mode 100644 index 0000000..96dcfd0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/UriTemplate.php @@ -0,0 +1,237 @@ + ['prefix' => '', 'joiner' => ',', 'query' => false], + '+' => ['prefix' => '', 'joiner' => ',', 'query' => false], + '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false], + '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false], + '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false], + ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true], + '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true], + '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true] + ]; + + /** @var array Delimiters */ + private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$', + '&', '\'', '(', ')', '*', '+', ',', ';', '=']; + + /** @var array Percent encoded delimiters */ + private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D', + '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', + '%3B', '%3D']; + + public function expand($template, array $variables) + { + if (false === strpos($template, '{')) { + return $template; + } + + $this->template = $template; + $this->variables = $variables; + + return preg_replace_callback( + '/\{([^\}]+)\}/', + [$this, 'expandMatch'], + $this->template + ); + } + + /** + * Parse an expression into parts + * + * @param string $expression Expression to parse + * + * @return array Returns an associative array of parts + */ + private function parseExpression($expression) + { + $result = []; + + if (isset(self::$operatorHash[$expression[0]])) { + $result['operator'] = $expression[0]; + $expression = substr($expression, 1); + } else { + $result['operator'] = ''; + } + + foreach (explode(',', $expression) as $value) { + $value = trim($value); + $varspec = []; + if ($colonPos = strpos($value, ':')) { + $varspec['value'] = substr($value, 0, $colonPos); + $varspec['modifier'] = ':'; + $varspec['position'] = (int) substr($value, $colonPos + 1); + } elseif (substr($value, -1) === '*') { + $varspec['modifier'] = '*'; + $varspec['value'] = substr($value, 0, -1); + } else { + $varspec['value'] = (string) $value; + $varspec['modifier'] = ''; + } + $result['values'][] = $varspec; + } + + return $result; + } + + /** + * Process an expansion + * + * @param array $matches Matches met in the preg_replace_callback + * + * @return string Returns the replacement string + */ + private function expandMatch(array $matches) + { + static $rfc1738to3986 = ['+' => '%20', '%7e' => '~']; + + $replacements = []; + $parsed = self::parseExpression($matches[1]); + $prefix = self::$operatorHash[$parsed['operator']]['prefix']; + $joiner = self::$operatorHash[$parsed['operator']]['joiner']; + $useQuery = self::$operatorHash[$parsed['operator']]['query']; + + foreach ($parsed['values'] as $value) { + if (!isset($this->variables[$value['value']])) { + continue; + } + + $variable = $this->variables[$value['value']]; + $actuallyUseQuery = $useQuery; + $expanded = ''; + + if (is_array($variable)) { + $isAssoc = $this->isAssoc($variable); + $kvp = []; + foreach ($variable as $key => $var) { + if ($isAssoc) { + $key = rawurlencode($key); + $isNestedArray = is_array($var); + } else { + $isNestedArray = false; + } + + if (!$isNestedArray) { + $var = rawurlencode($var); + if ($parsed['operator'] === '+' || + $parsed['operator'] === '#' + ) { + $var = $this->decodeReserved($var); + } + } + + if ($value['modifier'] === '*') { + if ($isAssoc) { + if ($isNestedArray) { + // Nested arrays must allow for deeply nested + // structures. + $var = strtr( + http_build_query([$key => $var]), + $rfc1738to3986 + ); + } else { + $var = $key . '=' . $var; + } + } elseif ($key > 0 && $actuallyUseQuery) { + $var = $value['value'] . '=' . $var; + } + } + + $kvp[$key] = $var; + } + + if (empty($variable)) { + $actuallyUseQuery = false; + } elseif ($value['modifier'] === '*') { + $expanded = implode($joiner, $kvp); + if ($isAssoc) { + // Don't prepend the value name when using the explode + // modifier with an associative array. + $actuallyUseQuery = false; + } + } else { + if ($isAssoc) { + // When an associative array is encountered and the + // explode modifier is not set, then the result must be + // a comma separated list of keys followed by their + // respective values. + foreach ($kvp as $k => &$v) { + $v = $k . ',' . $v; + } + } + $expanded = implode(',', $kvp); + } + } else { + if ($value['modifier'] === ':') { + $variable = substr($variable, 0, $value['position']); + } + $expanded = rawurlencode($variable); + if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { + $expanded = $this->decodeReserved($expanded); + } + } + + if ($actuallyUseQuery) { + if (!$expanded && $joiner !== '&') { + $expanded = $value['value']; + } else { + $expanded = $value['value'] . '=' . $expanded; + } + } + + $replacements[] = $expanded; + } + + $ret = implode($joiner, $replacements); + if ($ret && $prefix) { + return $prefix . $ret; + } + + return $ret; + } + + /** + * Determines if an array is associative. + * + * This makes the assumption that input arrays are sequences or hashes. + * This assumption is a tradeoff for accuracy in favor of speed, but it + * should work in almost every case where input is supplied for a URI + * template. + * + * @param array $array Array to check + * + * @return bool + */ + private function isAssoc(array $array) + { + return $array && array_keys($array)[0] !== 0; + } + + /** + * Removes percent encoding on reserved characters (used with + and # + * modifiers). + * + * @param string $string String to fix + * + * @return string + */ + private function decodeReserved($string) + { + return str_replace(self::$delimsPct, self::$delims, $string); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions.php new file mode 100644 index 0000000..51d736d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions.php @@ -0,0 +1,346 @@ +expand($template, $variables); +} + +/** + * Debug function used to describe the provided value type and class. + * + * @param mixed $input + * + * @return string Returns a string containing the type of the variable and + * if a class is provided, the class name. + */ +function describe_type($input) +{ + switch (gettype($input)) { + case 'object': + return 'object(' . get_class($input) . ')'; + case 'array': + return 'array(' . count($input) . ')'; + default: + ob_start(); + var_dump($input); + // normalize float vs double + return str_replace('double(', 'float(', rtrim(ob_get_clean())); + } +} + +/** + * Parses an array of header lines into an associative array of headers. + * + * @param array $lines Header lines array of strings in the following + * format: "Name: Value" + * @return array + */ +function headers_from_lines($lines) +{ + $headers = []; + + foreach ($lines as $line) { + $parts = explode(':', $line, 2); + $headers[trim($parts[0])][] = isset($parts[1]) + ? trim($parts[1]) + : null; + } + + return $headers; +} + +/** + * Returns a debug stream based on the provided variable. + * + * @param mixed $value Optional value + * + * @return resource + */ +function debug_resource($value = null) +{ + if (is_resource($value)) { + return $value; + } elseif (defined('STDOUT')) { + return STDOUT; + } + + return fopen('php://output', 'w'); +} + +/** + * Chooses and creates a default handler to use based on the environment. + * + * The returned handler is not wrapped by any default middlewares. + * + * @throws \RuntimeException if no viable Handler is available. + * @return callable Returns the best handler for the given system. + */ +function choose_handler() +{ + $handler = null; + if (function_exists('curl_multi_exec') && function_exists('curl_exec')) { + $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); + } elseif (function_exists('curl_exec')) { + $handler = new CurlHandler(); + } elseif (function_exists('curl_multi_exec')) { + $handler = new CurlMultiHandler(); + } + + if (ini_get('allow_url_fopen')) { + $handler = $handler + ? Proxy::wrapStreaming($handler, new StreamHandler()) + : new StreamHandler(); + } elseif (!$handler) { + throw new \RuntimeException('GuzzleHttp requires cURL, the ' + . 'allow_url_fopen ini setting, or a custom HTTP handler.'); + } + + return $handler; +} + +/** + * Get the default User-Agent string to use with Guzzle + * + * @return string + */ +function default_user_agent() +{ + static $defaultAgent = ''; + + if (!$defaultAgent) { + $defaultAgent = 'GuzzleHttp/' . Client::VERSION; + if (extension_loaded('curl') && function_exists('curl_version')) { + $defaultAgent .= ' curl/' . \curl_version()['version']; + } + $defaultAgent .= ' PHP/' . PHP_VERSION; + } + + return $defaultAgent; +} + +/** + * Returns the default cacert bundle for the current system. + * + * First, the openssl.cafile and curl.cainfo php.ini settings are checked. + * If those settings are not configured, then the common locations for + * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X + * and Windows are checked. If any of these file locations are found on + * disk, they will be utilized. + * + * Note: the result of this function is cached for subsequent calls. + * + * @return string + * @throws \RuntimeException if no bundle can be found. + */ +function default_ca_bundle() +{ + static $cached = null; + static $cafiles = [ + // Red Hat, CentOS, Fedora (provided by the ca-certificates package) + '/etc/pki/tls/certs/ca-bundle.crt', + // Ubuntu, Debian (provided by the ca-certificates package) + '/etc/ssl/certs/ca-certificates.crt', + // FreeBSD (provided by the ca_root_nss package) + '/usr/local/share/certs/ca-root-nss.crt', + // SLES 12 (provided by the ca-certificates package) + '/var/lib/ca-certificates/ca-bundle.pem', + // OS X provided by homebrew (using the default path) + '/usr/local/etc/openssl/cert.pem', + // Google app engine + '/etc/ca-certificates.crt', + // Windows? + 'C:\\windows\\system32\\curl-ca-bundle.crt', + 'C:\\windows\\curl-ca-bundle.crt', + ]; + + if ($cached) { + return $cached; + } + + if ($ca = ini_get('openssl.cafile')) { + return $cached = $ca; + } + + if ($ca = ini_get('curl.cainfo')) { + return $cached = $ca; + } + + foreach ($cafiles as $filename) { + if (file_exists($filename)) { + return $cached = $filename; + } + } + + throw new \RuntimeException( + <<< EOT +No system CA bundle could be found in any of the the common system locations. +PHP versions earlier than 5.6 are not properly configured to use the system's +CA bundle by default. In order to verify peer certificates, you will need to +supply the path on disk to a certificate bundle to the 'verify' request +option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not +need a specific certificate bundle, then Mozilla provides a commonly used CA +bundle which can be downloaded here (provided by the maintainer of cURL): +https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once +you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP +ini setting to point to the path to the file, allowing you to omit the 'verify' +request option. See http://curl.haxx.se/docs/sslcerts.html for more +information. +EOT + ); +} + +/** + * Creates an associative array of lowercase header names to the actual + * header casing. + * + * @param array $headers + * + * @return array + */ +function normalize_header_keys(array $headers) +{ + $result = []; + foreach (array_keys($headers) as $key) { + $result[strtolower($key)] = $key; + } + + return $result; +} + +/** + * Returns true if the provided host matches any of the no proxy areas. + * + * This method will strip a port from the host if it is present. Each pattern + * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a + * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == + * "baz.foo.com", but ".foo.com" != "foo.com"). + * + * Areas are matched in the following cases: + * 1. "*" (without quotes) always matches any hosts. + * 2. An exact match. + * 3. The area starts with "." and the area is the last part of the host. e.g. + * '.mit.edu' will match any host that ends with '.mit.edu'. + * + * @param string $host Host to check against the patterns. + * @param array $noProxyArray An array of host patterns. + * + * @return bool + */ +function is_host_in_noproxy($host, array $noProxyArray) +{ + if (strlen($host) === 0) { + throw new \InvalidArgumentException('Empty host provided'); + } + + // Strip port if present. + if (strpos($host, ':')) { + $host = explode($host, ':', 2)[0]; + } + + foreach ($noProxyArray as $area) { + // Always match on wildcards. + if ($area === '*') { + return true; + } elseif (empty($area)) { + // Don't match on empty values. + continue; + } elseif ($area === $host) { + // Exact matches. + return true; + } else { + // Special match if the area when prefixed with ".". Remove any + // existing leading "." and add a new leading ".". + $area = '.' . ltrim($area, '.'); + if (substr($host, -(strlen($area))) === $area) { + return true; + } + } + } + + return false; +} + +/** + * Wrapper for json_decode that throws when an error occurs. + * + * @param string $json JSON data to parse + * @param bool $assoc When true, returned objects will be converted + * into associative arrays. + * @param int $depth User specified recursion depth. + * @param int $options Bitmask of JSON decode options. + * + * @return mixed + * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. + * @link http://www.php.net/manual/en/function.json-decode.php + */ +function json_decode($json, $assoc = false, $depth = 512, $options = 0) +{ + $data = \json_decode($json, $assoc, $depth, $options); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new Exception\InvalidArgumentException( + 'json_decode error: ' . json_last_error_msg() + ); + } + + return $data; +} + +/** + * Wrapper for JSON encoding that throws when an error occurs. + * + * @param mixed $value The value being encoded + * @param int $options JSON encode option bitmask + * @param int $depth Set the maximum depth. Must be greater than zero. + * + * @return string + * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. + * @link http://www.php.net/manual/en/function.json-encode.php + */ +function json_encode($value, $options = 0, $depth = 512) +{ + $json = \json_encode($value, $options, $depth); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new Exception\InvalidArgumentException( + 'json_encode error: ' . json_last_error_msg() + ); + } + + return $json; +} + +/** + * Wrapper for the hrtime() or microtime() functions + * (depending on the PHP version, one of the two is used) + * + * @return float|mixed UNIX timestamp + * @internal + */ +function _current_time() +{ + return function_exists('hrtime') ? hrtime(true) / 1e9 : microtime(true); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions_include.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions_include.php new file mode 100644 index 0000000..a93393a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions_include.php @@ -0,0 +1,6 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/AggregateException.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/AggregateException.php new file mode 100644 index 0000000..6a5690c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/AggregateException.php @@ -0,0 +1,16 @@ +then(function ($v) { echo $v; }); + * + * @param callable $generatorFn Generator function to wrap into a promise. + * + * @return Promise + * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration + */ +final class Coroutine implements PromiseInterface +{ + /** + * @var PromiseInterface|null + */ + private $currentPromise; + + /** + * @var Generator + */ + private $generator; + + /** + * @var Promise + */ + private $result; + + public function __construct(callable $generatorFn) + { + $this->generator = $generatorFn(); + $this->result = new Promise(function () { + while (isset($this->currentPromise)) { + $this->currentPromise->wait(); + } + }); + $this->nextCoroutine($this->generator->current()); + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + return $this->result->then($onFulfilled, $onRejected); + } + + public function otherwise(callable $onRejected) + { + return $this->result->otherwise($onRejected); + } + + public function wait($unwrap = true) + { + return $this->result->wait($unwrap); + } + + public function getState() + { + return $this->result->getState(); + } + + public function resolve($value) + { + $this->result->resolve($value); + } + + public function reject($reason) + { + $this->result->reject($reason); + } + + public function cancel() + { + $this->currentPromise->cancel(); + $this->result->cancel(); + } + + private function nextCoroutine($yielded) + { + $this->currentPromise = promise_for($yielded) + ->then([$this, '_handleSuccess'], [$this, '_handleFailure']); + } + + /** + * @internal + */ + public function _handleSuccess($value) + { + unset($this->currentPromise); + try { + $next = $this->generator->send($value); + if ($this->generator->valid()) { + $this->nextCoroutine($next); + } else { + $this->result->resolve($value); + } + } catch (Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } + + /** + * @internal + */ + public function _handleFailure($reason) + { + unset($this->currentPromise); + try { + $nextYield = $this->generator->throw(exception_for($reason)); + // The throw was caught, so keep iterating on the coroutine + $this->nextCoroutine($nextYield); + } catch (Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/EachPromise.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/EachPromise.php new file mode 100644 index 0000000..d0ddf60 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/EachPromise.php @@ -0,0 +1,229 @@ +iterable = iter_for($iterable); + + if (isset($config['concurrency'])) { + $this->concurrency = $config['concurrency']; + } + + if (isset($config['fulfilled'])) { + $this->onFulfilled = $config['fulfilled']; + } + + if (isset($config['rejected'])) { + $this->onRejected = $config['rejected']; + } + } + + public function promise() + { + if ($this->aggregate) { + return $this->aggregate; + } + + try { + $this->createPromise(); + $this->iterable->rewind(); + $this->refillPending(); + } catch (\Throwable $e) { + $this->aggregate->reject($e); + } catch (\Exception $e) { + $this->aggregate->reject($e); + } + + return $this->aggregate; + } + + private function createPromise() + { + $this->mutex = false; + $this->aggregate = new Promise(function () { + reset($this->pending); + if (empty($this->pending) && !$this->iterable->valid()) { + $this->aggregate->resolve(null); + return; + } + + // Consume a potentially fluctuating list of promises while + // ensuring that indexes are maintained (precluding array_shift). + while ($promise = current($this->pending)) { + next($this->pending); + $promise->wait(); + if ($this->aggregate->getState() !== PromiseInterface::PENDING) { + return; + } + } + }); + + // Clear the references when the promise is resolved. + $clearFn = function () { + $this->iterable = $this->concurrency = $this->pending = null; + $this->onFulfilled = $this->onRejected = null; + }; + + $this->aggregate->then($clearFn, $clearFn); + } + + private function refillPending() + { + if (!$this->concurrency) { + // Add all pending promises. + while ($this->addPending() && $this->advanceIterator()); + return; + } + + // Add only up to N pending promises. + $concurrency = is_callable($this->concurrency) + ? call_user_func($this->concurrency, count($this->pending)) + : $this->concurrency; + $concurrency = max($concurrency - count($this->pending), 0); + // Concurrency may be set to 0 to disallow new promises. + if (!$concurrency) { + return; + } + // Add the first pending promise. + $this->addPending(); + // Note this is special handling for concurrency=1 so that we do + // not advance the iterator after adding the first promise. This + // helps work around issues with generators that might not have the + // next value to yield until promise callbacks are called. + while (--$concurrency + && $this->advanceIterator() + && $this->addPending()); + } + + private function addPending() + { + if (!$this->iterable || !$this->iterable->valid()) { + return false; + } + + $promise = promise_for($this->iterable->current()); + $idx = $this->iterable->key(); + + $this->pending[$idx] = $promise->then( + function ($value) use ($idx) { + if ($this->onFulfilled) { + call_user_func( + $this->onFulfilled, $value, $idx, $this->aggregate + ); + } + $this->step($idx); + }, + function ($reason) use ($idx) { + if ($this->onRejected) { + call_user_func( + $this->onRejected, $reason, $idx, $this->aggregate + ); + } + $this->step($idx); + } + ); + + return true; + } + + private function advanceIterator() + { + // Place a lock on the iterator so that we ensure to not recurse, + // preventing fatal generator errors. + if ($this->mutex) { + return false; + } + + $this->mutex = true; + + try { + $this->iterable->next(); + $this->mutex = false; + return true; + } catch (\Throwable $e) { + $this->aggregate->reject($e); + $this->mutex = false; + return false; + } catch (\Exception $e) { + $this->aggregate->reject($e); + $this->mutex = false; + return false; + } + } + + private function step($idx) + { + // If the promise was already resolved, then ignore this step. + if ($this->aggregate->getState() !== PromiseInterface::PENDING) { + return; + } + + unset($this->pending[$idx]); + + // Only refill pending promises if we are not locked, preventing the + // EachPromise to recursively invoke the provided iterator, which + // cause a fatal error: "Cannot resume an already running generator" + if ($this->advanceIterator() && !$this->checkIfFinished()) { + // Add more pending promises if possible. + $this->refillPending(); + } + } + + private function checkIfFinished() + { + if (!$this->pending && !$this->iterable->valid()) { + // Resolve the promise if there's nothing left to do. + $this->aggregate->resolve(null); + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/FulfilledPromise.php new file mode 100644 index 0000000..dbbeeb9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/FulfilledPromise.php @@ -0,0 +1,82 @@ +value = $value; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + // Return itself if there is no onFulfilled function. + if (!$onFulfilled) { + return $this; + } + + $queue = queue(); + $p = new Promise([$queue, 'run']); + $value = $this->value; + $queue->add(static function () use ($p, $value, $onFulfilled) { + if ($p->getState() === self::PENDING) { + try { + $p->resolve($onFulfilled($value)); + } catch (\Throwable $e) { + $p->reject($e); + } catch (\Exception $e) { + $p->reject($e); + } + } + }); + + return $p; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true, $defaultDelivery = null) + { + return $unwrap ? $this->value : null; + } + + public function getState() + { + return self::FULFILLED; + } + + public function resolve($value) + { + if ($value !== $this->value) { + throw new \LogicException("Cannot resolve a fulfilled promise"); + } + } + + public function reject($reason) + { + throw new \LogicException("Cannot reject a fulfilled promise"); + } + + public function cancel() + { + // pass + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/Promise.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/Promise.php new file mode 100644 index 0000000..844ada0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/Promise.php @@ -0,0 +1,280 @@ +waitFn = $waitFn; + $this->cancelFn = $cancelFn; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + if ($this->state === self::PENDING) { + $p = new Promise(null, [$this, 'cancel']); + $this->handlers[] = [$p, $onFulfilled, $onRejected]; + $p->waitList = $this->waitList; + $p->waitList[] = $this; + return $p; + } + + // Return a fulfilled promise and immediately invoke any callbacks. + if ($this->state === self::FULFILLED) { + return $onFulfilled + ? promise_for($this->result)->then($onFulfilled) + : promise_for($this->result); + } + + // It's either cancelled or rejected, so return a rejected promise + // and immediately invoke any callbacks. + $rejection = rejection_for($this->result); + return $onRejected ? $rejection->then(null, $onRejected) : $rejection; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true) + { + $this->waitIfPending(); + + $inner = $this->result instanceof PromiseInterface + ? $this->result->wait($unwrap) + : $this->result; + + if ($unwrap) { + if ($this->result instanceof PromiseInterface + || $this->state === self::FULFILLED + ) { + return $inner; + } else { + // It's rejected so "unwrap" and throw an exception. + throw exception_for($inner); + } + } + } + + public function getState() + { + return $this->state; + } + + public function cancel() + { + if ($this->state !== self::PENDING) { + return; + } + + $this->waitFn = $this->waitList = null; + + if ($this->cancelFn) { + $fn = $this->cancelFn; + $this->cancelFn = null; + try { + $fn(); + } catch (\Throwable $e) { + $this->reject($e); + } catch (\Exception $e) { + $this->reject($e); + } + } + + // Reject the promise only if it wasn't rejected in a then callback. + if ($this->state === self::PENDING) { + $this->reject(new CancellationException('Promise has been cancelled')); + } + } + + public function resolve($value) + { + $this->settle(self::FULFILLED, $value); + } + + public function reject($reason) + { + $this->settle(self::REJECTED, $reason); + } + + private function settle($state, $value) + { + if ($this->state !== self::PENDING) { + // Ignore calls with the same resolution. + if ($state === $this->state && $value === $this->result) { + return; + } + throw $this->state === $state + ? new \LogicException("The promise is already {$state}.") + : new \LogicException("Cannot change a {$this->state} promise to {$state}"); + } + + if ($value === $this) { + throw new \LogicException('Cannot fulfill or reject a promise with itself'); + } + + // Clear out the state of the promise but stash the handlers. + $this->state = $state; + $this->result = $value; + $handlers = $this->handlers; + $this->handlers = null; + $this->waitList = $this->waitFn = null; + $this->cancelFn = null; + + if (!$handlers) { + return; + } + + // If the value was not a settled promise or a thenable, then resolve + // it in the task queue using the correct ID. + if (!method_exists($value, 'then')) { + $id = $state === self::FULFILLED ? 1 : 2; + // It's a success, so resolve the handlers in the queue. + queue()->add(static function () use ($id, $value, $handlers) { + foreach ($handlers as $handler) { + self::callHandler($id, $value, $handler); + } + }); + } elseif ($value instanceof Promise + && $value->getState() === self::PENDING + ) { + // We can just merge our handlers onto the next promise. + $value->handlers = array_merge($value->handlers, $handlers); + } else { + // Resolve the handlers when the forwarded promise is resolved. + $value->then( + static function ($value) use ($handlers) { + foreach ($handlers as $handler) { + self::callHandler(1, $value, $handler); + } + }, + static function ($reason) use ($handlers) { + foreach ($handlers as $handler) { + self::callHandler(2, $reason, $handler); + } + } + ); + } + } + + /** + * Call a stack of handlers using a specific callback index and value. + * + * @param int $index 1 (resolve) or 2 (reject). + * @param mixed $value Value to pass to the callback. + * @param array $handler Array of handler data (promise and callbacks). + * + * @return array Returns the next group to resolve. + */ + private static function callHandler($index, $value, array $handler) + { + /** @var PromiseInterface $promise */ + $promise = $handler[0]; + + // The promise may have been cancelled or resolved before placing + // this thunk in the queue. + if ($promise->getState() !== self::PENDING) { + return; + } + + try { + if (isset($handler[$index])) { + $promise->resolve($handler[$index]($value)); + } elseif ($index === 1) { + // Forward resolution values as-is. + $promise->resolve($value); + } else { + // Forward rejections down the chain. + $promise->reject($value); + } + } catch (\Throwable $reason) { + $promise->reject($reason); + } catch (\Exception $reason) { + $promise->reject($reason); + } + } + + private function waitIfPending() + { + if ($this->state !== self::PENDING) { + return; + } elseif ($this->waitFn) { + $this->invokeWaitFn(); + } elseif ($this->waitList) { + $this->invokeWaitList(); + } else { + // If there's not wait function, then reject the promise. + $this->reject('Cannot wait on a promise that has ' + . 'no internal wait function. You must provide a wait ' + . 'function when constructing the promise to be able to ' + . 'wait on a promise.'); + } + + queue()->run(); + + if ($this->state === self::PENDING) { + $this->reject('Invoking the wait callback did not resolve the promise'); + } + } + + private function invokeWaitFn() + { + try { + $wfn = $this->waitFn; + $this->waitFn = null; + $wfn(true); + } catch (\Exception $reason) { + if ($this->state === self::PENDING) { + // The promise has not been resolved yet, so reject the promise + // with the exception. + $this->reject($reason); + } else { + // The promise was already resolved, so there's a problem in + // the application. + throw $reason; + } + } + } + + private function invokeWaitList() + { + $waitList = $this->waitList; + $this->waitList = null; + + foreach ($waitList as $result) { + while (true) { + $result->waitIfPending(); + + if ($result->result instanceof Promise) { + $result = $result->result; + } else { + if ($result->result instanceof PromiseInterface) { + $result->result->wait(false); + } + break; + } + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/PromiseInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/PromiseInterface.php new file mode 100644 index 0000000..8f5f4b9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/PromiseInterface.php @@ -0,0 +1,93 @@ +reason = $reason; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + // If there's no onRejected callback then just return self. + if (!$onRejected) { + return $this; + } + + $queue = queue(); + $reason = $this->reason; + $p = new Promise([$queue, 'run']); + $queue->add(static function () use ($p, $reason, $onRejected) { + if ($p->getState() === self::PENDING) { + try { + // Return a resolved promise if onRejected does not throw. + $p->resolve($onRejected($reason)); + } catch (\Throwable $e) { + // onRejected threw, so return a rejected promise. + $p->reject($e); + } catch (\Exception $e) { + // onRejected threw, so return a rejected promise. + $p->reject($e); + } + } + }); + + return $p; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true, $defaultDelivery = null) + { + if ($unwrap) { + throw exception_for($this->reason); + } + } + + public function getState() + { + return self::REJECTED; + } + + public function resolve($value) + { + throw new \LogicException("Cannot resolve a rejected promise"); + } + + public function reject($reason) + { + if ($reason !== $this->reason) { + throw new \LogicException("Cannot reject a rejected promise"); + } + } + + public function cancel() + { + // pass + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/RejectionException.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/RejectionException.php new file mode 100644 index 0000000..07c1136 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/RejectionException.php @@ -0,0 +1,47 @@ +reason = $reason; + + $message = 'The promise was rejected'; + + if ($description) { + $message .= ' with reason: ' . $description; + } elseif (is_string($reason) + || (is_object($reason) && method_exists($reason, '__toString')) + ) { + $message .= ' with reason: ' . $this->reason; + } elseif ($reason instanceof \JsonSerializable) { + $message .= ' with reason: ' + . json_encode($this->reason, JSON_PRETTY_PRINT); + } + + parent::__construct($message); + } + + /** + * Returns the rejection reason. + * + * @return mixed + */ + public function getReason() + { + return $this->reason; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueue.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueue.php new file mode 100644 index 0000000..6e8a2a0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueue.php @@ -0,0 +1,66 @@ +run(); + */ +class TaskQueue implements TaskQueueInterface +{ + private $enableShutdown = true; + private $queue = []; + + public function __construct($withShutdown = true) + { + if ($withShutdown) { + register_shutdown_function(function () { + if ($this->enableShutdown) { + // Only run the tasks if an E_ERROR didn't occur. + $err = error_get_last(); + if (!$err || ($err['type'] ^ E_ERROR)) { + $this->run(); + } + } + }); + } + } + + public function isEmpty() + { + return !$this->queue; + } + + public function add(callable $task) + { + $this->queue[] = $task; + } + + public function run() + { + /** @var callable $task */ + while ($task = array_shift($this->queue)) { + $task(); + } + } + + /** + * The task queue will be run and exhausted by default when the process + * exits IFF the exit is not the result of a PHP E_ERROR error. + * + * You can disable running the automatic shutdown of the queue by calling + * this function. If you disable the task queue shutdown process, then you + * MUST either run the task queue (as a result of running your event loop + * or manually using the run() method) or wait on each outstanding promise. + * + * Note: This shutdown will occur before any destructors are triggered. + */ + public function disableShutdown() + { + $this->enableShutdown = false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueueInterface.php new file mode 100644 index 0000000..ac8306e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/TaskQueueInterface.php @@ -0,0 +1,25 @@ + + * while ($eventLoop->isRunning()) { + * GuzzleHttp\Promise\queue()->run(); + * } + * + * + * @param TaskQueueInterface $assign Optionally specify a new queue instance. + * + * @return TaskQueueInterface + */ +function queue(TaskQueueInterface $assign = null) +{ + static $queue; + + if ($assign) { + $queue = $assign; + } elseif (!$queue) { + $queue = new TaskQueue(); + } + + return $queue; +} + +/** + * Adds a function to run in the task queue when it is next `run()` and returns + * a promise that is fulfilled or rejected with the result. + * + * @param callable $task Task function to run. + * + * @return PromiseInterface + */ +function task(callable $task) +{ + $queue = queue(); + $promise = new Promise([$queue, 'run']); + $queue->add(function () use ($task, $promise) { + try { + $promise->resolve($task()); + } catch (\Throwable $e) { + $promise->reject($e); + } catch (\Exception $e) { + $promise->reject($e); + } + }); + + return $promise; +} + +/** + * Creates a promise for a value if the value is not a promise. + * + * @param mixed $value Promise or value. + * + * @return PromiseInterface + */ +function promise_for($value) +{ + if ($value instanceof PromiseInterface) { + return $value; + } + + // Return a Guzzle promise that shadows the given promise. + if (method_exists($value, 'then')) { + $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null; + $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null; + $promise = new Promise($wfn, $cfn); + $value->then([$promise, 'resolve'], [$promise, 'reject']); + return $promise; + } + + return new FulfilledPromise($value); +} + +/** + * Creates a rejected promise for a reason if the reason is not a promise. If + * the provided reason is a promise, then it is returned as-is. + * + * @param mixed $reason Promise or reason. + * + * @return PromiseInterface + */ +function rejection_for($reason) +{ + if ($reason instanceof PromiseInterface) { + return $reason; + } + + return new RejectedPromise($reason); +} + +/** + * Create an exception for a rejected promise value. + * + * @param mixed $reason + * + * @return \Exception|\Throwable + */ +function exception_for($reason) +{ + return $reason instanceof \Exception || $reason instanceof \Throwable + ? $reason + : new RejectionException($reason); +} + +/** + * Returns an iterator for the given value. + * + * @param mixed $value + * + * @return \Iterator + */ +function iter_for($value) +{ + if ($value instanceof \Iterator) { + return $value; + } elseif (is_array($value)) { + return new \ArrayIterator($value); + } else { + return new \ArrayIterator([$value]); + } +} + +/** + * Synchronously waits on a promise to resolve and returns an inspection state + * array. + * + * Returns a state associative array containing a "state" key mapping to a + * valid promise state. If the state of the promise is "fulfilled", the array + * will contain a "value" key mapping to the fulfilled value of the promise. If + * the promise is rejected, the array will contain a "reason" key mapping to + * the rejection reason of the promise. + * + * @param PromiseInterface $promise Promise or value. + * + * @return array + */ +function inspect(PromiseInterface $promise) +{ + try { + return [ + 'state' => PromiseInterface::FULFILLED, + 'value' => $promise->wait() + ]; + } catch (RejectionException $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; + } catch (\Throwable $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } catch (\Exception $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } +} + +/** + * Waits on all of the provided promises, but does not unwrap rejected promises + * as thrown exception. + * + * Returns an array of inspection state arrays. + * + * @param PromiseInterface[] $promises Traversable of promises to wait upon. + * + * @return array + * @see GuzzleHttp\Promise\inspect for the inspection state array format. + */ +function inspect_all($promises) +{ + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = inspect($promise); + } + + return $results; +} + +/** + * Waits on all of the provided promises and returns the fulfilled values. + * + * Returns an array that contains the value of each promise (in the same order + * the promises were provided). An exception is thrown if any of the promises + * are rejected. + * + * @param mixed $promises Iterable of PromiseInterface objects to wait on. + * + * @return array + * @throws \Exception on error + * @throws \Throwable on error in PHP >=7 + */ +function unwrap($promises) +{ + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = $promise->wait(); + } + + return $results; +} + +/** + * Given an array of promises, return a promise that is fulfilled when all the + * items in the array are fulfilled. + * + * The promise's fulfillment value is an array with fulfillment values at + * respective positions to the original array. If any promise in the array + * rejects, the returned promise is rejected with the rejection reason. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ +function all($promises) +{ + $results = []; + return each( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = $value; + }, + function ($reason, $idx, Promise $aggregate) { + $aggregate->reject($reason); + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); +} + +/** + * Initiate a competitive race between multiple promises or values (values will + * become immediately fulfilled promises). + * + * When count amount of promises have been fulfilled, the returned promise is + * fulfilled with an array that contains the fulfillment values of the winners + * in order of resolution. + * + * This prommise is rejected with a {@see GuzzleHttp\Promise\AggregateException} + * if the number of fulfilled promises is less than the desired $count. + * + * @param int $count Total number of promises. + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ +function some($count, $promises) +{ + $results = []; + $rejections = []; + + return each( + $promises, + function ($value, $idx, PromiseInterface $p) use (&$results, $count) { + if ($p->getState() !== PromiseInterface::PENDING) { + return; + } + $results[$idx] = $value; + if (count($results) >= $count) { + $p->resolve(null); + } + }, + function ($reason) use (&$rejections) { + $rejections[] = $reason; + } + )->then( + function () use (&$results, &$rejections, $count) { + if (count($results) !== $count) { + throw new AggregateException( + 'Not enough promises to fulfill count', + $rejections + ); + } + ksort($results); + return array_values($results); + } + ); +} + +/** + * Like some(), with 1 as count. However, if the promise fulfills, the + * fulfillment value is not an array of 1 but the value directly. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ +function any($promises) +{ + return some(1, $promises)->then(function ($values) { return $values[0]; }); +} + +/** + * Returns a promise that is fulfilled when all of the provided promises have + * been fulfilled or rejected. + * + * The returned promise is fulfilled with an array of inspection state arrays. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + * @see GuzzleHttp\Promise\inspect for the inspection state array format. + */ +function settle($promises) +{ + $results = []; + + return each( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; + }, + function ($reason, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); +} + +/** + * Given an iterator that yields promises or values, returns a promise that is + * fulfilled with a null value when the iterator has been consumed or the + * aggregate promise has been fulfilled or rejected. + * + * $onFulfilled is a function that accepts the fulfilled value, iterator + * index, and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate promise if needed. + * + * $onRejected is a function that accepts the rejection reason, iterator + * index, and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate promise if needed. + * + * @param mixed $iterable Iterator or array to iterate over. + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ +function each( + $iterable, + callable $onFulfilled = null, + callable $onRejected = null +) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected + ]))->promise(); +} + +/** + * Like each, but only allows a certain number of outstanding promises at any + * given time. + * + * $concurrency may be an integer or a function that accepts the number of + * pending promises and returns a numeric concurrency limit value to allow for + * dynamic a concurrency size. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ +function each_limit( + $iterable, + $concurrency, + callable $onFulfilled = null, + callable $onRejected = null +) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected, + 'concurrency' => $concurrency + ]))->promise(); +} + +/** + * Like each_limit, but ensures that no promise in the given $iterable argument + * is rejected. If any promise is rejected, then the aggregate promise is + * rejected with the encountered rejection. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * + * @return PromiseInterface + */ +function each_limit_all( + $iterable, + $concurrency, + callable $onFulfilled = null +) { + return each_limit( + $iterable, + $concurrency, + $onFulfilled, + function ($reason, $idx, PromiseInterface $aggregate) { + $aggregate->reject($reason); + } + ); +} + +/** + * Returns true if a promise is fulfilled. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_fulfilled(PromiseInterface $promise) +{ + return $promise->getState() === PromiseInterface::FULFILLED; +} + +/** + * Returns true if a promise is rejected. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_rejected(PromiseInterface $promise) +{ + return $promise->getState() === PromiseInterface::REJECTED; +} + +/** + * Returns true if a promise is fulfilled or rejected. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_settled(PromiseInterface $promise) +{ + return $promise->getState() !== PromiseInterface::PENDING; +} + +/** + * @see Coroutine + * + * @param callable $generatorFn + * + * @return PromiseInterface + */ +function coroutine(callable $generatorFn) +{ + return new Coroutine($generatorFn); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/functions_include.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/functions_include.php new file mode 100644 index 0000000..34cd171 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/functions_include.php @@ -0,0 +1,6 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/AppendStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/AppendStream.php new file mode 100644 index 0000000..472a0d6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/AppendStream.php @@ -0,0 +1,241 @@ +addStream($stream); + } + } + + public function __toString() + { + try { + $this->rewind(); + return $this->getContents(); + } catch (\Exception $e) { + return ''; + } + } + + /** + * Add a stream to the AppendStream + * + * @param StreamInterface $stream Stream to append. Must be readable. + * + * @throws \InvalidArgumentException if the stream is not readable + */ + public function addStream(StreamInterface $stream) + { + if (!$stream->isReadable()) { + throw new \InvalidArgumentException('Each stream must be readable'); + } + + // The stream is only seekable if all streams are seekable + if (!$stream->isSeekable()) { + $this->seekable = false; + } + + $this->streams[] = $stream; + } + + public function getContents() + { + return copy_to_string($this); + } + + /** + * Closes each attached stream. + * + * {@inheritdoc} + */ + public function close() + { + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->close(); + } + + $this->streams = []; + } + + /** + * Detaches each attached stream. + * + * Returns null as it's not clear which underlying stream resource to return. + * + * {@inheritdoc} + */ + public function detach() + { + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->detach(); + } + + $this->streams = []; + } + + public function tell() + { + return $this->pos; + } + + /** + * Tries to calculate the size by adding the size of each stream. + * + * If any of the streams do not return a valid number, then the size of the + * append stream cannot be determined and null is returned. + * + * {@inheritdoc} + */ + public function getSize() + { + $size = 0; + + foreach ($this->streams as $stream) { + $s = $stream->getSize(); + if ($s === null) { + return null; + } + $size += $s; + } + + return $size; + } + + public function eof() + { + return !$this->streams || + ($this->current >= count($this->streams) - 1 && + $this->streams[$this->current]->eof()); + } + + public function rewind() + { + $this->seek(0); + } + + /** + * Attempts to seek to the given position. Only supports SEEK_SET. + * + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + if (!$this->seekable) { + throw new \RuntimeException('This AppendStream is not seekable'); + } elseif ($whence !== SEEK_SET) { + throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); + } + + $this->pos = $this->current = 0; + + // Rewind each stream + foreach ($this->streams as $i => $stream) { + try { + $stream->rewind(); + } catch (\Exception $e) { + throw new \RuntimeException('Unable to seek stream ' + . $i . ' of the AppendStream', 0, $e); + } + } + + // Seek to the actual position by reading from each stream + while ($this->pos < $offset && !$this->eof()) { + $result = $this->read(min(8096, $offset - $this->pos)); + if ($result === '') { + break; + } + } + } + + /** + * Reads from all of the appended streams until the length is met or EOF. + * + * {@inheritdoc} + */ + public function read($length) + { + $buffer = ''; + $total = count($this->streams) - 1; + $remaining = $length; + $progressToNext = false; + + while ($remaining > 0) { + + // Progress to the next stream if needed. + if ($progressToNext || $this->streams[$this->current]->eof()) { + $progressToNext = false; + if ($this->current === $total) { + break; + } + $this->current++; + } + + $result = $this->streams[$this->current]->read($remaining); + + // Using a loose comparison here to match on '', false, and null + if ($result == null) { + $progressToNext = true; + continue; + } + + $buffer .= $result; + $remaining = $length - strlen($buffer); + } + + $this->pos += strlen($buffer); + + return $buffer; + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return false; + } + + public function isSeekable() + { + return $this->seekable; + } + + public function write($string) + { + throw new \RuntimeException('Cannot write to an AppendStream'); + } + + public function getMetadata($key = null) + { + return $key ? null : []; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/BufferStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/BufferStream.php new file mode 100644 index 0000000..af4d4c2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/BufferStream.php @@ -0,0 +1,137 @@ +hwm = $hwm; + } + + public function __toString() + { + return $this->getContents(); + } + + public function getContents() + { + $buffer = $this->buffer; + $this->buffer = ''; + + return $buffer; + } + + public function close() + { + $this->buffer = ''; + } + + public function detach() + { + $this->close(); + } + + public function getSize() + { + return strlen($this->buffer); + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return true; + } + + public function isSeekable() + { + return false; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + throw new \RuntimeException('Cannot seek a BufferStream'); + } + + public function eof() + { + return strlen($this->buffer) === 0; + } + + public function tell() + { + throw new \RuntimeException('Cannot determine the position of a BufferStream'); + } + + /** + * Reads data from the buffer. + */ + public function read($length) + { + $currentLength = strlen($this->buffer); + + if ($length >= $currentLength) { + // No need to slice the buffer because we don't have enough data. + $result = $this->buffer; + $this->buffer = ''; + } else { + // Slice up the result to provide a subset of the buffer. + $result = substr($this->buffer, 0, $length); + $this->buffer = substr($this->buffer, $length); + } + + return $result; + } + + /** + * Writes data to the buffer. + */ + public function write($string) + { + $this->buffer .= $string; + + // TODO: What should happen here? + if (strlen($this->buffer) >= $this->hwm) { + return false; + } + + return strlen($string); + } + + public function getMetadata($key = null) + { + if ($key == 'hwm') { + return $this->hwm; + } + + return $key ? null : []; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/CachingStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/CachingStream.php new file mode 100644 index 0000000..ed68f08 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/CachingStream.php @@ -0,0 +1,138 @@ +remoteStream = $stream; + $this->stream = $target ?: new Stream(fopen('php://temp', 'r+')); + } + + public function getSize() + { + return max($this->stream->getSize(), $this->remoteStream->getSize()); + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + if ($whence == SEEK_SET) { + $byte = $offset; + } elseif ($whence == SEEK_CUR) { + $byte = $offset + $this->tell(); + } elseif ($whence == SEEK_END) { + $size = $this->remoteStream->getSize(); + if ($size === null) { + $size = $this->cacheEntireStream(); + } + $byte = $size + $offset; + } else { + throw new \InvalidArgumentException('Invalid whence'); + } + + $diff = $byte - $this->stream->getSize(); + + if ($diff > 0) { + // Read the remoteStream until we have read in at least the amount + // of bytes requested, or we reach the end of the file. + while ($diff > 0 && !$this->remoteStream->eof()) { + $this->read($diff); + $diff = $byte - $this->stream->getSize(); + } + } else { + // We can just do a normal seek since we've already seen this byte. + $this->stream->seek($byte); + } + } + + public function read($length) + { + // Perform a regular read on any previously read data from the buffer + $data = $this->stream->read($length); + $remaining = $length - strlen($data); + + // More data was requested so read from the remote stream + if ($remaining) { + // If data was written to the buffer in a position that would have + // been filled from the remote stream, then we must skip bytes on + // the remote stream to emulate overwriting bytes from that + // position. This mimics the behavior of other PHP stream wrappers. + $remoteData = $this->remoteStream->read( + $remaining + $this->skipReadBytes + ); + + if ($this->skipReadBytes) { + $len = strlen($remoteData); + $remoteData = substr($remoteData, $this->skipReadBytes); + $this->skipReadBytes = max(0, $this->skipReadBytes - $len); + } + + $data .= $remoteData; + $this->stream->write($remoteData); + } + + return $data; + } + + public function write($string) + { + // When appending to the end of the currently read stream, you'll want + // to skip bytes from being read from the remote stream to emulate + // other stream wrappers. Basically replacing bytes of data of a fixed + // length. + $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell(); + if ($overflow > 0) { + $this->skipReadBytes += $overflow; + } + + return $this->stream->write($string); + } + + public function eof() + { + return $this->stream->eof() && $this->remoteStream->eof(); + } + + /** + * Close both the remote stream and buffer stream + */ + public function close() + { + $this->remoteStream->close() && $this->stream->close(); + } + + private function cacheEntireStream() + { + $target = new FnStream(['write' => 'strlen']); + copy_to_stream($this, $target); + + return $this->tell(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/DroppingStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/DroppingStream.php new file mode 100644 index 0000000..8935c80 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/DroppingStream.php @@ -0,0 +1,42 @@ +stream = $stream; + $this->maxLength = $maxLength; + } + + public function write($string) + { + $diff = $this->maxLength - $this->stream->getSize(); + + // Begin returning 0 when the underlying stream is too large. + if ($diff <= 0) { + return 0; + } + + // Write the stream or a subset of the stream if needed. + if (strlen($string) < $diff) { + return $this->stream->write($string); + } + + return $this->stream->write(substr($string, 0, $diff)); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/FnStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/FnStream.php new file mode 100644 index 0000000..73daea6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/FnStream.php @@ -0,0 +1,158 @@ +methods = $methods; + + // Create the functions on the class + foreach ($methods as $name => $fn) { + $this->{'_fn_' . $name} = $fn; + } + } + + /** + * Lazily determine which methods are not implemented. + * @throws \BadMethodCallException + */ + public function __get($name) + { + throw new \BadMethodCallException(str_replace('_fn_', '', $name) + . '() is not implemented in the FnStream'); + } + + /** + * The close method is called on the underlying stream only if possible. + */ + public function __destruct() + { + if (isset($this->_fn_close)) { + call_user_func($this->_fn_close); + } + } + + /** + * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. + * @throws \LogicException + */ + public function __wakeup() + { + throw new \LogicException('FnStream should never be unserialized'); + } + + /** + * Adds custom functionality to an underlying stream by intercepting + * specific method calls. + * + * @param StreamInterface $stream Stream to decorate + * @param array $methods Hash of method name to a closure + * + * @return FnStream + */ + public static function decorate(StreamInterface $stream, array $methods) + { + // If any of the required methods were not provided, then simply + // proxy to the decorated stream. + foreach (array_diff(self::$slots, array_keys($methods)) as $diff) { + $methods[$diff] = [$stream, $diff]; + } + + return new self($methods); + } + + public function __toString() + { + return call_user_func($this->_fn___toString); + } + + public function close() + { + return call_user_func($this->_fn_close); + } + + public function detach() + { + return call_user_func($this->_fn_detach); + } + + public function getSize() + { + return call_user_func($this->_fn_getSize); + } + + public function tell() + { + return call_user_func($this->_fn_tell); + } + + public function eof() + { + return call_user_func($this->_fn_eof); + } + + public function isSeekable() + { + return call_user_func($this->_fn_isSeekable); + } + + public function rewind() + { + call_user_func($this->_fn_rewind); + } + + public function seek($offset, $whence = SEEK_SET) + { + call_user_func($this->_fn_seek, $offset, $whence); + } + + public function isWritable() + { + return call_user_func($this->_fn_isWritable); + } + + public function write($string) + { + return call_user_func($this->_fn_write, $string); + } + + public function isReadable() + { + return call_user_func($this->_fn_isReadable); + } + + public function read($length) + { + return call_user_func($this->_fn_read, $length); + } + + public function getContents() + { + return call_user_func($this->_fn_getContents); + } + + public function getMetadata($key = null) + { + return call_user_func($this->_fn_getMetadata, $key); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/InflateStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/InflateStream.php new file mode 100644 index 0000000..5e4f602 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/InflateStream.php @@ -0,0 +1,52 @@ +read(10); + $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); + // Skip the header, that is 10 + length of filename + 1 (nil) bytes + $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); + $resource = StreamWrapper::getResource($stream); + stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ); + $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); + } + + /** + * @param StreamInterface $stream + * @param $header + * @return int + */ + private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) + { + $filename_header_length = 0; + + if (substr(bin2hex($header), 6, 2) === '08') { + // we have a filename, read until nil + $filename_header_length = 1; + while ($stream->read(1) !== chr(0)) { + $filename_header_length++; + } + } + + return $filename_header_length; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LazyOpenStream.php new file mode 100644 index 0000000..02cec3a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LazyOpenStream.php @@ -0,0 +1,39 @@ +filename = $filename; + $this->mode = $mode; + } + + /** + * Creates the underlying stream lazily when required. + * + * @return StreamInterface + */ + protected function createStream() + { + return stream_for(try_fopen($this->filename, $this->mode)); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LimitStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LimitStream.php new file mode 100644 index 0000000..e4f239e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/LimitStream.php @@ -0,0 +1,155 @@ +stream = $stream; + $this->setLimit($limit); + $this->setOffset($offset); + } + + public function eof() + { + // Always return true if the underlying stream is EOF + if ($this->stream->eof()) { + return true; + } + + // No limit and the underlying stream is not at EOF + if ($this->limit == -1) { + return false; + } + + return $this->stream->tell() >= $this->offset + $this->limit; + } + + /** + * Returns the size of the limited subset of data + * {@inheritdoc} + */ + public function getSize() + { + if (null === ($length = $this->stream->getSize())) { + return null; + } elseif ($this->limit == -1) { + return $length - $this->offset; + } else { + return min($this->limit, $length - $this->offset); + } + } + + /** + * Allow for a bounded seek on the read limited stream + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + if ($whence !== SEEK_SET || $offset < 0) { + throw new \RuntimeException(sprintf( + 'Cannot seek to offset %s with whence %s', + $offset, + $whence + )); + } + + $offset += $this->offset; + + if ($this->limit !== -1) { + if ($offset > $this->offset + $this->limit) { + $offset = $this->offset + $this->limit; + } + } + + $this->stream->seek($offset); + } + + /** + * Give a relative tell() + * {@inheritdoc} + */ + public function tell() + { + return $this->stream->tell() - $this->offset; + } + + /** + * Set the offset to start limiting from + * + * @param int $offset Offset to seek to and begin byte limiting from + * + * @throws \RuntimeException if the stream cannot be seeked. + */ + public function setOffset($offset) + { + $current = $this->stream->tell(); + + if ($current !== $offset) { + // If the stream cannot seek to the offset position, then read to it + if ($this->stream->isSeekable()) { + $this->stream->seek($offset); + } elseif ($current > $offset) { + throw new \RuntimeException("Could not seek to stream offset $offset"); + } else { + $this->stream->read($offset - $current); + } + } + + $this->offset = $offset; + } + + /** + * Set the limit of bytes that the decorator allows to be read from the + * stream. + * + * @param int $limit Number of bytes to allow to be read from the stream. + * Use -1 for no limit. + */ + public function setLimit($limit) + { + $this->limit = $limit; + } + + public function read($length) + { + if ($this->limit == -1) { + return $this->stream->read($length); + } + + // Check if the current position is less than the total allowed + // bytes + original offset + $remaining = ($this->offset + $this->limit) - $this->stream->tell(); + if ($remaining > 0) { + // Only return the amount of requested data, ensuring that the byte + // limit is not exceeded + return $this->stream->read(min($remaining, $length)); + } + + return ''; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MessageTrait.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MessageTrait.php new file mode 100644 index 0000000..a7966d1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -0,0 +1,213 @@ + array of values */ + private $headers = []; + + /** @var array Map of lowercase header name => original name at registration */ + private $headerNames = []; + + /** @var string */ + private $protocol = '1.1'; + + /** @var StreamInterface */ + private $stream; + + public function getProtocolVersion() + { + return $this->protocol; + } + + public function withProtocolVersion($version) + { + if ($this->protocol === $version) { + return $this; + } + + $new = clone $this; + $new->protocol = $version; + return $new; + } + + public function getHeaders() + { + return $this->headers; + } + + public function hasHeader($header) + { + return isset($this->headerNames[strtolower($header)]); + } + + public function getHeader($header) + { + $header = strtolower($header); + + if (!isset($this->headerNames[$header])) { + return []; + } + + $header = $this->headerNames[$header]; + + return $this->headers[$header]; + } + + public function getHeaderLine($header) + { + return implode(', ', $this->getHeader($header)); + } + + public function withHeader($header, $value) + { + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + unset($new->headers[$new->headerNames[$normalized]]); + } + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + + return $new; + } + + public function withAddedHeader($header, $value) + { + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $new->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + } + + return $new; + } + + public function withoutHeader($header) + { + $normalized = strtolower($header); + + if (!isset($this->headerNames[$normalized])) { + return $this; + } + + $header = $this->headerNames[$normalized]; + + $new = clone $this; + unset($new->headers[$header], $new->headerNames[$normalized]); + + return $new; + } + + public function getBody() + { + if (!$this->stream) { + $this->stream = stream_for(''); + } + + return $this->stream; + } + + public function withBody(StreamInterface $body) + { + if ($body === $this->stream) { + return $this; + } + + $new = clone $this; + $new->stream = $body; + return $new; + } + + private function setHeaders(array $headers) + { + $this->headerNames = $this->headers = []; + foreach ($headers as $header => $value) { + if (is_int($header)) { + // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec + // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. + $header = (string) $header; + } + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + if (isset($this->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $this->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $this->headerNames[$normalized] = $header; + $this->headers[$header] = $value; + } + } + } + + private function normalizeHeaderValue($value) + { + if (!is_array($value)) { + return $this->trimHeaderValues([$value]); + } + + if (count($value) === 0) { + throw new \InvalidArgumentException('Header value can not be an empty array.'); + } + + return $this->trimHeaderValues($value); + } + + /** + * Trims whitespace from the header values. + * + * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. + * + * header-field = field-name ":" OWS field-value OWS + * OWS = *( SP / HTAB ) + * + * @param string[] $values Header values + * + * @return string[] Trimmed header values + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + */ + private function trimHeaderValues(array $values) + { + return array_map(function ($value) { + if (!is_scalar($value) && null !== $value) { + throw new \InvalidArgumentException(sprintf( + 'Header value must be scalar or null but %s provided.', + is_object($value) ? get_class($value) : gettype($value) + )); + } + + return trim((string) $value, " \t"); + }, $values); + } + + private function assertHeader($header) + { + if (!is_string($header)) { + throw new \InvalidArgumentException(sprintf( + 'Header name must be a string but %s provided.', + is_object($header) ? get_class($header) : gettype($header) + )); + } + + if ($header === '') { + throw new \InvalidArgumentException('Header name can not be empty.'); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MultipartStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MultipartStream.php new file mode 100644 index 0000000..c0fd584 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/MultipartStream.php @@ -0,0 +1,153 @@ +boundary = $boundary ?: sha1(uniqid('', true)); + $this->stream = $this->createStream($elements); + } + + /** + * Get the boundary + * + * @return string + */ + public function getBoundary() + { + return $this->boundary; + } + + public function isWritable() + { + return false; + } + + /** + * Get the headers needed before transferring the content of a POST file + */ + private function getHeaders(array $headers) + { + $str = ''; + foreach ($headers as $key => $value) { + $str .= "{$key}: {$value}\r\n"; + } + + return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n"; + } + + /** + * Create the aggregate stream that will be used to upload the POST data + */ + protected function createStream(array $elements) + { + $stream = new AppendStream(); + + foreach ($elements as $element) { + $this->addElement($stream, $element); + } + + // Add the trailing boundary with CRLF + $stream->addStream(stream_for("--{$this->boundary}--\r\n")); + + return $stream; + } + + private function addElement(AppendStream $stream, array $element) + { + foreach (['contents', 'name'] as $key) { + if (!array_key_exists($key, $element)) { + throw new \InvalidArgumentException("A '{$key}' key is required"); + } + } + + $element['contents'] = stream_for($element['contents']); + + if (empty($element['filename'])) { + $uri = $element['contents']->getMetadata('uri'); + if (substr($uri, 0, 6) !== 'php://') { + $element['filename'] = $uri; + } + } + + list($body, $headers) = $this->createElement( + $element['name'], + $element['contents'], + isset($element['filename']) ? $element['filename'] : null, + isset($element['headers']) ? $element['headers'] : [] + ); + + $stream->addStream(stream_for($this->getHeaders($headers))); + $stream->addStream($body); + $stream->addStream(stream_for("\r\n")); + } + + /** + * @return array + */ + private function createElement($name, StreamInterface $stream, $filename, array $headers) + { + // Set a default content-disposition header if one was no provided + $disposition = $this->getHeader($headers, 'content-disposition'); + if (!$disposition) { + $headers['Content-Disposition'] = ($filename === '0' || $filename) + ? sprintf('form-data; name="%s"; filename="%s"', + $name, + basename($filename)) + : "form-data; name=\"{$name}\""; + } + + // Set a default content-length header if one was no provided + $length = $this->getHeader($headers, 'content-length'); + if (!$length) { + if ($length = $stream->getSize()) { + $headers['Content-Length'] = (string) $length; + } + } + + // Set a default Content-Type if one was not supplied + $type = $this->getHeader($headers, 'content-type'); + if (!$type && ($filename === '0' || $filename)) { + if ($type = mimetype_from_filename($filename)) { + $headers['Content-Type'] = $type; + } + } + + return [$stream, $headers]; + } + + private function getHeader(array $headers, $key) + { + $lowercaseHeader = strtolower($key); + foreach ($headers as $k => $v) { + if (strtolower($k) === $lowercaseHeader) { + return $v; + } + } + + return null; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/NoSeekStream.php new file mode 100644 index 0000000..2332218 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/NoSeekStream.php @@ -0,0 +1,22 @@ +source = $source; + $this->size = isset($options['size']) ? $options['size'] : null; + $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; + $this->buffer = new BufferStream(); + } + + public function __toString() + { + try { + return copy_to_string($this); + } catch (\Exception $e) { + return ''; + } + } + + public function close() + { + $this->detach(); + } + + public function detach() + { + $this->tellPos = false; + $this->source = null; + } + + public function getSize() + { + return $this->size; + } + + public function tell() + { + return $this->tellPos; + } + + public function eof() + { + return !$this->source; + } + + public function isSeekable() + { + return false; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + throw new \RuntimeException('Cannot seek a PumpStream'); + } + + public function isWritable() + { + return false; + } + + public function write($string) + { + throw new \RuntimeException('Cannot write to a PumpStream'); + } + + public function isReadable() + { + return true; + } + + public function read($length) + { + $data = $this->buffer->read($length); + $readLen = strlen($data); + $this->tellPos += $readLen; + $remaining = $length - $readLen; + + if ($remaining) { + $this->pump($remaining); + $data .= $this->buffer->read($remaining); + $this->tellPos += strlen($data) - $readLen; + } + + return $data; + } + + public function getContents() + { + $result = ''; + while (!$this->eof()) { + $result .= $this->read(1000000); + } + + return $result; + } + + public function getMetadata($key = null) + { + if (!$key) { + return $this->metadata; + } + + return isset($this->metadata[$key]) ? $this->metadata[$key] : null; + } + + private function pump($length) + { + if ($this->source) { + do { + $data = call_user_func($this->source, $length); + if ($data === false || $data === null) { + $this->source = null; + return; + } + $this->buffer->write($data); + $length -= strlen($data); + } while ($length > 0); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Request.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Request.php new file mode 100644 index 0000000..59f337d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Request.php @@ -0,0 +1,151 @@ +assertMethod($method); + if (!($uri instanceof UriInterface)) { + $uri = new Uri($uri); + } + + $this->method = strtoupper($method); + $this->uri = $uri; + $this->setHeaders($headers); + $this->protocol = $version; + + if (!isset($this->headerNames['host'])) { + $this->updateHostFromUri(); + } + + if ($body !== '' && $body !== null) { + $this->stream = stream_for($body); + } + } + + public function getRequestTarget() + { + if ($this->requestTarget !== null) { + return $this->requestTarget; + } + + $target = $this->uri->getPath(); + if ($target == '') { + $target = '/'; + } + if ($this->uri->getQuery() != '') { + $target .= '?' . $this->uri->getQuery(); + } + + return $target; + } + + public function withRequestTarget($requestTarget) + { + if (preg_match('#\s#', $requestTarget)) { + throw new InvalidArgumentException( + 'Invalid request target provided; cannot contain whitespace' + ); + } + + $new = clone $this; + $new->requestTarget = $requestTarget; + return $new; + } + + public function getMethod() + { + return $this->method; + } + + public function withMethod($method) + { + $this->assertMethod($method); + $new = clone $this; + $new->method = strtoupper($method); + return $new; + } + + public function getUri() + { + return $this->uri; + } + + public function withUri(UriInterface $uri, $preserveHost = false) + { + if ($uri === $this->uri) { + return $this; + } + + $new = clone $this; + $new->uri = $uri; + + if (!$preserveHost || !isset($this->headerNames['host'])) { + $new->updateHostFromUri(); + } + + return $new; + } + + private function updateHostFromUri() + { + $host = $this->uri->getHost(); + + if ($host == '') { + return; + } + + if (($port = $this->uri->getPort()) !== null) { + $host .= ':' . $port; + } + + if (isset($this->headerNames['host'])) { + $header = $this->headerNames['host']; + } else { + $header = 'Host'; + $this->headerNames['host'] = 'Host'; + } + // Ensure Host is the first header. + // See: http://tools.ietf.org/html/rfc7230#section-5.4 + $this->headers = [$header => [$host]] + $this->headers; + } + + private function assertMethod($method) + { + if (!is_string($method) || $method === '') { + throw new \InvalidArgumentException('Method must be a non-empty string.'); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Response.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Response.php new file mode 100644 index 0000000..e7e04d8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Response.php @@ -0,0 +1,154 @@ + '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', + 208 => 'Already Reported', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Switch Proxy', + 307 => 'Temporary Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 511 => 'Network Authentication Required', + ]; + + /** @var string */ + private $reasonPhrase = ''; + + /** @var int */ + private $statusCode = 200; + + /** + * @param int $status Status code + * @param array $headers Response headers + * @param string|null|resource|StreamInterface $body Response body + * @param string $version Protocol version + * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) + */ + public function __construct( + $status = 200, + array $headers = [], + $body = null, + $version = '1.1', + $reason = null + ) { + $this->assertStatusCodeIsInteger($status); + $status = (int) $status; + $this->assertStatusCodeRange($status); + + $this->statusCode = $status; + + if ($body !== '' && $body !== null) { + $this->stream = stream_for($body); + } + + $this->setHeaders($headers); + if ($reason == '' && isset(self::$phrases[$this->statusCode])) { + $this->reasonPhrase = self::$phrases[$this->statusCode]; + } else { + $this->reasonPhrase = (string) $reason; + } + + $this->protocol = $version; + } + + public function getStatusCode() + { + return $this->statusCode; + } + + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + + public function withStatus($code, $reasonPhrase = '') + { + $this->assertStatusCodeIsInteger($code); + $code = (int) $code; + $this->assertStatusCodeRange($code); + + $new = clone $this; + $new->statusCode = $code; + if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { + $reasonPhrase = self::$phrases[$new->statusCode]; + } + $new->reasonPhrase = $reasonPhrase; + return $new; + } + + private function assertStatusCodeIsInteger($statusCode) + { + if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) { + throw new \InvalidArgumentException('Status code must be an integer value.'); + } + } + + private function assertStatusCodeRange($statusCode) + { + if ($statusCode < 100 || $statusCode >= 600) { + throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Rfc7230.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Rfc7230.php new file mode 100644 index 0000000..505e474 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Rfc7230.php @@ -0,0 +1,18 @@ +@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; + const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/ServerRequest.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/ServerRequest.php new file mode 100644 index 0000000..1a09a6c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -0,0 +1,376 @@ +serverParams = $serverParams; + + parent::__construct($method, $uri, $headers, $body, $version); + } + + /** + * Return an UploadedFile instance array. + * + * @param array $files A array which respect $_FILES structure + * @throws InvalidArgumentException for unrecognized values + * @return array + */ + public static function normalizeFiles(array $files) + { + $normalized = []; + + foreach ($files as $key => $value) { + if ($value instanceof UploadedFileInterface) { + $normalized[$key] = $value; + } elseif (is_array($value) && isset($value['tmp_name'])) { + $normalized[$key] = self::createUploadedFileFromSpec($value); + } elseif (is_array($value)) { + $normalized[$key] = self::normalizeFiles($value); + continue; + } else { + throw new InvalidArgumentException('Invalid value in files specification'); + } + } + + return $normalized; + } + + /** + * Create and return an UploadedFile instance from a $_FILES specification. + * + * If the specification represents an array of values, this method will + * delegate to normalizeNestedFileSpec() and return that return value. + * + * @param array $value $_FILES struct + * @return array|UploadedFileInterface + */ + private static function createUploadedFileFromSpec(array $value) + { + if (is_array($value['tmp_name'])) { + return self::normalizeNestedFileSpec($value); + } + + return new UploadedFile( + $value['tmp_name'], + (int) $value['size'], + (int) $value['error'], + $value['name'], + $value['type'] + ); + } + + /** + * Normalize an array of file specifications. + * + * Loops through all nested files and returns a normalized array of + * UploadedFileInterface instances. + * + * @param array $files + * @return UploadedFileInterface[] + */ + private static function normalizeNestedFileSpec(array $files = []) + { + $normalizedFiles = []; + + foreach (array_keys($files['tmp_name']) as $key) { + $spec = [ + 'tmp_name' => $files['tmp_name'][$key], + 'size' => $files['size'][$key], + 'error' => $files['error'][$key], + 'name' => $files['name'][$key], + 'type' => $files['type'][$key], + ]; + $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); + } + + return $normalizedFiles; + } + + /** + * Return a ServerRequest populated with superglobals: + * $_GET + * $_POST + * $_COOKIE + * $_FILES + * $_SERVER + * + * @return ServerRequestInterface + */ + public static function fromGlobals() + { + $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; + $headers = getallheaders(); + $uri = self::getUriFromGlobals(); + $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); + $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; + + $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); + + return $serverRequest + ->withCookieParams($_COOKIE) + ->withQueryParams($_GET) + ->withParsedBody($_POST) + ->withUploadedFiles(self::normalizeFiles($_FILES)); + } + + private static function extractHostAndPortFromAuthority($authority) + { + $uri = 'http://'.$authority; + $parts = parse_url($uri); + if (false === $parts) { + return [null, null]; + } + + $host = isset($parts['host']) ? $parts['host'] : null; + $port = isset($parts['port']) ? $parts['port'] : null; + + return [$host, $port]; + } + + /** + * Get a Uri populated with values from $_SERVER. + * + * @return UriInterface + */ + public static function getUriFromGlobals() + { + $uri = new Uri(''); + + $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); + + $hasPort = false; + if (isset($_SERVER['HTTP_HOST'])) { + list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); + if ($host !== null) { + $uri = $uri->withHost($host); + } + + if ($port !== null) { + $hasPort = true; + $uri = $uri->withPort($port); + } + } elseif (isset($_SERVER['SERVER_NAME'])) { + $uri = $uri->withHost($_SERVER['SERVER_NAME']); + } elseif (isset($_SERVER['SERVER_ADDR'])) { + $uri = $uri->withHost($_SERVER['SERVER_ADDR']); + } + + if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { + $uri = $uri->withPort($_SERVER['SERVER_PORT']); + } + + $hasQuery = false; + if (isset($_SERVER['REQUEST_URI'])) { + $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2); + $uri = $uri->withPath($requestUriParts[0]); + if (isset($requestUriParts[1])) { + $hasQuery = true; + $uri = $uri->withQuery($requestUriParts[1]); + } + } + + if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { + $uri = $uri->withQuery($_SERVER['QUERY_STRING']); + } + + return $uri; + } + + + /** + * {@inheritdoc} + */ + public function getServerParams() + { + return $this->serverParams; + } + + /** + * {@inheritdoc} + */ + public function getUploadedFiles() + { + return $this->uploadedFiles; + } + + /** + * {@inheritdoc} + */ + public function withUploadedFiles(array $uploadedFiles) + { + $new = clone $this; + $new->uploadedFiles = $uploadedFiles; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getCookieParams() + { + return $this->cookieParams; + } + + /** + * {@inheritdoc} + */ + public function withCookieParams(array $cookies) + { + $new = clone $this; + $new->cookieParams = $cookies; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getQueryParams() + { + return $this->queryParams; + } + + /** + * {@inheritdoc} + */ + public function withQueryParams(array $query) + { + $new = clone $this; + $new->queryParams = $query; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getParsedBody() + { + return $this->parsedBody; + } + + /** + * {@inheritdoc} + */ + public function withParsedBody($data) + { + $new = clone $this; + $new->parsedBody = $data; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function getAttributes() + { + return $this->attributes; + } + + /** + * {@inheritdoc} + */ + public function getAttribute($attribute, $default = null) + { + if (false === array_key_exists($attribute, $this->attributes)) { + return $default; + } + + return $this->attributes[$attribute]; + } + + /** + * {@inheritdoc} + */ + public function withAttribute($attribute, $value) + { + $new = clone $this; + $new->attributes[$attribute] = $value; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function withoutAttribute($attribute) + { + if (false === array_key_exists($attribute, $this->attributes)) { + return $this; + } + + $new = clone $this; + unset($new->attributes[$attribute]); + + return $new; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Stream.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Stream.php new file mode 100644 index 0000000..d9e7409 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Stream.php @@ -0,0 +1,267 @@ +size = $options['size']; + } + + $this->customMetadata = isset($options['metadata']) + ? $options['metadata'] + : []; + + $this->stream = $stream; + $meta = stream_get_meta_data($this->stream); + $this->seekable = $meta['seekable']; + $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']); + $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']); + $this->uri = $this->getMetadata('uri'); + } + + /** + * Closes the stream when the destructed + */ + public function __destruct() + { + $this->close(); + } + + public function __toString() + { + try { + $this->seek(0); + return (string) stream_get_contents($this->stream); + } catch (\Exception $e) { + return ''; + } + } + + public function getContents() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $contents = stream_get_contents($this->stream); + + if ($contents === false) { + throw new \RuntimeException('Unable to read stream contents'); + } + + return $contents; + } + + public function close() + { + if (isset($this->stream)) { + if (is_resource($this->stream)) { + fclose($this->stream); + } + $this->detach(); + } + } + + public function detach() + { + if (!isset($this->stream)) { + return null; + } + + $result = $this->stream; + unset($this->stream); + $this->size = $this->uri = null; + $this->readable = $this->writable = $this->seekable = false; + + return $result; + } + + public function getSize() + { + if ($this->size !== null) { + return $this->size; + } + + if (!isset($this->stream)) { + return null; + } + + // Clear the stat cache if the stream has a URI + if ($this->uri) { + clearstatcache(true, $this->uri); + } + + $stats = fstat($this->stream); + if (isset($stats['size'])) { + $this->size = $stats['size']; + return $this->size; + } + + return null; + } + + public function isReadable() + { + return $this->readable; + } + + public function isWritable() + { + return $this->writable; + } + + public function isSeekable() + { + return $this->seekable; + } + + public function eof() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + return feof($this->stream); + } + + public function tell() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $result = ftell($this->stream); + + if ($result === false) { + throw new \RuntimeException('Unable to determine stream position'); + } + + return $result; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + $whence = (int) $whence; + + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->seekable) { + throw new \RuntimeException('Stream is not seekable'); + } + if (fseek($this->stream, $offset, $whence) === -1) { + throw new \RuntimeException('Unable to seek to stream position ' + . $offset . ' with whence ' . var_export($whence, true)); + } + } + + public function read($length) + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->readable) { + throw new \RuntimeException('Cannot read from non-readable stream'); + } + if ($length < 0) { + throw new \RuntimeException('Length parameter cannot be negative'); + } + + if (0 === $length) { + return ''; + } + + $string = fread($this->stream, $length); + if (false === $string) { + throw new \RuntimeException('Unable to read from stream'); + } + + return $string; + } + + public function write($string) + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->writable) { + throw new \RuntimeException('Cannot write to a non-writable stream'); + } + + // We can't know the size after writing anything + $this->size = null; + $result = fwrite($this->stream, $string); + + if ($result === false) { + throw new \RuntimeException('Unable to write to stream'); + } + + return $result; + } + + public function getMetadata($key = null) + { + if (!isset($this->stream)) { + return $key ? null : []; + } elseif (!$key) { + return $this->customMetadata + stream_get_meta_data($this->stream); + } elseif (isset($this->customMetadata[$key])) { + return $this->customMetadata[$key]; + } + + $meta = stream_get_meta_data($this->stream); + + return isset($meta[$key]) ? $meta[$key] : null; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php new file mode 100644 index 0000000..daec6f5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php @@ -0,0 +1,149 @@ +stream = $stream; + } + + /** + * Magic method used to create a new stream if streams are not added in + * the constructor of a decorator (e.g., LazyOpenStream). + * + * @param string $name Name of the property (allows "stream" only). + * + * @return StreamInterface + */ + public function __get($name) + { + if ($name == 'stream') { + $this->stream = $this->createStream(); + return $this->stream; + } + + throw new \UnexpectedValueException("$name not found on class"); + } + + public function __toString() + { + try { + if ($this->isSeekable()) { + $this->seek(0); + } + return $this->getContents(); + } catch (\Exception $e) { + // Really, PHP? https://bugs.php.net/bug.php?id=53648 + trigger_error('StreamDecorator::__toString exception: ' + . (string) $e, E_USER_ERROR); + return ''; + } + } + + public function getContents() + { + return copy_to_string($this); + } + + /** + * Allow decorators to implement custom methods + * + * @param string $method Missing method name + * @param array $args Method arguments + * + * @return mixed + */ + public function __call($method, array $args) + { + $result = call_user_func_array([$this->stream, $method], $args); + + // Always return the wrapped object if the result is a return $this + return $result === $this->stream ? $this : $result; + } + + public function close() + { + $this->stream->close(); + } + + public function getMetadata($key = null) + { + return $this->stream->getMetadata($key); + } + + public function detach() + { + return $this->stream->detach(); + } + + public function getSize() + { + return $this->stream->getSize(); + } + + public function eof() + { + return $this->stream->eof(); + } + + public function tell() + { + return $this->stream->tell(); + } + + public function isReadable() + { + return $this->stream->isReadable(); + } + + public function isWritable() + { + return $this->stream->isWritable(); + } + + public function isSeekable() + { + return $this->stream->isSeekable(); + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + $this->stream->seek($offset, $whence); + } + + public function read($length) + { + return $this->stream->read($length); + } + + public function write($string) + { + return $this->stream->write($string); + } + + /** + * Implement in subclasses to dynamically create streams when requested. + * + * @return StreamInterface + * @throws \BadMethodCallException + */ + protected function createStream() + { + throw new \BadMethodCallException('Not implemented'); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamWrapper.php new file mode 100644 index 0000000..0f3a285 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/StreamWrapper.php @@ -0,0 +1,161 @@ +isReadable()) { + $mode = $stream->isWritable() ? 'r+' : 'r'; + } elseif ($stream->isWritable()) { + $mode = 'w'; + } else { + throw new \InvalidArgumentException('The stream must be readable, ' + . 'writable, or both.'); + } + + return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream)); + } + + /** + * Creates a stream context that can be used to open a stream as a php stream resource. + * + * @param StreamInterface $stream + * + * @return resource + */ + public static function createStreamContext(StreamInterface $stream) + { + return stream_context_create([ + 'guzzle' => ['stream' => $stream] + ]); + } + + /** + * Registers the stream wrapper if needed + */ + public static function register() + { + if (!in_array('guzzle', stream_get_wrappers())) { + stream_wrapper_register('guzzle', __CLASS__); + } + } + + public function stream_open($path, $mode, $options, &$opened_path) + { + $options = stream_context_get_options($this->context); + + if (!isset($options['guzzle']['stream'])) { + return false; + } + + $this->mode = $mode; + $this->stream = $options['guzzle']['stream']; + + return true; + } + + public function stream_read($count) + { + return $this->stream->read($count); + } + + public function stream_write($data) + { + return (int) $this->stream->write($data); + } + + public function stream_tell() + { + return $this->stream->tell(); + } + + public function stream_eof() + { + return $this->stream->eof(); + } + + public function stream_seek($offset, $whence) + { + $this->stream->seek($offset, $whence); + + return true; + } + + public function stream_cast($cast_as) + { + $stream = clone($this->stream); + + return $stream->detach(); + } + + public function stream_stat() + { + static $modeMap = [ + 'r' => 33060, + 'rb' => 33060, + 'r+' => 33206, + 'w' => 33188, + 'wb' => 33188 + ]; + + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => $modeMap[$this->mode], + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => $this->stream->getSize() ?: 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } + + public function url_stat($path, $flags) + { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0, + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UploadedFile.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UploadedFile.php new file mode 100644 index 0000000..e62bd5c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UploadedFile.php @@ -0,0 +1,316 @@ +setError($errorStatus); + $this->setSize($size); + $this->setClientFilename($clientFilename); + $this->setClientMediaType($clientMediaType); + + if ($this->isOk()) { + $this->setStreamOrFile($streamOrFile); + } + } + + /** + * Depending on the value set file or stream variable + * + * @param mixed $streamOrFile + * @throws InvalidArgumentException + */ + private function setStreamOrFile($streamOrFile) + { + if (is_string($streamOrFile)) { + $this->file = $streamOrFile; + } elseif (is_resource($streamOrFile)) { + $this->stream = new Stream($streamOrFile); + } elseif ($streamOrFile instanceof StreamInterface) { + $this->stream = $streamOrFile; + } else { + throw new InvalidArgumentException( + 'Invalid stream or file provided for UploadedFile' + ); + } + } + + /** + * @param int $error + * @throws InvalidArgumentException + */ + private function setError($error) + { + if (false === is_int($error)) { + throw new InvalidArgumentException( + 'Upload file error status must be an integer' + ); + } + + if (false === in_array($error, UploadedFile::$errors)) { + throw new InvalidArgumentException( + 'Invalid error status for UploadedFile' + ); + } + + $this->error = $error; + } + + /** + * @param int $size + * @throws InvalidArgumentException + */ + private function setSize($size) + { + if (false === is_int($size)) { + throw new InvalidArgumentException( + 'Upload file size must be an integer' + ); + } + + $this->size = $size; + } + + /** + * @param mixed $param + * @return boolean + */ + private function isStringOrNull($param) + { + return in_array(gettype($param), ['string', 'NULL']); + } + + /** + * @param mixed $param + * @return boolean + */ + private function isStringNotEmpty($param) + { + return is_string($param) && false === empty($param); + } + + /** + * @param string|null $clientFilename + * @throws InvalidArgumentException + */ + private function setClientFilename($clientFilename) + { + if (false === $this->isStringOrNull($clientFilename)) { + throw new InvalidArgumentException( + 'Upload file client filename must be a string or null' + ); + } + + $this->clientFilename = $clientFilename; + } + + /** + * @param string|null $clientMediaType + * @throws InvalidArgumentException + */ + private function setClientMediaType($clientMediaType) + { + if (false === $this->isStringOrNull($clientMediaType)) { + throw new InvalidArgumentException( + 'Upload file client media type must be a string or null' + ); + } + + $this->clientMediaType = $clientMediaType; + } + + /** + * Return true if there is no upload error + * + * @return boolean + */ + private function isOk() + { + return $this->error === UPLOAD_ERR_OK; + } + + /** + * @return boolean + */ + public function isMoved() + { + return $this->moved; + } + + /** + * @throws RuntimeException if is moved or not ok + */ + private function validateActive() + { + if (false === $this->isOk()) { + throw new RuntimeException('Cannot retrieve stream due to upload error'); + } + + if ($this->isMoved()) { + throw new RuntimeException('Cannot retrieve stream after it has already been moved'); + } + } + + /** + * {@inheritdoc} + * @throws RuntimeException if the upload was not successful. + */ + public function getStream() + { + $this->validateActive(); + + if ($this->stream instanceof StreamInterface) { + return $this->stream; + } + + return new LazyOpenStream($this->file, 'r+'); + } + + /** + * {@inheritdoc} + * + * @see http://php.net/is_uploaded_file + * @see http://php.net/move_uploaded_file + * @param string $targetPath Path to which to move the uploaded file. + * @throws RuntimeException if the upload was not successful. + * @throws InvalidArgumentException if the $path specified is invalid. + * @throws RuntimeException on any error during the move operation, or on + * the second or subsequent call to the method. + */ + public function moveTo($targetPath) + { + $this->validateActive(); + + if (false === $this->isStringNotEmpty($targetPath)) { + throw new InvalidArgumentException( + 'Invalid path provided for move operation; must be a non-empty string' + ); + } + + if ($this->file) { + $this->moved = php_sapi_name() == 'cli' + ? rename($this->file, $targetPath) + : move_uploaded_file($this->file, $targetPath); + } else { + copy_to_stream( + $this->getStream(), + new LazyOpenStream($targetPath, 'w') + ); + + $this->moved = true; + } + + if (false === $this->moved) { + throw new RuntimeException( + sprintf('Uploaded file could not be moved to %s', $targetPath) + ); + } + } + + /** + * {@inheritdoc} + * + * @return int|null The file size in bytes or null if unknown. + */ + public function getSize() + { + return $this->size; + } + + /** + * {@inheritdoc} + * + * @see http://php.net/manual/en/features.file-upload.errors.php + * @return int One of PHP's UPLOAD_ERR_XXX constants. + */ + public function getError() + { + return $this->error; + } + + /** + * {@inheritdoc} + * + * @return string|null The filename sent by the client or null if none + * was provided. + */ + public function getClientFilename() + { + return $this->clientFilename; + } + + /** + * {@inheritdoc} + */ + public function getClientMediaType() + { + return $this->clientMediaType; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Uri.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Uri.php new file mode 100644 index 0000000..825a25e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/Uri.php @@ -0,0 +1,760 @@ + 80, + 'https' => 443, + 'ftp' => 21, + 'gopher' => 70, + 'nntp' => 119, + 'news' => 119, + 'telnet' => 23, + 'tn3270' => 23, + 'imap' => 143, + 'pop' => 110, + 'ldap' => 389, + ]; + + private static $charUnreserved = 'a-zA-Z0-9_\-\.~'; + private static $charSubDelims = '!\$&\'\(\)\*\+,;='; + private static $replaceQuery = ['=' => '%3D', '&' => '%26']; + + /** @var string Uri scheme. */ + private $scheme = ''; + + /** @var string Uri user info. */ + private $userInfo = ''; + + /** @var string Uri host. */ + private $host = ''; + + /** @var int|null Uri port. */ + private $port; + + /** @var string Uri path. */ + private $path = ''; + + /** @var string Uri query string. */ + private $query = ''; + + /** @var string Uri fragment. */ + private $fragment = ''; + + /** + * @param string $uri URI to parse + */ + public function __construct($uri = '') + { + // weak type check to also accept null until we can add scalar type hints + if ($uri != '') { + $parts = parse_url($uri); + if ($parts === false) { + throw new \InvalidArgumentException("Unable to parse URI: $uri"); + } + $this->applyParts($parts); + } + } + + public function __toString() + { + return self::composeComponents( + $this->scheme, + $this->getAuthority(), + $this->path, + $this->query, + $this->fragment + ); + } + + /** + * Composes a URI reference string from its various components. + * + * Usually this method does not need to be called manually but instead is used indirectly via + * `Psr\Http\Message\UriInterface::__toString`. + * + * PSR-7 UriInterface treats an empty component the same as a missing component as + * getQuery(), getFragment() etc. always return a string. This explains the slight + * difference to RFC 3986 Section 5.3. + * + * Another adjustment is that the authority separator is added even when the authority is missing/empty + * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with + * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But + * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to + * that format). + * + * @param string $scheme + * @param string $authority + * @param string $path + * @param string $query + * @param string $fragment + * + * @return string + * + * @link https://tools.ietf.org/html/rfc3986#section-5.3 + */ + public static function composeComponents($scheme, $authority, $path, $query, $fragment) + { + $uri = ''; + + // weak type checks to also accept null until we can add scalar type hints + if ($scheme != '') { + $uri .= $scheme . ':'; + } + + if ($authority != ''|| $scheme === 'file') { + $uri .= '//' . $authority; + } + + $uri .= $path; + + if ($query != '') { + $uri .= '?' . $query; + } + + if ($fragment != '') { + $uri .= '#' . $fragment; + } + + return $uri; + } + + /** + * Whether the URI has the default port of the current scheme. + * + * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used + * independently of the implementation. + * + * @param UriInterface $uri + * + * @return bool + */ + public static function isDefaultPort(UriInterface $uri) + { + return $uri->getPort() === null + || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]); + } + + /** + * Whether the URI is absolute, i.e. it has a scheme. + * + * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true + * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative + * to another URI, the base URI. Relative references can be divided into several forms: + * - network-path references, e.g. '//example.com/path' + * - absolute-path references, e.g. '/path' + * - relative-path references, e.g. 'subpath' + * + * @param UriInterface $uri + * + * @return bool + * @see Uri::isNetworkPathReference + * @see Uri::isAbsolutePathReference + * @see Uri::isRelativePathReference + * @link https://tools.ietf.org/html/rfc3986#section-4 + */ + public static function isAbsolute(UriInterface $uri) + { + return $uri->getScheme() !== ''; + } + + /** + * Whether the URI is a network-path reference. + * + * A relative reference that begins with two slash characters is termed an network-path reference. + * + * @param UriInterface $uri + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isNetworkPathReference(UriInterface $uri) + { + return $uri->getScheme() === '' && $uri->getAuthority() !== ''; + } + + /** + * Whether the URI is a absolute-path reference. + * + * A relative reference that begins with a single slash character is termed an absolute-path reference. + * + * @param UriInterface $uri + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isAbsolutePathReference(UriInterface $uri) + { + return $uri->getScheme() === '' + && $uri->getAuthority() === '' + && isset($uri->getPath()[0]) + && $uri->getPath()[0] === '/'; + } + + /** + * Whether the URI is a relative-path reference. + * + * A relative reference that does not begin with a slash character is termed a relative-path reference. + * + * @param UriInterface $uri + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isRelativePathReference(UriInterface $uri) + { + return $uri->getScheme() === '' + && $uri->getAuthority() === '' + && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); + } + + /** + * Whether the URI is a same-document reference. + * + * A same-document reference refers to a URI that is, aside from its fragment + * component, identical to the base URI. When no base URI is given, only an empty + * URI reference (apart from its fragment) is considered a same-document reference. + * + * @param UriInterface $uri The URI to check + * @param UriInterface|null $base An optional base URI to compare against + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-4.4 + */ + public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) + { + if ($base !== null) { + $uri = UriResolver::resolve($base, $uri); + + return ($uri->getScheme() === $base->getScheme()) + && ($uri->getAuthority() === $base->getAuthority()) + && ($uri->getPath() === $base->getPath()) + && ($uri->getQuery() === $base->getQuery()); + } + + return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; + } + + /** + * Removes dot segments from a path and returns the new path. + * + * @param string $path + * + * @return string + * + * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead. + * @see UriResolver::removeDotSegments + */ + public static function removeDotSegments($path) + { + return UriResolver::removeDotSegments($path); + } + + /** + * Converts the relative URI into a new URI that is resolved against the base URI. + * + * @param UriInterface $base Base URI + * @param string|UriInterface $rel Relative URI + * + * @return UriInterface + * + * @deprecated since version 1.4. Use UriResolver::resolve instead. + * @see UriResolver::resolve + */ + public static function resolve(UriInterface $base, $rel) + { + if (!($rel instanceof UriInterface)) { + $rel = new self($rel); + } + + return UriResolver::resolve($base, $rel); + } + + /** + * Creates a new URI with a specific query string value removed. + * + * Any existing query string values that exactly match the provided key are + * removed. + * + * @param UriInterface $uri URI to use as a base. + * @param string $key Query string key to remove. + * + * @return UriInterface + */ + public static function withoutQueryValue(UriInterface $uri, $key) + { + $result = self::getFilteredQueryString($uri, [$key]); + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a new URI with a specific query string value. + * + * Any existing query string values that exactly match the provided key are + * removed and replaced with the given key value pair. + * + * A value of null will set the query string key without a value, e.g. "key" + * instead of "key=value". + * + * @param UriInterface $uri URI to use as a base. + * @param string $key Key to set. + * @param string|null $value Value to set + * + * @return UriInterface + */ + public static function withQueryValue(UriInterface $uri, $key, $value) + { + $result = self::getFilteredQueryString($uri, [$key]); + + $result[] = self::generateQueryString($key, $value); + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a new URI with multiple specific query string values. + * + * It has the same behavior as withQueryValue() but for an associative array of key => value. + * + * @param UriInterface $uri URI to use as a base. + * @param array $keyValueArray Associative array of key and values + * + * @return UriInterface + */ + public static function withQueryValues(UriInterface $uri, array $keyValueArray) + { + $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); + + foreach ($keyValueArray as $key => $value) { + $result[] = self::generateQueryString($key, $value); + } + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a URI from a hash of `parse_url` components. + * + * @param array $parts + * + * @return UriInterface + * @link http://php.net/manual/en/function.parse-url.php + * + * @throws \InvalidArgumentException If the components do not form a valid URI. + */ + public static function fromParts(array $parts) + { + $uri = new self(); + $uri->applyParts($parts); + $uri->validateState(); + + return $uri; + } + + public function getScheme() + { + return $this->scheme; + } + + public function getAuthority() + { + $authority = $this->host; + if ($this->userInfo !== '') { + $authority = $this->userInfo . '@' . $authority; + } + + if ($this->port !== null) { + $authority .= ':' . $this->port; + } + + return $authority; + } + + public function getUserInfo() + { + return $this->userInfo; + } + + public function getHost() + { + return $this->host; + } + + public function getPort() + { + return $this->port; + } + + public function getPath() + { + return $this->path; + } + + public function getQuery() + { + return $this->query; + } + + public function getFragment() + { + return $this->fragment; + } + + public function withScheme($scheme) + { + $scheme = $this->filterScheme($scheme); + + if ($this->scheme === $scheme) { + return $this; + } + + $new = clone $this; + $new->scheme = $scheme; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withUserInfo($user, $password = null) + { + $info = $this->filterUserInfoComponent($user); + if ($password !== null) { + $info .= ':' . $this->filterUserInfoComponent($password); + } + + if ($this->userInfo === $info) { + return $this; + } + + $new = clone $this; + $new->userInfo = $info; + $new->validateState(); + + return $new; + } + + public function withHost($host) + { + $host = $this->filterHost($host); + + if ($this->host === $host) { + return $this; + } + + $new = clone $this; + $new->host = $host; + $new->validateState(); + + return $new; + } + + public function withPort($port) + { + $port = $this->filterPort($port); + + if ($this->port === $port) { + return $this; + } + + $new = clone $this; + $new->port = $port; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withPath($path) + { + $path = $this->filterPath($path); + + if ($this->path === $path) { + return $this; + } + + $new = clone $this; + $new->path = $path; + $new->validateState(); + + return $new; + } + + public function withQuery($query) + { + $query = $this->filterQueryAndFragment($query); + + if ($this->query === $query) { + return $this; + } + + $new = clone $this; + $new->query = $query; + + return $new; + } + + public function withFragment($fragment) + { + $fragment = $this->filterQueryAndFragment($fragment); + + if ($this->fragment === $fragment) { + return $this; + } + + $new = clone $this; + $new->fragment = $fragment; + + return $new; + } + + /** + * Apply parse_url parts to a URI. + * + * @param array $parts Array of parse_url parts to apply. + */ + private function applyParts(array $parts) + { + $this->scheme = isset($parts['scheme']) + ? $this->filterScheme($parts['scheme']) + : ''; + $this->userInfo = isset($parts['user']) + ? $this->filterUserInfoComponent($parts['user']) + : ''; + $this->host = isset($parts['host']) + ? $this->filterHost($parts['host']) + : ''; + $this->port = isset($parts['port']) + ? $this->filterPort($parts['port']) + : null; + $this->path = isset($parts['path']) + ? $this->filterPath($parts['path']) + : ''; + $this->query = isset($parts['query']) + ? $this->filterQueryAndFragment($parts['query']) + : ''; + $this->fragment = isset($parts['fragment']) + ? $this->filterQueryAndFragment($parts['fragment']) + : ''; + if (isset($parts['pass'])) { + $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); + } + + $this->removeDefaultPort(); + } + + /** + * @param string $scheme + * + * @return string + * + * @throws \InvalidArgumentException If the scheme is invalid. + */ + private function filterScheme($scheme) + { + if (!is_string($scheme)) { + throw new \InvalidArgumentException('Scheme must be a string'); + } + + return strtolower($scheme); + } + + /** + * @param string $component + * + * @return string + * + * @throws \InvalidArgumentException If the user info is invalid. + */ + private function filterUserInfoComponent($component) + { + if (!is_string($component)) { + throw new \InvalidArgumentException('User info must be a string'); + } + + return preg_replace_callback( + '/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $component + ); + } + + /** + * @param string $host + * + * @return string + * + * @throws \InvalidArgumentException If the host is invalid. + */ + private function filterHost($host) + { + if (!is_string($host)) { + throw new \InvalidArgumentException('Host must be a string'); + } + + return strtolower($host); + } + + /** + * @param int|null $port + * + * @return int|null + * + * @throws \InvalidArgumentException If the port is invalid. + */ + private function filterPort($port) + { + if ($port === null) { + return null; + } + + $port = (int) $port; + if (0 > $port || 0xffff < $port) { + throw new \InvalidArgumentException( + sprintf('Invalid port: %d. Must be between 0 and 65535', $port) + ); + } + + return $port; + } + + /** + * @param UriInterface $uri + * @param array $keys + * + * @return array + */ + private static function getFilteredQueryString(UriInterface $uri, array $keys) + { + $current = $uri->getQuery(); + + if ($current === '') { + return []; + } + + $decodedKeys = array_map('rawurldecode', $keys); + + return array_filter(explode('&', $current), function ($part) use ($decodedKeys) { + return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true); + }); + } + + /** + * @param string $key + * @param string|null $value + * + * @return string + */ + private static function generateQueryString($key, $value) + { + // Query string separators ("=", "&") within the key or value need to be encoded + // (while preventing double-encoding) before setting the query string. All other + // chars that need percent-encoding will be encoded by withQuery(). + $queryString = strtr($key, self::$replaceQuery); + + if ($value !== null) { + $queryString .= '=' . strtr($value, self::$replaceQuery); + } + + return $queryString; + } + + private function removeDefaultPort() + { + if ($this->port !== null && self::isDefaultPort($this)) { + $this->port = null; + } + } + + /** + * Filters the path of a URI + * + * @param string $path + * + * @return string + * + * @throws \InvalidArgumentException If the path is invalid. + */ + private function filterPath($path) + { + if (!is_string($path)) { + throw new \InvalidArgumentException('Path must be a string'); + } + + return preg_replace_callback( + '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $path + ); + } + + /** + * Filters the query string or fragment of a URI. + * + * @param string $str + * + * @return string + * + * @throws \InvalidArgumentException If the query or fragment is invalid. + */ + private function filterQueryAndFragment($str) + { + if (!is_string($str)) { + throw new \InvalidArgumentException('Query and fragment must be a string'); + } + + return preg_replace_callback( + '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $str + ); + } + + private function rawurlencodeMatchZero(array $match) + { + return rawurlencode($match[0]); + } + + private function validateState() + { + if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { + $this->host = self::HTTP_DEFAULT_HOST; + } + + if ($this->getAuthority() === '') { + if (0 === strpos($this->path, '//')) { + throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"'); + } + if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) { + throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon'); + } + } elseif (isset($this->path[0]) && $this->path[0] !== '/') { + @trigger_error( + 'The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' . + 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.', + E_USER_DEPRECATED + ); + $this->path = '/'. $this->path; + //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty'); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriNormalizer.php new file mode 100644 index 0000000..384c29e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriNormalizer.php @@ -0,0 +1,216 @@ +getPath() === '' && + ($uri->getScheme() === 'http' || $uri->getScheme() === 'https') + ) { + $uri = $uri->withPath('/'); + } + + if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { + $uri = $uri->withHost(''); + } + + if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { + $uri = $uri->withPort(null); + } + + if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { + $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); + } + + if ($flags & self::REMOVE_DUPLICATE_SLASHES) { + $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath())); + } + + if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { + $queryKeyValues = explode('&', $uri->getQuery()); + sort($queryKeyValues); + $uri = $uri->withQuery(implode('&', $queryKeyValues)); + } + + return $uri; + } + + /** + * Whether two URIs can be considered equivalent. + * + * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also + * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be + * resolved against the same base URI. If this is not the case, determination of equivalence or difference of + * relative references does not mean anything. + * + * @param UriInterface $uri1 An URI to compare + * @param UriInterface $uri2 An URI to compare + * @param int $normalizations A bitmask of normalizations to apply, see constants + * + * @return bool + * @link https://tools.ietf.org/html/rfc3986#section-6.1 + */ + public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS) + { + return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); + } + + private static function capitalizePercentEncoding(UriInterface $uri) + { + $regex = '/(?:%[A-Fa-f0-9]{2})++/'; + + $callback = function (array $match) { + return strtoupper($match[0]); + }; + + return + $uri->withPath( + preg_replace_callback($regex, $callback, $uri->getPath()) + )->withQuery( + preg_replace_callback($regex, $callback, $uri->getQuery()) + ); + } + + private static function decodeUnreservedCharacters(UriInterface $uri) + { + $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; + + $callback = function (array $match) { + return rawurldecode($match[0]); + }; + + return + $uri->withPath( + preg_replace_callback($regex, $callback, $uri->getPath()) + )->withQuery( + preg_replace_callback($regex, $callback, $uri->getQuery()) + ); + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriResolver.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriResolver.php new file mode 100644 index 0000000..c1cb8a2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/UriResolver.php @@ -0,0 +1,219 @@ +getScheme() != '') { + return $rel->withPath(self::removeDotSegments($rel->getPath())); + } + + if ($rel->getAuthority() != '') { + $targetAuthority = $rel->getAuthority(); + $targetPath = self::removeDotSegments($rel->getPath()); + $targetQuery = $rel->getQuery(); + } else { + $targetAuthority = $base->getAuthority(); + if ($rel->getPath() === '') { + $targetPath = $base->getPath(); + $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); + } else { + if ($rel->getPath()[0] === '/') { + $targetPath = $rel->getPath(); + } else { + if ($targetAuthority != '' && $base->getPath() === '') { + $targetPath = '/' . $rel->getPath(); + } else { + $lastSlashPos = strrpos($base->getPath(), '/'); + if ($lastSlashPos === false) { + $targetPath = $rel->getPath(); + } else { + $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); + } + } + } + $targetPath = self::removeDotSegments($targetPath); + $targetQuery = $rel->getQuery(); + } + } + + return new Uri(Uri::composeComponents( + $base->getScheme(), + $targetAuthority, + $targetPath, + $targetQuery, + $rel->getFragment() + )); + } + + /** + * Returns the target URI as a relative reference from the base URI. + * + * This method is the counterpart to resolve(): + * + * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) + * + * One use-case is to use the current request URI as base URI and then generate relative links in your documents + * to reduce the document size or offer self-contained downloadable document archives. + * + * $base = new Uri('http://example.com/a/b/'); + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. + * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. + * + * This method also accepts a target that is already relative and will try to relativize it further. Only a + * relative-path reference will be returned as-is. + * + * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well + * + * @param UriInterface $base Base URI + * @param UriInterface $target Target URI + * + * @return UriInterface The relative URI reference + */ + public static function relativize(UriInterface $base, UriInterface $target) + { + if ($target->getScheme() !== '' && + ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '') + ) { + return $target; + } + + if (Uri::isRelativePathReference($target)) { + // As the target is already highly relative we return it as-is. It would be possible to resolve + // the target with `$target = self::resolve($base, $target);` and then try make it more relative + // by removing a duplicate query. But let's not do that automatically. + return $target; + } + + if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { + return $target->withScheme(''); + } + + // We must remove the path before removing the authority because if the path starts with two slashes, the URI + // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also + // invalid. + $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); + + if ($base->getPath() !== $target->getPath()) { + return $emptyPathUri->withPath(self::getRelativePath($base, $target)); + } + + if ($base->getQuery() === $target->getQuery()) { + // Only the target fragment is left. And it must be returned even if base and target fragment are the same. + return $emptyPathUri->withQuery(''); + } + + // If the base URI has a query but the target has none, we cannot return an empty path reference as it would + // inherit the base query component when resolving. + if ($target->getQuery() === '') { + $segments = explode('/', $target->getPath()); + $lastSegment = end($segments); + + return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); + } + + return $emptyPathUri; + } + + private static function getRelativePath(UriInterface $base, UriInterface $target) + { + $sourceSegments = explode('/', $base->getPath()); + $targetSegments = explode('/', $target->getPath()); + array_pop($sourceSegments); + $targetLastSegment = array_pop($targetSegments); + foreach ($sourceSegments as $i => $segment) { + if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { + unset($sourceSegments[$i], $targetSegments[$i]); + } else { + break; + } + } + $targetSegments[] = $targetLastSegment; + $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments); + + // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". + // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used + // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. + if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) { + $relativePath = "./$relativePath"; + } elseif ('/' === $relativePath[0]) { + if ($base->getAuthority() != '' && $base->getPath() === '') { + // In this case an extra slash is added by resolve() automatically. So we must not add one here. + $relativePath = ".$relativePath"; + } else { + $relativePath = "./$relativePath"; + } + } + + return $relativePath; + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions.php new file mode 100644 index 0000000..8e6dafe --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions.php @@ -0,0 +1,899 @@ +getMethod() . ' ' + . $message->getRequestTarget()) + . ' HTTP/' . $message->getProtocolVersion(); + if (!$message->hasHeader('host')) { + $msg .= "\r\nHost: " . $message->getUri()->getHost(); + } + } elseif ($message instanceof ResponseInterface) { + $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' + . $message->getStatusCode() . ' ' + . $message->getReasonPhrase(); + } else { + throw new \InvalidArgumentException('Unknown message type'); + } + + foreach ($message->getHeaders() as $name => $values) { + $msg .= "\r\n{$name}: " . implode(', ', $values); + } + + return "{$msg}\r\n\r\n" . $message->getBody(); +} + +/** + * Returns a UriInterface for the given value. + * + * This function accepts a string or {@see Psr\Http\Message\UriInterface} and + * returns a UriInterface for the given value. If the value is already a + * `UriInterface`, it is returned as-is. + * + * @param string|UriInterface $uri + * + * @return UriInterface + * @throws \InvalidArgumentException + */ +function uri_for($uri) +{ + if ($uri instanceof UriInterface) { + return $uri; + } elseif (is_string($uri)) { + return new Uri($uri); + } + + throw new \InvalidArgumentException('URI must be a string or UriInterface'); +} + +/** + * Create a new stream based on the input type. + * + * Options is an associative array that can contain the following keys: + * - metadata: Array of custom metadata. + * - size: Size of the stream. + * + * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data + * @param array $options Additional options + * + * @return StreamInterface + * @throws \InvalidArgumentException if the $resource arg is not valid. + */ +function stream_for($resource = '', array $options = []) +{ + if (is_scalar($resource)) { + $stream = fopen('php://temp', 'r+'); + if ($resource !== '') { + fwrite($stream, $resource); + fseek($stream, 0); + } + return new Stream($stream, $options); + } + + switch (gettype($resource)) { + case 'resource': + return new Stream($resource, $options); + case 'object': + if ($resource instanceof StreamInterface) { + return $resource; + } elseif ($resource instanceof \Iterator) { + return new PumpStream(function () use ($resource) { + if (!$resource->valid()) { + return false; + } + $result = $resource->current(); + $resource->next(); + return $result; + }, $options); + } elseif (method_exists($resource, '__toString')) { + return stream_for((string) $resource, $options); + } + break; + case 'NULL': + return new Stream(fopen('php://temp', 'r+'), $options); + } + + if (is_callable($resource)) { + return new PumpStream($resource, $options); + } + + throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource)); +} + +/** + * Parse an array of header values containing ";" separated data into an + * array of associative arrays representing the header key value pair + * data of the header. When a parameter does not contain a value, but just + * contains a key, this function will inject a key with a '' string value. + * + * @param string|array $header Header to parse into components. + * + * @return array Returns the parsed header values. + */ +function parse_header($header) +{ + static $trimmed = "\"' \n\t\r"; + $params = $matches = []; + + foreach (normalize_header($header) as $val) { + $part = []; + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { + $m = $matches[0]; + if (isset($m[1])) { + $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); + } else { + $part[] = trim($m[0], $trimmed); + } + } + } + if ($part) { + $params[] = $part; + } + } + + return $params; +} + +/** + * Converts an array of header values that may contain comma separated + * headers into an array of headers with no comma separated values. + * + * @param string|array $header Header to normalize. + * + * @return array Returns the normalized header field values. + */ +function normalize_header($header) +{ + if (!is_array($header)) { + return array_map('trim', explode(',', $header)); + } + + $result = []; + foreach ($header as $value) { + foreach ((array) $value as $v) { + if (strpos($v, ',') === false) { + $result[] = $v; + continue; + } + foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { + $result[] = trim($vv); + } + } + } + + return $result; +} + +/** + * Clone and modify a request with the given changes. + * + * The changes can be one of: + * - method: (string) Changes the HTTP method. + * - set_headers: (array) Sets the given headers. + * - remove_headers: (array) Remove the given headers. + * - body: (mixed) Sets the given body. + * - uri: (UriInterface) Set the URI. + * - query: (string) Set the query string value of the URI. + * - version: (string) Set the protocol version. + * + * @param RequestInterface $request Request to clone and modify. + * @param array $changes Changes to apply. + * + * @return RequestInterface + */ +function modify_request(RequestInterface $request, array $changes) +{ + if (!$changes) { + return $request; + } + + $headers = $request->getHeaders(); + + if (!isset($changes['uri'])) { + $uri = $request->getUri(); + } else { + // Remove the host header if one is on the URI + if ($host = $changes['uri']->getHost()) { + $changes['set_headers']['Host'] = $host; + + if ($port = $changes['uri']->getPort()) { + $standardPorts = ['http' => 80, 'https' => 443]; + $scheme = $changes['uri']->getScheme(); + if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { + $changes['set_headers']['Host'] .= ':'.$port; + } + } + } + $uri = $changes['uri']; + } + + if (!empty($changes['remove_headers'])) { + $headers = _caseless_remove($changes['remove_headers'], $headers); + } + + if (!empty($changes['set_headers'])) { + $headers = _caseless_remove(array_keys($changes['set_headers']), $headers); + $headers = $changes['set_headers'] + $headers; + } + + if (isset($changes['query'])) { + $uri = $uri->withQuery($changes['query']); + } + + if ($request instanceof ServerRequestInterface) { + return (new ServerRequest( + isset($changes['method']) ? $changes['method'] : $request->getMethod(), + $uri, + $headers, + isset($changes['body']) ? $changes['body'] : $request->getBody(), + isset($changes['version']) + ? $changes['version'] + : $request->getProtocolVersion(), + $request->getServerParams() + )) + ->withParsedBody($request->getParsedBody()) + ->withQueryParams($request->getQueryParams()) + ->withCookieParams($request->getCookieParams()) + ->withUploadedFiles($request->getUploadedFiles()); + } + + return new Request( + isset($changes['method']) ? $changes['method'] : $request->getMethod(), + $uri, + $headers, + isset($changes['body']) ? $changes['body'] : $request->getBody(), + isset($changes['version']) + ? $changes['version'] + : $request->getProtocolVersion() + ); +} + +/** + * Attempts to rewind a message body and throws an exception on failure. + * + * The body of the message will only be rewound if a call to `tell()` returns a + * value other than `0`. + * + * @param MessageInterface $message Message to rewind + * + * @throws \RuntimeException + */ +function rewind_body(MessageInterface $message) +{ + $body = $message->getBody(); + + if ($body->tell()) { + $body->rewind(); + } +} + +/** + * Safely opens a PHP stream resource using a filename. + * + * When fopen fails, PHP normally raises a warning. This function adds an + * error handler that checks for errors and throws an exception instead. + * + * @param string $filename File to open + * @param string $mode Mode used to open the file + * + * @return resource + * @throws \RuntimeException if the file cannot be opened + */ +function try_fopen($filename, $mode) +{ + $ex = null; + set_error_handler(function () use ($filename, $mode, &$ex) { + $ex = new \RuntimeException(sprintf( + 'Unable to open %s using mode %s: %s', + $filename, + $mode, + func_get_args()[1] + )); + }); + + $handle = fopen($filename, $mode); + restore_error_handler(); + + if ($ex) { + /** @var $ex \RuntimeException */ + throw $ex; + } + + return $handle; +} + +/** + * Copy the contents of a stream into a string until the given number of + * bytes have been read. + * + * @param StreamInterface $stream Stream to read + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * @return string + * @throws \RuntimeException on error. + */ +function copy_to_string(StreamInterface $stream, $maxLen = -1) +{ + $buffer = ''; + + if ($maxLen === -1) { + while (!$stream->eof()) { + $buf = $stream->read(1048576); + // Using a loose equality here to match on '' and false. + if ($buf == null) { + break; + } + $buffer .= $buf; + } + return $buffer; + } + + $len = 0; + while (!$stream->eof() && $len < $maxLen) { + $buf = $stream->read($maxLen - $len); + // Using a loose equality here to match on '' and false. + if ($buf == null) { + break; + } + $buffer .= $buf; + $len = strlen($buffer); + } + + return $buffer; +} + +/** + * Copy the contents of a stream into another stream until the given number + * of bytes have been read. + * + * @param StreamInterface $source Stream to read from + * @param StreamInterface $dest Stream to write to + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * + * @throws \RuntimeException on error. + */ +function copy_to_stream( + StreamInterface $source, + StreamInterface $dest, + $maxLen = -1 +) { + $bufferSize = 8192; + + if ($maxLen === -1) { + while (!$source->eof()) { + if (!$dest->write($source->read($bufferSize))) { + break; + } + } + } else { + $remaining = $maxLen; + while ($remaining > 0 && !$source->eof()) { + $buf = $source->read(min($bufferSize, $remaining)); + $len = strlen($buf); + if (!$len) { + break; + } + $remaining -= $len; + $dest->write($buf); + } + } +} + +/** + * Calculate a hash of a Stream + * + * @param StreamInterface $stream Stream to calculate the hash for + * @param string $algo Hash algorithm (e.g. md5, crc32, etc) + * @param bool $rawOutput Whether or not to use raw output + * + * @return string Returns the hash of the stream + * @throws \RuntimeException on error. + */ +function hash( + StreamInterface $stream, + $algo, + $rawOutput = false +) { + $pos = $stream->tell(); + + if ($pos > 0) { + $stream->rewind(); + } + + $ctx = hash_init($algo); + while (!$stream->eof()) { + hash_update($ctx, $stream->read(1048576)); + } + + $out = hash_final($ctx, (bool) $rawOutput); + $stream->seek($pos); + + return $out; +} + +/** + * Read a line from the stream up to the maximum allowed buffer length + * + * @param StreamInterface $stream Stream to read from + * @param int $maxLength Maximum buffer length + * + * @return string + */ +function readline(StreamInterface $stream, $maxLength = null) +{ + $buffer = ''; + $size = 0; + + while (!$stream->eof()) { + // Using a loose equality here to match on '' and false. + if (null == ($byte = $stream->read(1))) { + return $buffer; + } + $buffer .= $byte; + // Break when a new line is found or the max length - 1 is reached + if ($byte === "\n" || ++$size === $maxLength - 1) { + break; + } + } + + return $buffer; +} + +/** + * Parses a request message string into a request object. + * + * @param string $message Request message string. + * + * @return Request + */ +function parse_request($message) +{ + $data = _parse_message($message); + $matches = []; + if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) { + throw new \InvalidArgumentException('Invalid request string'); + } + $parts = explode(' ', $data['start-line'], 3); + $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1'; + + $request = new Request( + $parts[0], + $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1], + $data['headers'], + $data['body'], + $version + ); + + return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); +} + +/** + * Parses a response message string into a response object. + * + * @param string $message Response message string. + * + * @return Response + */ +function parse_response($message) +{ + $data = _parse_message($message); + // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space + // between status-code and reason-phrase is required. But browsers accept + // responses without space and reason as well. + if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { + throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); + } + $parts = explode(' ', $data['start-line'], 3); + + return new Response( + $parts[1], + $data['headers'], + $data['body'], + explode('/', $parts[0])[1], + isset($parts[2]) ? $parts[2] : null + ); +} + +/** + * Parse a query string into an associative array. + * + * If multiple values are found for the same key, the value of that key + * value pair will become an array. This function does not parse nested + * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will + * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']). + * + * @param string $str Query string to parse + * @param int|bool $urlEncoding How the query string is encoded + * + * @return array + */ +function parse_query($str, $urlEncoding = true) +{ + $result = []; + + if ($str === '') { + return $result; + } + + if ($urlEncoding === true) { + $decoder = function ($value) { + return rawurldecode(str_replace('+', ' ', $value)); + }; + } elseif ($urlEncoding === PHP_QUERY_RFC3986) { + $decoder = 'rawurldecode'; + } elseif ($urlEncoding === PHP_QUERY_RFC1738) { + $decoder = 'urldecode'; + } else { + $decoder = function ($str) { return $str; }; + } + + foreach (explode('&', $str) as $kvp) { + $parts = explode('=', $kvp, 2); + $key = $decoder($parts[0]); + $value = isset($parts[1]) ? $decoder($parts[1]) : null; + if (!isset($result[$key])) { + $result[$key] = $value; + } else { + if (!is_array($result[$key])) { + $result[$key] = [$result[$key]]; + } + $result[$key][] = $value; + } + } + + return $result; +} + +/** + * Build a query string from an array of key value pairs. + * + * This function can use the return value of parse_query() to build a query + * string. This function does not modify the provided keys when an array is + * encountered (like http_build_query would). + * + * @param array $params Query string parameters. + * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 + * to encode using RFC3986, or PHP_QUERY_RFC1738 + * to encode using RFC1738. + * @return string + */ +function build_query(array $params, $encoding = PHP_QUERY_RFC3986) +{ + if (!$params) { + return ''; + } + + if ($encoding === false) { + $encoder = function ($str) { return $str; }; + } elseif ($encoding === PHP_QUERY_RFC3986) { + $encoder = 'rawurlencode'; + } elseif ($encoding === PHP_QUERY_RFC1738) { + $encoder = 'urlencode'; + } else { + throw new \InvalidArgumentException('Invalid type'); + } + + $qs = ''; + foreach ($params as $k => $v) { + $k = $encoder($k); + if (!is_array($v)) { + $qs .= $k; + if ($v !== null) { + $qs .= '=' . $encoder($v); + } + $qs .= '&'; + } else { + foreach ($v as $vv) { + $qs .= $k; + if ($vv !== null) { + $qs .= '=' . $encoder($vv); + } + $qs .= '&'; + } + } + } + + return $qs ? (string) substr($qs, 0, -1) : ''; +} + +/** + * Determines the mimetype of a file by looking at its extension. + * + * @param $filename + * + * @return null|string + */ +function mimetype_from_filename($filename) +{ + return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION)); +} + +/** + * Maps a file extensions to a mimetype. + * + * @param $extension string The file extension. + * + * @return string|null + * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types + */ +function mimetype_from_extension($extension) +{ + static $mimetypes = [ + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aac' => 'audio/x-aac', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'asc' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'atom' => 'application/atom+xml', + 'avi' => 'video/x-msvideo', + 'bmp' => 'image/bmp', + 'bz2' => 'application/x-bzip2', + 'cer' => 'application/pkix-cert', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'css' => 'text/css', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'deb' => 'application/x-debian-package', + 'doc' => 'application/msword', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dvi' => 'application/x-dvi', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'etx' => 'text/x-setext', + 'flac' => 'audio/flac', + 'flv' => 'video/x-flv', + 'gif' => 'image/gif', + 'gz' => 'application/gzip', + 'htm' => 'text/html', + 'html' => 'text/html', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ini' => 'text/plain', + 'iso' => 'application/x-iso9660-image', + 'jar' => 'application/java-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'latex' => 'application/x-latex', + 'log' => 'text/plain', + 'm4a' => 'audio/mp4', + 'm4v' => 'video/mp4', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mov' => 'video/quicktime', + 'mkv' => 'video/x-matroska', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4v' => 'video/mp4', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'pbm' => 'image/x-portable-bitmap', + 'pdf' => 'application/pdf', + 'pgm' => 'image/x-portable-graymap', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'ppm' => 'image/x-portable-pixmap', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'ps' => 'application/postscript', + 'qt' => 'video/quicktime', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'svg' => 'image/svg+xml', + 'swf' => 'application/x-shockwave-flash', + 'tar' => 'application/x-tar', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'torrent' => 'application/x-bittorrent', + 'ttf' => 'application/x-font-ttf', + 'txt' => 'text/plain', + 'wav' => 'audio/x-wav', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wma' => 'audio/x-ms-wma', + 'wmv' => 'video/x-ms-wmv', + 'woff' => 'application/x-font-woff', + 'wsdl' => 'application/wsdl+xml', + 'xbm' => 'image/x-xbitmap', + 'xls' => 'application/vnd.ms-excel', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xml' => 'application/xml', + 'xpm' => 'image/x-xpixmap', + 'xwd' => 'image/x-xwindowdump', + 'yaml' => 'text/yaml', + 'yml' => 'text/yaml', + 'zip' => 'application/zip', + ]; + + $extension = strtolower($extension); + + return isset($mimetypes[$extension]) + ? $mimetypes[$extension] + : null; +} + +/** + * Parses an HTTP message into an associative array. + * + * The array contains the "start-line" key containing the start line of + * the message, "headers" key containing an associative array of header + * array values, and a "body" key containing the body of the message. + * + * @param string $message HTTP request or response to parse. + * + * @return array + * @internal + */ +function _parse_message($message) +{ + if (!$message) { + throw new \InvalidArgumentException('Invalid message'); + } + + $message = ltrim($message, "\r\n"); + + $messageParts = preg_split("/\r?\n\r?\n/", $message, 2); + + if ($messageParts === false || count($messageParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); + } + + list($rawHeaders, $body) = $messageParts; + $rawHeaders .= "\r\n"; // Put back the delimiter we split previously + $headerParts = preg_split("/\r?\n/", $rawHeaders, 2); + + if ($headerParts === false || count($headerParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing status line'); + } + + list($startLine, $rawHeaders) = $headerParts; + + if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { + // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 + $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); + } + + /** @var array[] $headerLines */ + $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER); + + // If these aren't the same, then one line didn't match and there's an invalid header. + if ($count !== substr_count($rawHeaders, "\n")) { + // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 + if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { + throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); + } + + throw new \InvalidArgumentException('Invalid header syntax'); + } + + $headers = []; + + foreach ($headerLines as $headerLine) { + $headers[$headerLine[1]][] = $headerLine[2]; + } + + return [ + 'start-line' => $startLine, + 'headers' => $headers, + 'body' => $body, + ]; +} + +/** + * Constructs a URI for an HTTP request message. + * + * @param string $path Path from the start-line + * @param array $headers Array of headers (each value an array). + * + * @return string + * @internal + */ +function _parse_request_uri($path, array $headers) +{ + $hostKey = array_filter(array_keys($headers), function ($k) { + return strtolower($k) === 'host'; + }); + + // If no host is found, then a full URI cannot be constructed. + if (!$hostKey) { + return $path; + } + + $host = $headers[reset($hostKey)][0]; + $scheme = substr($host, -4) === ':443' ? 'https' : 'http'; + + return $scheme . '://' . $host . '/' . ltrim($path, '/'); +} + +/** + * Get a short summary of the message body + * + * Will return `null` if the response is not printable. + * + * @param MessageInterface $message The message to get the body summary + * @param int $truncateAt The maximum allowed size of the summary + * + * @return null|string + */ +function get_message_body_summary(MessageInterface $message, $truncateAt = 120) +{ + $body = $message->getBody(); + + if (!$body->isSeekable() || !$body->isReadable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $summary = $body->read($truncateAt); + $body->rewind(); + + if ($size > $truncateAt) { + $summary .= ' (truncated...)'; + } + + // Matches any printable character, including unicode characters: + // letters, marks, numbers, punctuation, spacing, and separators. + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) { + return null; + } + + return $summary; +} + +/** @internal */ +function _caseless_remove($keys, array $data) +{ + $result = []; + + foreach ($keys as &$key) { + $key = strtolower($key); + } + + foreach ($data as $k => $v) { + if (!in_array(strtolower($k), $keys)) { + $result[$k] = $v; + } + } + + return $result; +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions_include.php b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions_include.php new file mode 100644 index 0000000..96a4a83 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions_include.php @@ -0,0 +1,6 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use Monolog\Handler\AbstractHandler; +use Monolog\Registry; + +/** + * Monolog error handler + * + * A facility to enable logging of runtime errors, exceptions and fatal errors. + * + * Quick setup: ErrorHandler::register($logger); + * + * @author Jordi Boggiano + */ +class ErrorHandler +{ + private $logger; + + private $previousExceptionHandler; + private $uncaughtExceptionLevel; + + private $previousErrorHandler; + private $errorLevelMap; + private $handleOnlyReportedErrors; + + private $hasFatalErrorHandler; + private $fatalLevel; + private $reservedMemory; + private $lastFatalTrace; + private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR); + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * Registers a new ErrorHandler for a given Logger + * + * By default it will handle errors, exceptions and fatal errors + * + * @param LoggerInterface $logger + * @param array|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling + * @param int|false $exceptionLevel a LogLevel::* constant, or false to disable exception handling + * @param int|false $fatalLevel a LogLevel::* constant, or false to disable fatal error handling + * @return ErrorHandler + */ + public static function register(LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null) + { + //Forces the autoloader to run for LogLevel. Fixes an autoload issue at compile-time on PHP5.3. See https://github.com/Seldaek/monolog/pull/929 + class_exists('\\Psr\\Log\\LogLevel', true); + + $handler = new static($logger); + if ($errorLevelMap !== false) { + $handler->registerErrorHandler($errorLevelMap); + } + if ($exceptionLevel !== false) { + $handler->registerExceptionHandler($exceptionLevel); + } + if ($fatalLevel !== false) { + $handler->registerFatalHandler($fatalLevel); + } + + return $handler; + } + + public function registerExceptionHandler($level = null, $callPrevious = true) + { + $prev = set_exception_handler(array($this, 'handleException')); + $this->uncaughtExceptionLevel = $level; + if ($callPrevious && $prev) { + $this->previousExceptionHandler = $prev; + } + } + + public function registerErrorHandler(array $levelMap = array(), $callPrevious = true, $errorTypes = -1, $handleOnlyReportedErrors = true) + { + $prev = set_error_handler(array($this, 'handleError'), $errorTypes); + $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap); + if ($callPrevious) { + $this->previousErrorHandler = $prev ?: true; + } + + $this->handleOnlyReportedErrors = $handleOnlyReportedErrors; + } + + public function registerFatalHandler($level = null, $reservedMemorySize = 20) + { + register_shutdown_function(array($this, 'handleFatalError')); + + $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize); + $this->fatalLevel = $level; + $this->hasFatalErrorHandler = true; + } + + protected function defaultErrorLevelMap() + { + return array( + E_ERROR => LogLevel::CRITICAL, + E_WARNING => LogLevel::WARNING, + E_PARSE => LogLevel::ALERT, + E_NOTICE => LogLevel::NOTICE, + E_CORE_ERROR => LogLevel::CRITICAL, + E_CORE_WARNING => LogLevel::WARNING, + E_COMPILE_ERROR => LogLevel::ALERT, + E_COMPILE_WARNING => LogLevel::WARNING, + E_USER_ERROR => LogLevel::ERROR, + E_USER_WARNING => LogLevel::WARNING, + E_USER_NOTICE => LogLevel::NOTICE, + E_STRICT => LogLevel::NOTICE, + E_RECOVERABLE_ERROR => LogLevel::ERROR, + E_DEPRECATED => LogLevel::NOTICE, + E_USER_DEPRECATED => LogLevel::NOTICE, + ); + } + + /** + * @private + */ + public function handleException($e) + { + $this->logger->log( + $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel, + sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()), + array('exception' => $e) + ); + + if ($this->previousExceptionHandler) { + call_user_func($this->previousExceptionHandler, $e); + } + + exit(255); + } + + /** + * @private + */ + public function handleError($code, $message, $file = '', $line = 0, $context = array()) + { + if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) { + return; + } + + // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries + if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) { + $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL; + $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line)); + } else { + // http://php.net/manual/en/function.debug-backtrace.php + // As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. + // Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. + $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS); + array_shift($trace); // Exclude handleError from trace + $this->lastFatalTrace = $trace; + } + + if ($this->previousErrorHandler === true) { + return false; + } elseif ($this->previousErrorHandler) { + return call_user_func($this->previousErrorHandler, $code, $message, $file, $line, $context); + } + } + + /** + * @private + */ + public function handleFatalError() + { + $this->reservedMemory = null; + + $lastError = error_get_last(); + if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) { + $this->logger->log( + $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel, + 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'], + array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace) + ); + + if ($this->logger instanceof Logger) { + foreach ($this->logger->getHandlers() as $handler) { + if ($handler instanceof AbstractHandler) { + $handler->close(); + } + } + } + } + } + + private static function codeToString($code) + { + switch ($code) { + case E_ERROR: + return 'E_ERROR'; + case E_WARNING: + return 'E_WARNING'; + case E_PARSE: + return 'E_PARSE'; + case E_NOTICE: + return 'E_NOTICE'; + case E_CORE_ERROR: + return 'E_CORE_ERROR'; + case E_CORE_WARNING: + return 'E_CORE_WARNING'; + case E_COMPILE_ERROR: + return 'E_COMPILE_ERROR'; + case E_COMPILE_WARNING: + return 'E_COMPILE_WARNING'; + case E_USER_ERROR: + return 'E_USER_ERROR'; + case E_USER_WARNING: + return 'E_USER_WARNING'; + case E_USER_NOTICE: + return 'E_USER_NOTICE'; + case E_STRICT: + return 'E_STRICT'; + case E_RECOVERABLE_ERROR: + return 'E_RECOVERABLE_ERROR'; + case E_DEPRECATED: + return 'E_DEPRECATED'; + case E_USER_DEPRECATED: + return 'E_USER_DEPRECATED'; + } + + return 'Unknown PHP error'; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php new file mode 100644 index 0000000..9beda1e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; + +/** + * Formats a log message according to the ChromePHP array format + * + * @author Christophe Coevoet + */ +class ChromePHPFormatter implements FormatterInterface +{ + /** + * Translates Monolog log levels to Wildfire levels. + */ + private $logLevels = array( + Logger::DEBUG => 'log', + Logger::INFO => 'info', + Logger::NOTICE => 'info', + Logger::WARNING => 'warn', + Logger::ERROR => 'error', + Logger::CRITICAL => 'error', + Logger::ALERT => 'error', + Logger::EMERGENCY => 'error', + ); + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + // Retrieve the line and file if set and remove them from the formatted extra + $backtrace = 'unknown'; + if (isset($record['extra']['file'], $record['extra']['line'])) { + $backtrace = $record['extra']['file'].' : '.$record['extra']['line']; + unset($record['extra']['file'], $record['extra']['line']); + } + + $message = array('message' => $record['message']); + if ($record['context']) { + $message['context'] = $record['context']; + } + if ($record['extra']) { + $message['extra'] = $record['extra']; + } + if (count($message) === 1) { + $message = reset($message); + } + + return array( + $record['channel'], + $message, + $backtrace, + $this->logLevels[$record['level']], + ); + } + + public function formatBatch(array $records) + { + $formatted = array(); + + foreach ($records as $record) { + $formatted[] = $this->format($record); + } + + return $formatted; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php new file mode 100644 index 0000000..4c556cf --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Elastica\Document; + +/** + * Format a log message into an Elastica Document + * + * @author Jelle Vink + */ +class ElasticaFormatter extends NormalizerFormatter +{ + /** + * @var string Elastic search index name + */ + protected $index; + + /** + * @var string Elastic search document type + */ + protected $type; + + /** + * @param string $index Elastic Search index name + * @param string $type Elastic Search document type + */ + public function __construct($index, $type) + { + // elasticsearch requires a ISO 8601 format date with optional millisecond precision. + parent::__construct('Y-m-d\TH:i:s.uP'); + + $this->index = $index; + $this->type = $type; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + return $this->getDocument($record); + } + + /** + * Getter index + * @return string + */ + public function getIndex() + { + return $this->index; + } + + /** + * Getter type + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Convert a log message into an Elastica Document + * + * @param array $record Log message + * @return Document + */ + protected function getDocument($record) + { + $document = new Document(); + $document->setData($record); + $document->setType($this->type); + $document->setIndex($this->index); + + return $document; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php new file mode 100644 index 0000000..5094af3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * formats the record to be used in the FlowdockHandler + * + * @author Dominik Liebler + */ +class FlowdockFormatter implements FormatterInterface +{ + /** + * @var string + */ + private $source; + + /** + * @var string + */ + private $sourceEmail; + + /** + * @param string $source + * @param string $sourceEmail + */ + public function __construct($source, $sourceEmail) + { + $this->source = $source; + $this->sourceEmail = $sourceEmail; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $tags = array( + '#logs', + '#' . strtolower($record['level_name']), + '#' . $record['channel'], + ); + + foreach ($record['extra'] as $value) { + $tags[] = '#' . $value; + } + + $subject = sprintf( + 'in %s: %s - %s', + $this->source, + $record['level_name'], + $this->getShortMessage($record['message']) + ); + + $record['flowdock'] = array( + 'source' => $this->source, + 'from_address' => $this->sourceEmail, + 'subject' => $subject, + 'content' => $record['message'], + 'tags' => $tags, + 'project' => $this->source, + ); + + return $record; + } + + /** + * {@inheritdoc} + */ + public function formatBatch(array $records) + { + $formatted = array(); + + foreach ($records as $record) { + $formatted[] = $this->format($record); + } + + return $formatted; + } + + /** + * @param string $message + * + * @return string + */ + public function getShortMessage($message) + { + static $hasMbString; + + if (null === $hasMbString) { + $hasMbString = function_exists('mb_strlen'); + } + + $maxLength = 45; + + if ($hasMbString) { + if (mb_strlen($message, 'UTF-8') > $maxLength) { + $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...'; + } + } else { + if (strlen($message) > $maxLength) { + $message = substr($message, 0, $maxLength - 4) . ' ...'; + } + } + + return $message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php new file mode 100644 index 0000000..46a91ff --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Class FluentdFormatter + * + * Serializes a log message to Fluentd unix socket protocol + * + * Fluentd config: + * + * + * type unix + * path /var/run/td-agent/td-agent.sock + * + * + * Monolog setup: + * + * $logger = new Monolog\Logger('fluent.tag'); + * $fluentHandler = new Monolog\Handler\SocketHandler('unix:///var/run/td-agent/td-agent.sock'); + * $fluentHandler->setFormatter(new Monolog\Formatter\FluentdFormatter()); + * $logger->pushHandler($fluentHandler); + * + * @author Andrius Putna + */ +class FluentdFormatter implements FormatterInterface +{ + /** + * @var bool $levelTag should message level be a part of the fluentd tag + */ + protected $levelTag = false; + + public function __construct($levelTag = false) + { + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter'); + } + + $this->levelTag = (bool) $levelTag; + } + + public function isUsingLevelsInTag() + { + return $this->levelTag; + } + + public function format(array $record) + { + $tag = $record['channel']; + if ($this->levelTag) { + $tag .= '.' . strtolower($record['level_name']); + } + + $message = array( + 'message' => $record['message'], + 'context' => $record['context'], + 'extra' => $record['extra'], + ); + + if (!$this->levelTag) { + $message['level'] = $record['level']; + $message['level_name'] = $record['level_name']; + } + + return json_encode(array($tag, $record['datetime']->getTimestamp(), $message)); + } + + public function formatBatch(array $records) + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php new file mode 100644 index 0000000..b5de751 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Interface for formatters + * + * @author Jordi Boggiano + */ +interface FormatterInterface +{ + /** + * Formats a log record. + * + * @param array $record A record to format + * @return mixed The formatted record + */ + public function format(array $record); + + /** + * Formats a set of log records. + * + * @param array $records A set of records to format + * @return mixed The formatted set of records + */ + public function formatBatch(array $records); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php new file mode 100644 index 0000000..2c1b0e8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; +use Gelf\Message; + +/** + * Serializes a log message to GELF + * @see http://www.graylog2.org/about/gelf + * + * @author Matt Lehner + */ +class GelfMessageFormatter extends NormalizerFormatter +{ + const DEFAULT_MAX_LENGTH = 32766; + + /** + * @var string the name of the system for the Gelf log message + */ + protected $systemName; + + /** + * @var string a prefix for 'extra' fields from the Monolog record (optional) + */ + protected $extraPrefix; + + /** + * @var string a prefix for 'context' fields from the Monolog record (optional) + */ + protected $contextPrefix; + + /** + * @var int max length per field + */ + protected $maxLength; + + /** + * Translates Monolog log levels to Graylog2 log priorities. + */ + private $logLevels = array( + Logger::DEBUG => 7, + Logger::INFO => 6, + Logger::NOTICE => 5, + Logger::WARNING => 4, + Logger::ERROR => 3, + Logger::CRITICAL => 2, + Logger::ALERT => 1, + Logger::EMERGENCY => 0, + ); + + public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $maxLength = null) + { + parent::__construct('U.u'); + + $this->systemName = $systemName ?: gethostname(); + + $this->extraPrefix = $extraPrefix; + $this->contextPrefix = $contextPrefix; + $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + if (!isset($record['datetime'], $record['message'], $record['level'])) { + throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given'); + } + + $message = new Message(); + $message + ->setTimestamp($record['datetime']) + ->setShortMessage((string) $record['message']) + ->setHost($this->systemName) + ->setLevel($this->logLevels[$record['level']]); + + // message length + system name length + 200 for padding / metadata + $len = 200 + strlen((string) $record['message']) + strlen($this->systemName); + + if ($len > $this->maxLength) { + $message->setShortMessage(substr($record['message'], 0, $this->maxLength)); + } + + if (isset($record['channel'])) { + $message->setFacility($record['channel']); + } + if (isset($record['extra']['line'])) { + $message->setLine($record['extra']['line']); + unset($record['extra']['line']); + } + if (isset($record['extra']['file'])) { + $message->setFile($record['extra']['file']); + unset($record['extra']['file']); + } + + foreach ($record['extra'] as $key => $val) { + $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); + $len = strlen($this->extraPrefix . $key . $val); + if ($len > $this->maxLength) { + $message->setAdditional($this->extraPrefix . $key, substr($val, 0, $this->maxLength)); + break; + } + $message->setAdditional($this->extraPrefix . $key, $val); + } + + foreach ($record['context'] as $key => $val) { + $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); + $len = strlen($this->contextPrefix . $key . $val); + if ($len > $this->maxLength) { + $message->setAdditional($this->contextPrefix . $key, substr($val, 0, $this->maxLength)); + break; + } + $message->setAdditional($this->contextPrefix . $key, $val); + } + + if (null === $message->getFile() && isset($record['context']['exception']['file'])) { + if (preg_match("/^(.+):([0-9]+)$/", $record['context']['exception']['file'], $matches)) { + $message->setFile($matches[1]); + $message->setLine($matches[2]); + } + } + + return $message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php new file mode 100644 index 0000000..dfc0b4a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; + +/** + * Formats incoming records into an HTML table + * + * This is especially useful for html email logging + * + * @author Tiago Brito + */ +class HtmlFormatter extends NormalizerFormatter +{ + /** + * Translates Monolog log levels to html color priorities. + */ + protected $logLevels = array( + Logger::DEBUG => '#cccccc', + Logger::INFO => '#468847', + Logger::NOTICE => '#3a87ad', + Logger::WARNING => '#c09853', + Logger::ERROR => '#f0ad4e', + Logger::CRITICAL => '#FF7708', + Logger::ALERT => '#C12A19', + Logger::EMERGENCY => '#000000', + ); + + /** + * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct($dateFormat = null) + { + parent::__construct($dateFormat); + } + + /** + * Creates an HTML table row + * + * @param string $th Row header content + * @param string $td Row standard cell content + * @param bool $escapeTd false if td content must not be html escaped + * @return string + */ + protected function addRow($th, $td = ' ', $escapeTd = true) + { + $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8'); + if ($escapeTd) { + $td = '
            '.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'
            '; + } + + return "\n$th:\n".$td."\n"; + } + + /** + * Create a HTML h1 tag + * + * @param string $title Text to be in the h1 + * @param int $level Error level + * @return string + */ + protected function addTitle($title, $level) + { + $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8'); + + return '

            '.$title.'

            '; + } + + /** + * Formats a log record. + * + * @param array $record A record to format + * @return mixed The formatted record + */ + public function format(array $record) + { + $output = $this->addTitle($record['level_name'], $record['level']); + $output .= ''; + + $output .= $this->addRow('Message', (string) $record['message']); + $output .= $this->addRow('Time', $record['datetime']->format($this->dateFormat)); + $output .= $this->addRow('Channel', $record['channel']); + if ($record['context']) { + $embeddedTable = '
            '; + foreach ($record['context'] as $key => $value) { + $embeddedTable .= $this->addRow($key, $this->convertToString($value)); + } + $embeddedTable .= '
            '; + $output .= $this->addRow('Context', $embeddedTable, false); + } + if ($record['extra']) { + $embeddedTable = ''; + foreach ($record['extra'] as $key => $value) { + $embeddedTable .= $this->addRow($key, $this->convertToString($value)); + } + $embeddedTable .= '
            '; + $output .= $this->addRow('Extra', $embeddedTable, false); + } + + return $output.''; + } + + /** + * Formats a set of log records. + * + * @param array $records A set of records to format + * @return mixed The formatted set of records + */ + public function formatBatch(array $records) + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } + + protected function convertToString($data) + { + if (null === $data || is_scalar($data)) { + return (string) $data; + } + + $data = $this->normalize($data); + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + } + + return str_replace('\\/', '/', json_encode($data)); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php new file mode 100644 index 0000000..2ff119e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php @@ -0,0 +1,208 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Exception; +use Monolog\Utils; +use Throwable; + +/** + * Encodes whatever record data is passed to it as json + * + * This can be useful to log to databases or remote APIs + * + * @author Jordi Boggiano + */ +class JsonFormatter extends NormalizerFormatter +{ + const BATCH_MODE_JSON = 1; + const BATCH_MODE_NEWLINES = 2; + + protected $batchMode; + protected $appendNewline; + + /** + * @var bool + */ + protected $includeStacktraces = false; + + /** + * @param int $batchMode + * @param bool $appendNewline + */ + public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = true) + { + $this->batchMode = $batchMode; + $this->appendNewline = $appendNewline; + } + + /** + * The batch mode option configures the formatting style for + * multiple records. By default, multiple records will be + * formatted as a JSON-encoded array. However, for + * compatibility with some API endpoints, alternative styles + * are available. + * + * @return int + */ + public function getBatchMode() + { + return $this->batchMode; + } + + /** + * True if newlines are appended to every formatted record + * + * @return bool + */ + public function isAppendingNewlines() + { + return $this->appendNewline; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + return $this->toJson($this->normalize($record), true) . ($this->appendNewline ? "\n" : ''); + } + + /** + * {@inheritdoc} + */ + public function formatBatch(array $records) + { + switch ($this->batchMode) { + case static::BATCH_MODE_NEWLINES: + return $this->formatBatchNewlines($records); + + case static::BATCH_MODE_JSON: + default: + return $this->formatBatchJson($records); + } + } + + /** + * @param bool $include + */ + public function includeStacktraces($include = true) + { + $this->includeStacktraces = $include; + } + + /** + * Return a JSON-encoded array of records. + * + * @param array $records + * @return string + */ + protected function formatBatchJson(array $records) + { + return $this->toJson($this->normalize($records), true); + } + + /** + * Use new lines to separate records instead of a + * JSON-encoded array. + * + * @param array $records + * @return string + */ + protected function formatBatchNewlines(array $records) + { + $instance = $this; + + $oldNewline = $this->appendNewline; + $this->appendNewline = false; + array_walk($records, function (&$value, $key) use ($instance) { + $value = $instance->format($value); + }); + $this->appendNewline = $oldNewline; + + return implode("\n", $records); + } + + /** + * Normalizes given $data. + * + * @param mixed $data + * + * @return mixed + */ + protected function normalize($data, $depth = 0) + { + if ($depth > 9) { + return 'Over 9 levels deep, aborting normalization'; + } + + if (is_array($data) || $data instanceof \Traversable) { + $normalized = array(); + + $count = 1; + foreach ($data as $key => $value) { + if ($count++ > 1000) { + $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization'; + break; + } + + $normalized[$key] = $this->normalize($value, $depth+1); + } + + return $normalized; + } + + if ($data instanceof Exception || $data instanceof Throwable) { + return $this->normalizeException($data); + } + + return $data; + } + + /** + * Normalizes given exception with or without its own stack trace based on + * `includeStacktraces` property. + * + * @param Exception|Throwable $e + * + * @return array + */ + protected function normalizeException($e) + { + // TODO 2.0 only check for Throwable + if (!$e instanceof Exception && !$e instanceof Throwable) { + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); + } + + $data = array( + 'class' => Utils::getClass($e), + 'message' => $e->getMessage(), + 'code' => $e->getCode(), + 'file' => $e->getFile().':'.$e->getLine(), + ); + + if ($this->includeStacktraces) { + $trace = $e->getTrace(); + foreach ($trace as $frame) { + if (isset($frame['file'])) { + $data['trace'][] = $frame['file'].':'.$frame['line']; + } + } + } + + if ($previous = $e->getPrevious()) { + $data['previous'] = $this->normalizeException($previous); + } + + return $data; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php new file mode 100644 index 0000000..f98e1a6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Utils; + +/** + * Formats incoming records into a one-line string + * + * This is especially useful for logging to files + * + * @author Jordi Boggiano + * @author Christophe Coevoet + */ +class LineFormatter extends NormalizerFormatter +{ + const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; + + protected $format; + protected $allowInlineLineBreaks; + protected $ignoreEmptyContextAndExtra; + protected $includeStacktraces; + + /** + * @param string $format The format of the message + * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + * @param bool $allowInlineLineBreaks Whether to allow inline line breaks in log entries + * @param bool $ignoreEmptyContextAndExtra + */ + public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false) + { + $this->format = $format ?: static::SIMPLE_FORMAT; + $this->allowInlineLineBreaks = $allowInlineLineBreaks; + $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; + parent::__construct($dateFormat); + } + + public function includeStacktraces($include = true) + { + $this->includeStacktraces = $include; + if ($this->includeStacktraces) { + $this->allowInlineLineBreaks = true; + } + } + + public function allowInlineLineBreaks($allow = true) + { + $this->allowInlineLineBreaks = $allow; + } + + public function ignoreEmptyContextAndExtra($ignore = true) + { + $this->ignoreEmptyContextAndExtra = $ignore; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $vars = parent::format($record); + + $output = $this->format; + + foreach ($vars['extra'] as $var => $val) { + if (false !== strpos($output, '%extra.'.$var.'%')) { + $output = str_replace('%extra.'.$var.'%', $this->stringify($val), $output); + unset($vars['extra'][$var]); + } + } + + + foreach ($vars['context'] as $var => $val) { + if (false !== strpos($output, '%context.'.$var.'%')) { + $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output); + unset($vars['context'][$var]); + } + } + + if ($this->ignoreEmptyContextAndExtra) { + if (empty($vars['context'])) { + unset($vars['context']); + $output = str_replace('%context%', '', $output); + } + + if (empty($vars['extra'])) { + unset($vars['extra']); + $output = str_replace('%extra%', '', $output); + } + } + + foreach ($vars as $var => $val) { + if (false !== strpos($output, '%'.$var.'%')) { + $output = str_replace('%'.$var.'%', $this->stringify($val), $output); + } + } + + // remove leftover %extra.xxx% and %context.xxx% if any + if (false !== strpos($output, '%')) { + $output = preg_replace('/%(?:extra|context)\..+?%/', '', $output); + } + + return $output; + } + + public function formatBatch(array $records) + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } + + public function stringify($value) + { + return $this->replaceNewlines($this->convertToString($value)); + } + + protected function normalizeException($e) + { + // TODO 2.0 only check for Throwable + if (!$e instanceof \Exception && !$e instanceof \Throwable) { + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); + } + + $previousText = ''; + if ($previous = $e->getPrevious()) { + do { + $previousText .= ', '.Utils::getClass($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine(); + } while ($previous = $previous->getPrevious()); + } + + $str = '[object] ('.Utils::getClass($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')'; + if ($this->includeStacktraces) { + $str .= "\n[stacktrace]\n".$e->getTraceAsString()."\n"; + } + + return $str; + } + + protected function convertToString($data) + { + if (null === $data || is_bool($data)) { + return var_export($data, true); + } + + if (is_scalar($data)) { + return (string) $data; + } + + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + return $this->toJson($data, true); + } + + return str_replace('\\/', '/', @json_encode($data)); + } + + protected function replaceNewlines($str) + { + if ($this->allowInlineLineBreaks) { + if (0 === strpos($str, '{')) { + return str_replace(array('\r', '\n'), array("\r", "\n"), $str); + } + + return $str; + } + + return str_replace(array("\r\n", "\r", "\n"), ' ', $str); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php new file mode 100644 index 0000000..401859b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Encodes message information into JSON in a format compatible with Loggly. + * + * @author Adam Pancutt + */ +class LogglyFormatter extends JsonFormatter +{ + /** + * Overrides the default batch mode to new lines for compatibility with the + * Loggly bulk API. + * + * @param int $batchMode + */ + public function __construct($batchMode = self::BATCH_MODE_NEWLINES, $appendNewline = false) + { + parent::__construct($batchMode, $appendNewline); + } + + /** + * Appends the 'timestamp' parameter for indexing by Loggly. + * + * @see https://www.loggly.com/docs/automated-parsing/#json + * @see \Monolog\Formatter\JsonFormatter::format() + */ + public function format(array $record) + { + if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTime)) { + $record["timestamp"] = $record["datetime"]->format("Y-m-d\TH:i:s.uO"); + // TODO 2.0 unset the 'datetime' parameter, retained for BC + } + + return parent::format($record); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php new file mode 100644 index 0000000..8f83bec --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Serializes a log message to Logstash Event Format + * + * @see http://logstash.net/ + * @see https://github.com/logstash/logstash/blob/master/lib/logstash/event.rb + * + * @author Tim Mower + */ +class LogstashFormatter extends NormalizerFormatter +{ + const V0 = 0; + const V1 = 1; + + /** + * @var string the name of the system for the Logstash log message, used to fill the @source field + */ + protected $systemName; + + /** + * @var string an application name for the Logstash log message, used to fill the @type field + */ + protected $applicationName; + + /** + * @var string a prefix for 'extra' fields from the Monolog record (optional) + */ + protected $extraPrefix; + + /** + * @var string a prefix for 'context' fields from the Monolog record (optional) + */ + protected $contextPrefix; + + /** + * @var int logstash format version to use + */ + protected $version; + + /** + * @param string $applicationName the application that sends the data, used as the "type" field of logstash + * @param string $systemName the system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine + * @param string $extraPrefix prefix for extra keys inside logstash "fields" + * @param string $contextPrefix prefix for context keys inside logstash "fields", defaults to ctxt_ + * @param int $version the logstash format version to use, defaults to 0 + */ + public function __construct($applicationName, $systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $version = self::V0) + { + // logstash requires a ISO 8601 format date with optional millisecond precision. + parent::__construct('Y-m-d\TH:i:s.uP'); + + $this->systemName = $systemName ?: gethostname(); + $this->applicationName = $applicationName; + $this->extraPrefix = $extraPrefix; + $this->contextPrefix = $contextPrefix; + $this->version = $version; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + if ($this->version === self::V1) { + $message = $this->formatV1($record); + } else { + $message = $this->formatV0($record); + } + + return $this->toJson($message) . "\n"; + } + + protected function formatV0(array $record) + { + if (empty($record['datetime'])) { + $record['datetime'] = gmdate('c'); + } + $message = array( + '@timestamp' => $record['datetime'], + '@source' => $this->systemName, + '@fields' => array(), + ); + if (isset($record['message'])) { + $message['@message'] = $record['message']; + } + if (isset($record['channel'])) { + $message['@tags'] = array($record['channel']); + $message['@fields']['channel'] = $record['channel']; + } + if (isset($record['level'])) { + $message['@fields']['level'] = $record['level']; + } + if ($this->applicationName) { + $message['@type'] = $this->applicationName; + } + if (isset($record['extra']['server'])) { + $message['@source_host'] = $record['extra']['server']; + } + if (isset($record['extra']['url'])) { + $message['@source_path'] = $record['extra']['url']; + } + if (!empty($record['extra'])) { + foreach ($record['extra'] as $key => $val) { + $message['@fields'][$this->extraPrefix . $key] = $val; + } + } + if (!empty($record['context'])) { + foreach ($record['context'] as $key => $val) { + $message['@fields'][$this->contextPrefix . $key] = $val; + } + } + + return $message; + } + + protected function formatV1(array $record) + { + if (empty($record['datetime'])) { + $record['datetime'] = gmdate('c'); + } + $message = array( + '@timestamp' => $record['datetime'], + '@version' => 1, + 'host' => $this->systemName, + ); + if (isset($record['message'])) { + $message['message'] = $record['message']; + } + if (isset($record['channel'])) { + $message['type'] = $record['channel']; + $message['channel'] = $record['channel']; + } + if (isset($record['level_name'])) { + $message['level'] = $record['level_name']; + } + if ($this->applicationName) { + $message['type'] = $this->applicationName; + } + if (!empty($record['extra'])) { + foreach ($record['extra'] as $key => $val) { + $message[$this->extraPrefix . $key] = $val; + } + } + if (!empty($record['context'])) { + foreach ($record['context'] as $key => $val) { + $message[$this->contextPrefix . $key] = $val; + } + } + + return $message; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php new file mode 100644 index 0000000..eb7be84 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Utils; + +/** + * Formats a record for use with the MongoDBHandler. + * + * @author Florian Plattner + */ +class MongoDBFormatter implements FormatterInterface +{ + private $exceptionTraceAsString; + private $maxNestingLevel; + + /** + * @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2 + * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings + */ + public function __construct($maxNestingLevel = 3, $exceptionTraceAsString = true) + { + $this->maxNestingLevel = max($maxNestingLevel, 0); + $this->exceptionTraceAsString = (bool) $exceptionTraceAsString; + } + + /** + * {@inheritDoc} + */ + public function format(array $record) + { + return $this->formatArray($record); + } + + /** + * {@inheritDoc} + */ + public function formatBatch(array $records) + { + foreach ($records as $key => $record) { + $records[$key] = $this->format($record); + } + + return $records; + } + + protected function formatArray(array $record, $nestingLevel = 0) + { + if ($this->maxNestingLevel == 0 || $nestingLevel <= $this->maxNestingLevel) { + foreach ($record as $name => $value) { + if ($value instanceof \DateTime) { + $record[$name] = $this->formatDate($value, $nestingLevel + 1); + } elseif ($value instanceof \Exception) { + $record[$name] = $this->formatException($value, $nestingLevel + 1); + } elseif (is_array($value)) { + $record[$name] = $this->formatArray($value, $nestingLevel + 1); + } elseif (is_object($value)) { + $record[$name] = $this->formatObject($value, $nestingLevel + 1); + } + } + } else { + $record = '[...]'; + } + + return $record; + } + + protected function formatObject($value, $nestingLevel) + { + $objectVars = get_object_vars($value); + $objectVars['class'] = Utils::getClass($value); + + return $this->formatArray($objectVars, $nestingLevel); + } + + protected function formatException(\Exception $exception, $nestingLevel) + { + $formattedException = array( + 'class' => Utils::getClass($exception), + 'message' => $exception->getMessage(), + 'code' => $exception->getCode(), + 'file' => $exception->getFile() . ':' . $exception->getLine(), + ); + + if ($this->exceptionTraceAsString === true) { + $formattedException['trace'] = $exception->getTraceAsString(); + } else { + $formattedException['trace'] = $exception->getTrace(); + } + + return $this->formatArray($formattedException, $nestingLevel); + } + + protected function formatDate(\DateTime $value, $nestingLevel) + { + return new \MongoDate($value->getTimestamp()); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php new file mode 100644 index 0000000..9865394 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php @@ -0,0 +1,297 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Exception; +use Monolog\Utils; + +/** + * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets + * + * @author Jordi Boggiano + */ +class NormalizerFormatter implements FormatterInterface +{ + const SIMPLE_DATE = "Y-m-d H:i:s"; + + protected $dateFormat; + + /** + * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct($dateFormat = null) + { + $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE; + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter'); + } + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + return $this->normalize($record); + } + + /** + * {@inheritdoc} + */ + public function formatBatch(array $records) + { + foreach ($records as $key => $record) { + $records[$key] = $this->format($record); + } + + return $records; + } + + protected function normalize($data, $depth = 0) + { + if ($depth > 9) { + return 'Over 9 levels deep, aborting normalization'; + } + + if (null === $data || is_scalar($data)) { + if (is_float($data)) { + if (is_infinite($data)) { + return ($data > 0 ? '' : '-') . 'INF'; + } + if (is_nan($data)) { + return 'NaN'; + } + } + + return $data; + } + + if (is_array($data)) { + $normalized = array(); + + $count = 1; + foreach ($data as $key => $value) { + if ($count++ > 1000) { + $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization'; + break; + } + + $normalized[$key] = $this->normalize($value, $depth+1); + } + + return $normalized; + } + + if ($data instanceof \DateTime) { + return $data->format($this->dateFormat); + } + + if (is_object($data)) { + // TODO 2.0 only check for Throwable + if ($data instanceof Exception || (PHP_VERSION_ID > 70000 && $data instanceof \Throwable)) { + return $this->normalizeException($data); + } + + // non-serializable objects that implement __toString stringified + if (method_exists($data, '__toString') && !$data instanceof \JsonSerializable) { + $value = $data->__toString(); + } else { + // the rest is json-serialized in some way + $value = $this->toJson($data, true); + } + + return sprintf("[object] (%s: %s)", Utils::getClass($data), $value); + } + + if (is_resource($data)) { + return sprintf('[resource] (%s)', get_resource_type($data)); + } + + return '[unknown('.gettype($data).')]'; + } + + protected function normalizeException($e) + { + // TODO 2.0 only check for Throwable + if (!$e instanceof Exception && !$e instanceof \Throwable) { + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); + } + + $data = array( + 'class' => Utils::getClass($e), + 'message' => $e->getMessage(), + 'code' => $e->getCode(), + 'file' => $e->getFile().':'.$e->getLine(), + ); + + if ($e instanceof \SoapFault) { + if (isset($e->faultcode)) { + $data['faultcode'] = $e->faultcode; + } + + if (isset($e->faultactor)) { + $data['faultactor'] = $e->faultactor; + } + + if (isset($e->detail)) { + $data['detail'] = $e->detail; + } + } + + $trace = $e->getTrace(); + foreach ($trace as $frame) { + if (isset($frame['file'])) { + $data['trace'][] = $frame['file'].':'.$frame['line']; + } + } + + if ($previous = $e->getPrevious()) { + $data['previous'] = $this->normalizeException($previous); + } + + return $data; + } + + /** + * Return the JSON representation of a value + * + * @param mixed $data + * @param bool $ignoreErrors + * @throws \RuntimeException if encoding fails and errors are not ignored + * @return string + */ + protected function toJson($data, $ignoreErrors = false) + { + // suppress json_encode errors since it's twitchy with some inputs + if ($ignoreErrors) { + return @$this->jsonEncode($data); + } + + $json = $this->jsonEncode($data); + + if ($json === false) { + $json = $this->handleJsonError(json_last_error(), $data); + } + + return $json; + } + + /** + * @param mixed $data + * @return string JSON encoded data or null on failure + */ + private function jsonEncode($data) + { + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + } + + return json_encode($data); + } + + /** + * Handle a json_encode failure. + * + * If the failure is due to invalid string encoding, try to clean the + * input and encode again. If the second encoding attempt fails, the + * inital error is not encoding related or the input can't be cleaned then + * raise a descriptive exception. + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @throws \RuntimeException if failure can't be corrected + * @return string JSON encoded data after error correction + */ + private function handleJsonError($code, $data) + { + if ($code !== JSON_ERROR_UTF8) { + $this->throwEncodeError($code, $data); + } + + if (is_string($data)) { + $this->detectAndCleanUtf8($data); + } elseif (is_array($data)) { + array_walk_recursive($data, array($this, 'detectAndCleanUtf8')); + } else { + $this->throwEncodeError($code, $data); + } + + $json = $this->jsonEncode($data); + + if ($json === false) { + $this->throwEncodeError(json_last_error(), $data); + } + + return $json; + } + + /** + * Throws an exception according to a given code with a customized message + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @throws \RuntimeException + */ + private function throwEncodeError($code, $data) + { + switch ($code) { + case JSON_ERROR_DEPTH: + $msg = 'Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $msg = 'Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $msg = 'Unexpected control character found'; + break; + case JSON_ERROR_UTF8: + $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $msg = 'Unknown error'; + } + + throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); + } + + /** + * Detect invalid UTF-8 string characters and convert to valid UTF-8. + * + * Valid UTF-8 input will be left unmodified, but strings containing + * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed + * original encoding of ISO-8859-15. This conversion may result in + * incorrect output if the actual encoding was not ISO-8859-15, but it + * will be clean UTF-8 output and will not rely on expensive and fragile + * detection algorithms. + * + * Function converts the input in place in the passed variable so that it + * can be used as a callback for array_walk_recursive. + * + * @param mixed &$data Input to check and convert if needed + * @private + */ + public function detectAndCleanUtf8(&$data) + { + if (is_string($data) && !preg_match('//u', $data)) { + $data = preg_replace_callback( + '/[\x80-\xFF]+/', + function ($m) { return utf8_encode($m[0]); }, + $data + ); + $data = str_replace( + array('¤', '¦', '¨', '´', '¸', '¼', '½', '¾'), + array('€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'), + $data + ); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php new file mode 100644 index 0000000..5d345d5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Formats data into an associative array of scalar values. + * Objects and arrays will be JSON encoded. + * + * @author Andrew Lawson + */ +class ScalarFormatter extends NormalizerFormatter +{ + /** + * {@inheritdoc} + */ + public function format(array $record) + { + foreach ($record as $key => $value) { + $record[$key] = $this->normalizeValue($value); + } + + return $record; + } + + /** + * @param mixed $value + * @return mixed + */ + protected function normalizeValue($value) + { + $normalized = $this->normalize($value); + + if (is_array($normalized) || is_object($normalized)) { + return $this->toJson($normalized, true); + } + + return $normalized; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php new file mode 100644 index 0000000..65dba99 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; + +/** + * Serializes a log message according to Wildfire's header requirements + * + * @author Eric Clemmons (@ericclemmons) + * @author Christophe Coevoet + * @author Kirill chEbba Chebunin + */ +class WildfireFormatter extends NormalizerFormatter +{ + const TABLE = 'table'; + + /** + * Translates Monolog log levels to Wildfire levels. + */ + private $logLevels = array( + Logger::DEBUG => 'LOG', + Logger::INFO => 'INFO', + Logger::NOTICE => 'INFO', + Logger::WARNING => 'WARN', + Logger::ERROR => 'ERROR', + Logger::CRITICAL => 'ERROR', + Logger::ALERT => 'ERROR', + Logger::EMERGENCY => 'ERROR', + ); + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + // Retrieve the line and file if set and remove them from the formatted extra + $file = $line = ''; + if (isset($record['extra']['file'])) { + $file = $record['extra']['file']; + unset($record['extra']['file']); + } + if (isset($record['extra']['line'])) { + $line = $record['extra']['line']; + unset($record['extra']['line']); + } + + $record = $this->normalize($record); + $message = array('message' => $record['message']); + $handleError = false; + if ($record['context']) { + $message['context'] = $record['context']; + $handleError = true; + } + if ($record['extra']) { + $message['extra'] = $record['extra']; + $handleError = true; + } + if (count($message) === 1) { + $message = reset($message); + } + + if (isset($record['context'][self::TABLE])) { + $type = 'TABLE'; + $label = $record['channel'] .': '. $record['message']; + $message = $record['context'][self::TABLE]; + } else { + $type = $this->logLevels[$record['level']]; + $label = $record['channel']; + } + + // Create JSON object describing the appearance of the message in the console + $json = $this->toJson(array( + array( + 'Type' => $type, + 'File' => $file, + 'Line' => $line, + 'Label' => $label, + ), + $message, + ), $handleError); + + // The message itself is a serialization of the above JSON object + it's length + return sprintf( + '%s|%s|', + strlen($json), + $json + ); + } + + public function formatBatch(array $records) + { + throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); + } + + protected function normalize($data, $depth = 0) + { + if (is_object($data) && !$data instanceof \DateTime) { + return $data; + } + + return parent::normalize($data, $depth); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php new file mode 100644 index 0000000..92b9d45 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php @@ -0,0 +1,196 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; +use Monolog\ResettableInterface; + +/** + * Base Handler class providing the Handler structure + * + * @author Jordi Boggiano + */ +abstract class AbstractHandler implements HandlerInterface, ResettableInterface +{ + protected $level = Logger::DEBUG; + protected $bubble = true; + + /** + * @var FormatterInterface + */ + protected $formatter; + protected $processors = array(); + + /** + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($level = Logger::DEBUG, $bubble = true) + { + $this->setLevel($level); + $this->bubble = $bubble; + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return $record['level'] >= $this->level; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + foreach ($records as $record) { + $this->handle($record); + } + } + + /** + * Closes the handler. + * + * This will be called automatically when the object is destroyed + */ + public function close() + { + } + + /** + * {@inheritdoc} + */ + public function pushProcessor($callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); + } + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function popProcessor() + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->formatter = $formatter; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + + return $this->formatter; + } + + /** + * Sets minimum logging level at which this handler will be triggered. + * + * @param int|string $level Level or level name + * @return self + */ + public function setLevel($level) + { + $this->level = Logger::toMonologLevel($level); + + return $this; + } + + /** + * Gets minimum logging level at which this handler will be triggered. + * + * @return int + */ + public function getLevel() + { + return $this->level; + } + + /** + * Sets the bubbling behavior. + * + * @param bool $bubble true means that this handler allows bubbling. + * false means that bubbling is not permitted. + * @return self + */ + public function setBubble($bubble) + { + $this->bubble = $bubble; + + return $this; + } + + /** + * Gets the bubbling behavior. + * + * @return bool true means that this handler allows bubbling. + * false means that bubbling is not permitted. + */ + public function getBubble() + { + return $this->bubble; + } + + public function __destruct() + { + try { + $this->close(); + } catch (\Exception $e) { + // do nothing + } catch (\Throwable $e) { + // do nothing + } + } + + public function reset() + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + + /** + * Gets the default formatter. + * + * @return FormatterInterface + */ + protected function getDefaultFormatter() + { + return new LineFormatter(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php new file mode 100644 index 0000000..e1e8953 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; + +/** + * Base Handler class providing the Handler structure + * + * Classes extending it should (in most cases) only implement write($record) + * + * @author Jordi Boggiano + * @author Christophe Coevoet + */ +abstract class AbstractProcessingHandler extends AbstractHandler +{ + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if (!$this->isHandling($record)) { + return false; + } + + $record = $this->processRecord($record); + + $record['formatted'] = $this->getFormatter()->format($record); + + $this->write($record); + + return false === $this->bubble; + } + + /** + * Writes the record down to the log of the implementing handler + * + * @param array $record + * @return void + */ + abstract protected function write(array $record); + + /** + * Processes a record. + * + * @param array $record + * @return array + */ + protected function processRecord(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + return $record; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php new file mode 100644 index 0000000..8c76aca --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LineFormatter; + +/** + * Common syslog functionality + */ +abstract class AbstractSyslogHandler extends AbstractProcessingHandler +{ + protected $facility; + + /** + * Translates Monolog log levels to syslog log priorities. + */ + protected $logLevels = array( + Logger::DEBUG => LOG_DEBUG, + Logger::INFO => LOG_INFO, + Logger::NOTICE => LOG_NOTICE, + Logger::WARNING => LOG_WARNING, + Logger::ERROR => LOG_ERR, + Logger::CRITICAL => LOG_CRIT, + Logger::ALERT => LOG_ALERT, + Logger::EMERGENCY => LOG_EMERG, + ); + + /** + * List of valid log facility names. + */ + protected $facilities = array( + 'auth' => LOG_AUTH, + 'authpriv' => LOG_AUTHPRIV, + 'cron' => LOG_CRON, + 'daemon' => LOG_DAEMON, + 'kern' => LOG_KERN, + 'lpr' => LOG_LPR, + 'mail' => LOG_MAIL, + 'news' => LOG_NEWS, + 'syslog' => LOG_SYSLOG, + 'user' => LOG_USER, + 'uucp' => LOG_UUCP, + ); + + /** + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($facility = LOG_USER, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->facilities['local0'] = LOG_LOCAL0; + $this->facilities['local1'] = LOG_LOCAL1; + $this->facilities['local2'] = LOG_LOCAL2; + $this->facilities['local3'] = LOG_LOCAL3; + $this->facilities['local4'] = LOG_LOCAL4; + $this->facilities['local5'] = LOG_LOCAL5; + $this->facilities['local6'] = LOG_LOCAL6; + $this->facilities['local7'] = LOG_LOCAL7; + } else { + $this->facilities['local0'] = 128; // LOG_LOCAL0 + $this->facilities['local1'] = 136; // LOG_LOCAL1 + $this->facilities['local2'] = 144; // LOG_LOCAL2 + $this->facilities['local3'] = 152; // LOG_LOCAL3 + $this->facilities['local4'] = 160; // LOG_LOCAL4 + $this->facilities['local5'] = 168; // LOG_LOCAL5 + $this->facilities['local6'] = 176; // LOG_LOCAL6 + $this->facilities['local7'] = 184; // LOG_LOCAL7 + } + + // convert textual description of facility to syslog constant + if (array_key_exists(strtolower($facility), $this->facilities)) { + $facility = $this->facilities[strtolower($facility)]; + } elseif (!in_array($facility, array_values($this->facilities), true)) { + throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given'); + } + + $this->facility = $facility; + } + + /** + * {@inheritdoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%'); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php new file mode 100644 index 0000000..e5a46bc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\JsonFormatter; +use PhpAmqpLib\Message\AMQPMessage; +use PhpAmqpLib\Channel\AMQPChannel; +use AMQPExchange; + +class AmqpHandler extends AbstractProcessingHandler +{ + /** + * @var AMQPExchange|AMQPChannel $exchange + */ + protected $exchange; + + /** + * @var string + */ + protected $exchangeName; + + /** + * @param AMQPExchange|AMQPChannel $exchange AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use + * @param string $exchangeName + * @param int $level + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = true) + { + if ($exchange instanceof AMQPExchange) { + $exchange->setName($exchangeName); + } elseif ($exchange instanceof AMQPChannel) { + $this->exchangeName = $exchangeName; + } else { + throw new \InvalidArgumentException('PhpAmqpLib\Channel\AMQPChannel or AMQPExchange instance required'); + } + $this->exchange = $exchange; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $data = $record["formatted"]; + $routingKey = $this->getRoutingKey($record); + + if ($this->exchange instanceof AMQPExchange) { + $this->exchange->publish( + $data, + $routingKey, + 0, + array( + 'delivery_mode' => 2, + 'content_type' => 'application/json', + ) + ); + } else { + $this->exchange->basic_publish( + $this->createAmqpMessage($data), + $this->exchangeName, + $routingKey + ); + } + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records) + { + if ($this->exchange instanceof AMQPExchange) { + parent::handleBatch($records); + + return; + } + + foreach ($records as $record) { + if (!$this->isHandling($record)) { + continue; + } + + $record = $this->processRecord($record); + $data = $this->getFormatter()->format($record); + + $this->exchange->batch_basic_publish( + $this->createAmqpMessage($data), + $this->exchangeName, + $this->getRoutingKey($record) + ); + } + + $this->exchange->publish_batch(); + } + + /** + * Gets the routing key for the AMQP exchange + * + * @param array $record + * @return string + */ + protected function getRoutingKey(array $record) + { + $routingKey = sprintf( + '%s.%s', + // TODO 2.0 remove substr call + substr($record['level_name'], 0, 4), + $record['channel'] + ); + + return strtolower($routingKey); + } + + /** + * @param string $data + * @return AMQPMessage + */ + private function createAmqpMessage($data) + { + return new AMQPMessage( + (string) $data, + array( + 'delivery_mode' => 2, + 'content_type' => 'application/json', + ) + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php new file mode 100644 index 0000000..23cf23b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php @@ -0,0 +1,240 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; + +/** + * Handler sending logs to browser's javascript console with no browser extension required + * + * @author Olivier Poitrey + */ +class BrowserConsoleHandler extends AbstractProcessingHandler +{ + protected static $initialized = false; + protected static $records = array(); + + /** + * {@inheritDoc} + * + * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format. + * + * Example of formatted string: + * + * You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%'); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + // Accumulate records + static::$records[] = $record; + + // Register shutdown handler if not already done + if (!static::$initialized) { + static::$initialized = true; + $this->registerShutdownFunction(); + } + } + + /** + * Convert records to javascript console commands and send it to the browser. + * This method is automatically called on PHP shutdown if output is HTML or Javascript. + */ + public static function send() + { + $format = static::getResponseFormat(); + if ($format === 'unknown') { + return; + } + + if (count(static::$records)) { + if ($format === 'html') { + static::writeOutput(''); + } elseif ($format === 'js') { + static::writeOutput(static::generateScript()); + } + static::resetStatic(); + } + } + + public function close() + { + self::resetStatic(); + } + + public function reset() + { + self::resetStatic(); + } + + /** + * Forget all logged records + */ + public static function resetStatic() + { + static::$records = array(); + } + + /** + * Wrapper for register_shutdown_function to allow overriding + */ + protected function registerShutdownFunction() + { + if (PHP_SAPI !== 'cli') { + register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send')); + } + } + + /** + * Wrapper for echo to allow overriding + * + * @param string $str + */ + protected static function writeOutput($str) + { + echo $str; + } + + /** + * Checks the format of the response + * + * If Content-Type is set to application/javascript or text/javascript -> js + * If Content-Type is set to text/html, or is unset -> html + * If Content-Type is anything else -> unknown + * + * @return string One of 'js', 'html' or 'unknown' + */ + protected static function getResponseFormat() + { + // Check content type + foreach (headers_list() as $header) { + if (stripos($header, 'content-type:') === 0) { + // This handler only works with HTML and javascript outputs + // text/javascript is obsolete in favour of application/javascript, but still used + if (stripos($header, 'application/javascript') !== false || stripos($header, 'text/javascript') !== false) { + return 'js'; + } + if (stripos($header, 'text/html') === false) { + return 'unknown'; + } + break; + } + } + + return 'html'; + } + + private static function generateScript() + { + $script = array(); + foreach (static::$records as $record) { + $context = static::dump('Context', $record['context']); + $extra = static::dump('Extra', $record['extra']); + + if (empty($context) && empty($extra)) { + $script[] = static::call_array('log', static::handleStyles($record['formatted'])); + } else { + $script = array_merge($script, + array(static::call_array('groupCollapsed', static::handleStyles($record['formatted']))), + $context, + $extra, + array(static::call('groupEnd')) + ); + } + } + + return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);"; + } + + private static function handleStyles($formatted) + { + $args = array(static::quote('font-weight: normal')); + $format = '%c' . $formatted; + preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); + + foreach (array_reverse($matches) as $match) { + $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0])); + $args[] = '"font-weight: normal"'; + + $pos = $match[0][1]; + $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0])); + } + + array_unshift($args, static::quote($format)); + + return $args; + } + + private static function handleCustomStyles($style, $string) + { + static $colors = array('blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey'); + static $labels = array(); + + return preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function ($m) use ($string, &$colors, &$labels) { + if (trim($m[1]) === 'autolabel') { + // Format the string as a label with consistent auto assigned background color + if (!isset($labels[$string])) { + $labels[$string] = $colors[count($labels) % count($colors)]; + } + $color = $labels[$string]; + + return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px"; + } + + return $m[1]; + }, $style); + } + + private static function dump($title, array $dict) + { + $script = array(); + $dict = array_filter($dict); + if (empty($dict)) { + return $script; + } + $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title)); + foreach ($dict as $key => $value) { + $value = json_encode($value); + if (empty($value)) { + $value = static::quote(''); + } + $script[] = static::call('log', static::quote('%s: %o'), static::quote($key), $value); + } + + return $script; + } + + private static function quote($arg) + { + return '"' . addcslashes($arg, "\"\n\\") . '"'; + } + + private static function call() + { + $args = func_get_args(); + $method = array_shift($args); + + return static::call_array($method, $args); + } + + private static function call_array($method, array $args) + { + return 'c.' . $method . '(' . implode(', ', $args) . ');'; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php new file mode 100644 index 0000000..61d1b50 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\ResettableInterface; + +/** + * Buffers all records until closing the handler and then pass them as batch. + * + * This is useful for a MailHandler to send only one mail per request instead of + * sending one per log message. + * + * @author Christophe Coevoet + */ +class BufferHandler extends AbstractHandler +{ + protected $handler; + protected $bufferSize = 0; + protected $bufferLimit; + protected $flushOnOverflow; + protected $buffer = array(); + protected $initialized = false; + + /** + * @param HandlerInterface $handler Handler. + * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded + */ + public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false) + { + parent::__construct($level, $bubble); + $this->handler = $handler; + $this->bufferLimit = (int) $bufferLimit; + $this->flushOnOverflow = $flushOnOverflow; + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($record['level'] < $this->level) { + return false; + } + + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + + if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { + if ($this->flushOnOverflow) { + $this->flush(); + } else { + array_shift($this->buffer); + $this->bufferSize--; + } + } + + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + $this->buffer[] = $record; + $this->bufferSize++; + + return false === $this->bubble; + } + + public function flush() + { + if ($this->bufferSize === 0) { + return; + } + + $this->handler->handleBatch($this->buffer); + $this->clear(); + } + + public function __destruct() + { + // suppress the parent behavior since we already have register_shutdown_function() + // to call close(), and the reference contained there will prevent this from being + // GC'd until the end of the request + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->flush(); + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + */ + public function clear() + { + $this->bufferSize = 0; + $this->buffer = array(); + } + + public function reset() + { + $this->flush(); + + parent::reset(); + + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php new file mode 100644 index 0000000..ac98d5d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php @@ -0,0 +1,211 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\ChromePHPFormatter; +use Monolog\Logger; + +/** + * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) + * + * This also works out of the box with Firefox 43+ + * + * @author Christophe Coevoet + */ +class ChromePHPHandler extends AbstractProcessingHandler +{ + /** + * Version of the extension + */ + const VERSION = '4.0'; + + /** + * Header name + */ + const HEADER_NAME = 'X-ChromeLogger-Data'; + + /** + * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) + */ + const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}'; + + protected static $initialized = false; + + /** + * Tracks whether we sent too much data + * + * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending + * + * @var bool + */ + protected static $overflowed = false; + + protected static $json = array( + 'version' => self::VERSION, + 'columns' => array('label', 'log', 'backtrace', 'type'), + 'rows' => array(), + ); + + protected static $sendHeaders = true; + + /** + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); + } + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $messages = array(); + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + $messages[] = $this->processRecord($record); + } + + if (!empty($messages)) { + $messages = $this->getFormatter()->formatBatch($messages); + self::$json['rows'] = array_merge(self::$json['rows'], $messages); + $this->send(); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new ChromePHPFormatter(); + } + + /** + * Creates & sends header for a record + * + * @see sendHeader() + * @see send() + * @param array $record + */ + protected function write(array $record) + { + self::$json['rows'][] = $record['formatted']; + + $this->send(); + } + + /** + * Sends the log header + * + * @see sendHeader() + */ + protected function send() + { + if (self::$overflowed || !self::$sendHeaders) { + return; + } + + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; + } + + $json = @json_encode(self::$json); + $data = base64_encode(utf8_encode($json)); + if (strlen($data) > 3 * 1024) { + self::$overflowed = true; + + $record = array( + 'message' => 'Incomplete logs, chrome header size limit reached', + 'context' => array(), + 'level' => Logger::WARNING, + 'level_name' => Logger::getLevelName(Logger::WARNING), + 'channel' => 'monolog', + 'datetime' => new \DateTime(), + 'extra' => array(), + ); + self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); + $json = @json_encode(self::$json); + $data = base64_encode(utf8_encode($json)); + } + + if (trim($data) !== '') { + $this->sendHeader(self::HEADER_NAME, $data); + } + } + + /** + * Send header string to the client + * + * @param string $header + * @param string $content + */ + protected function sendHeader($header, $content) + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + * + * @return bool + */ + protected function headersAccepted() + { + if (empty($_SERVER['HTTP_USER_AGENT'])) { + return false; + } + + return preg_match(self::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']); + } + + /** + * BC getter for the sendHeaders property that has been made static + */ + public function __get($property) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + return static::$sendHeaders; + } + + /** + * BC setter for the sendHeaders property that has been made static + */ + public function __set($property, $value) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + static::$sendHeaders = $value; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php new file mode 100644 index 0000000..cc98697 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\JsonFormatter; +use Monolog\Logger; + +/** + * CouchDB handler + * + * @author Markus Bachmann + */ +class CouchDBHandler extends AbstractProcessingHandler +{ + private $options; + + public function __construct(array $options = array(), $level = Logger::DEBUG, $bubble = true) + { + $this->options = array_merge(array( + 'host' => 'localhost', + 'port' => 5984, + 'dbname' => 'logger', + 'username' => null, + 'password' => null, + ), $options); + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $basicAuth = null; + if ($this->options['username']) { + $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); + } + + $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; + $context = stream_context_create(array( + 'http' => array( + 'method' => 'POST', + 'content' => $record['formatted'], + 'ignore_errors' => true, + 'max_redirects' => 0, + 'header' => 'Content-type: application/json', + ), + )); + + if (false === @file_get_contents($url, null, $context)) { + throw new \RuntimeException(sprintf('Could not connect to %s', $url)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php new file mode 100644 index 0000000..96b3ca0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php @@ -0,0 +1,151 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Logs to Cube. + * + * @link http://square.github.com/cube/ + * @author Wan Chen + */ +class CubeHandler extends AbstractProcessingHandler +{ + private $udpConnection; + private $httpConnection; + private $scheme; + private $host; + private $port; + private $acceptedSchemes = array('http', 'udp'); + + /** + * Create a Cube handler + * + * @throws \UnexpectedValueException when given url is not a valid url. + * A valid url must consist of three parts : protocol://host:port + * Only valid protocols used by Cube are http and udp + */ + public function __construct($url, $level = Logger::DEBUG, $bubble = true) + { + $urlInfo = parse_url($url); + + if (!isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { + throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); + } + + if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) { + throw new \UnexpectedValueException( + 'Invalid protocol (' . $urlInfo['scheme'] . ').' + . ' Valid options are ' . implode(', ', $this->acceptedSchemes)); + } + + $this->scheme = $urlInfo['scheme']; + $this->host = $urlInfo['host']; + $this->port = $urlInfo['port']; + + parent::__construct($level, $bubble); + } + + /** + * Establish a connection to an UDP socket + * + * @throws \LogicException when unable to connect to the socket + * @throws MissingExtensionException when there is no socket extension + */ + protected function connectUdp() + { + if (!extension_loaded('sockets')) { + throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); + } + + $this->udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); + if (!$this->udpConnection) { + throw new \LogicException('Unable to create a socket'); + } + + if (!socket_connect($this->udpConnection, $this->host, $this->port)) { + throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); + } + } + + /** + * Establish a connection to a http server + * @throws \LogicException when no curl extension + */ + protected function connectHttp() + { + if (!extension_loaded('curl')) { + throw new \LogicException('The curl extension is needed to use http URLs with the CubeHandler'); + } + + $this->httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); + + if (!$this->httpConnection) { + throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); + } + + curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $date = $record['datetime']; + + $data = array('time' => $date->format('Y-m-d\TH:i:s.uO')); + unset($record['datetime']); + + if (isset($record['context']['type'])) { + $data['type'] = $record['context']['type']; + unset($record['context']['type']); + } else { + $data['type'] = $record['channel']; + } + + $data['data'] = $record['context']; + $data['data']['level'] = $record['level']; + + if ($this->scheme === 'http') { + $this->writeHttp(json_encode($data)); + } else { + $this->writeUdp(json_encode($data)); + } + } + + private function writeUdp($data) + { + if (!$this->udpConnection) { + $this->connectUdp(); + } + + socket_send($this->udpConnection, $data, strlen($data), 0); + } + + private function writeHttp($data) + { + if (!$this->httpConnection) { + $this->connectHttp(); + } + + curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); + curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, array( + 'Content-Type: application/json', + 'Content-Length: ' . strlen('['.$data.']'), + )); + + Curl\Util::execute($this->httpConnection, 5, false); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php new file mode 100644 index 0000000..48d30b3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\Curl; + +class Util +{ + private static $retriableErrorCodes = array( + CURLE_COULDNT_RESOLVE_HOST, + CURLE_COULDNT_CONNECT, + CURLE_HTTP_NOT_FOUND, + CURLE_READ_ERROR, + CURLE_OPERATION_TIMEOUTED, + CURLE_HTTP_POST_ERROR, + CURLE_SSL_CONNECT_ERROR, + ); + + /** + * Executes a CURL request with optional retries and exception on failure + * + * @param resource $ch curl handler + * @throws \RuntimeException + */ + public static function execute($ch, $retries = 5, $closeAfterDone = true) + { + while ($retries--) { + if (curl_exec($ch) === false) { + $curlErrno = curl_errno($ch); + + if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) { + $curlError = curl_error($ch); + + if ($closeAfterDone) { + curl_close($ch); + } + + throw new \RuntimeException(sprintf('Curl error (code %s): %s', $curlErrno, $curlError)); + } + + continue; + } + + if ($closeAfterDone) { + curl_close($ch); + } + break; + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php new file mode 100644 index 0000000..35b55cb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php @@ -0,0 +1,169 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Simple handler wrapper that deduplicates log records across multiple requests + * + * It also includes the BufferHandler functionality and will buffer + * all messages until the end of the request or flush() is called. + * + * This works by storing all log records' messages above $deduplicationLevel + * to the file specified by $deduplicationStore. When further logs come in at the end of the + * request (or when flush() is called), all those above $deduplicationLevel are checked + * against the existing stored logs. If they match and the timestamps in the stored log is + * not older than $time seconds, the new log record is discarded. If no log record is new, the + * whole data set is discarded. + * + * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers + * that send messages to people, to avoid spamming with the same message over and over in case of + * a major component failure like a database server being down which makes all requests fail in the + * same way. + * + * @author Jordi Boggiano + */ +class DeduplicationHandler extends BufferHandler +{ + /** + * @var string + */ + protected $deduplicationStore; + + /** + * @var int + */ + protected $deduplicationLevel; + + /** + * @var int + */ + protected $time; + + /** + * @var bool + */ + private $gc = false; + + /** + * @param HandlerInterface $handler Handler. + * @param string $deduplicationStore The file/path where the deduplication log should be kept + * @param int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes + * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true) + { + parent::__construct($handler, 0, Logger::DEBUG, $bubble, false); + + $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore; + $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); + $this->time = $time; + } + + public function flush() + { + if ($this->bufferSize === 0) { + return; + } + + $passthru = null; + + foreach ($this->buffer as $record) { + if ($record['level'] >= $this->deduplicationLevel) { + + $passthru = $passthru || !$this->isDuplicate($record); + if ($passthru) { + $this->appendRecord($record); + } + } + } + + // default of null is valid as well as if no record matches duplicationLevel we just pass through + if ($passthru === true || $passthru === null) { + $this->handler->handleBatch($this->buffer); + } + + $this->clear(); + + if ($this->gc) { + $this->collectLogs(); + } + } + + private function isDuplicate(array $record) + { + if (!file_exists($this->deduplicationStore)) { + return false; + } + + $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + if (!is_array($store)) { + return false; + } + + $yesterday = time() - 86400; + $timestampValidity = $record['datetime']->getTimestamp() - $this->time; + $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']); + + for ($i = count($store) - 1; $i >= 0; $i--) { + list($timestamp, $level, $message) = explode(':', $store[$i], 3); + + if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) { + return true; + } + + if ($timestamp < $yesterday) { + $this->gc = true; + } + } + + return false; + } + + private function collectLogs() + { + if (!file_exists($this->deduplicationStore)) { + return false; + } + + $handle = fopen($this->deduplicationStore, 'rw+'); + flock($handle, LOCK_EX); + $validLogs = array(); + + $timestampValidity = time() - $this->time; + + while (!feof($handle)) { + $log = fgets($handle); + if (substr($log, 0, 10) >= $timestampValidity) { + $validLogs[] = $log; + } + } + + ftruncate($handle, 0); + rewind($handle); + foreach ($validLogs as $log) { + fwrite($handle, $log); + } + + flock($handle, LOCK_UN); + fclose($handle); + + $this->gc = false; + } + + private function appendRecord(array $record) + { + file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php new file mode 100644 index 0000000..b91ffec --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; +use Doctrine\CouchDB\CouchDBClient; + +/** + * CouchDB handler for Doctrine CouchDB ODM + * + * @author Markus Bachmann + */ +class DoctrineCouchDBHandler extends AbstractProcessingHandler +{ + private $client; + + public function __construct(CouchDBClient $client, $level = Logger::DEBUG, $bubble = true) + { + $this->client = $client; + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $this->client->postDocument($record['formatted']); + } + + protected function getDefaultFormatter() + { + return new NormalizerFormatter; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php new file mode 100644 index 0000000..237b71f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Aws\Sdk; +use Aws\DynamoDb\DynamoDbClient; +use Aws\DynamoDb\Marshaler; +use Monolog\Formatter\ScalarFormatter; +use Monolog\Logger; + +/** + * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) + * + * @link https://github.com/aws/aws-sdk-php/ + * @author Andrew Lawson + */ +class DynamoDbHandler extends AbstractProcessingHandler +{ + const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; + + /** + * @var DynamoDbClient + */ + protected $client; + + /** + * @var string + */ + protected $table; + + /** + * @var int + */ + protected $version; + + /** + * @var Marshaler + */ + protected $marshaler; + + /** + * @param DynamoDbClient $client + * @param string $table + * @param int $level + * @param bool $bubble + */ + public function __construct(DynamoDbClient $client, $table, $level = Logger::DEBUG, $bubble = true) + { + if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) { + $this->version = 3; + $this->marshaler = new Marshaler; + } else { + $this->version = 2; + } + + $this->client = $client; + $this->table = $table; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $filtered = $this->filterEmptyFields($record['formatted']); + if ($this->version === 3) { + $formatted = $this->marshaler->marshalItem($filtered); + } else { + $formatted = $this->client->formatAttributes($filtered); + } + + $this->client->putItem(array( + 'TableName' => $this->table, + 'Item' => $formatted, + )); + } + + /** + * @param array $record + * @return array + */ + protected function filterEmptyFields(array $record) + { + return array_filter($record, function ($value) { + return !empty($value) || false === $value || 0 === $value; + }); + } + + /** + * {@inheritdoc} + */ + protected function getDefaultFormatter() + { + return new ScalarFormatter(self::DATE_FORMAT); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php new file mode 100644 index 0000000..bb0f83e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\ElasticaFormatter; +use Monolog\Logger; +use Elastica\Client; +use Elastica\Exception\ExceptionInterface; + +/** + * Elastic Search handler + * + * Usage example: + * + * $client = new \Elastica\Client(); + * $options = array( + * 'index' => 'elastic_index_name', + * 'type' => 'elastic_doc_type', + * ); + * $handler = new ElasticSearchHandler($client, $options); + * $log = new Logger('application'); + * $log->pushHandler($handler); + * + * @author Jelle Vink + */ +class ElasticSearchHandler extends AbstractProcessingHandler +{ + /** + * @var Client + */ + protected $client; + + /** + * @var array Handler config options + */ + protected $options = array(); + + /** + * @param Client $client Elastica Client object + * @param array $options Handler configuration + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + $this->client = $client; + $this->options = array_merge( + array( + 'index' => 'monolog', // Elastic index name + 'type' => 'record', // Elastic document type + 'ignore_error' => false, // Suppress Elastica exceptions + ), + $options + ); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $this->bulkSend(array($record['formatted'])); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + if ($formatter instanceof ElasticaFormatter) { + return parent::setFormatter($formatter); + } + throw new \InvalidArgumentException('ElasticSearchHandler is only compatible with ElasticaFormatter'); + } + + /** + * Getter options + * @return array + */ + public function getOptions() + { + return $this->options; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new ElasticaFormatter($this->options['index'], $this->options['type']); + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $documents = $this->getFormatter()->formatBatch($records); + $this->bulkSend($documents); + } + + /** + * Use Elasticsearch bulk API to send list of documents + * @param array $documents + * @throws \RuntimeException + */ + protected function bulkSend(array $documents) + { + try { + $this->client->addDocuments($documents); + } catch (ExceptionInterface $e) { + if (!$this->options['ignore_error']) { + throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php new file mode 100644 index 0000000..b2986b0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Stores to PHP error_log() handler. + * + * @author Elan Ruusamäe + */ +class ErrorLogHandler extends AbstractProcessingHandler +{ + const OPERATING_SYSTEM = 0; + const SAPI = 4; + + protected $messageType; + protected $expandNewlines; + + /** + * @param int $messageType Says where the error should go. + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries + */ + public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false) + { + parent::__construct($level, $bubble); + + if (false === in_array($messageType, self::getAvailableTypes())) { + $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); + throw new \InvalidArgumentException($message); + } + + $this->messageType = $messageType; + $this->expandNewlines = $expandNewlines; + } + + /** + * @return array With all available types + */ + public static function getAvailableTypes() + { + return array( + self::OPERATING_SYSTEM, + self::SAPI, + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if ($this->expandNewlines) { + $lines = preg_split('{[\r\n]+}', (string) $record['formatted']); + foreach ($lines as $line) { + error_log($line, $this->messageType); + } + } else { + error_log((string) $record['formatted'], $this->messageType); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php new file mode 100644 index 0000000..938c1a7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php @@ -0,0 +1,140 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Simple handler wrapper that filters records based on a list of levels + * + * It can be configured with an exact list of levels to allow, or a min/max level. + * + * @author Hennadiy Verkh + * @author Jordi Boggiano + */ +class FilterHandler extends AbstractHandler +{ + /** + * Handler or factory callable($record, $this) + * + * @var callable|\Monolog\Handler\HandlerInterface + */ + protected $handler; + + /** + * Minimum level for logs that are passed to handler + * + * @var int[] + */ + protected $acceptedLevels; + + /** + * Whether the messages that are handled can bubble up the stack or not + * + * @var bool + */ + protected $bubble; + + /** + * @param callable|HandlerInterface $handler Handler or factory callable($record, $this). + * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided + * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true) + { + $this->handler = $handler; + $this->bubble = $bubble; + $this->setAcceptedLevels($minLevelOrList, $maxLevel); + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * @return array + */ + public function getAcceptedLevels() + { + return array_flip($this->acceptedLevels); + } + + /** + * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided + * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array + */ + public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY) + { + if (is_array($minLevelOrList)) { + $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList); + } else { + $minLevelOrList = Logger::toMonologLevel($minLevelOrList); + $maxLevel = Logger::toMonologLevel($maxLevel); + $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) { + return $level >= $minLevelOrList && $level <= $maxLevel; + })); + } + $this->acceptedLevels = array_flip($acceptedLevels); + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return isset($this->acceptedLevels[$record['level']]); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if (!$this->isHandling($record)) { + return false; + } + + // The same logic as in FingersCrossedHandler + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + $this->handler->handle($record); + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $filtered = array(); + foreach ($records as $record) { + if ($this->isHandling($record)) { + $filtered[] = $record; + } + } + + $this->handler->handleBatch($filtered); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php new file mode 100644 index 0000000..aaca12c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +/** + * Interface for activation strategies for the FingersCrossedHandler. + * + * @author Johannes M. Schmitt + */ +interface ActivationStrategyInterface +{ + /** + * Returns whether the given record activates the handler. + * + * @param array $record + * @return bool + */ + public function isHandlerActivated(array $record); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php new file mode 100644 index 0000000..2a2a64d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +use Monolog\Logger; + +/** + * Channel and Error level based monolog activation strategy. Allows to trigger activation + * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except + * for records of the 'sql' channel; those should trigger activation on level 'WARN'. + * + * Example: + * + * + * $activationStrategy = new ChannelLevelActivationStrategy( + * Logger::CRITICAL, + * array( + * 'request' => Logger::ALERT, + * 'sensitive' => Logger::ERROR, + * ) + * ); + * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); + * + * + * @author Mike Meessen + */ +class ChannelLevelActivationStrategy implements ActivationStrategyInterface +{ + private $defaultActionLevel; + private $channelToActionLevel; + + /** + * @param int $defaultActionLevel The default action level to be used if the record's category doesn't match any + * @param array $channelToActionLevel An array that maps channel names to action levels. + */ + public function __construct($defaultActionLevel, $channelToActionLevel = array()) + { + $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); + $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel); + } + + public function isHandlerActivated(array $record) + { + if (isset($this->channelToActionLevel[$record['channel']])) { + return $record['level'] >= $this->channelToActionLevel[$record['channel']]; + } + + return $record['level'] >= $this->defaultActionLevel; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php new file mode 100644 index 0000000..6e63085 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +use Monolog\Logger; + +/** + * Error level based activation strategy. + * + * @author Johannes M. Schmitt + */ +class ErrorLevelActivationStrategy implements ActivationStrategyInterface +{ + private $actionLevel; + + public function __construct($actionLevel) + { + $this->actionLevel = Logger::toMonologLevel($actionLevel); + } + + public function isHandlerActivated(array $record) + { + return $record['level'] >= $this->actionLevel; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php new file mode 100644 index 0000000..275fd51 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; +use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; +use Monolog\Logger; +use Monolog\ResettableInterface; + +/** + * Buffers all records until a certain level is reached + * + * The advantage of this approach is that you don't get any clutter in your log files. + * Only requests which actually trigger an error (or whatever your actionLevel is) will be + * in the logs, but they will contain all records, not only those above the level threshold. + * + * You can find the various activation strategies in the + * Monolog\Handler\FingersCrossed\ namespace. + * + * @author Jordi Boggiano + */ +class FingersCrossedHandler extends AbstractHandler +{ + protected $handler; + protected $activationStrategy; + protected $buffering = true; + protected $bufferSize; + protected $buffer = array(); + protected $stopBuffering; + protected $passthruLevel; + + /** + * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). + * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action + * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) + * @param int $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered + */ + public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null) + { + if (null === $activationStrategy) { + $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); + } + + // convert simple int activationStrategy to an object + if (!$activationStrategy instanceof ActivationStrategyInterface) { + $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); + } + + $this->handler = $handler; + $this->activationStrategy = $activationStrategy; + $this->bufferSize = $bufferSize; + $this->bubble = $bubble; + $this->stopBuffering = $stopBuffering; + + if ($passthruLevel !== null) { + $this->passthruLevel = Logger::toMonologLevel($passthruLevel); + } + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return true; + } + + /** + * Manually activate this logger regardless of the activation strategy + */ + public function activate() + { + if ($this->stopBuffering) { + $this->buffering = false; + } + if (!$this->handler instanceof HandlerInterface) { + $record = end($this->buffer) ?: null; + + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + $this->handler->handleBatch($this->buffer); + $this->buffer = array(); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + if ($this->buffering) { + $this->buffer[] = $record; + if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { + array_shift($this->buffer); + } + if ($this->activationStrategy->isHandlerActivated($record)) { + $this->activate(); + } + } else { + $this->handler->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->flushBuffer(); + } + + public function reset() + { + $this->flushBuffer(); + + parent::reset(); + + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + * + * It also resets the handler to its initial buffering state. + */ + public function clear() + { + $this->buffer = array(); + $this->reset(); + } + + /** + * Resets the state of the handler. Stops forwarding records to the wrapped handler. + */ + private function flushBuffer() + { + if (null !== $this->passthruLevel) { + $level = $this->passthruLevel; + $this->buffer = array_filter($this->buffer, function ($record) use ($level) { + return $record['level'] >= $level; + }); + if (count($this->buffer) > 0) { + $this->handler->handleBatch($this->buffer); + } + } + + $this->buffer = array(); + $this->buffering = true; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php new file mode 100644 index 0000000..c30b184 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php @@ -0,0 +1,195 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\WildfireFormatter; + +/** + * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. + * + * @author Eric Clemmons (@ericclemmons) + */ +class FirePHPHandler extends AbstractProcessingHandler +{ + /** + * WildFire JSON header message format + */ + const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; + + /** + * FirePHP structure for parsing messages & their presentation + */ + const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; + + /** + * Must reference a "known" plugin, otherwise headers won't display in FirePHP + */ + const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; + + /** + * Header prefix for Wildfire to recognize & parse headers + */ + const HEADER_PREFIX = 'X-Wf'; + + /** + * Whether or not Wildfire vendor-specific headers have been generated & sent yet + */ + protected static $initialized = false; + + /** + * Shared static message index between potentially multiple handlers + * @var int + */ + protected static $messageIndex = 1; + + protected static $sendHeaders = true; + + /** + * Base header creation function used by init headers & record headers + * + * @param array $meta Wildfire Plugin, Protocol & Structure Indexes + * @param string $message Log message + * @return array Complete header string ready for the client as key and message as value + */ + protected function createHeader(array $meta, $message) + { + $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta)); + + return array($header => $message); + } + + /** + * Creates message header from record + * + * @see createHeader() + * @param array $record + * @return string + */ + protected function createRecordHeader(array $record) + { + // Wildfire is extensible to support multiple protocols & plugins in a single request, + // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. + return $this->createHeader( + array(1, 1, 1, self::$messageIndex++), + $record['formatted'] + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new WildfireFormatter(); + } + + /** + * Wildfire initialization headers to enable message parsing + * + * @see createHeader() + * @see sendHeader() + * @return array + */ + protected function getInitHeaders() + { + // Initial payload consists of required headers for Wildfire + return array_merge( + $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI), + $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI), + $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI) + ); + } + + /** + * Send header string to the client + * + * @param string $header + * @param string $content + */ + protected function sendHeader($header, $content) + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Creates & sends header for a record, ensuring init headers have been sent prior + * + * @see sendHeader() + * @see sendInitHeaders() + * @param array $record + */ + protected function write(array $record) + { + if (!self::$sendHeaders) { + return; + } + + // WildFire-specific headers must be sent prior to any messages + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + foreach ($this->getInitHeaders() as $header => $content) { + $this->sendHeader($header, $content); + } + } + + $header = $this->createRecordHeader($record); + if (trim(current($header)) !== '') { + $this->sendHeader(key($header), current($header)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + * + * @return bool + */ + protected function headersAccepted() + { + if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { + return true; + } + + return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); + } + + /** + * BC getter for the sendHeaders property that has been made static + */ + public function __get($property) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + return static::$sendHeaders; + } + + /** + * BC setter for the sendHeaders property that has been made static + */ + public function __set($property, $value) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + static::$sendHeaders = $value; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php new file mode 100644 index 0000000..c43c013 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Sends logs to Fleep.io using Webhook integrations + * + * You'll need a Fleep.io account to use this handler. + * + * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation + * @author Ando Roots + */ +class FleepHookHandler extends SocketHandler +{ + const FLEEP_HOST = 'fleep.io'; + + const FLEEP_HOOK_URI = '/hook/'; + + /** + * @var string Webhook token (specifies the conversation where logs are sent) + */ + protected $token; + + /** + * Construct a new Fleep.io Handler. + * + * For instructions on how to create a new web hook in your conversations + * see https://fleep.io/integrations/webhooks/ + * + * @param string $token Webhook token + * @param bool|int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @throws MissingExtensionException + */ + public function __construct($token, $level = Logger::DEBUG, $bubble = true) + { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); + } + + $this->token = $token; + + $connectionString = 'ssl://' . self::FLEEP_HOST . ':443'; + parent::__construct($connectionString, $level, $bubble); + } + + /** + * Returns the default formatter to use with this handler + * + * Overloaded to remove empty context and extra arrays from the end of the log message. + * + * @return LineFormatter + */ + protected function getDefaultFormatter() + { + return new LineFormatter(null, null, true, true); + } + + /** + * Handles a log record + * + * @param array $record + */ + public function write(array $record) + { + parent::write($record); + $this->closeSocket(); + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + $header = "POST " . self::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; + $header .= "Host: " . self::FLEEP_HOST . "\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + $dataArray = array( + 'message' => $record['formatted'], + ); + + return http_build_query($dataArray); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php new file mode 100644 index 0000000..dd9a361 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php @@ -0,0 +1,127 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FlowdockFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Sends notifications through the Flowdock push API + * + * This must be configured with a FlowdockFormatter instance via setFormatter() + * + * Notes: + * API token - Flowdock API token + * + * @author Dominik Liebler + * @see https://www.flowdock.com/api/push + */ +class FlowdockHandler extends SocketHandler +{ + /** + * @var string + */ + protected $apiToken; + + /** + * @param string $apiToken + * @param bool|int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * + * @throws MissingExtensionException if OpenSSL is missing + */ + public function __construct($apiToken, $level = Logger::DEBUG, $bubble = true) + { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); + } + + parent::__construct('ssl://api.flowdock.com:443', $level, $bubble); + $this->apiToken = $apiToken; + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + if (!$formatter instanceof FlowdockFormatter) { + throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + return parent::setFormatter($formatter); + } + + /** + * Gets the default formatter. + * + * @return FormatterInterface + */ + protected function getDefaultFormatter() + { + throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + parent::write($record); + + $this->closeSocket(); + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + return json_encode($record['formatted']['flowdock']); + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; + $header .= "Host: api.flowdock.com\r\n"; + $header .= "Content-Type: application/json\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php new file mode 100644 index 0000000..3e2f1b2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Interface to describe loggers that have a formatter + * + * This interface is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +interface FormattableHandlerInterface +{ + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + * @return HandlerInterface self + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface; + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(): FormatterInterface; +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php new file mode 100644 index 0000000..e9ec5e7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; + +/** + * Helper trait for implementing FormattableInterface + * + * This trait is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +trait FormattableHandlerTrait +{ + /** + * @var FormatterInterface + */ + protected $formatter; + + /** + * {@inheritdoc} + * @suppress PhanTypeMismatchReturn + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $this->formatter = $formatter; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter(): FormatterInterface + { + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + + return $this->formatter; + } + + /** + * Gets the default formatter. + * + * Overwrite this if the LineFormatter is not a good default for your handler. + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php new file mode 100644 index 0000000..71e4669 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Gelf\IMessagePublisher; +use Gelf\PublisherInterface; +use Gelf\Publisher; +use InvalidArgumentException; +use Monolog\Logger; +use Monolog\Formatter\GelfMessageFormatter; + +/** + * Handler to send messages to a Graylog2 (http://www.graylog2.org) server + * + * @author Matt Lehner + * @author Benjamin Zikarsky + */ +class GelfHandler extends AbstractProcessingHandler +{ + /** + * @var Publisher the publisher object that sends the message to the server + */ + protected $publisher; + + /** + * @param PublisherInterface|IMessagePublisher|Publisher $publisher a publisher object + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($publisher, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + + if (!$publisher instanceof Publisher && !$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) { + throw new InvalidArgumentException('Invalid publisher, expected a Gelf\Publisher, Gelf\IMessagePublisher or Gelf\PublisherInterface instance'); + } + + $this->publisher = $publisher; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->publisher->publish($record['formatted']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new GelfMessageFormatter(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php new file mode 100644 index 0000000..0d461f9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php @@ -0,0 +1,117 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\ResettableInterface; + +/** + * Forwards records to multiple handlers + * + * @author Lenar Lõhmus + */ +class GroupHandler extends AbstractHandler +{ + protected $handlers; + + /** + * @param array $handlers Array of Handlers. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(array $handlers, $bubble = true) + { + foreach ($handlers as $handler) { + if (!$handler instanceof HandlerInterface) { + throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); + } + } + + $this->handlers = $handlers; + $this->bubble = $bubble; + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + foreach ($this->handlers as $handler) { + $handler->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + if ($this->processors) { + $processed = array(); + foreach ($records as $record) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + $processed[] = $record; + } + $records = $processed; + } + + foreach ($this->handlers as $handler) { + $handler->handleBatch($records); + } + } + + public function reset() + { + parent::reset(); + + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + foreach ($this->handlers as $handler) { + $handler->setFormatter($formatter); + } + + return $this; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php new file mode 100644 index 0000000..8d5a4a0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Interface that all Monolog Handlers must implement + * + * @author Jordi Boggiano + */ +interface HandlerInterface +{ + /** + * Checks whether the given record will be handled by this handler. + * + * This is mostly done for performance reasons, to avoid calling processors for nothing. + * + * Handlers should still check the record levels within handle(), returning false in isHandling() + * is no guarantee that handle() will not be called, and isHandling() might not be called + * for a given record. + * + * @param array $record Partial log record containing only a level key + * + * @return bool + */ + public function isHandling(array $record); + + /** + * Handles a record. + * + * All records may be passed to this method, and the handler should discard + * those that it does not want to handle. + * + * The return value of this function controls the bubbling process of the handler stack. + * Unless the bubbling is interrupted (by returning true), the Logger class will keep on + * calling further handlers in the stack with a given log record. + * + * @param array $record The record to handle + * @return bool true means that this handler handled the record, and that bubbling is not permitted. + * false means the record was either not processed or that this handler allows bubbling. + */ + public function handle(array $record); + + /** + * Handles a set of records at once. + * + * @param array $records The records to handle (an array of record arrays) + */ + public function handleBatch(array $records); + + /** + * Adds a processor in the stack. + * + * @param callable $callback + * @return self + */ + public function pushProcessor($callback); + + /** + * Removes the processor on top of the stack and returns it. + * + * @return callable + */ + public function popProcessor(); + + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + * @return self + */ + public function setFormatter(FormatterInterface $formatter); + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php new file mode 100644 index 0000000..55e6498 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * This simple wrapper class can be used to extend handlers functionality. + * + * Example: A custom filtering that can be applied to any handler. + * + * Inherit from this class and override handle() like this: + * + * public function handle(array $record) + * { + * if ($record meets certain conditions) { + * return false; + * } + * return $this->handler->handle($record); + * } + * + * @author Alexey Karapetov + */ +class HandlerWrapper implements HandlerInterface, ResettableInterface +{ + /** + * @var HandlerInterface + */ + protected $handler; + + /** + * HandlerWrapper constructor. + * @param HandlerInterface $handler + */ + public function __construct(HandlerInterface $handler) + { + $this->handler = $handler; + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return $this->handler->isHandling($record); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + return $this->handler->handle($record); + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + return $this->handler->handleBatch($records); + } + + /** + * {@inheritdoc} + */ + public function pushProcessor($callback) + { + $this->handler->pushProcessor($callback); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function popProcessor() + { + return $this->handler->popProcessor(); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->handler->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->handler->getFormatter(); + } + + public function reset() + { + if ($this->handler instanceof ResettableInterface) { + return $this->handler->reset(); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php new file mode 100644 index 0000000..179d626 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php @@ -0,0 +1,367 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Sends notifications through the hipchat api to a hipchat room + * + * Notes: + * API token - HipChat API token + * Room - HipChat Room Id or name, where messages are sent + * Name - Name used to send the message (from) + * notify - Should the message trigger a notification in the clients + * version - The API version to use (HipChatHandler::API_V1 | HipChatHandler::API_V2) + * + * @author Rafael Dohms + * @see https://www.hipchat.com/docs/api + */ +class HipChatHandler extends SocketHandler +{ + /** + * Use API version 1 + */ + const API_V1 = 'v1'; + + /** + * Use API version v2 + */ + const API_V2 = 'v2'; + + /** + * The maximum allowed length for the name used in the "from" field. + */ + const MAXIMUM_NAME_LENGTH = 15; + + /** + * The maximum allowed length for the message. + */ + const MAXIMUM_MESSAGE_LENGTH = 9500; + + /** + * @var string + */ + private $token; + + /** + * @var string + */ + private $room; + + /** + * @var string + */ + private $name; + + /** + * @var bool + */ + private $notify; + + /** + * @var string + */ + private $format; + + /** + * @var string + */ + private $host; + + /** + * @var string + */ + private $version; + + /** + * @param string $token HipChat API Token + * @param string $room The room that should be alerted of the message (Id or Name) + * @param string $name Name used in the "from" field. + * @param bool $notify Trigger a notification in clients or not + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $useSSL Whether to connect via SSL. + * @param string $format The format of the messages (default to text, can be set to html if you have html in the messages) + * @param string $host The HipChat server hostname. + * @param string $version The HipChat API version (default HipChatHandler::API_V1) + */ + public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $format = 'text', $host = 'api.hipchat.com', $version = self::API_V1) + { + @trigger_error('The Monolog\Handler\HipChatHandler class is deprecated. You should migrate to Slack and the SlackWebhookHandler / SlackbotHandler, see https://www.atlassian.com/partnerships/slack', E_USER_DEPRECATED); + + if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) { + throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.'); + } + + $connectionString = $useSSL ? 'ssl://'.$host.':443' : $host.':80'; + parent::__construct($connectionString, $level, $bubble); + + $this->token = $token; + $this->name = $name; + $this->notify = $notify; + $this->room = $room; + $this->format = $format; + $this->host = $host; + $this->version = $version; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + $dataArray = array( + 'notify' => $this->version == self::API_V1 ? + ($this->notify ? 1 : 0) : + ($this->notify ? 'true' : 'false'), + 'message' => $record['formatted'], + 'message_format' => $this->format, + 'color' => $this->getAlertColor($record['level']), + ); + + if (!$this->validateStringLength($dataArray['message'], static::MAXIMUM_MESSAGE_LENGTH)) { + if (function_exists('mb_substr')) { + $dataArray['message'] = mb_substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]'; + } else { + $dataArray['message'] = substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]'; + } + } + + // if we are using the legacy API then we need to send some additional information + if ($this->version == self::API_V1) { + $dataArray['room_id'] = $this->room; + } + + // append the sender name if it is set + // always append it if we use the v1 api (it is required in v1) + if ($this->version == self::API_V1 || $this->name !== null) { + $dataArray['from'] = (string) $this->name; + } + + return http_build_query($dataArray); + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + if ($this->version == self::API_V1) { + $header = "POST /v1/rooms/message?format=json&auth_token={$this->token} HTTP/1.1\r\n"; + } else { + // needed for rooms with special (spaces, etc) characters in the name + $room = rawurlencode($this->room); + $header = "POST /v2/room/{$room}/notification?auth_token={$this->token} HTTP/1.1\r\n"; + } + + $header .= "Host: {$this->host}\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * Assigns a color to each level of log records. + * + * @param int $level + * @return string + */ + protected function getAlertColor($level) + { + switch (true) { + case $level >= Logger::ERROR: + return 'red'; + case $level >= Logger::WARNING: + return 'yellow'; + case $level >= Logger::INFO: + return 'green'; + case $level == Logger::DEBUG: + return 'gray'; + default: + return 'yellow'; + } + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + parent::write($record); + $this->finalizeWrite(); + } + + /** + * Finalizes the request by reading some bytes and then closing the socket + * + * If we do not read some but close the socket too early, hipchat sometimes + * drops the request entirely. + */ + protected function finalizeWrite() + { + $res = $this->getResource(); + if (is_resource($res)) { + @fread($res, 2048); + } + $this->closeSocket(); + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + if (count($records) == 0) { + return true; + } + + $batchRecords = $this->combineRecords($records); + + $handled = false; + foreach ($batchRecords as $batchRecord) { + if ($this->isHandling($batchRecord)) { + $this->write($batchRecord); + $handled = true; + } + } + + if (!$handled) { + return false; + } + + return false === $this->bubble; + } + + /** + * Combines multiple records into one. Error level of the combined record + * will be the highest level from the given records. Datetime will be taken + * from the first record. + * + * @param $records + * @return array + */ + private function combineRecords($records) + { + $batchRecord = null; + $batchRecords = array(); + $messages = array(); + $formattedMessages = array(); + $level = 0; + $levelName = null; + $datetime = null; + + foreach ($records as $record) { + $record = $this->processRecord($record); + + if ($record['level'] > $level) { + $level = $record['level']; + $levelName = $record['level_name']; + } + + if (null === $datetime) { + $datetime = $record['datetime']; + } + + $messages[] = $record['message']; + $messageStr = implode(PHP_EOL, $messages); + $formattedMessages[] = $this->getFormatter()->format($record); + $formattedMessageStr = implode('', $formattedMessages); + + $batchRecord = array( + 'message' => $messageStr, + 'formatted' => $formattedMessageStr, + 'context' => array(), + 'extra' => array(), + ); + + if (!$this->validateStringLength($batchRecord['formatted'], static::MAXIMUM_MESSAGE_LENGTH)) { + // Pop the last message and implode the remaining messages + $lastMessage = array_pop($messages); + $lastFormattedMessage = array_pop($formattedMessages); + $batchRecord['message'] = implode(PHP_EOL, $messages); + $batchRecord['formatted'] = implode('', $formattedMessages); + + $batchRecords[] = $batchRecord; + $messages = array($lastMessage); + $formattedMessages = array($lastFormattedMessage); + + $batchRecord = null; + } + } + + if (null !== $batchRecord) { + $batchRecords[] = $batchRecord; + } + + // Set the max level and datetime for all records + foreach ($batchRecords as &$batchRecord) { + $batchRecord = array_merge( + $batchRecord, + array( + 'level' => $level, + 'level_name' => $levelName, + 'datetime' => $datetime, + ) + ); + } + + return $batchRecords; + } + + /** + * Validates the length of a string. + * + * If the `mb_strlen()` function is available, it will use that, as HipChat + * allows UTF-8 characters. Otherwise, it will fall back to `strlen()`. + * + * Note that this might cause false failures in the specific case of using + * a valid name with less than 16 characters, but 16 or more bytes, on a + * system where `mb_strlen()` is unavailable. + * + * @param string $str + * @param int $length + * + * @return bool + */ + private function validateStringLength($str, $length) + { + if (function_exists('mb_strlen')) { + return (mb_strlen($str) <= $length); + } + + return (strlen($str) <= $length); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php new file mode 100644 index 0000000..7f22622 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * IFTTTHandler uses cURL to trigger IFTTT Maker actions + * + * Register a secret key and trigger/event name at https://ifttt.com/maker + * + * value1 will be the channel from monolog's Logger constructor, + * value2 will be the level name (ERROR, WARNING, ..) + * value3 will be the log record's message + * + * @author Nehal Patel + */ +class IFTTTHandler extends AbstractProcessingHandler +{ + private $eventName; + private $secretKey; + + /** + * @param string $eventName The name of the IFTTT Maker event that should be triggered + * @param string $secretKey A valid IFTTT secret key + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = true) + { + $this->eventName = $eventName; + $this->secretKey = $secretKey; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + public function write(array $record) + { + $postData = array( + "value1" => $record["channel"], + "value2" => $record["level_name"], + "value3" => $record["message"], + ); + $postString = json_encode($postData); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + "Content-Type: application/json", + )); + + Curl\Util::execute($ch); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php new file mode 100644 index 0000000..8f683dc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + + namespace Monolog\Handler; + + use Monolog\Logger; + +/** + * Inspired on LogEntriesHandler. + * + * @author Robert Kaufmann III + * @author Gabriel Machado + */ +class InsightOpsHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by InsightOps + * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. + * @param bool $useSSL Whether or not SSL encryption should be used + * @param int $level The minimum logging level to trigger this handler + * @param bool $bubble Whether or not messages that are handled should bubble up the stack. + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct($token, $region = 'us', $useSSL = true, $level = Logger::DEBUG, $bubble = true) + { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); + } + + $endpoint = $useSSL + ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' + : $region . '.data.logs.insight.rapid7.com:80'; + + parent::__construct($endpoint, $level, $bubble); + $this->logToken = $token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php new file mode 100644 index 0000000..ea89fb3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * @author Robert Kaufmann III + */ +class LogEntriesHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by LogEntries + * @param bool $useSSL Whether or not SSL encryption should be used. + * @param int $level The minimum logging level to trigger this handler + * @param bool $bubble Whether or not messages that are handled should bubble up the stack. + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true, $host = 'data.logentries.com') + { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); + } + + $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; + parent::__construct($endpoint, $level, $bubble); + $this->logToken = $token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php new file mode 100644 index 0000000..bcd62e1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LogglyFormatter; + +/** + * Sends errors to Loggly. + * + * @author Przemek Sobstel + * @author Adam Pancutt + * @author Gregory Barchard + */ +class LogglyHandler extends AbstractProcessingHandler +{ + const HOST = 'logs-01.loggly.com'; + const ENDPOINT_SINGLE = 'inputs'; + const ENDPOINT_BATCH = 'bulk'; + + protected $token; + + protected $tag = array(); + + public function __construct($token, $level = Logger::DEBUG, $bubble = true) + { + if (!extension_loaded('curl')) { + throw new \LogicException('The curl extension is needed to use the LogglyHandler'); + } + + $this->token = $token; + + parent::__construct($level, $bubble); + } + + public function setTag($tag) + { + $tag = !empty($tag) ? $tag : array(); + $this->tag = is_array($tag) ? $tag : array($tag); + } + + public function addTag($tag) + { + if (!empty($tag)) { + $tag = is_array($tag) ? $tag : array($tag); + $this->tag = array_unique(array_merge($this->tag, $tag)); + } + } + + protected function write(array $record) + { + $this->send($record["formatted"], self::ENDPOINT_SINGLE); + } + + public function handleBatch(array $records) + { + $level = $this->level; + + $records = array_filter($records, function ($record) use ($level) { + return ($record['level'] >= $level); + }); + + if ($records) { + $this->send($this->getFormatter()->formatBatch($records), self::ENDPOINT_BATCH); + } + } + + protected function send($data, $endpoint) + { + $url = sprintf("https://%s/%s/%s/", self::HOST, $endpoint, $this->token); + + $headers = array('Content-Type: application/json'); + + if (!empty($this->tag)) { + $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag); + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + + Curl\Util::execute($ch); + } + + protected function getDefaultFormatter() + { + return new LogglyFormatter(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php new file mode 100644 index 0000000..9e23283 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Base class for all mail handlers + * + * @author Gyula Sallai + */ +abstract class MailHandler extends AbstractProcessingHandler +{ + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $messages = array(); + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + $messages[] = $this->processRecord($record); + } + + if (!empty($messages)) { + $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); + } + } + + /** + * Send a mail with the given content + * + * @param string $content formatted email body to be sent + * @param array $records the array of log records that formed this content + */ + abstract protected function send($content, array $records); + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->send((string) $record['formatted'], array($record)); + } + + protected function getHighestRecord(array $records) + { + $highestRecord = null; + foreach ($records as $record) { + if ($highestRecord === null || $highestRecord['level'] < $record['level']) { + $highestRecord = $record; + } + } + + return $highestRecord; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php new file mode 100644 index 0000000..3f0956a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * MandrillHandler uses cURL to send the emails to the Mandrill API + * + * @author Adam Nicholson + */ +class MandrillHandler extends MailHandler +{ + protected $message; + protected $apiKey; + + /** + * @param string $apiKey A valid Mandrill API key + * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = true) + { + parent::__construct($level, $bubble); + + if (!$message instanceof \Swift_Message && is_callable($message)) { + $message = call_user_func($message); + } + if (!$message instanceof \Swift_Message) { + throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); + } + $this->message = $message; + $this->apiKey = $apiKey; + } + + /** + * {@inheritdoc} + */ + protected function send($content, array $records) + { + $message = clone $this->message; + $message->setBody($content); + $message->setDate(time()); + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array( + 'key' => $this->apiKey, + 'raw_message' => (string) $message, + 'async' => false, + ))); + + Curl\Util::execute($ch); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php new file mode 100644 index 0000000..4724a7e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Exception can be thrown if an extension for an handler is missing + * + * @author Christian Bergau + */ +class MissingExtensionException extends \Exception +{ +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php new file mode 100644 index 0000000..56fe755 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; + +/** + * Logs to a MongoDB database. + * + * usage example: + * + * $log = new Logger('application'); + * $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod"); + * $log->pushHandler($mongodb); + * + * @author Thomas Tourlourat + */ +class MongoDBHandler extends AbstractProcessingHandler +{ + protected $mongoCollection; + + public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true) + { + if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \MongoDB\Client)) { + throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\Client instance required'); + } + + $this->mongoCollection = $mongo->selectCollection($database, $collection); + + parent::__construct($level, $bubble); + } + + protected function write(array $record) + { + if ($this->mongoCollection instanceof \MongoDB\Collection) { + $this->mongoCollection->insertOne($record["formatted"]); + } else { + $this->mongoCollection->save($record["formatted"]); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new NormalizerFormatter(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php new file mode 100644 index 0000000..d7807fd --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php @@ -0,0 +1,185 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LineFormatter; + +/** + * NativeMailerHandler uses the mail() function to send the emails + * + * @author Christophe Coevoet + * @author Mark Garrett + */ +class NativeMailerHandler extends MailHandler +{ + /** + * The email addresses to which the message will be sent + * @var array + */ + protected $to; + + /** + * The subject of the email + * @var string + */ + protected $subject; + + /** + * Optional headers for the message + * @var array + */ + protected $headers = array(); + + /** + * Optional parameters for the message + * @var array + */ + protected $parameters = array(); + + /** + * The wordwrap length for the message + * @var int + */ + protected $maxColumnWidth; + + /** + * The Content-type for the message + * @var string + */ + protected $contentType = 'text/plain'; + + /** + * The encoding for the message + * @var string + */ + protected $encoding = 'utf-8'; + + /** + * @param string|array $to The receiver of the mail + * @param string $subject The subject of the mail + * @param string $from The sender of the mail + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $maxColumnWidth The maximum column width that the message lines will have + */ + public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true, $maxColumnWidth = 70) + { + parent::__construct($level, $bubble); + $this->to = is_array($to) ? $to : array($to); + $this->subject = $subject; + $this->addHeader(sprintf('From: %s', $from)); + $this->maxColumnWidth = $maxColumnWidth; + } + + /** + * Add headers to the message + * + * @param string|array $headers Custom added headers + * @return self + */ + public function addHeader($headers) + { + foreach ((array) $headers as $header) { + if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { + throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); + } + $this->headers[] = $header; + } + + return $this; + } + + /** + * Add parameters to the message + * + * @param string|array $parameters Custom added parameters + * @return self + */ + public function addParameter($parameters) + { + $this->parameters = array_merge($this->parameters, (array) $parameters); + + return $this; + } + + /** + * {@inheritdoc} + */ + protected function send($content, array $records) + { + $content = wordwrap($content, $this->maxColumnWidth); + $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); + $headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . "\r\n"; + if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) { + $headers .= 'MIME-Version: 1.0' . "\r\n"; + } + + $subject = $this->subject; + if ($records) { + $subjectFormatter = new LineFormatter($this->subject); + $subject = $subjectFormatter->format($this->getHighestRecord($records)); + } + + $parameters = implode(' ', $this->parameters); + foreach ($this->to as $to) { + mail($to, $subject, $content, $headers, $parameters); + } + } + + /** + * @return string $contentType + */ + public function getContentType() + { + return $this->contentType; + } + + /** + * @return string $encoding + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML + * messages. + * @return self + */ + public function setContentType($contentType) + { + if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { + throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); + } + + $this->contentType = $contentType; + + return $this; + } + + /** + * @param string $encoding + * @return self + */ + public function setEncoding($encoding) + { + if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { + throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); + } + + $this->encoding = $encoding; + + return $this; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php new file mode 100644 index 0000000..f911997 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php @@ -0,0 +1,204 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; + +/** + * Class to record a log on a NewRelic application. + * Enabling New Relic High Security mode may prevent capture of useful information. + * + * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted'] + * + * @see https://docs.newrelic.com/docs/agents/php-agent + * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security + */ +class NewRelicHandler extends AbstractProcessingHandler +{ + /** + * Name of the New Relic application that will receive logs from this handler. + * + * @var string + */ + protected $appName; + + /** + * Name of the current transaction + * + * @var string + */ + protected $transactionName; + + /** + * Some context and extra data is passed into the handler as arrays of values. Do we send them as is + * (useful if we are using the API), or explode them for display on the NewRelic RPM website? + * + * @var bool + */ + protected $explodeArrays; + + /** + * {@inheritDoc} + * + * @param string $appName + * @param bool $explodeArrays + * @param string $transactionName + */ + public function __construct( + $level = Logger::ERROR, + $bubble = true, + $appName = null, + $explodeArrays = false, + $transactionName = null + ) { + parent::__construct($level, $bubble); + + $this->appName = $appName; + $this->explodeArrays = $explodeArrays; + $this->transactionName = $transactionName; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + if (!$this->isNewRelicEnabled()) { + throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); + } + + if ($appName = $this->getAppName($record['context'])) { + $this->setNewRelicAppName($appName); + } + + if ($transactionName = $this->getTransactionName($record['context'])) { + $this->setNewRelicTransactionName($transactionName); + unset($record['formatted']['context']['transaction_name']); + } + + if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) { + newrelic_notice_error($record['message'], $record['context']['exception']); + unset($record['formatted']['context']['exception']); + } else { + newrelic_notice_error($record['message']); + } + + if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) { + foreach ($record['formatted']['context'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('context_' . $key, $parameter); + } + } + } + + if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) { + foreach ($record['formatted']['extra'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('extra_' . $key, $parameter); + } + } + } + } + + /** + * Checks whether the NewRelic extension is enabled in the system. + * + * @return bool + */ + protected function isNewRelicEnabled() + { + return extension_loaded('newrelic'); + } + + /** + * Returns the appname where this log should be sent. Each log can override the default appname, set in this + * handler's constructor, by providing the appname in it's context. + * + * @param array $context + * @return null|string + */ + protected function getAppName(array $context) + { + if (isset($context['appname'])) { + return $context['appname']; + } + + return $this->appName; + } + + /** + * Returns the name of the current transaction. Each log can override the default transaction name, set in this + * handler's constructor, by providing the transaction_name in it's context + * + * @param array $context + * + * @return null|string + */ + protected function getTransactionName(array $context) + { + if (isset($context['transaction_name'])) { + return $context['transaction_name']; + } + + return $this->transactionName; + } + + /** + * Sets the NewRelic application that should receive this log. + * + * @param string $appName + */ + protected function setNewRelicAppName($appName) + { + newrelic_set_appname($appName); + } + + /** + * Overwrites the name of the current transaction + * + * @param string $transactionName + */ + protected function setNewRelicTransactionName($transactionName) + { + newrelic_name_transaction($transactionName); + } + + /** + * @param string $key + * @param mixed $value + */ + protected function setNewRelicParameter($key, $value) + { + if (null === $value || is_scalar($value)) { + newrelic_add_custom_parameter($key, $value); + } else { + newrelic_add_custom_parameter($key, @json_encode($value)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new NormalizerFormatter(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php new file mode 100644 index 0000000..4b84588 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Blackhole + * + * Any record it can handle will be thrown away. This can be used + * to put on top of an existing stack to override it temporarily. + * + * @author Jordi Boggiano + */ +class NullHandler extends AbstractHandler +{ + /** + * @param int $level The minimum logging level at which this handler will be triggered + */ + public function __construct($level = Logger::DEBUG) + { + parent::__construct($level, false); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($record['level'] < $this->level) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php new file mode 100644 index 0000000..1f2076a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php @@ -0,0 +1,242 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Exception; +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; +use PhpConsole\Connector; +use PhpConsole\Handler; +use PhpConsole\Helper; + +/** + * Monolog handler for Google Chrome extension "PHP Console" + * + * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely + * + * Usage: + * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef + * 2. See overview https://github.com/barbushin/php-console#overview + * 3. Install PHP Console library https://github.com/barbushin/php-console#installation + * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) + * + * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); + * \Monolog\ErrorHandler::register($logger); + * echo $undefinedVar; + * $logger->addDebug('SELECT * FROM users', array('db', 'time' => 0.012)); + * PC::debug($_SERVER); // PHP Console debugger for any type of vars + * + * @author Sergey Barbushin https://www.linkedin.com/in/barbushin + */ +class PHPConsoleHandler extends AbstractProcessingHandler +{ + private $options = array( + 'enabled' => true, // bool Is PHP Console server enabled + 'classesPartialsTraceIgnore' => array('Monolog\\'), // array Hide calls of classes started with... + 'debugTagsKeysInContext' => array(0, 'tag'), // bool Is PHP Console server enabled + 'useOwnErrorsHandler' => false, // bool Enable errors handling + 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling + 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths + 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') + 'serverEncoding' => null, // string|null Server internal encoding + 'headersLimit' => null, // int|null Set headers size limit for your web-server + 'password' => null, // string|null Protect PHP Console connection by password + 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed + 'ipMasks' => array(), // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') + 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) + 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings + 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level + 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number + 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item + 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON + 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug + 'dataStorage' => null, // PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ) + ); + + /** @var Connector */ + private $connector; + + /** + * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details + * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) + * @param int $level + * @param bool $bubble + * @throws Exception + */ + public function __construct(array $options = array(), Connector $connector = null, $level = Logger::DEBUG, $bubble = true) + { + if (!class_exists('PhpConsole\Connector')) { + throw new Exception('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); + } + parent::__construct($level, $bubble); + $this->options = $this->initOptions($options); + $this->connector = $this->initConnector($connector); + } + + private function initOptions(array $options) + { + $wrongOptions = array_diff(array_keys($options), array_keys($this->options)); + if ($wrongOptions) { + throw new Exception('Unknown options: ' . implode(', ', $wrongOptions)); + } + + return array_replace($this->options, $options); + } + + private function initConnector(Connector $connector = null) + { + if (!$connector) { + if ($this->options['dataStorage']) { + Connector::setPostponeStorage($this->options['dataStorage']); + } + $connector = Connector::getInstance(); + } + + if ($this->options['registerHelper'] && !Helper::isRegistered()) { + Helper::register(); + } + + if ($this->options['enabled'] && $connector->isActiveClient()) { + if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { + $handler = Handler::getInstance(); + $handler->setHandleErrors($this->options['useOwnErrorsHandler']); + $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); + $handler->start(); + } + if ($this->options['sourcesBasePath']) { + $connector->setSourcesBasePath($this->options['sourcesBasePath']); + } + if ($this->options['serverEncoding']) { + $connector->setServerEncoding($this->options['serverEncoding']); + } + if ($this->options['password']) { + $connector->setPassword($this->options['password']); + } + if ($this->options['enableSslOnlyMode']) { + $connector->enableSslOnlyMode(); + } + if ($this->options['ipMasks']) { + $connector->setAllowedIpMasks($this->options['ipMasks']); + } + if ($this->options['headersLimit']) { + $connector->setHeadersLimit($this->options['headersLimit']); + } + if ($this->options['detectDumpTraceAndSource']) { + $connector->getDebugDispatcher()->detectTraceAndSource = true; + } + $dumper = $connector->getDumper(); + $dumper->levelLimit = $this->options['dumperLevelLimit']; + $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; + $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; + $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; + $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; + if ($this->options['enableEvalListener']) { + $connector->startEvalRequestsListener(); + } + } + + return $connector; + } + + public function getConnector() + { + return $this->connector; + } + + public function getOptions() + { + return $this->options; + } + + public function handle(array $record) + { + if ($this->options['enabled'] && $this->connector->isActiveClient()) { + return parent::handle($record); + } + + return !$this->bubble; + } + + /** + * Writes the record down to the log of the implementing handler + * + * @param array $record + * @return void + */ + protected function write(array $record) + { + if ($record['level'] < Logger::NOTICE) { + $this->handleDebugRecord($record); + } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof Exception) { + $this->handleExceptionRecord($record); + } else { + $this->handleErrorRecord($record); + } + } + + private function handleDebugRecord(array $record) + { + $tags = $this->getRecordTags($record); + $message = $record['message']; + if ($record['context']) { + $message .= ' ' . json_encode($this->connector->getDumper()->dump(array_filter($record['context']))); + } + $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); + } + + private function handleExceptionRecord(array $record) + { + $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']); + } + + private function handleErrorRecord(array $record) + { + $context = $record['context']; + + $this->connector->getErrorsDispatcher()->dispatchError( + isset($context['code']) ? $context['code'] : null, + isset($context['message']) ? $context['message'] : $record['message'], + isset($context['file']) ? $context['file'] : null, + isset($context['line']) ? $context['line'] : null, + $this->options['classesPartialsTraceIgnore'] + ); + } + + private function getRecordTags(array &$record) + { + $tags = null; + if (!empty($record['context'])) { + $context = & $record['context']; + foreach ($this->options['debugTagsKeysInContext'] as $key) { + if (!empty($context[$key])) { + $tags = $context[$key]; + if ($key === 0) { + array_shift($context); + } else { + unset($context[$key]); + } + break; + } + } + } + + return $tags ?: strtolower($record['level_name']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('%message%'); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php new file mode 100644 index 0000000..66a3d83 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Processor\ProcessorInterface; + +/** + * Interface to describe loggers that have processors + * + * This interface is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +interface ProcessableHandlerInterface +{ + /** + * Adds a processor in the stack. + * + * @param ProcessorInterface|callable $callback + * @return HandlerInterface self + */ + public function pushProcessor($callback): HandlerInterface; + + /** + * Removes the processor on top of the stack and returns it. + * + * @throws \LogicException In case the processor stack is empty + * @return callable + */ + public function popProcessor(): callable; +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php new file mode 100644 index 0000000..09f32a1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; + +/** + * Helper trait for implementing ProcessableInterface + * + * This trait is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +trait ProcessableHandlerTrait +{ + /** + * @var callable[] + */ + protected $processors = []; + + /** + * {@inheritdoc} + * @suppress PhanTypeMismatchReturn + */ + public function pushProcessor($callback): HandlerInterface + { + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function popProcessor(): callable + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * Processes a record. + */ + protected function processRecord(array $record): array + { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + + return $record; + } + + protected function resetProcessors(): void + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php new file mode 100644 index 0000000..a99e6ab --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LoggerInterface; + +/** + * Proxies log messages to an existing PSR-3 compliant logger. + * + * @author Michael Moussa + */ +class PsrHandler extends AbstractHandler +{ + /** + * PSR-3 compliant logger + * + * @var LoggerInterface + */ + protected $logger; + + /** + * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + + $this->logger = $logger; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record) + { + if (!$this->isHandling($record)) { + return false; + } + + $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']); + + return false === $this->bubble; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php new file mode 100644 index 0000000..f27bb3d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php @@ -0,0 +1,185 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Sends notifications through the pushover api to mobile phones + * + * @author Sebastian Göttschkes + * @see https://www.pushover.net/api + */ +class PushoverHandler extends SocketHandler +{ + private $token; + private $users; + private $title; + private $user; + private $retry; + private $expire; + + private $highPriorityLevel; + private $emergencyLevel; + private $useFormattedMessage = false; + + /** + * All parameters that can be sent to Pushover + * @see https://pushover.net/api + * @var array + */ + private $parameterNames = array( + 'token' => true, + 'user' => true, + 'message' => true, + 'device' => true, + 'title' => true, + 'url' => true, + 'url_title' => true, + 'priority' => true, + 'timestamp' => true, + 'sound' => true, + 'retry' => true, + 'expire' => true, + 'callback' => true, + ); + + /** + * Sounds the api supports by default + * @see https://pushover.net/api#sounds + * @var array + */ + private $sounds = array( + 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', + 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', + 'persistent', 'echo', 'updown', 'none', + ); + + /** + * @param string $token Pushover api token + * @param string|array $users Pushover user id or array of ids the message will be sent to + * @param string $title Title sent to the Pushover API + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not + * the pushover.net app owner. OpenSSL is required for this option. + * @param int $highPriorityLevel The minimum logging level at which this handler will start + * sending "high priority" requests to the Pushover API + * @param int $emergencyLevel The minimum logging level at which this handler will start + * sending "emergency" requests to the Pushover API + * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user. + * @param int $expire The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds). + */ + public function __construct($token, $users, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, $retry = 30, $expire = 25200) + { + $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; + parent::__construct($connectionString, $level, $bubble); + + $this->token = $token; + $this->users = (array) $users; + $this->title = $title ?: gethostname(); + $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); + $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); + $this->retry = $retry; + $this->expire = $expire; + } + + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + private function buildContent($record) + { + // Pushover has a limit of 512 characters on title and message combined. + $maxMessageLength = 512 - strlen($this->title); + + $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message']; + $message = substr($message, 0, $maxMessageLength); + + $timestamp = $record['datetime']->getTimestamp(); + + $dataArray = array( + 'token' => $this->token, + 'user' => $this->user, + 'message' => $message, + 'title' => $this->title, + 'timestamp' => $timestamp, + ); + + if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) { + $dataArray['priority'] = 2; + $dataArray['retry'] = $this->retry; + $dataArray['expire'] = $this->expire; + } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) { + $dataArray['priority'] = 1; + } + + // First determine the available parameters + $context = array_intersect_key($record['context'], $this->parameterNames); + $extra = array_intersect_key($record['extra'], $this->parameterNames); + + // Least important info should be merged with subsequent info + $dataArray = array_merge($extra, $context, $dataArray); + + // Only pass sounds that are supported by the API + if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) { + unset($dataArray['sound']); + } + + return http_build_query($dataArray); + } + + private function buildHeader($content) + { + $header = "POST /1/messages.json HTTP/1.1\r\n"; + $header .= "Host: api.pushover.net\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + protected function write(array $record) + { + foreach ($this->users as $user) { + $this->user = $user; + + parent::write($record); + $this->closeSocket(); + } + + $this->user = null; + } + + public function setHighPriorityLevel($value) + { + $this->highPriorityLevel = $value; + } + + public function setEmergencyLevel($value) + { + $this->emergencyLevel = $value; + } + + /** + * Use the formatted message? + * @param bool $value + */ + public function useFormattedMessage($value) + { + $this->useFormattedMessage = (bool) $value; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php new file mode 100644 index 0000000..1929f25 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php @@ -0,0 +1,234 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Raven_Client; + +/** + * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server + * using sentry-php (https://github.com/getsentry/sentry-php) + * + * @author Marc Abramowitz + */ +class RavenHandler extends AbstractProcessingHandler +{ + /** + * Translates Monolog log levels to Raven log levels. + */ + protected $logLevels = array( + Logger::DEBUG => Raven_Client::DEBUG, + Logger::INFO => Raven_Client::INFO, + Logger::NOTICE => Raven_Client::INFO, + Logger::WARNING => Raven_Client::WARNING, + Logger::ERROR => Raven_Client::ERROR, + Logger::CRITICAL => Raven_Client::FATAL, + Logger::ALERT => Raven_Client::FATAL, + Logger::EMERGENCY => Raven_Client::FATAL, + ); + + /** + * @var string should represent the current version of the calling + * software. Can be any string (git commit, version number) + */ + protected $release; + + /** + * @var Raven_Client the client object that sends the message to the server + */ + protected $ravenClient; + + /** + * @var LineFormatter The formatter to use for the logs generated via handleBatch() + */ + protected $batchFormatter; + + /** + * @param Raven_Client $ravenClient + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true) + { + @trigger_error('The Monolog\Handler\RavenHandler class is deprecated. You should rather upgrade to the sentry/sentry 2.x and use Sentry\Monolog\Handler, see https://github.com/getsentry/sentry-php/blob/master/src/Monolog/Handler.php', E_USER_DEPRECATED); + + parent::__construct($level, $bubble); + + $this->ravenClient = $ravenClient; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $level = $this->level; + + // filter records based on their level + $records = array_filter($records, function ($record) use ($level) { + return $record['level'] >= $level; + }); + + if (!$records) { + return; + } + + // the record with the highest severity is the "main" one + $record = array_reduce($records, function ($highest, $record) { + if ($record['level'] > $highest['level']) { + return $record; + } + + return $highest; + }); + + // the other ones are added as a context item + $logs = array(); + foreach ($records as $r) { + $logs[] = $this->processRecord($r); + } + + if ($logs) { + $record['context']['logs'] = (string) $this->getBatchFormatter()->formatBatch($logs); + } + + $this->handle($record); + } + + /** + * Sets the formatter for the logs generated by handleBatch(). + * + * @param FormatterInterface $formatter + */ + public function setBatchFormatter(FormatterInterface $formatter) + { + $this->batchFormatter = $formatter; + } + + /** + * Gets the formatter for the logs generated by handleBatch(). + * + * @return FormatterInterface + */ + public function getBatchFormatter() + { + if (!$this->batchFormatter) { + $this->batchFormatter = $this->getDefaultBatchFormatter(); + } + + return $this->batchFormatter; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $previousUserContext = false; + $options = array(); + $options['level'] = $this->logLevels[$record['level']]; + $options['tags'] = array(); + if (!empty($record['extra']['tags'])) { + $options['tags'] = array_merge($options['tags'], $record['extra']['tags']); + unset($record['extra']['tags']); + } + if (!empty($record['context']['tags'])) { + $options['tags'] = array_merge($options['tags'], $record['context']['tags']); + unset($record['context']['tags']); + } + if (!empty($record['context']['fingerprint'])) { + $options['fingerprint'] = $record['context']['fingerprint']; + unset($record['context']['fingerprint']); + } + if (!empty($record['context']['logger'])) { + $options['logger'] = $record['context']['logger']; + unset($record['context']['logger']); + } else { + $options['logger'] = $record['channel']; + } + foreach ($this->getExtraParameters() as $key) { + foreach (array('extra', 'context') as $source) { + if (!empty($record[$source][$key])) { + $options[$key] = $record[$source][$key]; + unset($record[$source][$key]); + } + } + } + if (!empty($record['context'])) { + $options['extra']['context'] = $record['context']; + if (!empty($record['context']['user'])) { + $previousUserContext = $this->ravenClient->context->user; + $this->ravenClient->user_context($record['context']['user']); + unset($options['extra']['context']['user']); + } + } + if (!empty($record['extra'])) { + $options['extra']['extra'] = $record['extra']; + } + + if (!empty($this->release) && !isset($options['release'])) { + $options['release'] = $this->release; + } + + if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) { + $options['message'] = $record['formatted']; + $this->ravenClient->captureException($record['context']['exception'], $options); + } else { + $this->ravenClient->captureMessage($record['formatted'], array(), $options); + } + + if ($previousUserContext !== false) { + $this->ravenClient->user_context($previousUserContext); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('[%channel%] %message%'); + } + + /** + * Gets the default formatter for the logs generated by handleBatch(). + * + * @return FormatterInterface + */ + protected function getDefaultBatchFormatter() + { + return new LineFormatter(); + } + + /** + * Gets extra parameters supported by Raven that can be found in "extra" and "context" + * + * @return array + */ + protected function getExtraParameters() + { + return array('contexts', 'checksum', 'release', 'event_id'); + } + + /** + * @param string $value + * @return self + */ + public function setRelease($value) + { + $this->release = $value; + + return $this; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php new file mode 100644 index 0000000..590f996 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Logs to a Redis key using rpush + * + * usage example: + * + * $log = new Logger('application'); + * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); + * $log->pushHandler($redis); + * + * @author Thomas Tourlourat + */ +class RedisHandler extends AbstractProcessingHandler +{ + private $redisClient; + private $redisKey; + protected $capSize; + + /** + * @param \Predis\Client|\Redis $redis The redis instance + * @param string $key The key name to push records to + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $capSize Number of entries to limit list size to + */ + public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = true, $capSize = false) + { + if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { + throw new \InvalidArgumentException('Predis\Client or Redis instance required'); + } + + $this->redisClient = $redis; + $this->redisKey = $key; + $this->capSize = $capSize; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + if ($this->capSize) { + $this->writeCapped($record); + } else { + $this->redisClient->rpush($this->redisKey, $record["formatted"]); + } + } + + /** + * Write and cap the collection + * Writes the record to the redis list and caps its + * + * @param array $record associative record array + * @return void + */ + protected function writeCapped(array $record) + { + if ($this->redisClient instanceof \Redis) { + $this->redisClient->multi() + ->rpush($this->redisKey, $record["formatted"]) + ->ltrim($this->redisKey, -$this->capSize, -1) + ->exec(); + } else { + $redisKey = $this->redisKey; + $capSize = $this->capSize; + $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) { + $tx->rpush($redisKey, $record["formatted"]); + $tx->ltrim($redisKey, -$capSize, -1); + }); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php new file mode 100644 index 0000000..65073ff --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use RollbarNotifier; +use Exception; +use Monolog\Logger; + +/** + * Sends errors to Rollbar + * + * If the context data contains a `payload` key, that is used as an array + * of payload options to RollbarNotifier's report_message/report_exception methods. + * + * Rollbar's context info will contain the context + extra keys from the log record + * merged, and then on top of that a few keys: + * + * - level (rollbar level name) + * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) + * - channel + * - datetime (unix timestamp) + * + * @author Paul Statezny + */ +class RollbarHandler extends AbstractProcessingHandler +{ + /** + * Rollbar notifier + * + * @var RollbarNotifier + */ + protected $rollbarNotifier; + + protected $levelMap = array( + Logger::DEBUG => 'debug', + Logger::INFO => 'info', + Logger::NOTICE => 'info', + Logger::WARNING => 'warning', + Logger::ERROR => 'error', + Logger::CRITICAL => 'critical', + Logger::ALERT => 'critical', + Logger::EMERGENCY => 'critical', + ); + + /** + * Records whether any log records have been added since the last flush of the rollbar notifier + * + * @var bool + */ + private $hasRecords = false; + + protected $initialized = false; + + /** + * @param RollbarNotifier $rollbarNotifier RollbarNotifier object constructed with valid token + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(RollbarNotifier $rollbarNotifier, $level = Logger::ERROR, $bubble = true) + { + $this->rollbarNotifier = $rollbarNotifier; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + + $context = $record['context']; + $payload = array(); + if (isset($context['payload'])) { + $payload = $context['payload']; + unset($context['payload']); + } + $context = array_merge($context, $record['extra'], array( + 'level' => $this->levelMap[$record['level']], + 'monolog_level' => $record['level_name'], + 'channel' => $record['channel'], + 'datetime' => $record['datetime']->format('U'), + )); + + if (isset($context['exception']) && $context['exception'] instanceof Exception) { + $payload['level'] = $context['level']; + $exception = $context['exception']; + unset($context['exception']); + + $this->rollbarNotifier->report_exception($exception, $context, $payload); + } else { + $this->rollbarNotifier->report_message( + $record['message'], + $context['level'], + $context, + $payload + ); + } + + $this->hasRecords = true; + } + + public function flush() + { + if ($this->hasRecords) { + $this->rollbarNotifier->flush(); + $this->hasRecords = false; + } + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->flush(); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->flush(); + + parent::reset(); + } + + +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php new file mode 100644 index 0000000..ae2309f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -0,0 +1,190 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores logs to files that are rotated every day and a limited number of files are kept. + * + * This rotation is only intended to be used as a workaround. Using logrotate to + * handle the rotation is strongly encouraged when you can use it. + * + * @author Christophe Coevoet + * @author Jordi Boggiano + */ +class RotatingFileHandler extends StreamHandler +{ + const FILE_PER_DAY = 'Y-m-d'; + const FILE_PER_MONTH = 'Y-m'; + const FILE_PER_YEAR = 'Y'; + + protected $filename; + protected $maxFiles; + protected $mustRotate; + protected $nextRotation; + protected $filenameFormat; + protected $dateFormat; + + /** + * @param string $filename + * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + */ + public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) + { + $this->filename = $filename; + $this->maxFiles = (int) $maxFiles; + $this->nextRotation = new \DateTime('tomorrow'); + $this->filenameFormat = '{filename}-{date}'; + $this->dateFormat = 'Y-m-d'; + + parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); + } + + /** + * {@inheritdoc} + */ + public function close() + { + parent::close(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + /** + * {@inheritdoc} + */ + public function reset() + { + parent::reset(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + public function setFilenameFormat($filenameFormat, $dateFormat) + { + if (!preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { + trigger_error( + 'Invalid date format - format must be one of '. + 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '. + 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '. + 'date formats using slashes, underscores and/or dots instead of dashes.', + E_USER_DEPRECATED + ); + } + if (substr_count($filenameFormat, '{date}') === 0) { + trigger_error( + 'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.', + E_USER_DEPRECATED + ); + } + $this->filenameFormat = $filenameFormat; + $this->dateFormat = $dateFormat; + $this->url = $this->getTimedFilename(); + $this->close(); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + // on the first record written, if the log is new, we should rotate (once per day) + if (null === $this->mustRotate) { + $this->mustRotate = !file_exists($this->url); + } + + if ($this->nextRotation < $record['datetime']) { + $this->mustRotate = true; + $this->close(); + } + + parent::write($record); + } + + /** + * Rotates the files. + */ + protected function rotate() + { + // update filename + $this->url = $this->getTimedFilename(); + $this->nextRotation = new \DateTime('tomorrow'); + + // skip GC of old logs if files are unlimited + if (0 === $this->maxFiles) { + return; + } + + $logFiles = glob($this->getGlobPattern()); + if ($this->maxFiles >= count($logFiles)) { + // no files to remove + return; + } + + // Sorting the files by name to remove the older ones + usort($logFiles, function ($a, $b) { + return strcmp($b, $a); + }); + + foreach (array_slice($logFiles, $this->maxFiles) as $file) { + if (is_writable($file)) { + // suppress errors here as unlink() might fail if two processes + // are cleaning up/rotating at the same time + set_error_handler(function ($errno, $errstr, $errfile, $errline) {}); + unlink($file); + restore_error_handler(); + } + } + + $this->mustRotate = false; + } + + protected function getTimedFilename() + { + $fileInfo = pathinfo($this->filename); + $timedFilename = str_replace( + array('{filename}', '{date}'), + array($fileInfo['filename'], date($this->dateFormat)), + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + + if (!empty($fileInfo['extension'])) { + $timedFilename .= '.'.$fileInfo['extension']; + } + + return $timedFilename; + } + + protected function getGlobPattern() + { + $fileInfo = pathinfo($this->filename); + $glob = str_replace( + array('{filename}', '{date}'), + array($fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'), + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + if (!empty($fileInfo['extension'])) { + $glob .= '.'.$fileInfo['extension']; + } + + return $glob; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php new file mode 100644 index 0000000..9509ae3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Sampling handler + * + * A sampled event stream can be useful for logging high frequency events in + * a production environment where you only need an idea of what is happening + * and are not concerned with capturing every occurrence. Since the decision to + * handle or not handle a particular event is determined randomly, the + * resulting sampled log is not guaranteed to contain 1/N of the events that + * occurred in the application, but based on the Law of large numbers, it will + * tend to be close to this ratio with a large number of attempts. + * + * @author Bryan Davis + * @author Kunal Mehta + */ +class SamplingHandler extends AbstractHandler +{ + /** + * @var callable|HandlerInterface $handler + */ + protected $handler; + + /** + * @var int $factor + */ + protected $factor; + + /** + * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). + * @param int $factor Sample factor + */ + public function __construct($handler, $factor) + { + parent::__construct(); + $this->handler = $handler; + $this->factor = $factor; + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + public function isHandling(array $record) + { + return $this->handler->isHandling($record); + } + + public function handle(array $record) + { + if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { + // The same logic as in FingersCrossedHandler + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + $this->handler->handle($record); + } + + return false === $this->bubble; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php new file mode 100644 index 0000000..e55e0e2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php @@ -0,0 +1,294 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\Slack; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Slack record utility helping to log to Slack webhooks or API. + * + * @author Greg Kedzierski + * @author Haralan Dobrev + * @see https://api.slack.com/incoming-webhooks + * @see https://api.slack.com/docs/message-attachments + */ +class SlackRecord +{ + const COLOR_DANGER = 'danger'; + + const COLOR_WARNING = 'warning'; + + const COLOR_GOOD = 'good'; + + const COLOR_DEFAULT = '#e3e4e6'; + + /** + * Slack channel (encoded ID or name) + * @var string|null + */ + private $channel; + + /** + * Name of a bot + * @var string|null + */ + private $username; + + /** + * User icon e.g. 'ghost', 'http://example.com/user.png' + * @var string + */ + private $userIcon; + + /** + * Whether the message should be added to Slack as attachment (plain text otherwise) + * @var bool + */ + private $useAttachment; + + /** + * Whether the the context/extra messages added to Slack as attachments are in a short style + * @var bool + */ + private $useShortAttachment; + + /** + * Whether the attachment should include context and extra data + * @var bool + */ + private $includeContextAndExtra; + + /** + * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @var array + */ + private $excludeFields; + + /** + * @var FormatterInterface + */ + private $formatter; + + /** + * @var NormalizerFormatter + */ + private $normalizerFormatter; + + public function __construct($channel = null, $username = null, $useAttachment = true, $userIcon = null, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array(), FormatterInterface $formatter = null) + { + $this->channel = $channel; + $this->username = $username; + $this->userIcon = trim($userIcon, ':'); + $this->useAttachment = $useAttachment; + $this->useShortAttachment = $useShortAttachment; + $this->includeContextAndExtra = $includeContextAndExtra; + $this->excludeFields = $excludeFields; + $this->formatter = $formatter; + + if ($this->includeContextAndExtra) { + $this->normalizerFormatter = new NormalizerFormatter(); + } + } + + public function getSlackData(array $record) + { + $dataArray = array(); + $record = $this->excludeFields($record); + + if ($this->username) { + $dataArray['username'] = $this->username; + } + + if ($this->channel) { + $dataArray['channel'] = $this->channel; + } + + if ($this->formatter && !$this->useAttachment) { + $message = $this->formatter->format($record); + } else { + $message = $record['message']; + } + + if ($this->useAttachment) { + $attachment = array( + 'fallback' => $message, + 'text' => $message, + 'color' => $this->getAttachmentColor($record['level']), + 'fields' => array(), + 'mrkdwn_in' => array('fields'), + 'ts' => $record['datetime']->getTimestamp() + ); + + if ($this->useShortAttachment) { + $attachment['title'] = $record['level_name']; + } else { + $attachment['title'] = 'Message'; + $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']); + } + + + if ($this->includeContextAndExtra) { + foreach (array('extra', 'context') as $key) { + if (empty($record[$key])) { + continue; + } + + if ($this->useShortAttachment) { + $attachment['fields'][] = $this->generateAttachmentField( + $key, + $record[$key] + ); + } else { + // Add all extra fields as individual fields in attachment + $attachment['fields'] = array_merge( + $attachment['fields'], + $this->generateAttachmentFields($record[$key]) + ); + } + } + } + + $dataArray['attachments'] = array($attachment); + } else { + $dataArray['text'] = $message; + } + + if ($this->userIcon) { + if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) { + $dataArray['icon_url'] = $this->userIcon; + } else { + $dataArray['icon_emoji'] = ":{$this->userIcon}:"; + } + } + + return $dataArray; + } + + /** + * Returned a Slack message attachment color associated with + * provided level. + * + * @param int $level + * @return string + */ + public function getAttachmentColor($level) + { + switch (true) { + case $level >= Logger::ERROR: + return self::COLOR_DANGER; + case $level >= Logger::WARNING: + return self::COLOR_WARNING; + case $level >= Logger::INFO: + return self::COLOR_GOOD; + default: + return self::COLOR_DEFAULT; + } + } + + /** + * Stringifies an array of key/value pairs to be used in attachment fields + * + * @param array $fields + * + * @return string + */ + public function stringify($fields) + { + $normalized = $this->normalizerFormatter->format($fields); + $prettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; + + $hasSecondDimension = count(array_filter($normalized, 'is_array')); + $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric')); + + return $hasSecondDimension || $hasNonNumericKeys + ? json_encode($normalized, $prettyPrintFlag) + : json_encode($normalized); + } + + /** + * Sets the formatter + * + * @param FormatterInterface $formatter + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->formatter = $formatter; + } + + /** + * Generates attachment field + * + * @param string $title + * @param string|array $value + * + * @return array + */ + private function generateAttachmentField($title, $value) + { + $value = is_array($value) + ? sprintf('```%s```', $this->stringify($value)) + : $value; + + return array( + 'title' => ucfirst($title), + 'value' => $value, + 'short' => false + ); + } + + /** + * Generates a collection of attachment fields from array + * + * @param array $data + * + * @return array + */ + private function generateAttachmentFields(array $data) + { + $fields = array(); + foreach ($this->normalizerFormatter->format($data) as $key => $value) { + $fields[] = $this->generateAttachmentField($key, $value); + } + + return $fields; + } + + /** + * Get a copy of record with fields excluded according to $this->excludeFields + * + * @param array $record + * + * @return array + */ + private function excludeFields(array $record) + { + foreach ($this->excludeFields as $field) { + $keys = explode('.', $field); + $node = &$record; + $lastKey = end($keys); + foreach ($keys as $key) { + if (!isset($node[$key])) { + break; + } + if ($lastKey === $key) { + unset($node[$key]); + break; + } + $node = &$node[$key]; + } + } + + return $record; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php new file mode 100644 index 0000000..45d634f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php @@ -0,0 +1,220 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack API + * + * @author Greg Kedzierski + * @see https://api.slack.com/ + */ +class SlackHandler extends SocketHandler +{ + /** + * Slack API token + * @var string + */ + private $token; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $token Slack API token + * @param string $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @throws MissingExtensionException If no OpenSSL PHP extension configured + */ + public function __construct($token, $channel, $username = null, $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array()) + { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); + } + + parent::__construct('ssl://slack.com:443', $level, $bubble); + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields, + $this->formatter + ); + + $this->token = $token; + } + + public function getSlackRecord() + { + return $this->slackRecord; + } + + public function getToken() + { + return $this->token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + $dataArray = $this->prepareContentData($record); + + return http_build_query($dataArray); + } + + /** + * Prepares content data + * + * @param array $record + * @return array + */ + protected function prepareContentData($record) + { + $dataArray = $this->slackRecord->getSlackData($record); + $dataArray['token'] = $this->token; + + if (!empty($dataArray['attachments'])) { + $dataArray['attachments'] = json_encode($dataArray['attachments']); + } + + return $dataArray; + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; + $header .= "Host: slack.com\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + parent::write($record); + $this->finalizeWrite(); + } + + /** + * Finalizes the request by reading some bytes and then closing the socket + * + * If we do not read some but close the socket too early, slack sometimes + * drops the request entirely. + */ + protected function finalizeWrite() + { + $res = $this->getResource(); + if (is_resource($res)) { + @fread($res, 2048); + } + $this->closeSocket(); + } + + /** + * Returned a Slack message attachment color associated with + * provided level. + * + * @param int $level + * @return string + * @deprecated Use underlying SlackRecord instead + */ + protected function getAttachmentColor($level) + { + trigger_error( + 'SlackHandler::getAttachmentColor() is deprecated. Use underlying SlackRecord instead.', + E_USER_DEPRECATED + ); + + return $this->slackRecord->getAttachmentColor($level); + } + + /** + * Stringifies an array of key/value pairs to be used in attachment fields + * + * @param array $fields + * @return string + * @deprecated Use underlying SlackRecord instead + */ + protected function stringify($fields) + { + trigger_error( + 'SlackHandler::stringify() is deprecated. Use underlying SlackRecord instead.', + E_USER_DEPRECATED + ); + + return $this->slackRecord->stringify($fields); + } + + public function setFormatter(FormatterInterface $formatter) + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter() + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php new file mode 100644 index 0000000..1ef85fa --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack Webhooks + * + * @author Haralan Dobrev + * @see https://api.slack.com/incoming-webhooks + */ +class SlackWebhookHandler extends AbstractProcessingHandler +{ + /** + * Slack Webhook token + * @var string + */ + private $webhookUrl; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $webhookUrl Slack Webhook URL + * @param string|null $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + */ + public function __construct($webhookUrl, $channel = null, $username = null, $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeContextAndExtra = false, $level = Logger::CRITICAL, $bubble = true, array $excludeFields = array()) + { + parent::__construct($level, $bubble); + + $this->webhookUrl = $webhookUrl; + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields, + $this->formatter + ); + } + + public function getSlackRecord() + { + return $this->slackRecord; + } + + public function getWebhookUrl() + { + return $this->webhookUrl; + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + $postData = $this->slackRecord->getSlackData($record); + $postString = json_encode($postData); + + $ch = curl_init(); + $options = array( + CURLOPT_URL => $this->webhookUrl, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => array('Content-type: application/json'), + CURLOPT_POSTFIELDS => $postString + ); + if (defined('CURLOPT_SAFE_UPLOAD')) { + $options[CURLOPT_SAFE_UPLOAD] = true; + } + + curl_setopt_array($ch, $options); + + Curl\Util::execute($ch); + } + + public function setFormatter(FormatterInterface $formatter) + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter() + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php new file mode 100644 index 0000000..d3352ea --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Sends notifications through Slack's Slackbot + * + * @author Haralan Dobrev + * @see https://slack.com/apps/A0F81R8ET-slackbot + * @deprecated According to Slack the API used on this handler it is deprecated. + * Therefore this handler will be removed on 2.x + * Slack suggests to use webhooks instead. Please contact slack for more information. + */ +class SlackbotHandler extends AbstractProcessingHandler +{ + /** + * The slug of the Slack team + * @var string + */ + private $slackTeam; + + /** + * Slackbot token + * @var string + */ + private $token; + + /** + * Slack channel name + * @var string + */ + private $channel; + + /** + * @param string $slackTeam Slack team slug + * @param string $token Slackbot token + * @param string $channel Slack channel (encoded ID or name) + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($slackTeam, $token, $channel, $level = Logger::CRITICAL, $bubble = true) + { + @trigger_error('SlackbotHandler is deprecated and will be removed on 2.x', E_USER_DEPRECATED); + parent::__construct($level, $bubble); + + $this->slackTeam = $slackTeam; + $this->token = $token; + $this->channel = $channel; + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + $slackbotUrl = sprintf( + 'https://%s.slack.com/services/hooks/slackbot?token=%s&channel=%s', + $this->slackTeam, + $this->token, + $this->channel + ); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $slackbotUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $record['message']); + + Curl\Util::execute($ch); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php new file mode 100644 index 0000000..db50d97 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php @@ -0,0 +1,385 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores to any socket - uses fsockopen() or pfsockopen(). + * + * @author Pablo de Leon Belloc + * @see http://php.net/manual/en/function.fsockopen.php + */ +class SocketHandler extends AbstractProcessingHandler +{ + private $connectionString; + private $connectionTimeout; + private $resource; + private $timeout = 0; + private $writingTimeout = 10; + private $lastSentBytes = null; + private $chunkSize = null; + private $persistent = false; + private $errno; + private $errstr; + private $lastWritingAt; + + /** + * @param string $connectionString Socket connection string + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + $this->connectionString = $connectionString; + $this->connectionTimeout = (float) ini_get('default_socket_timeout'); + } + + /** + * Connect (if necessary) and write to the socket + * + * @param array $record + * + * @throws \UnexpectedValueException + * @throws \RuntimeException + */ + protected function write(array $record) + { + $this->connectIfNotConnected(); + $data = $this->generateDataStream($record); + $this->writeToSocket($data); + } + + /** + * We will not close a PersistentSocket instance so it can be reused in other requests. + */ + public function close() + { + if (!$this->isPersistent()) { + $this->closeSocket(); + } + } + + /** + * Close socket, if open + */ + public function closeSocket() + { + if (is_resource($this->resource)) { + fclose($this->resource); + $this->resource = null; + } + } + + /** + * Set socket connection to nbe persistent. It only has effect before the connection is initiated. + * + * @param bool $persistent + */ + public function setPersistent($persistent) + { + $this->persistent = (bool) $persistent; + } + + /** + * Set connection timeout. Only has effect before we connect. + * + * @param float $seconds + * + * @see http://php.net/manual/en/function.fsockopen.php + */ + public function setConnectionTimeout($seconds) + { + $this->validateTimeout($seconds); + $this->connectionTimeout = (float) $seconds; + } + + /** + * Set write timeout. Only has effect before we connect. + * + * @param float $seconds + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + */ + public function setTimeout($seconds) + { + $this->validateTimeout($seconds); + $this->timeout = (float) $seconds; + } + + /** + * Set writing timeout. Only has effect during connection in the writing cycle. + * + * @param float $seconds 0 for no timeout + */ + public function setWritingTimeout($seconds) + { + $this->validateTimeout($seconds); + $this->writingTimeout = (float) $seconds; + } + + /** + * Set chunk size. Only has effect during connection in the writing cycle. + * + * @param float $bytes + */ + public function setChunkSize($bytes) + { + $this->chunkSize = $bytes; + } + + /** + * Get current connection string + * + * @return string + */ + public function getConnectionString() + { + return $this->connectionString; + } + + /** + * Get persistent setting + * + * @return bool + */ + public function isPersistent() + { + return $this->persistent; + } + + /** + * Get current connection timeout setting + * + * @return float + */ + public function getConnectionTimeout() + { + return $this->connectionTimeout; + } + + /** + * Get current in-transfer timeout + * + * @return float + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * Get current local writing timeout + * + * @return float + */ + public function getWritingTimeout() + { + return $this->writingTimeout; + } + + /** + * Get current chunk size + * + * @return float + */ + public function getChunkSize() + { + return $this->chunkSize; + } + + /** + * Check to see if the socket is currently available. + * + * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. + * + * @return bool + */ + public function isConnected() + { + return is_resource($this->resource) + && !feof($this->resource); // on TCP - other party can close connection. + } + + /** + * Wrapper to allow mocking + */ + protected function pfsockopen() + { + return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + */ + protected function fsockopen() + { + return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + */ + protected function streamSetTimeout() + { + $seconds = floor($this->timeout); + $microseconds = round(($this->timeout - $seconds) * 1e6); + + return stream_set_timeout($this->resource, $seconds, $microseconds); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-chunk-size.php + */ + protected function streamSetChunkSize() + { + return stream_set_chunk_size($this->resource, $this->chunkSize); + } + + /** + * Wrapper to allow mocking + */ + protected function fwrite($data) + { + return @fwrite($this->resource, $data); + } + + /** + * Wrapper to allow mocking + */ + protected function streamGetMetadata() + { + return stream_get_meta_data($this->resource); + } + + private function validateTimeout($value) + { + $ok = filter_var($value, FILTER_VALIDATE_FLOAT); + if ($ok === false || $value < 0) { + throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); + } + } + + private function connectIfNotConnected() + { + if ($this->isConnected()) { + return; + } + $this->connect(); + } + + protected function generateDataStream($record) + { + return (string) $record['formatted']; + } + + /** + * @return resource|null + */ + protected function getResource() + { + return $this->resource; + } + + private function connect() + { + $this->createSocketResource(); + $this->setSocketTimeout(); + $this->setStreamChunkSize(); + } + + private function createSocketResource() + { + if ($this->isPersistent()) { + $resource = $this->pfsockopen(); + } else { + $resource = $this->fsockopen(); + } + if (!$resource) { + throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); + } + $this->resource = $resource; + } + + private function setSocketTimeout() + { + if (!$this->streamSetTimeout()) { + throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); + } + } + + private function setStreamChunkSize() + { + if ($this->chunkSize && !$this->streamSetChunkSize()) { + throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); + } + } + + private function writeToSocket($data) + { + $length = strlen($data); + $sent = 0; + $this->lastSentBytes = $sent; + while ($this->isConnected() && $sent < $length) { + if (0 == $sent) { + $chunk = $this->fwrite($data); + } else { + $chunk = $this->fwrite(substr($data, $sent)); + } + if ($chunk === false) { + throw new \RuntimeException("Could not write to socket"); + } + $sent += $chunk; + $socketInfo = $this->streamGetMetadata(); + if ($socketInfo['timed_out']) { + throw new \RuntimeException("Write timed-out"); + } + + if ($this->writingIsTimedOut($sent)) { + throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)"); + } + } + if (!$this->isConnected() && $sent < $length) { + throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); + } + } + + private function writingIsTimedOut($sent) + { + $writingTimeout = (int) floor($this->writingTimeout); + if (0 === $writingTimeout) { + return false; + } + + if ($sent !== $this->lastSentBytes) { + $this->lastWritingAt = time(); + $this->lastSentBytes = $sent; + + return false; + } else { + usleep(100); + } + + if ((time() - $this->lastWritingAt) >= $writingTimeout) { + $this->closeSocket(); + + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php new file mode 100644 index 0000000..27d90e0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores to any stream resource + * + * Can be used to store into php://stderr, remote and local files, etc. + * + * @author Jordi Boggiano + */ +class StreamHandler extends AbstractProcessingHandler +{ + protected $stream; + protected $url; + private $errorMessage; + protected $filePermission; + protected $useLocking; + private $dirCreated; + + /** + * @param resource|string $stream + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + * + * @throws \Exception If a missing directory is not buildable + * @throws \InvalidArgumentException If stream is not a resource or string + */ + public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) + { + parent::__construct($level, $bubble); + if (is_resource($stream)) { + $this->stream = $stream; + } elseif (is_string($stream)) { + $this->url = $stream; + } else { + throw new \InvalidArgumentException('A stream must either be a resource or a string.'); + } + + $this->filePermission = $filePermission; + $this->useLocking = $useLocking; + } + + /** + * {@inheritdoc} + */ + public function close() + { + if ($this->url && is_resource($this->stream)) { + fclose($this->stream); + } + $this->stream = null; + $this->dirCreated = null; + } + + /** + * Return the currently active stream if it is open + * + * @return resource|null + */ + public function getStream() + { + return $this->stream; + } + + /** + * Return the stream URL if it was configured with a URL and not an active resource + * + * @return string|null + */ + public function getUrl() + { + return $this->url; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if (!is_resource($this->stream)) { + if (null === $this->url || '' === $this->url) { + throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); + } + $this->createDir(); + $this->errorMessage = null; + set_error_handler(array($this, 'customErrorHandler')); + $this->stream = fopen($this->url, 'a'); + if ($this->filePermission !== null) { + @chmod($this->url, $this->filePermission); + } + restore_error_handler(); + if (!is_resource($this->stream)) { + $this->stream = null; + throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url)); + } + } + + if ($this->useLocking) { + // ignoring errors here, there's not much we can do about them + flock($this->stream, LOCK_EX); + } + + $this->streamWrite($this->stream, $record); + + if ($this->useLocking) { + flock($this->stream, LOCK_UN); + } + } + + /** + * Write to stream + * @param resource $stream + * @param array $record + */ + protected function streamWrite($stream, array $record) + { + fwrite($stream, (string) $record['formatted']); + } + + private function customErrorHandler($code, $msg) + { + $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); + } + + /** + * @param string $stream + * + * @return null|string + */ + private function getDirFromStream($stream) + { + $pos = strpos($stream, '://'); + if ($pos === false) { + return dirname($stream); + } + + if ('file://' === substr($stream, 0, 7)) { + return dirname(substr($stream, 7)); + } + + return; + } + + private function createDir() + { + // Do not try to create dir if it has already been tried. + if ($this->dirCreated) { + return; + } + + $dir = $this->getDirFromStream($this->url); + if (null !== $dir && !is_dir($dir)) { + $this->errorMessage = null; + set_error_handler(array($this, 'customErrorHandler')); + $status = mkdir($dir, 0777, true); + restore_error_handler(); + if (false === $status && !is_dir($dir)) { + throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and its not buildable: '.$this->errorMessage, $dir)); + } + } + $this->dirCreated = true; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php new file mode 100644 index 0000000..ac7b16f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Swift; + +/** + * SwiftMailerHandler uses Swift_Mailer to send the emails + * + * @author Gyula Sallai + */ +class SwiftMailerHandler extends MailHandler +{ + protected $mailer; + private $messageTemplate; + + /** + * @param \Swift_Mailer $mailer The mailer to use + * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true) + { + parent::__construct($level, $bubble); + + $this->mailer = $mailer; + $this->messageTemplate = $message; + } + + /** + * {@inheritdoc} + */ + protected function send($content, array $records) + { + $this->mailer->send($this->buildMessage($content, $records)); + } + + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string $format The format of the subject + * @return FormatterInterface + */ + protected function getSubjectFormatter($format) + { + return new LineFormatter($format); + } + + /** + * Creates instance of Swift_Message to be sent + * + * @param string $content formatted email body to be sent + * @param array $records Log records that formed the content + * @return \Swift_Message + */ + protected function buildMessage($content, array $records) + { + $message = null; + if ($this->messageTemplate instanceof \Swift_Message) { + $message = clone $this->messageTemplate; + $message->generateId(); + } elseif (is_callable($this->messageTemplate)) { + $message = call_user_func($this->messageTemplate, $content, $records); + } + + if (!$message instanceof \Swift_Message) { + throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); + } + + if ($records) { + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); + $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); + } + + $message->setBody($content); + if (version_compare(Swift::VERSION, '6.0.0', '>=')) { + $message->setDate(new \DateTimeImmutable()); + } else { + $message->setDate(time()); + } + + return $message; + } + + /** + * BC getter, to be removed in 2.0 + */ + public function __get($name) + { + if ($name === 'message') { + trigger_error('SwiftMailerHandler->message is deprecated, use ->buildMessage() instead to retrieve the message', E_USER_DEPRECATED); + + return $this->buildMessage(null, array()); + } + + throw new \InvalidArgumentException('Invalid property '.$name); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php new file mode 100644 index 0000000..f770c80 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Logs to syslog service. + * + * usage example: + * + * $log = new Logger('application'); + * $syslog = new SyslogHandler('myfacility', 'local6'); + * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); + * $syslog->setFormatter($formatter); + * $log->pushHandler($syslog); + * + * @author Sven Paulus + */ +class SyslogHandler extends AbstractSyslogHandler +{ + protected $ident; + protected $logopts; + + /** + * @param string $ident + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID + */ + public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID) + { + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->logopts = $logopts; + } + + /** + * {@inheritdoc} + */ + public function close() + { + closelog(); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if (!openlog($this->ident, $this->logopts, $this->facility)) { + throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"'); + } + syslog($this->logLevels[$record['level']], (string) $record['formatted']); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php new file mode 100644 index 0000000..3bff085 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\SyslogUdp; + +class UdpSocket +{ + const DATAGRAM_MAX_LENGTH = 65023; + + protected $ip; + protected $port; + protected $socket; + + public function __construct($ip, $port = 514) + { + $this->ip = $ip; + $this->port = $port; + $this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + } + + public function write($line, $header = "") + { + $this->send($this->assembleMessage($line, $header)); + } + + public function close() + { + if (is_resource($this->socket)) { + socket_close($this->socket); + $this->socket = null; + } + } + + protected function send($chunk) + { + if (!is_resource($this->socket)) { + throw new \LogicException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore'); + } + socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); + } + + protected function assembleMessage($line, $header) + { + $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header); + + return $header . substr($line, 0, $chunkSize); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php new file mode 100644 index 0000000..4dfd5f5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php @@ -0,0 +1,124 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Handler\SyslogUdp\UdpSocket; + +/** + * A Handler for logging to a remote syslogd server. + * + * @author Jesper Skovgaard Nielsen + * @author Dominik Kukacka + */ +class SyslogUdpHandler extends AbstractSyslogHandler +{ + const RFC3164 = 0; + const RFC5424 = 1; + + private $dateFormats = array( + self::RFC3164 => 'M d H:i:s', + self::RFC5424 => \DateTime::RFC3339, + ); + + protected $socket; + protected $ident; + protected $rfc; + + /** + * @param string $host + * @param int $port + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param string $ident Program name or tag for each log message. + * @param int $rfc RFC to format the message for. + */ + public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php', $rfc = self::RFC5424) + { + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->rfc = $rfc; + + $this->socket = new UdpSocket($host, $port ?: 514); + } + + protected function write(array $record) + { + $lines = $this->splitMessageIntoLines($record['formatted']); + + $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']]); + + foreach ($lines as $line) { + $this->socket->write($line, $header); + } + } + + public function close() + { + $this->socket->close(); + } + + private function splitMessageIntoLines($message) + { + if (is_array($message)) { + $message = implode("\n", $message); + } + + return preg_split('/$\R?^/m', $message, -1, PREG_SPLIT_NO_EMPTY); + } + + /** + * Make common syslog header (see rfc5424 or rfc3164) + */ + protected function makeCommonSyslogHeader($severity) + { + $priority = $severity + $this->facility; + + if (!$pid = getmypid()) { + $pid = '-'; + } + + if (!$hostname = gethostname()) { + $hostname = '-'; + } + + $date = $this->getDateTime(); + + if ($this->rfc === self::RFC3164) { + return "<$priority>" . + $date . " " . + $hostname . " " . + $this->ident . "[" . $pid . "]: "; + } else { + return "<$priority>1 " . + $date . " " . + $hostname . " " . + $this->ident . " " . + $pid . " - - "; + } + } + + protected function getDateTime() + { + return date($this->dateFormats[$this->rfc]); + } + + /** + * Inject your own socket, mainly used for testing + */ + public function setSocket($socket) + { + $this->socket = $socket; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php new file mode 100644 index 0000000..478db0a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Used for testing purposes. + * + * It records all records and gives you access to them for verification. + * + * @author Jordi Boggiano + * + * @method bool hasEmergency($record) + * @method bool hasAlert($record) + * @method bool hasCritical($record) + * @method bool hasError($record) + * @method bool hasWarning($record) + * @method bool hasNotice($record) + * @method bool hasInfo($record) + * @method bool hasDebug($record) + * + * @method bool hasEmergencyRecords() + * @method bool hasAlertRecords() + * @method bool hasCriticalRecords() + * @method bool hasErrorRecords() + * @method bool hasWarningRecords() + * @method bool hasNoticeRecords() + * @method bool hasInfoRecords() + * @method bool hasDebugRecords() + * + * @method bool hasEmergencyThatContains($message) + * @method bool hasAlertThatContains($message) + * @method bool hasCriticalThatContains($message) + * @method bool hasErrorThatContains($message) + * @method bool hasWarningThatContains($message) + * @method bool hasNoticeThatContains($message) + * @method bool hasInfoThatContains($message) + * @method bool hasDebugThatContains($message) + * + * @method bool hasEmergencyThatMatches($message) + * @method bool hasAlertThatMatches($message) + * @method bool hasCriticalThatMatches($message) + * @method bool hasErrorThatMatches($message) + * @method bool hasWarningThatMatches($message) + * @method bool hasNoticeThatMatches($message) + * @method bool hasInfoThatMatches($message) + * @method bool hasDebugThatMatches($message) + * + * @method bool hasEmergencyThatPasses($message) + * @method bool hasAlertThatPasses($message) + * @method bool hasCriticalThatPasses($message) + * @method bool hasErrorThatPasses($message) + * @method bool hasWarningThatPasses($message) + * @method bool hasNoticeThatPasses($message) + * @method bool hasInfoThatPasses($message) + * @method bool hasDebugThatPasses($message) + */ +class TestHandler extends AbstractProcessingHandler +{ + protected $records = array(); + protected $recordsByLevel = array(); + private $skipReset = false; + + public function getRecords() + { + return $this->records; + } + + public function clear() + { + $this->records = array(); + $this->recordsByLevel = array(); + } + + public function reset() + { + if (!$this->skipReset) { + $this->clear(); + } + } + + public function setSkipReset($skipReset) + { + $this->skipReset = $skipReset; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + /** + * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records + * @param int $level Logger::LEVEL constant value + */ + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = array('message' => $record); + } + + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + return true; + }, $level); + } + + public function hasRecordThatContains($message, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return strpos($rec['message'], $message) !== false; + }, $level); + } + + public function hasRecordThatMatches($regex, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + public function hasRecordThatPasses($predicate, $level) + { + if (!is_callable($predicate)) { + throw new \InvalidArgumentException("Expected a callable for hasRecordThatSucceeds"); + } + + if (!isset($this->recordsByLevel[$level])) { + return false; + } + + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if (call_user_func($predicate, $rec, $i)) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + public function __call($method, $args) + { + if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { + $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; + $level = constant('Monolog\Logger::' . strtoupper($matches[2])); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + + return call_user_func_array(array($this, $genericMethod), $args); + } + } + + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php new file mode 100644 index 0000000..7d7622a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Forwards records to multiple handlers suppressing failures of each handler + * and continuing through to give every handler a chance to succeed. + * + * @author Craig D'Amelio + */ +class WhatFailureGroupHandler extends GroupHandler +{ + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + foreach ($this->handlers as $handler) { + try { + $handler->handle($record); + } catch (\Exception $e) { + // What failure? + } catch (\Throwable $e) { + // What failure? + } + } + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + if ($this->processors) { + $processed = array(); + foreach ($records as $record) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + $processed[] = $record; + } + $records = $processed; + } + + foreach ($this->handlers as $handler) { + try { + $handler->handleBatch($records); + } catch (\Exception $e) { + // What failure? + } catch (\Throwable $e) { + // What failure? + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php new file mode 100644 index 0000000..a20aeae --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Logger; + +/** + * Handler sending logs to Zend Monitor + * + * @author Christian Bergau + * @author Jason Davis + */ +class ZendMonitorHandler extends AbstractProcessingHandler +{ + /** + * Monolog level / ZendMonitor Custom Event priority map + * + * @var array + */ + protected $levelMap = array(); + + /** + * Construct + * + * @param int $level + * @param bool $bubble + * @throws MissingExtensionException + */ + public function __construct($level = Logger::DEBUG, $bubble = true) + { + if (!function_exists('zend_monitor_custom_event')) { + throw new MissingExtensionException( + 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler' + ); + } + //zend monitor constants are not defined if zend monitor is not enabled. + $this->levelMap = array( + Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, + Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + ); + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->writeZendMonitorCustomEvent( + Logger::getLevelName($record['level']), + $record['message'], + $record['formatted'], + $this->levelMap[$record['level']] + ); + } + + /** + * Write to Zend Monitor Events + * @param string $type Text displayed in "Class Name (custom)" field + * @param string $message Text displayed in "Error String" + * @param mixed $formatted Displayed in Custom Variables tab + * @param int $severity Set the event severity level (-1,0,1) + */ + protected function writeZendMonitorCustomEvent($type, $message, $formatted, $severity) + { + zend_monitor_custom_event($type, $message, $formatted, $severity); + } + + /** + * {@inheritdoc} + */ + public function getDefaultFormatter() + { + return new NormalizerFormatter(); + } + + /** + * Get the level map + * + * @return array + */ + public function getLevelMap() + { + return $this->levelMap; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Logger.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Logger.php new file mode 100644 index 0000000..05dfc81 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Logger.php @@ -0,0 +1,791 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Monolog\Handler\HandlerInterface; +use Monolog\Handler\StreamHandler; +use Psr\Log\LoggerInterface; +use Psr\Log\InvalidArgumentException; +use Exception; + +/** + * Monolog log channel + * + * It contains a stack of Handlers and a stack of Processors, + * and uses them to store records that are added to it. + * + * @author Jordi Boggiano + */ +class Logger implements LoggerInterface, ResettableInterface +{ + /** + * Detailed debug information + */ + const DEBUG = 100; + + /** + * Interesting events + * + * Examples: User logs in, SQL logs. + */ + const INFO = 200; + + /** + * Uncommon events + */ + const NOTICE = 250; + + /** + * Exceptional occurrences that are not errors + * + * Examples: Use of deprecated APIs, poor use of an API, + * undesirable things that are not necessarily wrong. + */ + const WARNING = 300; + + /** + * Runtime errors + */ + const ERROR = 400; + + /** + * Critical conditions + * + * Example: Application component unavailable, unexpected exception. + */ + const CRITICAL = 500; + + /** + * Action must be taken immediately + * + * Example: Entire website down, database unavailable, etc. + * This should trigger the SMS alerts and wake you up. + */ + const ALERT = 550; + + /** + * Urgent alert. + */ + const EMERGENCY = 600; + + /** + * Monolog API version + * + * This is only bumped when API breaks are done and should + * follow the major version of the library + * + * @var int + */ + const API = 1; + + /** + * Logging levels from syslog protocol defined in RFC 5424 + * + * @var array $levels Logging levels + */ + protected static $levels = array( + self::DEBUG => 'DEBUG', + self::INFO => 'INFO', + self::NOTICE => 'NOTICE', + self::WARNING => 'WARNING', + self::ERROR => 'ERROR', + self::CRITICAL => 'CRITICAL', + self::ALERT => 'ALERT', + self::EMERGENCY => 'EMERGENCY', + ); + + /** + * @var \DateTimeZone + */ + protected static $timezone; + + /** + * @var string + */ + protected $name; + + /** + * The handler stack + * + * @var HandlerInterface[] + */ + protected $handlers; + + /** + * Processors that will process all log records + * + * To process records of a single handler instead, add the processor on that specific handler + * + * @var callable[] + */ + protected $processors; + + /** + * @var bool + */ + protected $microsecondTimestamps = true; + + /** + * @var callable + */ + protected $exceptionHandler; + + /** + * @param string $name The logging channel + * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. + * @param callable[] $processors Optional array of processors + */ + public function __construct($name, array $handlers = array(), array $processors = array()) + { + $this->name = $name; + $this->setHandlers($handlers); + $this->processors = $processors; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Return a new cloned instance with the name changed + * + * @return static + */ + public function withName($name) + { + $new = clone $this; + $new->name = $name; + + return $new; + } + + /** + * Pushes a handler on to the stack. + * + * @param HandlerInterface $handler + * @return $this + */ + public function pushHandler(HandlerInterface $handler) + { + array_unshift($this->handlers, $handler); + + return $this; + } + + /** + * Pops a handler from the stack + * + * @return HandlerInterface + */ + public function popHandler() + { + if (!$this->handlers) { + throw new \LogicException('You tried to pop from an empty handler stack.'); + } + + return array_shift($this->handlers); + } + + /** + * Set handlers, replacing all existing ones. + * + * If a map is passed, keys will be ignored. + * + * @param HandlerInterface[] $handlers + * @return $this + */ + public function setHandlers(array $handlers) + { + $this->handlers = array(); + foreach (array_reverse($handlers) as $handler) { + $this->pushHandler($handler); + } + + return $this; + } + + /** + * @return HandlerInterface[] + */ + public function getHandlers() + { + return $this->handlers; + } + + /** + * Adds a processor on to the stack. + * + * @param callable $callback + * @return $this + */ + public function pushProcessor($callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); + } + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * Removes the processor on top of the stack and returns it. + * + * @return callable + */ + public function popProcessor() + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * @return callable[] + */ + public function getProcessors() + { + return $this->processors; + } + + /** + * Control the use of microsecond resolution timestamps in the 'datetime' + * member of new records. + * + * Generating microsecond resolution timestamps by calling + * microtime(true), formatting the result via sprintf() and then parsing + * the resulting string via \DateTime::createFromFormat() can incur + * a measurable runtime overhead vs simple usage of DateTime to capture + * a second resolution timestamp in systems which generate a large number + * of log events. + * + * @param bool $micro True to use microtime() to create timestamps + */ + public function useMicrosecondTimestamps($micro) + { + $this->microsecondTimestamps = (bool) $micro; + } + + /** + * Adds a log record. + * + * @param int $level The logging level + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addRecord($level, $message, array $context = array()) + { + if (!$this->handlers) { + $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG)); + } + + $levelName = static::getLevelName($level); + + // check if any handler will handle this message so we can return early and save cycles + $handlerKey = null; + reset($this->handlers); + while ($handler = current($this->handlers)) { + if ($handler->isHandling(array('level' => $level))) { + $handlerKey = key($this->handlers); + break; + } + + next($this->handlers); + } + + if (null === $handlerKey) { + return false; + } + + if (!static::$timezone) { + static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC'); + } + + // php7.1+ always has microseconds enabled, so we do not need this hack + if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) { + $ts = \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone); + } else { + $ts = new \DateTime(null, static::$timezone); + } + $ts->setTimezone(static::$timezone); + + $record = array( + 'message' => (string) $message, + 'context' => $context, + 'level' => $level, + 'level_name' => $levelName, + 'channel' => $this->name, + 'datetime' => $ts, + 'extra' => array(), + ); + + try { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + + while ($handler = current($this->handlers)) { + if (true === $handler->handle($record)) { + break; + } + + next($this->handlers); + } + } catch (Exception $e) { + $this->handleException($e, $record); + } + + return true; + } + + /** + * Ends a log cycle and frees all resources used by handlers. + * + * Closing a Handler means flushing all buffers and freeing any open resources/handles. + * Handlers that have been closed should be able to accept log records again and re-open + * themselves on demand, but this may not always be possible depending on implementation. + * + * This is useful at the end of a request and will be called automatically on every handler + * when they get destructed. + */ + public function close() + { + foreach ($this->handlers as $handler) { + if (method_exists($handler, 'close')) { + $handler->close(); + } + } + } + + /** + * Ends a log cycle and resets all handlers and processors to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + */ + public function reset() + { + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + + /** + * Adds a log record at the DEBUG level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addDebug($message, array $context = array()) + { + return $this->addRecord(static::DEBUG, $message, $context); + } + + /** + * Adds a log record at the INFO level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addInfo($message, array $context = array()) + { + return $this->addRecord(static::INFO, $message, $context); + } + + /** + * Adds a log record at the NOTICE level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addNotice($message, array $context = array()) + { + return $this->addRecord(static::NOTICE, $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addWarning($message, array $context = array()) + { + return $this->addRecord(static::WARNING, $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addError($message, array $context = array()) + { + return $this->addRecord(static::ERROR, $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addCritical($message, array $context = array()) + { + return $this->addRecord(static::CRITICAL, $message, $context); + } + + /** + * Adds a log record at the ALERT level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addAlert($message, array $context = array()) + { + return $this->addRecord(static::ALERT, $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addEmergency($message, array $context = array()) + { + return $this->addRecord(static::EMERGENCY, $message, $context); + } + + /** + * Gets all supported logging levels. + * + * @return array Assoc array with human-readable level names => level codes. + */ + public static function getLevels() + { + return array_flip(static::$levels); + } + + /** + * Gets the name of the logging level. + * + * @param int $level + * @return string + */ + public static function getLevelName($level) + { + if (!isset(static::$levels[$level])) { + throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); + } + + return static::$levels[$level]; + } + + /** + * Converts PSR-3 levels to Monolog ones if necessary + * + * @param string|int Level number (monolog) or name (PSR-3) + * @return int + */ + public static function toMonologLevel($level) + { + if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) { + return constant(__CLASS__.'::'.strtoupper($level)); + } + + return $level; + } + + /** + * Checks whether the Logger has a handler that listens on the given level + * + * @param int $level + * @return bool + */ + public function isHandling($level) + { + $record = array( + 'level' => $level, + ); + + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * Set a custom exception handler + * + * @param callable $callback + * @return $this + */ + public function setExceptionHandler($callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), '.var_export($callback, true).' given'); + } + $this->exceptionHandler = $callback; + + return $this; + } + + /** + * @return callable + */ + public function getExceptionHandler() + { + return $this->exceptionHandler; + } + + /** + * Delegates exception management to the custom exception handler, + * or throws the exception if no custom handler is set. + */ + protected function handleException(Exception $e, array $record) + { + if (!$this->exceptionHandler) { + throw $e; + } + + call_user_func($this->exceptionHandler, $e, $record); + } + + /** + * Adds a log record at an arbitrary level. + * + * This method allows for compatibility with common interfaces. + * + * @param mixed $level The log level + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function log($level, $message, array $context = array()) + { + $level = static::toMonologLevel($level); + + return $this->addRecord($level, $message, $context); + } + + /** + * Adds a log record at the DEBUG level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function debug($message, array $context = array()) + { + return $this->addRecord(static::DEBUG, $message, $context); + } + + /** + * Adds a log record at the INFO level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function info($message, array $context = array()) + { + return $this->addRecord(static::INFO, $message, $context); + } + + /** + * Adds a log record at the NOTICE level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function notice($message, array $context = array()) + { + return $this->addRecord(static::NOTICE, $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function warn($message, array $context = array()) + { + return $this->addRecord(static::WARNING, $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function warning($message, array $context = array()) + { + return $this->addRecord(static::WARNING, $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function err($message, array $context = array()) + { + return $this->addRecord(static::ERROR, $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function error($message, array $context = array()) + { + return $this->addRecord(static::ERROR, $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function crit($message, array $context = array()) + { + return $this->addRecord(static::CRITICAL, $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function critical($message, array $context = array()) + { + return $this->addRecord(static::CRITICAL, $message, $context); + } + + /** + * Adds a log record at the ALERT level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function alert($message, array $context = array()) + { + return $this->addRecord(static::ALERT, $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function emerg($message, array $context = array()) + { + return $this->addRecord(static::EMERGENCY, $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function emergency($message, array $context = array()) + { + return $this->addRecord(static::EMERGENCY, $message, $context); + } + + /** + * Set the timezone to be used for the timestamp of log records. + * + * This is stored globally for all Logger instances + * + * @param \DateTimeZone $tz Timezone object + */ + public static function setTimezone(\DateTimeZone $tz) + { + self::$timezone = $tz; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php new file mode 100644 index 0000000..9fc3f50 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; + +/** + * Injects Git branch and Git commit SHA in all records + * + * @author Nick Otter + * @author Jordi Boggiano + */ +class GitProcessor implements ProcessorInterface +{ + private $level; + private static $cache; + + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['git'] = self::getGitInfo(); + + return $record; + } + + private static function getGitInfo() + { + if (self::$cache) { + return self::$cache; + } + + $branches = `git branch -v --no-abbrev`; + if (preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { + return self::$cache = array( + 'branch' => $matches[1], + 'commit' => $matches[2], + ); + } + + return self::$cache = array(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php new file mode 100644 index 0000000..6ae192a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; + +/** + * Injects line/file:class/function where the log message came from + * + * Warning: This only works if the handler processes the logs directly. + * If you put the processor on a handler that is behind a FingersCrossedHandler + * for example, the processor will only be called once the trigger level is reached, + * and all the log records will have the same file/line/.. data from the call that + * triggered the FingersCrossedHandler. + * + * @author Jordi Boggiano + */ +class IntrospectionProcessor implements ProcessorInterface +{ + private $level; + + private $skipClassesPartials; + + private $skipStackFramesCount; + + private $skipFunctions = array( + 'call_user_func', + 'call_user_func_array', + ); + + public function __construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0) + { + $this->level = Logger::toMonologLevel($level); + $this->skipClassesPartials = array_merge(array('Monolog\\'), $skipClassesPartials); + $this->skipStackFramesCount = $skipStackFramesCount; + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + /* + * http://php.net/manual/en/function.debug-backtrace.php + * As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. + * Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. + */ + $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS); + + // skip first since it's always the current method + array_shift($trace); + // the call_user_func call is also skipped + array_shift($trace); + + $i = 0; + + while ($this->isTraceClassOrSkippedFunction($trace, $i)) { + if (isset($trace[$i]['class'])) { + foreach ($this->skipClassesPartials as $part) { + if (strpos($trace[$i]['class'], $part) !== false) { + $i++; + continue 2; + } + } + } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) { + $i++; + continue; + } + + break; + } + + $i += $this->skipStackFramesCount; + + // we should have the call source now + $record['extra'] = array_merge( + $record['extra'], + array( + 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, + 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, + 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, + 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, + ) + ); + + return $record; + } + + private function isTraceClassOrSkippedFunction(array $trace, $index) + { + if (!isset($trace[$index])) { + return false; + } + + return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php new file mode 100644 index 0000000..0543e92 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_peak_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryPeakUsageProcessor extends MemoryProcessor +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + $bytes = memory_get_peak_usage($this->realUsage); + $formatted = $this->formatBytes($bytes); + + $record['extra']['memory_peak_usage'] = $formatted; + + return $record; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php new file mode 100644 index 0000000..2a379a3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Some methods that are common for all memory processors + * + * @author Rob Jensen + */ +abstract class MemoryProcessor implements ProcessorInterface +{ + /** + * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. + */ + protected $realUsage; + + /** + * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + protected $useFormatting; + + /** + * @param bool $realUsage Set this to true to get the real size of memory allocated from system. + * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + public function __construct($realUsage = true, $useFormatting = true) + { + $this->realUsage = (bool) $realUsage; + $this->useFormatting = (bool) $useFormatting; + } + + /** + * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is + * + * @param int $bytes + * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as is + */ + protected function formatBytes($bytes) + { + $bytes = (int) $bytes; + + if (!$this->useFormatting) { + return $bytes; + } + + if ($bytes > 1024 * 1024) { + return round($bytes / 1024 / 1024, 2).' MB'; + } elseif ($bytes > 1024) { + return round($bytes / 1024, 2).' KB'; + } + + return $bytes . ' B'; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php new file mode 100644 index 0000000..2783d65 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryUsageProcessor extends MemoryProcessor +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + $bytes = memory_get_usage($this->realUsage); + $formatted = $this->formatBytes($bytes); + + $record['extra']['memory_usage'] = $formatted; + + return $record; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php new file mode 100644 index 0000000..2f5b326 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; + +/** + * Injects Hg branch and Hg revision number in all records + * + * @author Jonathan A. Schweder + */ +class MercurialProcessor implements ProcessorInterface +{ + private $level; + private static $cache; + + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['hg'] = self::getMercurialInfo(); + + return $record; + } + + private static function getMercurialInfo() + { + if (self::$cache) { + return self::$cache; + } + + $result = explode(' ', trim(`hg id -nb`)); + if (count($result) >= 3) { + return self::$cache = array( + 'branch' => $result[1], + 'revision' => $result[2], + ); + } + + return self::$cache = array(); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php new file mode 100644 index 0000000..66b80fb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds value of getmypid into records + * + * @author Andreas Hörnicke + */ +class ProcessIdProcessor implements ProcessorInterface +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + $record['extra']['process_id'] = getmypid(); + + return $record; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php new file mode 100644 index 0000000..7e64d4d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * An optional interface to allow labelling Monolog processors. + * + * @author Nicolas Grekas + */ +interface ProcessorInterface +{ + /** + * @return array The processed records + */ + public function __invoke(array $records); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php new file mode 100644 index 0000000..0088505 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Utils; + +/** + * Processes a record's message according to PSR-3 rules + * + * It replaces {foo} with the value from $context['foo'] + * + * @author Jordi Boggiano + */ +class PsrLogMessageProcessor implements ProcessorInterface +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + if (false === strpos($record['message'], '{')) { + return $record; + } + + $replacements = array(); + foreach ($record['context'] as $key => $val) { + if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { + $replacements['{'.$key.'}'] = $val; + } elseif (is_object($val)) { + $replacements['{'.$key.'}'] = '[object '.Utils::getClass($val).']'; + } else { + $replacements['{'.$key.'}'] = '['.gettype($val).']'; + } + } + + $record['message'] = strtr($record['message'], $replacements); + + return $record; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php new file mode 100644 index 0000000..615a4d9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds a tags array into record + * + * @author Martijn Riemers + */ +class TagProcessor implements ProcessorInterface +{ + private $tags; + + public function __construct(array $tags = array()) + { + $this->setTags($tags); + } + + public function addTags(array $tags = array()) + { + $this->tags = array_merge($this->tags, $tags); + } + + public function setTags(array $tags = array()) + { + $this->tags = $tags; + } + + public function __invoke(array $record) + { + $record['extra']['tags'] = $this->tags; + + return $record; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php new file mode 100644 index 0000000..d1f708c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\ResettableInterface; + +/** + * Adds a unique identifier into records + * + * @author Simon Mönch + */ +class UidProcessor implements ProcessorInterface, ResettableInterface +{ + private $uid; + + public function __construct($length = 7) + { + if (!is_int($length) || $length > 32 || $length < 1) { + throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); + } + + + $this->uid = $this->generateUid($length); + } + + public function __invoke(array $record) + { + $record['extra']['uid'] = $this->uid; + + return $record; + } + + /** + * @return string + */ + public function getUid() + { + return $this->uid; + } + + public function reset() + { + $this->uid = $this->generateUid(strlen($this->uid)); + } + + private function generateUid($length) + { + return substr(hash('md5', uniqid('', true)), 0, $length); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php new file mode 100644 index 0000000..684188f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects url/method and remote IP of the current web request in all records + * + * @author Jordi Boggiano + */ +class WebProcessor implements ProcessorInterface +{ + /** + * @var array|\ArrayAccess + */ + protected $serverData; + + /** + * Default fields + * + * Array is structured as [key in record.extra => key in $serverData] + * + * @var array + */ + protected $extraFields = array( + 'url' => 'REQUEST_URI', + 'ip' => 'REMOTE_ADDR', + 'http_method' => 'REQUEST_METHOD', + 'server' => 'SERVER_NAME', + 'referrer' => 'HTTP_REFERER', + ); + + /** + * @param array|\ArrayAccess $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data + * @param array|null $extraFields Field names and the related key inside $serverData to be added. If not provided it defaults to: url, ip, http_method, server, referrer + */ + public function __construct($serverData = null, array $extraFields = null) + { + if (null === $serverData) { + $this->serverData = &$_SERVER; + } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) { + $this->serverData = $serverData; + } else { + throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); + } + + if (null !== $extraFields) { + if (isset($extraFields[0])) { + foreach (array_keys($this->extraFields) as $fieldName) { + if (!in_array($fieldName, $extraFields)) { + unset($this->extraFields[$fieldName]); + } + } + } else { + $this->extraFields = $extraFields; + } + } + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // skip processing if for some reason request data + // is not present (CLI or wonky SAPIs) + if (!isset($this->serverData['REQUEST_URI'])) { + return $record; + } + + $record['extra'] = $this->appendExtraFields($record['extra']); + + return $record; + } + + /** + * @param string $extraName + * @param string $serverName + * @return $this + */ + public function addExtraField($extraName, $serverName) + { + $this->extraFields[$extraName] = $serverName; + + return $this; + } + + /** + * @param array $extra + * @return array + */ + private function appendExtraFields(array $extra) + { + foreach ($this->extraFields as $extraName => $serverName) { + $extra[$extraName] = isset($this->serverData[$serverName]) ? $this->serverData[$serverName] : null; + } + + if (isset($this->serverData['UNIQUE_ID'])) { + $extra['unique_id'] = $this->serverData['UNIQUE_ID']; + } + + return $extra; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Registry.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Registry.php new file mode 100644 index 0000000..159b751 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Registry.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use InvalidArgumentException; + +/** + * Monolog log registry + * + * Allows to get `Logger` instances in the global scope + * via static method calls on this class. + * + * + * $application = new Monolog\Logger('application'); + * $api = new Monolog\Logger('api'); + * + * Monolog\Registry::addLogger($application); + * Monolog\Registry::addLogger($api); + * + * function testLogger() + * { + * Monolog\Registry::api()->addError('Sent to $api Logger instance'); + * Monolog\Registry::application()->addError('Sent to $application Logger instance'); + * } + * + * + * @author Tomas Tatarko + */ +class Registry +{ + /** + * List of all loggers in the registry (by named indexes) + * + * @var Logger[] + */ + private static $loggers = array(); + + /** + * Adds new logging channel to the registry + * + * @param Logger $logger Instance of the logging channel + * @param string|null $name Name of the logging channel ($logger->getName() by default) + * @param bool $overwrite Overwrite instance in the registry if the given name already exists? + * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists + */ + public static function addLogger(Logger $logger, $name = null, $overwrite = false) + { + $name = $name ?: $logger->getName(); + + if (isset(self::$loggers[$name]) && !$overwrite) { + throw new InvalidArgumentException('Logger with the given name already exists'); + } + + self::$loggers[$name] = $logger; + } + + /** + * Checks if such logging channel exists by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function hasLogger($logger) + { + if ($logger instanceof Logger) { + $index = array_search($logger, self::$loggers, true); + + return false !== $index; + } else { + return isset(self::$loggers[$logger]); + } + } + + /** + * Removes instance from registry by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function removeLogger($logger) + { + if ($logger instanceof Logger) { + if (false !== ($idx = array_search($logger, self::$loggers, true))) { + unset(self::$loggers[$idx]); + } + } else { + unset(self::$loggers[$logger]); + } + } + + /** + * Clears the registry + */ + public static function clear() + { + self::$loggers = array(); + } + + /** + * Gets Logger instance from the registry + * + * @param string $name Name of the requested Logger instance + * @throws \InvalidArgumentException If named Logger instance is not in the registry + * @return Logger Requested instance of Logger + */ + public static function getInstance($name) + { + if (!isset(self::$loggers[$name])) { + throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); + } + + return self::$loggers[$name]; + } + + /** + * Gets Logger instance from the registry via static method call + * + * @param string $name Name of the requested Logger instance + * @param array $arguments Arguments passed to static method call + * @throws \InvalidArgumentException If named Logger instance is not in the registry + * @return Logger Requested instance of Logger + */ + public static function __callStatic($name, $arguments) + { + return self::getInstance($name); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/ResettableInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/ResettableInterface.php new file mode 100644 index 0000000..635bc77 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/ResettableInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +/** + * Handler or Processor implementing this interface will be reset when Logger::reset() is called. + * + * Resetting ends a log cycle gets them back to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + * + * @author Grégoire Pineau + */ +interface ResettableInterface +{ + public function reset(); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/SignalHandler.php new file mode 100644 index 0000000..d87018f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/SignalHandler.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use ReflectionExtension; + +/** + * Monolog POSIX signal handler + * + * @author Robert Gust-Bardon + */ +class SignalHandler +{ + private $logger; + + private $previousSignalHandler = array(); + private $signalLevelMap = array(); + private $signalRestartSyscalls = array(); + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + public function registerSignalHandler($signo, $level = LogLevel::CRITICAL, $callPrevious = true, $restartSyscalls = true, $async = true) + { + if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) { + return $this; + } + + if ($callPrevious) { + if (function_exists('pcntl_signal_get_handler')) { + $handler = pcntl_signal_get_handler($signo); + if ($handler === false) { + return $this; + } + $this->previousSignalHandler[$signo] = $handler; + } else { + $this->previousSignalHandler[$signo] = true; + } + } else { + unset($this->previousSignalHandler[$signo]); + } + $this->signalLevelMap[$signo] = $level; + $this->signalRestartSyscalls[$signo] = $restartSyscalls; + + if (function_exists('pcntl_async_signals') && $async !== null) { + pcntl_async_signals($async); + } + + pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); + + return $this; + } + + public function handleSignal($signo, array $siginfo = null) + { + static $signals = array(); + + if (!$signals && extension_loaded('pcntl')) { + $pcntl = new ReflectionExtension('pcntl'); + $constants = $pcntl->getConstants(); + if (!$constants) { + // HHVM 3.24.2 returns an empty array. + $constants = get_defined_constants(true); + $constants = $constants['Core']; + } + foreach ($constants as $name => $value) { + if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) { + $signals[$value] = $name; + } + } + unset($constants); + } + + $level = isset($this->signalLevelMap[$signo]) ? $this->signalLevelMap[$signo] : LogLevel::CRITICAL; + $signal = isset($signals[$signo]) ? $signals[$signo] : $signo; + $context = isset($siginfo) ? $siginfo : array(); + $this->logger->log($level, sprintf('Program received signal %s', $signal), $context); + + if (!isset($this->previousSignalHandler[$signo])) { + return; + } + + if ($this->previousSignalHandler[$signo] === true || $this->previousSignalHandler[$signo] === SIG_DFL) { + if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch') + && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')) { + $restartSyscalls = isset($this->signalRestartSyscalls[$signo]) ? $this->signalRestartSyscalls[$signo] : true; + pcntl_signal($signo, SIG_DFL, $restartSyscalls); + pcntl_sigprocmask(SIG_UNBLOCK, array($signo), $oldset); + posix_kill(posix_getpid(), $signo); + pcntl_signal_dispatch(); + pcntl_sigprocmask(SIG_SETMASK, $oldset); + pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); + } + } elseif (is_callable($this->previousSignalHandler[$signo])) { + if (PHP_VERSION_ID >= 70100) { + $this->previousSignalHandler[$signo]($signo, $siginfo); + } else { + $this->previousSignalHandler[$signo]($signo); + } + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Utils.php b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Utils.php new file mode 100644 index 0000000..eb9be86 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/monolog/monolog/src/Monolog/Utils.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +class Utils +{ + /** + * @internal + */ + public static function getClass($object) + { + $class = \get_class($object); + + return 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/LICENSE b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/LICENSE new file mode 100644 index 0000000..e7214eb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2011-2019 TerraFrost and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/AES.php b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/AES.php new file mode 100644 index 0000000..7d8cb8b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/AES.php @@ -0,0 +1,126 @@ + + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $aes->decrypt($aes->encrypt($plaintext)); + * ?> + * + * + * @category Crypt + * @package AES + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +namespace phpseclib\Crypt; + +/** + * Pure-PHP implementation of AES. + * + * @package AES + * @author Jim Wigginton + * @access public + */ +class AES extends Rijndael +{ + /** + * Dummy function + * + * Since \phpseclib\Crypt\AES extends \phpseclib\Crypt\Rijndael, this function is, technically, available, but it doesn't do anything. + * + * @see \phpseclib\Crypt\Rijndael::setBlockLength() + * @access public + * @param int $length + */ + function setBlockLength($length) + { + return; + } + + /** + * Sets the key length + * + * Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @see \phpseclib\Crypt\Rijndael:setKeyLength() + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch ($length) { + case 160: + $length = 192; + break; + case 224: + $length = 256; + } + parent::setKeyLength($length); + } + + /** + * Sets the key. + * + * Rijndael supports five different key lengths, AES only supports three. + * + * @see \phpseclib\Crypt\Rijndael:setKey() + * @see setKeyLength() + * @access public + * @param string $key + */ + function setKey($key) + { + parent::setKey($key); + + if (!$this->explicit_key_length) { + $length = strlen($key); + switch (true) { + case $length <= 16: + $this->key_length = 16; + break; + case $length <= 24: + $this->key_length = 24; + break; + default: + $this->key_length = 32; + } + $this->_setEngine(); + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php new file mode 100644 index 0000000..d2c6c7c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php @@ -0,0 +1,3201 @@ + + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $ciphertext = $rsa->encrypt($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->decrypt($ciphertext); + * ?> + * + * + * Here's an example of how to create signatures and verify signatures with this library: + * + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $signature = $rsa->sign($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified'; + * ?> + * + * + * @category Crypt + * @package RSA + * @author Jim Wigginton + * @copyright 2009 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +namespace phpseclib\Crypt; + +use phpseclib\Math\BigInteger; + +/** + * Pure-PHP PKCS#1 compliant implementation of RSA. + * + * @package RSA + * @author Jim Wigginton + * @access public + */ +class RSA +{ + /**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ + /** + * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} + * (OAEP) for encryption / decryption. + * + * Uses sha1 by default. + * + * @see self::setHash() + * @see self::setMGFHash() + */ + const ENCRYPTION_OAEP = 1; + /** + * Use PKCS#1 padding. + * + * Although self::ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards + * compatibility with protocols (like SSH-1) written before OAEP's introduction. + */ + const ENCRYPTION_PKCS1 = 2; + /** + * Do not use any padding + * + * Although this method is not recommended it can none-the-less sometimes be useful if you're trying to decrypt some legacy + * stuff, if you're trying to diagnose why an encrypted message isn't decrypting, etc. + */ + const ENCRYPTION_NONE = 3; + /**#@-*/ + + /**#@+ + * @access public + * @see self::sign() + * @see self::verify() + * @see self::setHash() + */ + /** + * Use the Probabilistic Signature Scheme for signing + * + * Uses sha1 by default. + * + * @see self::setSaltLength() + * @see self::setMGFHash() + */ + const SIGNATURE_PSS = 1; + /** + * Use the PKCS#1 scheme by default. + * + * Although self::SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards + * compatibility with protocols (like SSH-2) written before PSS's introduction. + */ + const SIGNATURE_PKCS1 = 2; + /**#@-*/ + + /**#@+ + * @access private + * @see \phpseclib\Crypt\RSA::createKey() + */ + /** + * ASN1 Integer + */ + const ASN1_INTEGER = 2; + /** + * ASN1 Bit String + */ + const ASN1_BITSTRING = 3; + /** + * ASN1 Octet String + */ + const ASN1_OCTETSTRING = 4; + /** + * ASN1 Object Identifier + */ + const ASN1_OBJECT = 6; + /** + * ASN1 Sequence (with the constucted bit set) + */ + const ASN1_SEQUENCE = 48; + /**#@-*/ + + /**#@+ + * @access private + * @see \phpseclib\Crypt\RSA::__construct() + */ + /** + * To use the pure-PHP implementation + */ + const MODE_INTERNAL = 1; + /** + * To use the OpenSSL library + * + * (if enabled; otherwise, the internal implementation will be used) + */ + const MODE_OPENSSL = 2; + /**#@-*/ + + /**#@+ + * @access public + * @see \phpseclib\Crypt\RSA::createKey() + * @see \phpseclib\Crypt\RSA::setPrivateKeyFormat() + */ + /** + * PKCS#1 formatted private key + * + * Used by OpenSSH + */ + const PRIVATE_FORMAT_PKCS1 = 0; + /** + * PuTTY formatted private key + */ + const PRIVATE_FORMAT_PUTTY = 1; + /** + * XML formatted private key + */ + const PRIVATE_FORMAT_XML = 2; + /** + * PKCS#8 formatted private key + */ + const PRIVATE_FORMAT_PKCS8 = 8; + /** + * OpenSSH formatted private key + */ + const PRIVATE_FORMAT_OPENSSH = 9; + /**#@-*/ + + /**#@+ + * @access public + * @see \phpseclib\Crypt\RSA::createKey() + * @see \phpseclib\Crypt\RSA::setPublicKeyFormat() + */ + /** + * Raw public key + * + * An array containing two \phpseclib\Math\BigInteger objects. + * + * The exponent can be indexed with any of the following: + * + * 0, e, exponent, publicExponent + * + * The modulus can be indexed with any of the following: + * + * 1, n, modulo, modulus + */ + const PUBLIC_FORMAT_RAW = 3; + /** + * PKCS#1 formatted public key (raw) + * + * Used by File/X509.php + * + * Has the following header: + * + * -----BEGIN RSA PUBLIC KEY----- + * + * Analogous to ssh-keygen's pem format (as specified by -m) + */ + const PUBLIC_FORMAT_PKCS1 = 4; + const PUBLIC_FORMAT_PKCS1_RAW = 4; + /** + * XML formatted public key + */ + const PUBLIC_FORMAT_XML = 5; + /** + * OpenSSH formatted public key + * + * Place in $HOME/.ssh/authorized_keys + */ + const PUBLIC_FORMAT_OPENSSH = 6; + /** + * PKCS#1 formatted public key (encapsulated) + * + * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set) + * + * Has the following header: + * + * -----BEGIN PUBLIC KEY----- + * + * Analogous to ssh-keygen's pkcs8 format (as specified by -m). Although PKCS8 + * is specific to private keys it's basically creating a DER-encoded wrapper + * for keys. This just extends that same concept to public keys (much like ssh-keygen) + */ + const PUBLIC_FORMAT_PKCS8 = 7; + /**#@-*/ + + /** + * Precomputed Zero + * + * @var \phpseclib\Math\BigInteger + * @access private + */ + var $zero; + + /** + * Precomputed One + * + * @var \phpseclib\Math\BigInteger + * @access private + */ + var $one; + + /** + * Private Key Format + * + * @var int + * @access private + */ + var $privateKeyFormat = self::PRIVATE_FORMAT_PKCS1; + + /** + * Public Key Format + * + * @var int + * @access public + */ + var $publicKeyFormat = self::PUBLIC_FORMAT_PKCS8; + + /** + * Modulus (ie. n) + * + * @var \phpseclib\Math\BigInteger + * @access private + */ + var $modulus; + + /** + * Modulus length + * + * @var \phpseclib\Math\BigInteger + * @access private + */ + var $k; + + /** + * Exponent (ie. e or d) + * + * @var \phpseclib\Math\BigInteger + * @access private + */ + var $exponent; + + /** + * Primes for Chinese Remainder Theorem (ie. p and q) + * + * @var array + * @access private + */ + var $primes; + + /** + * Exponents for Chinese Remainder Theorem (ie. dP and dQ) + * + * @var array + * @access private + */ + var $exponents; + + /** + * Coefficients for Chinese Remainder Theorem (ie. qInv) + * + * @var array + * @access private + */ + var $coefficients; + + /** + * Hash name + * + * @var string + * @access private + */ + var $hashName; + + /** + * Hash function + * + * @var \phpseclib\Crypt\Hash + * @access private + */ + var $hash; + + /** + * Length of hash function output + * + * @var int + * @access private + */ + var $hLen; + + /** + * Length of salt + * + * @var int + * @access private + */ + var $sLen; + + /** + * Hash function for the Mask Generation Function + * + * @var \phpseclib\Crypt\Hash + * @access private + */ + var $mgfHash; + + /** + * Length of MGF hash function output + * + * @var int + * @access private + */ + var $mgfHLen; + + /** + * Encryption mode + * + * @var int + * @access private + */ + var $encryptionMode = self::ENCRYPTION_OAEP; + + /** + * Signature mode + * + * @var int + * @access private + */ + var $signatureMode = self::SIGNATURE_PSS; + + /** + * Public Exponent + * + * @var mixed + * @access private + */ + var $publicExponent = false; + + /** + * Password + * + * @var string + * @access private + */ + var $password = false; + + /** + * Components + * + * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions - + * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't. + * + * @see self::_start_element_handler() + * @var array + * @access private + */ + var $components = array(); + + /** + * Current String + * + * For use with parsing XML formatted keys. + * + * @see self::_character_handler() + * @see self::_stop_element_handler() + * @var mixed + * @access private + */ + var $current; + + /** + * OpenSSL configuration file name. + * + * Set to null to use system configuration file. + * @see self::createKey() + * @var mixed + * @Access public + */ + var $configFile; + + /** + * Public key comment field. + * + * @var string + * @access private + */ + var $comment = 'phpseclib-generated-key'; + + /** + * The constructor + * + * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason + * \phpseclib\Crypt\RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires + * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late. + * + * @return \phpseclib\Crypt\RSA + * @access public + */ + function __construct() + { + $this->configFile = dirname(__FILE__) . '/../openssl.cnf'; + + if (!defined('CRYPT_RSA_MODE')) { + switch (true) { + // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular, + // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger + // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either. + case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'): + define('CRYPT_RSA_MODE', self::MODE_INTERNAL); + break; + case extension_loaded('openssl') && file_exists($this->configFile): + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + $versions = array(); + + // avoid generating errors (even with suppression) when phpinfo() is disabled (common in production systems) + if (strpos(ini_get('disable_functions'), 'phpinfo') === false) { + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0: + define('CRYPT_RSA_MODE', self::MODE_OPENSSL); + break; + default: + define('CRYPT_RSA_MODE', self::MODE_INTERNAL); + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + break; + default: + define('CRYPT_RSA_MODE', self::MODE_INTERNAL); + } + } + + $this->zero = new BigInteger(); + $this->one = new BigInteger(1); + + $this->hash = new Hash('sha1'); + $this->hLen = $this->hash->getLength(); + $this->hashName = 'sha1'; + $this->mgfHash = new Hash('sha1'); + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * Create public / private key pair + * + * Returns an array with the following three elements: + * - 'privatekey': The private key. + * - 'publickey': The public key. + * - 'partialkey': A partially computed key (if the execution time exceeded $timeout). + * Will need to be passed back to \phpseclib\Crypt\RSA::createKey() as the third parameter for further processing. + * + * @access public + * @param int $bits + * @param int $timeout + * @param array $p + */ + function createKey($bits = 1024, $timeout = false, $partial = array()) + { + if (!defined('CRYPT_RSA_EXPONENT')) { + // http://en.wikipedia.org/wiki/65537_%28number%29 + define('CRYPT_RSA_EXPONENT', '65537'); + } + // per , this number ought not result in primes smaller + // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME + // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if + // CRYPT_RSA_MODE is set to self::MODE_INTERNAL. if CRYPT_RSA_MODE is set to self::MODE_OPENSSL then + // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key + // generation when there's a chance neither gmp nor OpenSSL are installed) + if (!defined('CRYPT_RSA_SMALLEST_PRIME')) { + define('CRYPT_RSA_SMALLEST_PRIME', 4096); + } + + // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum + if (CRYPT_RSA_MODE == self::MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) { + $config = array(); + if (isset($this->configFile)) { + $config['config'] = $this->configFile; + } + $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config); + openssl_pkey_export($rsa, $privatekey, null, $config); + $publickey = openssl_pkey_get_details($rsa); + $publickey = $publickey['key']; + + $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, self::PRIVATE_FORMAT_PKCS1))); + $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, self::PUBLIC_FORMAT_PKCS1))); + + // clear the buffer of error strings stemming from a minimalistic openssl.cnf + while (openssl_error_string() !== false) { + } + + return array( + 'privatekey' => $privatekey, + 'publickey' => $publickey, + 'partialkey' => false + ); + } + + static $e; + if (!isset($e)) { + $e = new BigInteger(CRYPT_RSA_EXPONENT); + } + + extract($this->_generateMinMax($bits)); + $absoluteMin = $min; + $temp = $bits >> 1; // divide by two to see how many bits P and Q would be + if ($temp > CRYPT_RSA_SMALLEST_PRIME) { + $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME); + $temp = CRYPT_RSA_SMALLEST_PRIME; + } else { + $num_primes = 2; + } + extract($this->_generateMinMax($temp + $bits % $temp)); + $finalMax = $max; + extract($this->_generateMinMax($temp)); + + $generator = new BigInteger(); + + $n = $this->one->copy(); + if (!empty($partial)) { + extract(unserialize($partial)); + } else { + $exponents = $coefficients = $primes = array(); + $lcm = array( + 'top' => $this->one->copy(), + 'bottom' => false + ); + } + + $start = time(); + $i0 = count($primes) + 1; + + do { + for ($i = $i0; $i <= $num_primes; $i++) { + if ($timeout !== false) { + $timeout-= time() - $start; + $start = time(); + if ($timeout <= 0) { + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )) + ); + } + } + + if ($i == $num_primes) { + list($min, $temp) = $absoluteMin->divide($n); + if (!$temp->equals($this->zero)) { + $min = $min->add($this->one); // ie. ceil() + } + $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout); + } else { + $primes[$i] = $generator->randomPrime($min, $max, $timeout); + } + + if ($primes[$i] === false) { // if we've reached the timeout + if (count($primes) > 1) { + $partialkey = ''; + } else { + array_pop($primes); + $partialkey = serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )); + } + + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => $partialkey + ); + } + + // the first coefficient is calculated differently from the rest + // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) + if ($i > 2) { + $coefficients[$i] = $n->modInverse($primes[$i]); + } + + $n = $n->multiply($primes[$i]); + + $temp = $primes[$i]->subtract($this->one); + + // textbook RSA implementations use Euler's totient function instead of the least common multiple. + // see http://en.wikipedia.org/wiki/Euler%27s_totient_function + $lcm['top'] = $lcm['top']->multiply($temp); + $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); + + $exponents[$i] = $e->modInverse($temp); + } + + list($temp) = $lcm['top']->divide($lcm['bottom']); + $gcd = $temp->gcd($e); + $i0 = 1; + } while (!$gcd->equals($this->one)); + + $d = $e->modInverse($temp); + + $coefficients[2] = $primes[2]->modInverse($primes[1]); + + // from : + // RSAPrivateKey ::= SEQUENCE { + // version Version, + // modulus INTEGER, -- n + // publicExponent INTEGER, -- e + // privateExponent INTEGER, -- d + // prime1 INTEGER, -- p + // prime2 INTEGER, -- q + // exponent1 INTEGER, -- d mod (p-1) + // exponent2 INTEGER, -- d mod (q-1) + // coefficient INTEGER, -- (inverse of q) mod p + // otherPrimeInfos OtherPrimeInfos OPTIONAL + // } + + return array( + 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients), + 'publickey' => $this->_convertPublicKey($n, $e), + 'partialkey' => false + ); + } + + /** + * Convert a private key to the appropriate format. + * + * @access private + * @see self::setPrivateKeyFormat() + * @param string $RSAPrivateKey + * @return string + */ + function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients) + { + $signed = $this->privateKeyFormat != self::PRIVATE_FORMAT_XML; + $num_primes = count($primes); + $raw = array( + 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi + 'modulus' => $n->toBytes($signed), + 'publicExponent' => $e->toBytes($signed), + 'privateExponent' => $d->toBytes($signed), + 'prime1' => $primes[1]->toBytes($signed), + 'prime2' => $primes[2]->toBytes($signed), + 'exponent1' => $exponents[1]->toBytes($signed), + 'exponent2' => $exponents[2]->toBytes($signed), + 'coefficient' => $coefficients[2]->toBytes($signed) + ); + + // if the format in question does not support multi-prime rsa and multi-prime rsa was used, + // call _convertPublicKey() instead. + switch ($this->privateKeyFormat) { + case self::PRIVATE_FORMAT_XML: + if ($num_primes != 2) { + return false; + } + return "\r\n" . + ' ' . base64_encode($raw['modulus']) . "\r\n" . + ' ' . base64_encode($raw['publicExponent']) . "\r\n" . + '

            ' . base64_encode($raw['prime1']) . "

            \r\n" . + ' ' . base64_encode($raw['prime2']) . "\r\n" . + ' ' . base64_encode($raw['exponent1']) . "\r\n" . + ' ' . base64_encode($raw['exponent2']) . "\r\n" . + ' ' . base64_encode($raw['coefficient']) . "\r\n" . + ' ' . base64_encode($raw['privateExponent']) . "\r\n" . + '
            '; + break; + case self::PRIVATE_FORMAT_PUTTY: + if ($num_primes != 2) { + return false; + } + $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: "; + $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none'; + $key.= $encryption; + $key.= "\r\nComment: " . $this->comment . "\r\n"; + $public = pack( + 'Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($raw['publicExponent']), + $raw['publicExponent'], + strlen($raw['modulus']), + $raw['modulus'] + ); + $source = pack( + 'Na*Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($encryption), + $encryption, + strlen($this->comment), + $this->comment, + strlen($public), + $public + ); + $public = base64_encode($public); + $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; + $key.= chunk_split($public, 64); + $private = pack( + 'Na*Na*Na*Na*', + strlen($raw['privateExponent']), + $raw['privateExponent'], + strlen($raw['prime1']), + $raw['prime1'], + strlen($raw['prime2']), + $raw['prime2'], + strlen($raw['coefficient']), + $raw['coefficient'] + ); + if (empty($this->password) && !is_string($this->password)) { + $source.= pack('Na*', strlen($private), $private); + $hashkey = 'putty-private-key-file-mac-key'; + } else { + $private.= Random::string(16 - (strlen($private) & 15)); + $source.= pack('Na*', strlen($private), $private); + $sequence = 0; + $symkey = ''; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new AES(); + + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->encrypt($private); + $hashkey = 'putty-private-key-file-mac-key' . $this->password; + } + + $private = base64_encode($private); + $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; + $key.= chunk_split($private, 64); + $hash = new Hash('sha1'); + $hash->setKey(pack('H*', sha1($hashkey))); + $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n"; + + return $key; + case self::PRIVATE_FORMAT_OPENSSH: + if ($num_primes != 2) { + return false; + } + $publicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus']); + $privateKey = pack( + 'Na*Na*Na*Na*Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($raw['modulus']), + $raw['modulus'], + strlen($raw['publicExponent']), + $raw['publicExponent'], + strlen($raw['privateExponent']), + $raw['privateExponent'], + strlen($raw['coefficient']), + $raw['coefficient'], + strlen($raw['prime1']), + $raw['prime1'], + strlen($raw['prime2']), + $raw['prime2'] + ); + $checkint = Random::string(4); + $paddedKey = pack( + 'a*Na*', + $checkint . $checkint . $privateKey, + strlen($this->comment), + $this->comment + ); + $paddingLength = (7 * strlen($paddedKey)) % 8; + for ($i = 1; $i <= $paddingLength; $i++) { + $paddedKey.= chr($i); + } + $key = pack( + 'Na*Na*Na*NNa*Na*', + strlen('none'), + 'none', + strlen('none'), + 'none', + 0, + '', + 1, + strlen($publicKey), + $publicKey, + strlen($paddedKey), + $paddedKey + ); + $key = "openssh-key-v1\0$key"; + + return "-----BEGIN OPENSSH PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($key), 70) . + "-----END OPENSSH PRIVATE KEY-----"; + default: // eg. self::PRIVATE_FORMAT_PKCS1 + $components = array(); + foreach ($raw as $name => $value) { + $components[$name] = pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value); + } + + $RSAPrivateKey = implode('', $components); + + if ($num_primes > 2) { + $OtherPrimeInfos = ''; + for ($i = 3; $i <= $num_primes; $i++) { + // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo + // + // OtherPrimeInfo ::= SEQUENCE { + // prime INTEGER, -- ri + // exponent INTEGER, -- di + // coefficient INTEGER -- ti + // } + $OtherPrimeInfo = pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true)); + $OtherPrimeInfos.= pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo); + } + $RSAPrivateKey.= pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos); + } + + $RSAPrivateKey = pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + if ($this->privateKeyFormat == self::PRIVATE_FORMAT_PKCS8) { + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPrivateKey = pack( + 'Ca*a*Ca*a*', + self::ASN1_INTEGER, + "\01\00", + $rsaOID, + 4, + $this->_encodeLength(strlen($RSAPrivateKey)), + $RSAPrivateKey + ); + $RSAPrivateKey = pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + if (!empty($this->password) || is_string($this->password)) { + $salt = Random::string(8); + $iterationCount = 2048; + + $crypto = new DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $RSAPrivateKey = $crypto->encrypt($RSAPrivateKey); + + $parameters = pack( + 'Ca*a*Ca*N', + self::ASN1_OCTETSTRING, + $this->_encodeLength(strlen($salt)), + $salt, + self::ASN1_INTEGER, + $this->_encodeLength(4), + $iterationCount + ); + $pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03"; + + $encryptionAlgorithm = pack( + 'Ca*a*Ca*a*', + self::ASN1_OBJECT, + $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), + $pbeWithMD5AndDES_CBC, + self::ASN1_SEQUENCE, + $this->_encodeLength(strlen($parameters)), + $parameters + ); + + $RSAPrivateKey = pack( + 'Ca*a*Ca*a*', + self::ASN1_SEQUENCE, + $this->_encodeLength(strlen($encryptionAlgorithm)), + $encryptionAlgorithm, + self::ASN1_OCTETSTRING, + $this->_encodeLength(strlen($RSAPrivateKey)), + $RSAPrivateKey + ); + + $RSAPrivateKey = pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + $RSAPrivateKey = "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END ENCRYPTED PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END PRIVATE KEY-----'; + } + return $RSAPrivateKey; + } + + if (!empty($this->password) || is_string($this->password)) { + $iv = Random::string(8); + $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key + $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8); + $des = new TripleDES(); + $des->setKey($symkey); + $des->setIV($iv); + $iv = strtoupper(bin2hex($iv)); + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + "Proc-Type: 4,ENCRYPTED\r\n" . + "DEK-Info: DES-EDE3-CBC,$iv\r\n" . + "\r\n" . + chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) . + '-----END RSA PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END RSA PRIVATE KEY-----'; + } + + return $RSAPrivateKey; + } + } + + /** + * Convert a public key to the appropriate format + * + * @access private + * @see self::setPublicKeyFormat() + * @param string $RSAPrivateKey + * @return string + */ + function _convertPublicKey($n, $e) + { + $signed = $this->publicKeyFormat != self::PUBLIC_FORMAT_XML; + + $modulus = $n->toBytes($signed); + $publicExponent = $e->toBytes($signed); + + switch ($this->publicKeyFormat) { + case self::PUBLIC_FORMAT_RAW: + return array('e' => $e->copy(), 'n' => $n->copy()); + case self::PUBLIC_FORMAT_XML: + return "\r\n" . + ' ' . base64_encode($modulus) . "\r\n" . + ' ' . base64_encode($publicExponent) . "\r\n" . + ''; + break; + case self::PUBLIC_FORMAT_OPENSSH: + // from : + // string "ssh-rsa" + // mpint e + // mpint n + $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); + $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment; + + return $RSAPublicKey; + default: // eg. self::PUBLIC_FORMAT_PKCS1_RAW or self::PUBLIC_FORMAT_PKCS1 + // from : + // RSAPublicKey ::= SEQUENCE { + // modulus INTEGER, -- n + // publicExponent INTEGER -- e + // } + $components = array( + 'modulus' => pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus), + 'publicExponent' => pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent) + ); + + $RSAPublicKey = pack( + 'Ca*a*a*', + self::ASN1_SEQUENCE, + $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], + $components['publicExponent'] + ); + + if ($this->publicKeyFormat == self::PUBLIC_FORMAT_PKCS1_RAW) { + $RSAPublicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END RSA PUBLIC KEY-----'; + } else { + // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey; + + $RSAPublicKey = pack( + 'Ca*a*', + self::ASN1_SEQUENCE, + $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), + $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END PUBLIC KEY-----'; + } + + return $RSAPublicKey; + } + } + + /** + * Break a public or private key down into its constituant components + * + * @access private + * @see self::_convertPublicKey() + * @see self::_convertPrivateKey() + * @param string|array $key + * @param int $type + * @return array|bool + */ + function _parseKey($key, $type) + { + if ($type != self::PUBLIC_FORMAT_RAW && !is_string($key)) { + return false; + } + + switch ($type) { + case self::PUBLIC_FORMAT_RAW: + if (!is_array($key)) { + return false; + } + $components = array(); + switch (true) { + case isset($key['e']): + $components['publicExponent'] = $key['e']->copy(); + break; + case isset($key['exponent']): + $components['publicExponent'] = $key['exponent']->copy(); + break; + case isset($key['publicExponent']): + $components['publicExponent'] = $key['publicExponent']->copy(); + break; + case isset($key[0]): + $components['publicExponent'] = $key[0]->copy(); + } + switch (true) { + case isset($key['n']): + $components['modulus'] = $key['n']->copy(); + break; + case isset($key['modulo']): + $components['modulus'] = $key['modulo']->copy(); + break; + case isset($key['modulus']): + $components['modulus'] = $key['modulus']->copy(); + break; + case isset($key[1]): + $components['modulus'] = $key[1]->copy(); + } + return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false; + case self::PRIVATE_FORMAT_PKCS1: + case self::PRIVATE_FORMAT_PKCS8: + case self::PUBLIC_FORMAT_PKCS1: + /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is + "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to + protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding + two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: + + http://tools.ietf.org/html/rfc1421#section-4.6.1.1 + http://tools.ietf.org/html/rfc1421#section-4.6.1.3 + + DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. + DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation + function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's + own implementation. ie. the implementation *is* the standard and any bugs that may exist in that + implementation are part of the standard, as well. + + * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ + if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { + $iv = pack('H*', trim($matches[2])); + $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key + $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8))); + // remove the Proc-Type / DEK-Info sections as they're no longer needed + $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); + $ciphertext = $this->_extractBER($key); + if ($ciphertext === false) { + $ciphertext = $key; + } + switch ($matches[1]) { + case 'AES-256-CBC': + $crypto = new AES(); + break; + case 'AES-128-CBC': + $symkey = substr($symkey, 0, 16); + $crypto = new AES(); + break; + case 'DES-EDE3-CFB': + $crypto = new TripleDES(Base::MODE_CFB); + break; + case 'DES-EDE3-CBC': + $symkey = substr($symkey, 0, 24); + $crypto = new TripleDES(); + break; + case 'DES-CBC': + $crypto = new DES(); + break; + default: + return false; + } + $crypto->setKey($symkey); + $crypto->setIV($iv); + $decoded = $crypto->decrypt($ciphertext); + } else { + $decoded = $this->_extractBER($key); + } + + if ($decoded !== false) { + $key = $decoded; + } + + $components = array(); + + if (ord($this->_string_shift($key)) != self::ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + + $tag = ord($this->_string_shift($key)); + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 631 cons: SEQUENCE + 4:d=1 hl=2 l= 1 prim: INTEGER :00 + 7:d=1 hl=2 l= 13 cons: SEQUENCE + 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 20:d=2 hl=2 l= 0 prim: NULL + 22:d=1 hl=4 l= 609 prim: OCTET STRING + + ie. PKCS8 keys*/ + + if ($tag == self::ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") { + $this->_string_shift($key, 3); + $tag = self::ASN1_SEQUENCE; + } + + if ($tag == self::ASN1_SEQUENCE) { + $temp = $this->_string_shift($key, $this->_decodeLength($key)); + if (ord($this->_string_shift($temp)) != self::ASN1_OBJECT) { + return false; + } + $length = $this->_decodeLength($temp); + switch ($this->_string_shift($temp, $length)) { + case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption + break; + case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC + /* + PBEParameter ::= SEQUENCE { + salt OCTET STRING (SIZE(8)), + iterationCount INTEGER } + */ + if (ord($this->_string_shift($temp)) != self::ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($temp) != strlen($temp)) { + return false; + } + $this->_string_shift($temp); // assume it's an octet string + $salt = $this->_string_shift($temp, $this->_decodeLength($temp)); + if (ord($this->_string_shift($temp)) != self::ASN1_INTEGER) { + return false; + } + $this->_decodeLength($temp); + list(, $iterationCount) = unpack('N', str_pad($temp, 4, chr(0), STR_PAD_LEFT)); + $this->_string_shift($key); // assume it's an octet string + $length = $this->_decodeLength($key); + if (strlen($key) != $length) { + return false; + } + + $crypto = new DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $key = $crypto->decrypt($key); + if ($key === false) { + return false; + } + return $this->_parseKey($key, self::PRIVATE_FORMAT_PKCS1); + default: + return false; + } + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 290 cons: SEQUENCE + 4:d=1 hl=2 l= 13 cons: SEQUENCE + 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 17:d=2 hl=2 l= 0 prim: NULL + 19:d=1 hl=4 l= 271 prim: BIT STRING */ + $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag + $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length + // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of + // unused bits in the final subsequent octet. The number shall be in the range zero to seven." + // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2) + if ($tag == self::ASN1_BITSTRING) { + $this->_string_shift($key); + } + if (ord($this->_string_shift($key)) != self::ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + $tag = ord($this->_string_shift($key)); + } + if ($tag != self::ASN1_INTEGER) { + return false; + } + + $length = $this->_decodeLength($key); + $temp = $this->_string_shift($key, $length); + if (strlen($temp) != 1 || ord($temp) > 2) { + $components['modulus'] = new BigInteger($temp, 256); + $this->_string_shift($key); // skip over self::ASN1_INTEGER + $length = $this->_decodeLength($key); + $components[$type == self::PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new BigInteger($this->_string_shift($key, $length), 256); + + return $components; + } + if (ord($this->_string_shift($key)) != self::ASN1_INTEGER) { + return false; + } + $length = $this->_decodeLength($key); + $components['modulus'] = new BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['publicExponent'] = new BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['privateExponent'] = new BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'] = array(1 => new BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'][] = new BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'] = array(1 => new BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'] = array(2 => new BigInteger($this->_string_shift($key, $length), 256)); + + if (!empty($key)) { + if (ord($this->_string_shift($key)) != self::ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + while (!empty($key)) { + if (ord($this->_string_shift($key)) != self::ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + $key = substr($key, 1); + $length = $this->_decodeLength($key); + $components['primes'][] = new BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'][] = new BigInteger($this->_string_shift($key, $length), 256); + } + } + + return $components; + case self::PUBLIC_FORMAT_OPENSSH: + $parts = explode(' ', $key, 3); + + $key = isset($parts[1]) ? base64_decode($parts[1]) : false; + if ($key === false) { + return false; + } + + $comment = isset($parts[2]) ? $parts[2] : false; + + $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa"; + + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $publicExponent = new BigInteger($this->_string_shift($key, $length), -256); + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $modulus = new BigInteger($this->_string_shift($key, $length), -256); + + if ($cleanup && strlen($key)) { + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $realModulus = new BigInteger($this->_string_shift($key, $length), -256); + return strlen($key) ? false : array( + 'modulus' => $realModulus, + 'publicExponent' => $modulus, + 'comment' => $comment + ); + } else { + return strlen($key) ? false : array( + 'modulus' => $modulus, + 'publicExponent' => $publicExponent, + 'comment' => $comment + ); + } + // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue + // http://en.wikipedia.org/wiki/XML_Signature + case self::PRIVATE_FORMAT_XML: + case self::PUBLIC_FORMAT_XML: + $this->components = array(); + + $xml = xml_parser_create('UTF-8'); + xml_set_object($xml, $this); + xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler'); + xml_set_character_data_handler($xml, '_data_handler'); + // add to account for "dangling" tags like ... that are sometimes added + if (!xml_parse($xml, '' . $key . '')) { + xml_parser_free($xml); + unset($xml); + return false; + } + + xml_parser_free($xml); + unset($xml); + + return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false; + // from PuTTY's SSHPUBK.C + case self::PRIVATE_FORMAT_PUTTY: + $components = array(); + $key = preg_split('#\r\n|\r|\n#', $key); + $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0])); + if ($type != 'ssh-rsa') { + return false; + } + $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); + $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); + + $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); + $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); + $public = substr($public, 11); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['publicExponent'] = new BigInteger($this->_string_shift($public, $length), -256); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['modulus'] = new BigInteger($this->_string_shift($public, $length), -256); + + $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4])); + $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength)))); + + switch ($encryption) { + case 'aes256-cbc': + $symkey = ''; + $sequence = 0; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new AES(); + } + + if ($encryption != 'none') { + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->decrypt($private); + if ($private === false) { + return false; + } + } + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['privateExponent'] = new BigInteger($this->_string_shift($private, $length), -256); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'] = array(1 => new BigInteger($this->_string_shift($private, $length), -256)); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'][] = new BigInteger($this->_string_shift($private, $length), -256); + + $temp = $components['primes'][1]->subtract($this->one); + $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); + $temp = $components['primes'][2]->subtract($this->one); + $components['exponents'][] = $components['publicExponent']->modInverse($temp); + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['coefficients'] = array(2 => new BigInteger($this->_string_shift($private, $length), -256)); + + return $components; + case self::PRIVATE_FORMAT_OPENSSH: + $components = array(); + $decoded = $this->_extractBER($key); + $magic = $this->_string_shift($decoded, 15); + if ($magic !== "openssh-key-v1\0") { + return false; + } + $options = $this->_string_shift($decoded, 24); + // \0\0\0\4none = ciphername + // \0\0\0\4none = kdfname + // \0\0\0\0 = kdfoptions + // \0\0\0\1 = numkeys + if ($options != "\0\0\0\4none\0\0\0\4none\0\0\0\0\0\0\0\1") { + return false; + } + extract(unpack('Nlength', $this->_string_shift($decoded, 4))); + if (strlen($decoded) < $length) { + return false; + } + $publicKey = $this->_string_shift($decoded, $length); + extract(unpack('Nlength', $this->_string_shift($decoded, 4))); + if (strlen($decoded) < $length) { + return false; + } + $paddedKey = $this->_string_shift($decoded, $length); + + if ($this->_string_shift($publicKey, 11) !== "\0\0\0\7ssh-rsa") { + return false; + } + + $checkint1 = $this->_string_shift($paddedKey, 4); + $checkint2 = $this->_string_shift($paddedKey, 4); + if (strlen($checkint1) != 4 || $checkint1 !== $checkint2) { + return false; + } + + if ($this->_string_shift($paddedKey, 11) !== "\0\0\0\7ssh-rsa") { + return false; + } + + $values = array( + &$components['modulus'], + &$components['publicExponent'], + &$components['privateExponent'], + &$components['coefficients'][2], + &$components['primes'][1], + &$components['primes'][2] + ); + + foreach ($values as &$value) { + extract(unpack('Nlength', $this->_string_shift($paddedKey, 4))); + if (strlen($paddedKey) < $length) { + return false; + } + $value = new BigInteger($this->_string_shift($paddedKey, $length), -256); + } + + extract(unpack('Nlength', $this->_string_shift($paddedKey, 4))); + if (strlen($paddedKey) < $length) { + return false; + } + $components['comment'] = $this->_string_shift($decoded, $length); + + $temp = $components['primes'][1]->subtract($this->one); + $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); + $temp = $components['primes'][2]->subtract($this->one); + $components['exponents'][] = $components['publicExponent']->modInverse($temp); + + return $components; + } + } + + /** + * Returns the key size + * + * More specifically, this returns the size of the modulo in bits. + * + * @access public + * @return int + */ + function getSize() + { + return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits()); + } + + /** + * Start Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param resource $parser + * @param string $name + * @param array $attribs + */ + function _start_element_handler($parser, $name, $attribs) + { + //$name = strtoupper($name); + switch ($name) { + case 'MODULUS': + $this->current = &$this->components['modulus']; + break; + case 'EXPONENT': + $this->current = &$this->components['publicExponent']; + break; + case 'P': + $this->current = &$this->components['primes'][1]; + break; + case 'Q': + $this->current = &$this->components['primes'][2]; + break; + case 'DP': + $this->current = &$this->components['exponents'][1]; + break; + case 'DQ': + $this->current = &$this->components['exponents'][2]; + break; + case 'INVERSEQ': + $this->current = &$this->components['coefficients'][2]; + break; + case 'D': + $this->current = &$this->components['privateExponent']; + } + $this->current = ''; + } + + /** + * Stop Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param resource $parser + * @param string $name + */ + function _stop_element_handler($parser, $name) + { + if (isset($this->current)) { + $this->current = new BigInteger(base64_decode($this->current), 256); + unset($this->current); + } + } + + /** + * Data Handler + * + * Called by xml_set_character_data_handler() + * + * @access private + * @param resource $parser + * @param string $data + */ + function _data_handler($parser, $data) + { + if (!isset($this->current) || is_object($this->current)) { + return; + } + $this->current.= trim($data); + } + + /** + * Loads a public or private key + * + * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed) + * + * @access public + * @param string|RSA|array $key + * @param bool|int $type optional + * @return bool + */ + function loadKey($key, $type = false) + { + if ($key instanceof RSA) { + $this->privateKeyFormat = $key->privateKeyFormat; + $this->publicKeyFormat = $key->publicKeyFormat; + $this->k = $key->k; + $this->hLen = $key->hLen; + $this->sLen = $key->sLen; + $this->mgfHLen = $key->mgfHLen; + $this->encryptionMode = $key->encryptionMode; + $this->signatureMode = $key->signatureMode; + $this->password = $key->password; + $this->configFile = $key->configFile; + $this->comment = $key->comment; + + if (is_object($key->hash)) { + $this->hash = new Hash($key->hash->getHash()); + } + if (is_object($key->mgfHash)) { + $this->mgfHash = new Hash($key->mgfHash->getHash()); + } + + if (is_object($key->modulus)) { + $this->modulus = $key->modulus->copy(); + } + if (is_object($key->exponent)) { + $this->exponent = $key->exponent->copy(); + } + if (is_object($key->publicExponent)) { + $this->publicExponent = $key->publicExponent->copy(); + } + + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + + foreach ($this->primes as $prime) { + $this->primes[] = $prime->copy(); + } + foreach ($this->exponents as $exponent) { + $this->exponents[] = $exponent->copy(); + } + foreach ($this->coefficients as $coefficient) { + $this->coefficients[] = $coefficient->copy(); + } + + return true; + } + + if ($type === false) { + $types = array( + self::PUBLIC_FORMAT_RAW, + self::PRIVATE_FORMAT_PKCS1, + self::PRIVATE_FORMAT_XML, + self::PRIVATE_FORMAT_PUTTY, + self::PUBLIC_FORMAT_OPENSSH, + self::PRIVATE_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + $this->comment = null; + $this->modulus = null; + $this->k = null; + $this->exponent = null; + $this->primes = null; + $this->exponents = null; + $this->coefficients = null; + $this->publicExponent = null; + + return false; + } + + if (isset($components['comment']) && $components['comment'] !== false) { + $this->comment = $components['comment']; + } + $this->modulus = $components['modulus']; + $this->k = strlen($this->modulus->toBytes()); + $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent']; + if (isset($components['primes'])) { + $this->primes = $components['primes']; + $this->exponents = $components['exponents']; + $this->coefficients = $components['coefficients']; + $this->publicExponent = $components['publicExponent']; + } else { + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + $this->publicExponent = false; + } + + switch ($type) { + case self::PUBLIC_FORMAT_OPENSSH: + case self::PUBLIC_FORMAT_RAW: + $this->setPublicKey(); + break; + case self::PRIVATE_FORMAT_PKCS1: + switch (true) { + case strpos($key, '-BEGIN PUBLIC KEY-') !== false: + case strpos($key, '-BEGIN RSA PUBLIC KEY-') !== false: + $this->setPublicKey(); + } + } + + return true; + } + + /** + * Sets the password + * + * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. + * Or rather, pass in $password such that empty($password) && !is_string($password) is true. + * + * @see self::createKey() + * @see self::loadKey() + * @access public + * @param string $password + */ + function setPassword($password = false) + { + $this->password = $password; + } + + /** + * Defines the public key + * + * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when + * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a + * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys + * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public + * exponent this won't work unless you manually add the public exponent. phpseclib tries to guess if the key being used + * is the public key but in the event that it guesses incorrectly you might still want to explicitly set the key as being + * public. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see self::getPublicKey() + * @access public + * @param string $key optional + * @param int $type optional + * @return bool + */ + function setPublicKey($key = false, $type = false) + { + // if a public key has already been loaded return false + if (!empty($this->publicExponent)) { + return false; + } + + if ($key === false && !empty($this->modulus)) { + $this->publicExponent = $this->exponent; + return true; + } + + if ($type === false) { + $types = array( + self::PUBLIC_FORMAT_RAW, + self::PUBLIC_FORMAT_PKCS1, + self::PUBLIC_FORMAT_XML, + self::PUBLIC_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + return false; + } + + if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) { + $this->modulus = $components['modulus']; + $this->exponent = $this->publicExponent = $components['publicExponent']; + return true; + } + + $this->publicExponent = $components['publicExponent']; + + return true; + } + + /** + * Defines the private key + * + * If phpseclib guessed a private key was a public key and loaded it as such it might be desirable to force + * phpseclib to treat the key as a private key. This function will do that. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see self::getPublicKey() + * @access public + * @param string $key optional + * @param int $type optional + * @return bool + */ + function setPrivateKey($key = false, $type = false) + { + if ($key === false && !empty($this->publicExponent)) { + $this->publicExponent = false; + return true; + } + + $rsa = new RSA(); + if (!$rsa->loadKey($key, $type)) { + return false; + } + $rsa->publicExponent = false; + + // don't overwrite the old key if the new key is invalid + $this->loadKey($rsa); + return true; + } + + /** + * Returns the public key + * + * The public key is only returned under two circumstances - if the private key had the public key embedded within it + * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this + * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. + * + * @see self::getPublicKey() + * @access public + * @param string $key + * @param int $type optional + */ + function getPublicKey($type = self::PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->publicExponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $type; + $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns the public key's fingerprint + * + * The public key's fingerprint is returned, which is equivalent to running `ssh-keygen -lf rsa.pub`. If there is + * no public key currently loaded, false is returned. + * Example output (md5): "c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87" (as specified by RFC 4716) + * + * @access public + * @param string $algorithm The hashing algorithm to be used. Valid options are 'md5' and 'sha256'. False is returned + * for invalid values. + * @return mixed + */ + function getPublicKeyFingerprint($algorithm = 'md5') + { + if (empty($this->modulus) || empty($this->publicExponent)) { + return false; + } + + $modulus = $this->modulus->toBytes(true); + $publicExponent = $this->publicExponent->toBytes(true); + + $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); + + switch ($algorithm) { + case 'sha256': + $hash = new Hash('sha256'); + $base = base64_encode($hash->hash($RSAPublicKey)); + return substr($base, 0, strlen($base) - 1); + case 'md5': + return substr(chunk_split(md5($RSAPublicKey), 2, ':'), 0, -1); + default: + return false; + } + } + + /** + * Returns the private key + * + * The private key is only returned if the currently loaded key contains the constituent prime numbers. + * + * @see self::getPublicKey() + * @access public + * @param string $key + * @param int $type optional + * @return mixed + */ + function getPrivateKey($type = self::PUBLIC_FORMAT_PKCS1) + { + if (empty($this->primes)) { + return false; + } + + $oldFormat = $this->privateKeyFormat; + $this->privateKeyFormat = $type; + $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients); + $this->privateKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns a minimalistic private key + * + * Returns the private key without the prime number constituants. Structurally identical to a public key that + * hasn't been set as the public key + * + * @see self::getPrivateKey() + * @access private + * @param string $key + * @param int $type optional + */ + function _getPrivatePublicKey($mode = self::PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $mode; + $temp = $this->_convertPublicKey($this->modulus, $this->exponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * __toString() magic method + * + * @access public + * @return string + */ + function __toString() + { + $key = $this->getPrivateKey($this->privateKeyFormat); + if ($key !== false) { + return $key; + } + $key = $this->_getPrivatePublicKey($this->publicKeyFormat); + return $key !== false ? $key : ''; + } + + /** + * __clone() magic method + * + * @access public + * @return Crypt_RSA + */ + function __clone() + { + $key = new RSA(); + $key->loadKey($this); + return $key; + } + + /** + * Generates the smallest and largest numbers requiring $bits bits + * + * @access private + * @param int $bits + * @return array + */ + function _generateMinMax($bits) + { + $bytes = $bits >> 3; + $min = str_repeat(chr(0), $bytes); + $max = str_repeat(chr(0xFF), $bytes); + $msb = $bits & 7; + if ($msb) { + $min = chr(1 << ($msb - 1)) . $min; + $max = chr((1 << $msb) - 1) . $max; + } else { + $min[0] = chr(0x80); + } + + return array( + 'min' => new BigInteger($min, 256), + 'max' => new BigInteger($max, 256) + ); + } + + /** + * DER-decode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param string $string + * @return int + */ + function _decodeLength(&$string) + { + $length = ord($this->_string_shift($string)); + if ($length & 0x80) { // definite length, long form + $length&= 0x7F; + $temp = $this->_string_shift($string, $length); + list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); + } + return $length; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param int $length + * @return string + */ + function _encodeLength($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * Determines the private key format + * + * @see self::createKey() + * @access public + * @param int $format + */ + function setPrivateKeyFormat($format) + { + $this->privateKeyFormat = $format; + } + + /** + * Determines the public key format + * + * @see self::createKey() + * @access public + * @param int $format + */ + function setPublicKeyFormat($format) + { + $this->publicKeyFormat = $format; + } + + /** + * Determines which hashing function should be used + * + * Used with signature production / verification and (if the encryption mode is self::ENCRYPTION_OAEP) encryption and + * decryption. If $hash isn't supported, sha1 is used. + * + * @access public + * @param string $hash + */ + function setHash($hash) + { + // \phpseclib\Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->hash = new Hash($hash); + $this->hashName = $hash; + break; + default: + $this->hash = new Hash('sha1'); + $this->hashName = 'sha1'; + } + $this->hLen = $this->hash->getLength(); + } + + /** + * Determines which hashing function should be used for the mask generation function + * + * The mask generation function is used by self::ENCRYPTION_OAEP and self::SIGNATURE_PSS and although it's + * best if Hash and MGFHash are set to the same thing this is not a requirement. + * + * @access public + * @param string $hash + */ + function setMGFHash($hash) + { + // \phpseclib\Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->mgfHash = new Hash($hash); + break; + default: + $this->mgfHash = new Hash('sha1'); + } + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * Determines the salt length + * + * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: + * + * Typical salt lengths in octets are hLen (the length of the output + * of the hash function Hash) and 0. + * + * @access public + * @param int $format + */ + function setSaltLength($sLen) + { + $this->sLen = $sLen; + } + + /** + * Integer-to-Octet-String primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. + * + * @access private + * @param \phpseclib\Math\BigInteger $x + * @param int $xLen + * @return string + */ + function _i2osp($x, $xLen) + { + $x = $x->toBytes(); + if (strlen($x) > $xLen) { + user_error('Integer too large'); + return false; + } + return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); + } + + /** + * Octet-String-to-Integer primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. + * + * @access private + * @param string $x + * @return \phpseclib\Math\BigInteger + */ + function _os2ip($x) + { + return new BigInteger($x, 256); + } + + /** + * Exponentiate with or without Chinese Remainder Theorem + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}. + * + * @access private + * @param \phpseclib\Math\BigInteger $x + * @return \phpseclib\Math\BigInteger + */ + function _exponentiate($x) + { + switch (true) { + case empty($this->primes): + case $this->primes[1]->equals($this->zero): + case empty($this->coefficients): + case $this->coefficients[2]->equals($this->zero): + case empty($this->exponents): + case $this->exponents[1]->equals($this->zero): + return $x->modPow($this->exponent, $this->modulus); + } + + $num_primes = count($this->primes); + + if (defined('CRYPT_RSA_DISABLE_BLINDING')) { + $m_i = array( + 1 => $x->modPow($this->exponents[1], $this->primes[1]), + 2 => $x->modPow($this->exponents[2], $this->primes[2]) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } else { + $smallest = $this->primes[1]; + for ($i = 2; $i <= $num_primes; $i++) { + if ($smallest->compare($this->primes[$i]) > 0) { + $smallest = $this->primes[$i]; + } + } + + $one = new BigInteger(1); + + $r = $one->random($one, $smallest->subtract($one)); + + $m_i = array( + 1 => $this->_blind($x, $r, 1), + 2 => $this->_blind($x, $r, 2) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $this->_blind($x, $r, $i); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } + + return $m; + } + + /** + * Performs RSA Blinding + * + * Protects against timing attacks by employing RSA Blinding. + * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) + * + * @access private + * @param \phpseclib\Math\BigInteger $x + * @param \phpseclib\Math\BigInteger $r + * @param int $i + * @return \phpseclib\Math\BigInteger + */ + function _blind($x, $r, $i) + { + $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); + $x = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->modInverse($this->primes[$i]); + $x = $x->multiply($r); + list(, $x) = $x->divide($this->primes[$i]); + + return $x; + } + + /** + * Performs blinded RSA equality testing + * + * Protects against a particular type of timing attack described. + * + * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)} + * + * Thanks for the heads up singpolyma! + * + * @access private + * @param string $x + * @param string $y + * @return bool + */ + function _equals($x, $y) + { + if (function_exists('hash_equals')) { + return hash_equals($x, $y); + } + + if (strlen($x) != strlen($y)) { + return false; + } + + $result = "\0"; + $x^= $y; + for ($i = 0; $i < strlen($x); $i++) { + $result|= $x[$i]; + } + + return $result === "\0"; + } + + /** + * RSAEP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. + * + * @access private + * @param \phpseclib\Math\BigInteger $m + * @return \phpseclib\Math\BigInteger + */ + function _rsaep($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSADP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. + * + * @access private + * @param \phpseclib\Math\BigInteger $c + * @return \phpseclib\Math\BigInteger + */ + function _rsadp($c) + { + if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) { + user_error('Ciphertext representative out of range'); + return false; + } + return $this->_exponentiate($c); + } + + /** + * RSASP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. + * + * @access private + * @param \phpseclib\Math\BigInteger $m + * @return \phpseclib\Math\BigInteger + */ + function _rsasp1($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSAVP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. + * + * @access private + * @param \phpseclib\Math\BigInteger $s + * @return \phpseclib\Math\BigInteger + */ + function _rsavp1($s) + { + if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) { + user_error('Signature representative out of range'); + return false; + } + return $this->_exponentiate($s); + } + + /** + * MGF1 + * + * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. + * + * @access private + * @param string $mgfSeed + * @param int $mgfLen + * @return string + */ + function _mgf1($mgfSeed, $maskLen) + { + // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. + + $t = ''; + $count = ceil($maskLen / $this->mgfHLen); + for ($i = 0; $i < $count; $i++) { + $c = pack('N', $i); + $t.= $this->mgfHash->hash($mgfSeed . $c); + } + + return substr($t, 0, $maskLen); + } + + /** + * RSAES-OAEP-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and + * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. + * + * @access private + * @param string $m + * @param string $l + * @return string + */ + function _rsaes_oaep_encrypt($m, $l = '') + { + $mLen = strlen($m); + + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if ($mLen > $this->k - 2 * $this->hLen - 2) { + user_error('Message too long'); + return false; + } + + // EME-OAEP encoding + + $lHash = $this->hash->hash($l); + $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); + $db = $lHash . $ps . chr(1) . $m; + $seed = Random::string($this->hLen); + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $maskedSeed = $seed ^ $seedMask; + $em = chr(0) . $maskedSeed . $maskedDB; + + // RSA encryption + + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-OAEP-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error + * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: + * + * Note. Care must be taken to ensure that an opponent cannot + * distinguish the different error conditions in Step 3.g, whether by + * error message or timing, or, more generally, learn partial + * information about the encoded message EM. Otherwise an opponent may + * be able to obtain useful information about the decryption of the + * ciphertext C, leading to a chosen-ciphertext attack such as the one + * observed by Manger [36]. + * + * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: + * + * Both the encryption and the decryption operations of RSAES-OAEP take + * the value of a label L as input. In this version of PKCS #1, L is + * the empty string; other uses of the label are outside the scope of + * this document. + * + * @access private + * @param string $c + * @param string $l + * @return string + */ + function _rsaes_oaep_decrypt($c, $l = '') + { + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-OAEP decoding + + $lHash = $this->hash->hash($l); + $y = ord($em[0]); + $maskedSeed = substr($em, 1, $this->hLen); + $maskedDB = substr($em, $this->hLen + 1); + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $seed = $maskedSeed ^ $seedMask; + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $lHash2 = substr($db, 0, $this->hLen); + $m = substr($db, $this->hLen); + $hashesMatch = $this->_equals($lHash, $lHash2); + $leadingZeros = 1; + $patternMatch = 0; + $offset = 0; + for ($i = 0; $i < strlen($m); $i++) { + $patternMatch|= $leadingZeros & ($m[$i] === "\1"); + $leadingZeros&= $m[$i] === "\0"; + $offset+= $patternMatch ? 0 : 1; + } + + // we do & instead of && to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation + // to protect against timing attacks + if (!$hashesMatch & !$patternMatch) { + user_error('Decryption error'); + return false; + } + + // Output the message M + + return substr($m, $offset + 1); + } + + /** + * Raw Encryption / Decryption + * + * Doesn't use padding and is not recommended. + * + * @access private + * @param string $m + * @return string + */ + function _raw_encrypt($m) + { + $temp = $this->_os2ip($m); + $temp = $this->_rsaep($temp); + return $this->_i2osp($temp, $this->k); + } + + /** + * RSAES-PKCS1-V1_5-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsaes_pkcs1_v1_5_encrypt($m) + { + $mLen = strlen($m); + + // Length checking + + if ($mLen > $this->k - 11) { + user_error('Message too long'); + return false; + } + + // EME-PKCS1-v1_5 encoding + + $psLen = $this->k - $mLen - 3; + $ps = ''; + while (strlen($ps) != $psLen) { + $temp = Random::string($psLen - strlen($ps)); + $temp = str_replace("\x00", '', $temp); + $ps.= $temp; + } + $type = 2; + // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done + if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) { + $type = 1; + // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF" + $ps = str_repeat("\xFF", $psLen); + } + $em = chr(0) . chr($type) . $ps . chr(0) . $m; + + // RSA encryption + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-PKCS1-V1_5-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. + * + * For compatibility purposes, this function departs slightly from the description given in RFC3447. + * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the + * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the + * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed + * to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the + * second byte is 2 or less. If it is, we'll accept the decrypted string as valid. + * + * As a consequence of this, a private key encrypted ciphertext produced with \phpseclib\Crypt\RSA may not decrypt + * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but + * not private key encrypted ciphertext's. + * + * @access private + * @param string $c + * @return string + */ + function _rsaes_pkcs1_v1_5_decrypt($c) + { + // Length checking + + if (strlen($c) != $this->k) { // or if k < 11 + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-PKCS1-v1_5 decoding + + if (ord($em[0]) != 0 || ord($em[1]) > 2) { + user_error('Decryption error'); + return false; + } + + $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); + $m = substr($em, strlen($ps) + 3); + + if (strlen($ps) < 8) { + user_error('Decryption error'); + return false; + } + + // Output M + + return $m; + } + + /** + * EMSA-PSS-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. + * + * @access private + * @param string $m + * @param int $emBits + */ + function _emsa_pss_encode($m, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) + $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + user_error('Encoding error'); + return false; + } + + $salt = Random::string($sLen); + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h = $this->hash->hash($m2); + $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); + $db = $ps . chr(1) . $salt; + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; + $em = $maskedDB . $h . chr(0xBC); + + return $em; + } + + /** + * EMSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. + * + * @access private + * @param string $m + * @param string $em + * @param int $emBits + * @return string + */ + function _emsa_pss_verify($m, $em, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8); + $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + return false; + } + + if ($em[strlen($em) - 1] != chr(0xBC)) { + return false; + } + + $maskedDB = substr($em, 0, -$this->hLen - 1); + $h = substr($em, -$this->hLen - 1, $this->hLen); + $temp = chr(0xFF << ($emBits & 7)); + if ((~$maskedDB[0] & $temp) != $temp) { + return false; + } + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; + $temp = $emLen - $this->hLen - $sLen - 2; + if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { + return false; + } + $salt = substr($db, $temp + 1); // should be $sLen long + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h2 = $this->hash->hash($m2); + return $this->_equals($h, $h2); + } + + /** + * RSASSA-PSS-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pss_sign($m) + { + // EMSA-PSS encoding + + $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1); + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. + * + * @access private + * @param string $m + * @param string $s + * @return string + */ + function _rsassa_pss_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $modBits = 8 * $this->k; + + $s2 = $this->_os2ip($s); + $m2 = $this->_rsavp1($s2); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $modBits >> 3); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PSS verification + + return $this->_emsa_pss_verify($m, $em, $modBits - 1); + } + + /** + * EMSA-PKCS1-V1_5-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. + * + * @access private + * @param string $m + * @param int $emLen + * @return string + */ + function _emsa_pkcs1_v1_5_encode($m, $emLen) + { + $h = $this->hash->hash($m); + if ($h === false) { + return false; + } + + // see http://tools.ietf.org/html/rfc3447#page-43 + switch ($this->hashName) { + case 'md2': + $t = pack('H*', '3020300c06082a864886f70d020205000410'); + break; + case 'md5': + $t = pack('H*', '3020300c06082a864886f70d020505000410'); + break; + case 'sha1': + $t = pack('H*', '3021300906052b0e03021a05000414'); + break; + case 'sha256': + $t = pack('H*', '3031300d060960864801650304020105000420'); + break; + case 'sha384': + $t = pack('H*', '3041300d060960864801650304020205000430'); + break; + case 'sha512': + $t = pack('H*', '3051300d060960864801650304020305000440'); + } + $t.= $h; + $tLen = strlen($t); + + if ($emLen < $tLen + 11) { + user_error('Intended encoded message length too short'); + return false; + } + + $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); + + $em = "\0\1$ps\0$t"; + + return $em; + } + + /** + * RSASSA-PKCS1-V1_5-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pkcs1_v1_5_sign($m) + { + // EMSA-PKCS1-v1_5 encoding + + $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + if ($em === false) { + user_error('RSA modulus too short'); + return false; + } + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PKCS1-V1_5-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pkcs1_v1_5_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $s = $this->_os2ip($s); + $m2 = $this->_rsavp1($s); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $this->k); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PKCS1-v1_5 encoding + + $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + if ($em2 === false) { + user_error('RSA modulus too short'); + return false; + } + + // Compare + return $this->_equals($em, $em2); + } + + /** + * Set Encryption Mode + * + * Valid values include self::ENCRYPTION_OAEP and self::ENCRYPTION_PKCS1. + * + * @access public + * @param int $mode + */ + function setEncryptionMode($mode) + { + $this->encryptionMode = $mode; + } + + /** + * Set Signature Mode + * + * Valid values include self::SIGNATURE_PSS and self::SIGNATURE_PKCS1 + * + * @access public + * @param int $mode + */ + function setSignatureMode($mode) + { + $this->signatureMode = $mode; + } + + /** + * Set public key comment. + * + * @access public + * @param string $comment + */ + function setComment($comment) + { + $this->comment = $comment; + } + + /** + * Get public key comment. + * + * @access public + * @return string + */ + function getComment() + { + return $this->comment; + } + + /** + * Encryption + * + * Both self::ENCRYPTION_OAEP and self::ENCRYPTION_PKCS1 both place limits on how long $plaintext can be. + * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will + * be concatenated together. + * + * @see self::decrypt() + * @access public + * @param string $plaintext + * @return string + */ + function encrypt($plaintext) + { + switch ($this->encryptionMode) { + case self::ENCRYPTION_NONE: + $plaintext = str_split($plaintext, $this->k); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_raw_encrypt($m); + } + return $ciphertext; + case self::ENCRYPTION_PKCS1: + $length = $this->k - 11; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m); + } + return $ciphertext; + //case self::ENCRYPTION_OAEP: + default: + $length = $this->k - 2 * $this->hLen - 2; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_oaep_encrypt($m); + } + return $ciphertext; + } + } + + /** + * Decryption + * + * @see self::encrypt() + * @access public + * @param string $plaintext + * @return string + */ + function decrypt($ciphertext) + { + if ($this->k <= 0) { + return false; + } + + $ciphertext = str_split($ciphertext, $this->k); + $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT); + + $plaintext = ''; + + switch ($this->encryptionMode) { + case self::ENCRYPTION_NONE: + $decrypt = '_raw_encrypt'; + break; + case self::ENCRYPTION_PKCS1: + $decrypt = '_rsaes_pkcs1_v1_5_decrypt'; + break; + //case self::ENCRYPTION_OAEP: + default: + $decrypt = '_rsaes_oaep_decrypt'; + } + + foreach ($ciphertext as $c) { + $temp = $this->$decrypt($c); + if ($temp === false) { + return false; + } + $plaintext.= $temp; + } + + return $plaintext; + } + + /** + * Create a signature + * + * @see self::verify() + * @access public + * @param string $message + * @return string + */ + function sign($message) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case self::SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_sign($message); + //case self::SIGNATURE_PSS: + default: + return $this->_rsassa_pss_sign($message); + } + } + + /** + * Verifies a signature + * + * @see self::sign() + * @access public + * @param string $message + * @param string $signature + * @return bool + */ + function verify($message, $signature) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case self::SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_verify($message, $signature); + //case self::SIGNATURE_PSS: + default: + return $this->_rsassa_pss_verify($message, $signature); + } + } + + /** + * Extract raw BER from Base64 encoding + * + * @access private + * @param string $str + * @return string + */ + function _extractBER($str) + { + /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them + * above and beyond the ceritificate. + * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: + * + * Bag Attributes + * localKeyID: 01 00 00 00 + * subject=/O=organization/OU=org unit/CN=common name + * issuer=/O=organization/CN=common name + */ + $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1); + // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff + $temp = preg_replace('#-+[^-]+-+#', '', $temp); + // remove new lines + $temp = str_replace(array("\r", "\n", ' '), '', $temp); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + return $temp != false ? $temp : $str; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php new file mode 100644 index 0000000..01e34cc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php @@ -0,0 +1,274 @@ + + * + * + * + * @category Crypt + * @package Random + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +namespace phpseclib\Crypt; + +/** + * Pure-PHP Random Number Generator + * + * @package Random + * @author Jim Wigginton + * @access public + */ +class Random +{ + /** + * Generate a random string. + * + * Although microoptimizations are generally discouraged as they impair readability this function is ripe with + * microoptimizations because this function has the potential of being called a huge number of times. + * eg. for RSA key generation. + * + * @param int $length + * @return string + */ + static function string($length) + { + if (!$length) { + return ''; + } + + if (version_compare(PHP_VERSION, '7.0.0', '>=')) { + try { + return \random_bytes($length); + } catch (\Throwable $e) { + // If a sufficient source of randomness is unavailable, random_bytes() will throw an + // object that implements the Throwable interface (Exception, TypeError, Error). + // We don't actually need to do anything here. The string() method should just continue + // as normal. Note, however, that if we don't have a sufficient source of randomness for + // random_bytes(), most of the other calls here will fail too, so we'll end up using + // the PHP implementation. + } + } + + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + // method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call. + // ie. class_alias is a function that was introduced in PHP 5.3 + if (extension_loaded('mcrypt') && function_exists('class_alias')) { + return @mcrypt_create_iv($length); + } + // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was, + // to quote , "possible blocking behavior". as of 5.3.4 + // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both + // call php_win32_get_random_bytes(): + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008 + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392 + // + // php_win32_get_random_bytes() is defined thusly: + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80 + // + // we're calling it, all the same, in the off chance that the mcrypt extension is not available + if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.4', '>=')) { + return openssl_random_pseudo_bytes($length); + } + } else { + // method 1. the fastest + if (extension_loaded('openssl')) { + return openssl_random_pseudo_bytes($length); + } + // method 2 + static $fp = true; + if ($fp === true) { + // warning's will be output unles the error suppression operator is used. errors such as + // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc. + $fp = @fopen('/dev/urandom', 'rb'); + } + if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource() + return fread($fp, $length); + } + // method 3. pretty much does the same thing as method 2 per the following url: + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391 + // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're + // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir + // restrictions or some such + if (extension_loaded('mcrypt')) { + return @mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + } + } + // at this point we have no choice but to use a pure-PHP CSPRNG + + // cascade entropy across multiple PHP instances by fixing the session and collecting all + // environmental variables, including the previous session data and the current session + // data. + // + // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) + // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but + // PHP isn't low level to be able to use those as sources and on a web server there's not likely + // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use + // however, a ton of people visiting the website. obviously you don't want to base your seeding + // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled + // by the user and (2) this isn't just looking at the data sent by the current user - it's based + // on the data sent by all users. one user requests the page and a hash of their info is saved. + // another user visits the page and the serialization of their data is utilized along with the + // server envirnment stuff and a hash of the previous http request data (which itself utilizes + // a hash of the session data before that). certainly an attacker should be assumed to have + // full control over his own http requests. he, however, is not going to have control over + // everyone's http requests. + static $crypto = false, $v; + if ($crypto === false) { + // save old session data + $old_session_id = session_id(); + $old_use_cookies = ini_get('session.use_cookies'); + $old_session_cache_limiter = session_cache_limiter(); + $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; + if ($old_session_id != '') { + session_write_close(); + } + + session_id(1); + ini_set('session.use_cookies', 0); + session_cache_limiter(''); + session_start(); + + $v = $seed = $_SESSION['seed'] = pack('H*', sha1( + (isset($_SERVER) ? phpseclib_safe_serialize($_SERVER) : '') . + (isset($_POST) ? phpseclib_safe_serialize($_POST) : '') . + (isset($_GET) ? phpseclib_safe_serialize($_GET) : '') . + (isset($_COOKIE) ? phpseclib_safe_serialize($_COOKIE) : '') . + phpseclib_safe_serialize($GLOBALS) . + phpseclib_safe_serialize($_SESSION) . + phpseclib_safe_serialize($_OLD_SESSION) + )); + if (!isset($_SESSION['count'])) { + $_SESSION['count'] = 0; + } + $_SESSION['count']++; + + session_write_close(); + + // restore old session data + if ($old_session_id != '') { + session_id($old_session_id); + session_start(); + ini_set('session.use_cookies', $old_use_cookies); + session_cache_limiter($old_session_cache_limiter); + } else { + if ($_OLD_SESSION !== false) { + $_SESSION = $_OLD_SESSION; + unset($_OLD_SESSION); + } else { + unset($_SESSION); + } + } + + // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. + // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. + // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the + // original hash and the current hash. we'll be emulating that. for more info see the following URL: + // + // http://tools.ietf.org/html/rfc4253#section-7.2 + // + // see the is_string($crypto) part for an example of how to expand the keys + $key = pack('H*', sha1($seed . 'A')); + $iv = pack('H*', sha1($seed . 'C')); + + // ciphers are used as per the nist.gov link below. also, see this link: + // + // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives + switch (true) { + case class_exists('\phpseclib\Crypt\AES'): + $crypto = new AES(Base::MODE_CTR); + break; + case class_exists('\phpseclib\Crypt\Twofish'): + $crypto = new Twofish(Base::MODE_CTR); + break; + case class_exists('\phpseclib\Crypt\Blowfish'): + $crypto = new Blowfish(Base::MODE_CTR); + break; + case class_exists('\phpseclib\Crypt\TripleDES'): + $crypto = new TripleDES(Base::MODE_CTR); + break; + case class_exists('\phpseclib\Crypt\DES'): + $crypto = new DES(Base::MODE_CTR); + break; + case class_exists('\phpseclib\Crypt\RC4'): + $crypto = new RC4(); + break; + default: + user_error(__CLASS__ . ' requires at least one symmetric cipher be loaded'); + return false; + } + + $crypto->setKey($key); + $crypto->setIV($iv); + $crypto->enableContinuousBuffer(); + } + + //return $crypto->encrypt(str_repeat("\0", $length)); + + // the following is based off of ANSI X9.31: + // + // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf + // + // OpenSSL uses that same standard for it's random numbers: + // + // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c + // (do a search for "ANS X9.31 A.2.4") + $result = ''; + while (strlen($result) < $length) { + $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 + $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 + $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 + $result.= $r; + } + return substr($result, 0, $length); + } +} + +if (!function_exists('phpseclib_safe_serialize')) { + /** + * Safely serialize variables + * + * If a class has a private __sleep() method it'll give a fatal error on PHP 5.2 and earlier. + * PHP 5.3 will emit a warning. + * + * @param mixed $arr + * @access public + */ + function phpseclib_safe_serialize(&$arr) + { + if (is_object($arr)) { + return ''; + } + if (!is_array($arr)) { + return serialize($arr); + } + // prevent circular array recursion + if (isset($arr['__phpseclib_marker'])) { + return ''; + } + $safearr = array(); + $arr['__phpseclib_marker'] = true; + foreach (array_keys($arr) as $key) { + // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage + if ($key !== '__phpseclib_marker') { + $safearr[$key] = phpseclib_safe_serialize($arr[$key]); + } + } + unset($arr['__phpseclib_marker']); + return serialize($safearr); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php new file mode 100644 index 0000000..3648a19 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php @@ -0,0 +1,936 @@ + + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); + * ?> + * + * + * @category Crypt + * @package Rijndael + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +namespace phpseclib\Crypt; + +/** + * Pure-PHP implementation of Rijndael. + * + * @package Rijndael + * @author Jim Wigginton + * @access public + */ +class Rijndael extends Base +{ + /** + * The mcrypt specific name of the cipher + * + * Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not. + * \phpseclib\Crypt\Rijndael determines automatically whether mcrypt is useable + * or not for the current $block_size/$key_length. + * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. + * + * @see \phpseclib\Crypt\Base::cipher_name_mcrypt + * @see \phpseclib\Crypt\Base::engine + * @see self::isValidEngine() + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'rijndael-128'; + + /** + * The default salt used by setPassword() + * + * @see \phpseclib\Crypt\Base::password_default_salt + * @see \phpseclib\Crypt\Base::setPassword() + * @var string + * @access private + */ + var $password_default_salt = 'phpseclib'; + + /** + * The Key Schedule + * + * @see self::_setup() + * @var array + * @access private + */ + var $w; + + /** + * The Inverse Key Schedule + * + * @see self::_setup() + * @var array + * @access private + */ + var $dw; + + /** + * The Block Length divided by 32 + * + * @see self::setBlockLength() + * @var int + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size + * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could + * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $Nb = 4; + + /** + * The Key Length (in bytes) + * + * @see self::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk + * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could + * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $key_length = 16; + + /** + * The Key Length divided by 32 + * + * @see self::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 + */ + var $Nk = 4; + + /** + * The Number of Rounds + * + * @var int + * @access private + * @internal The max value is 14, the min value is 10. + */ + var $Nr; + + /** + * Shift offsets + * + * @var array + * @access private + */ + var $c; + + /** + * Holds the last used key- and block_size information + * + * @var array + * @access private + */ + var $kl; + + /** + * Sets the key length. + * + * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined + * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to + * 192/256 bits as, for example, mcrypt will do. + * + * That said, if you want be compatible with other Rijndael and AES implementations, + * you should not setKeyLength(160) or setKeyLength(224). + * + * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use + * the mcrypt php extension, even if available. + * This results then in slower encryption. + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch (true) { + case $length <= 128: + $this->key_length = 16; + break; + case $length <= 160: + $this->key_length = 20; + break; + case $length <= 192: + $this->key_length = 24; + break; + case $length <= 224: + $this->key_length = 28; + break; + default: + $this->key_length = 32; + } + + parent::setKeyLength($length); + } + + /** + * Sets the block length + * + * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @access public + * @param int $length + */ + function setBlockLength($length) + { + $length >>= 5; + if ($length > 8) { + $length = 8; + } elseif ($length < 4) { + $length = 4; + } + $this->Nb = $length; + $this->block_size = $length << 2; + $this->changed = true; + $this->_setEngine(); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine() + * + * @see \phpseclib\Crypt\Base::__construct() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + switch ($engine) { + case self::ENGINE_OPENSSL: + if ($this->block_size != 16) { + return false; + } + $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb'; + $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->_openssl_translate_mode(); + break; + case self::ENGINE_MCRYPT: + $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); + if ($this->key_length % 8) { // is it a 160/224-bit key? + // mcrypt is not usable for them, only for 128/192/256-bit keys + return false; + } + } + + return parent::isValidEngine($engine); + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + static $tables; + if (empty($tables)) { + $tables = &$this->_getTables(); + } + $t0 = $tables[0]; + $t1 = $tables[1]; + $t2 = $tables[2]; + $t3 = $tables[3]; + $sbox = $tables[4]; + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $w = $this->w; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $wc = $Nb - 1; + foreach ($words as $word) { + $state[] = $word ^ $w[++$wc]; + } + + // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - + // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding + // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. + // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. + // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], + // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. + + // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf + $temp = array(); + for ($round = 1; $round < $Nr; ++$round) { + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + + while ($i < $Nb) { + $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ + $t1[$state[$j] >> 16 & 0x000000FF] ^ + $t2[$state[$k] >> 8 & 0x000000FF] ^ + $t3[$state[$l] & 0x000000FF] ^ + $w[++$wc]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // subWord + for ($i = 0; $i < $Nb; ++$i) { + $state[$i] = $sbox[$state[$i] & 0x000000FF] | + ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | + ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | + ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); + } + + // shiftRows + addRoundKey + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + while ($i < $Nb) { + $temp[$i] = ($state[$i] & 0xFF000000) ^ + ($state[$j] & 0x00FF0000) ^ + ($state[$k] & 0x0000FF00) ^ + ($state[$l] & 0x000000FF) ^ + $w[$i]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + static $invtables; + if (empty($invtables)) { + $invtables = &$this->_getInvTables(); + } + $dt0 = $invtables[0]; + $dt1 = $invtables[1]; + $dt2 = $invtables[2]; + $dt3 = $invtables[3]; + $isbox = $invtables[4]; + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $dw = $this->dw; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $wc = $Nb - 1; + foreach ($words as $word) { + $state[] = $word ^ $dw[++$wc]; + } + + $temp = array(); + for ($round = $Nr - 1; $round > 0; --$round) { + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ + $dt1[$state[$j] >> 16 & 0x000000FF] ^ + $dt2[$state[$k] >> 8 & 0x000000FF] ^ + $dt3[$state[$l] & 0x000000FF] ^ + $dw[++$wc]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // invShiftRows + invSubWord + addRoundKey + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $word = ($state[$i] & 0xFF000000) | + ($state[$j] & 0x00FF0000) | + ($state[$k] & 0x0000FF00) | + ($state[$l] & 0x000000FF); + + $temp[$i] = $dw[$i] ^ ($isbox[$word & 0x000000FF] | + ($isbox[$word >> 8 & 0x000000FF] << 8) | + ($isbox[$word >> 16 & 0x000000FF] << 16) | + ($isbox[$word >> 24 & 0x000000FF] << 24)); + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Setup the key (expansion) + * + * @see \phpseclib\Crypt\Base::_setupKey() + * @access private + */ + function _setupKey() + { + // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. + // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse + static $rcon = array(0, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, + 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, + 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, + 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, + 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 + ); + + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size); + + $this->Nk = $this->key_length >> 2; + // see Rijndael-ammended.pdf#page=44 + $this->Nr = max($this->Nk, $this->Nb) + 6; + + // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, + // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" + // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, + // "Table 2: Shift offsets for different block lengths" + switch ($this->Nb) { + case 4: + case 5: + case 6: + $this->c = array(0, 1, 2, 3); + break; + case 7: + $this->c = array(0, 1, 2, 4); + break; + case 8: + $this->c = array(0, 1, 3, 4); + } + + $w = array_values(unpack('N*words', $this->key)); + + $length = $this->Nb * ($this->Nr + 1); + for ($i = $this->Nk; $i < $length; $i++) { + $temp = $w[$i - 1]; + if ($i % $this->Nk == 0) { + // according to , "the size of an integer is platform-dependent". + // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, + // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' + // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. + $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord + $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk]; + } elseif ($this->Nk > 6 && $i % $this->Nk == 4) { + $temp = $this->_subWord($temp); + } + $w[$i] = $w[$i - $this->Nk] ^ $temp; + } + + // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns + // and generate the inverse key schedule. more specifically, + // according to (section 5.3.3), + // "The key expansion for the Inverse Cipher is defined as follows: + // 1. Apply the Key Expansion. + // 2. Apply InvMixColumn to all Round Keys except the first and the last one." + // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" + list($dt0, $dt1, $dt2, $dt3) = $this->_getInvTables(); + $temp = $this->w = $this->dw = array(); + for ($i = $row = $col = 0; $i < $length; $i++, $col++) { + if ($col == $this->Nb) { + if ($row == 0) { + $this->dw[0] = $this->w[0]; + } else { + // subWord + invMixColumn + invSubWord = invMixColumn + $j = 0; + while ($j < $this->Nb) { + $dw = $this->_subWord($this->w[$row][$j]); + $temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^ + $dt1[$dw >> 16 & 0x000000FF] ^ + $dt2[$dw >> 8 & 0x000000FF] ^ + $dt3[$dw & 0x000000FF]; + $j++; + } + $this->dw[$row] = $temp; + } + + $col = 0; + $row++; + } + $this->w[$row][$col] = $w[$i]; + } + + $this->dw[$row] = $this->w[$row]; + + // Converting to 1-dim key arrays (both ascending) + $this->dw = array_reverse($this->dw); + $w = array_pop($this->w); + $dw = array_pop($this->dw); + foreach ($this->w as $r => $wr) { + foreach ($wr as $c => $wc) { + $w[] = $wc; + $dw[] = $this->dw[$r][$c]; + } + } + $this->w = $w; + $this->dw = $dw; + } + + /** + * Performs S-Box substitutions + * + * @access private + * @param int $word + */ + function _subWord($word) + { + static $sbox; + if (empty($sbox)) { + list(, , , , $sbox) = $this->_getTables(); + } + + return $sbox[$word & 0x000000FF] | + ($sbox[$word >> 8 & 0x000000FF] << 8) | + ($sbox[$word >> 16 & 0x000000FF] << 16) | + ($sbox[$word >> 24 & 0x000000FF] << 24); + } + + /** + * Provides the mixColumns and sboxes tables + * + * @see self::_encryptBlock() + * @see self::_setupInlineCrypt() + * @see self::_subWord() + * @access private + * @return array &$tables + */ + function &_getTables() + { + static $tables; + if (empty($tables)) { + // according to (section 5.2.1), + // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so + // those are the names we'll use. + $t3 = array_map('intval', array( + // with array_map('intval', ...) we ensure we have only int's and not + // some slower floats converted by php automatically on high values + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, + 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, + 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, + 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, + 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, + 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, + 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, + 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, + 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, + 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, + 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, + 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, + 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, + 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, + 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, + 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, + 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, + 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, + 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, + 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, + 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, + 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, + 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, + 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, + 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, + 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, + 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, + 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, + 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, + 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C + )); + + foreach ($t3 as $t3i) { + $t0[] = (($t3i << 24) & 0xFF000000) | (($t3i >> 8) & 0x00FFFFFF); + $t1[] = (($t3i << 16) & 0xFFFF0000) | (($t3i >> 16) & 0x0000FFFF); + $t2[] = (($t3i << 8) & 0xFFFFFF00) | (($t3i >> 24) & 0x000000FF); + } + + $tables = array( + // The Precomputed mixColumns tables t0 - t3 + $t0, + $t1, + $t2, + $t3, + // The SubByte S-Box + array( + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 + ) + ); + } + return $tables; + } + + /** + * Provides the inverse mixColumns and inverse sboxes tables + * + * @see self::_decryptBlock() + * @see self::_setupInlineCrypt() + * @see self::_setupKey() + * @access private + * @return array &$tables + */ + function &_getInvTables() + { + static $tables; + if (empty($tables)) { + $dt3 = array_map('intval', array( + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, + 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, + 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, + 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, + 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, + 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, + 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, + 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, + 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, + 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, + 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, + 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, + 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, + 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, + 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, + 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, + 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, + 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, + 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, + 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, + 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, + 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, + 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, + 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, + 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, + 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, + 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, + 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, + 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, + 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 + )); + + foreach ($dt3 as $dt3i) { + $dt0[] = (($dt3i << 24) & 0xFF000000) | (($dt3i >> 8) & 0x00FFFFFF); + $dt1[] = (($dt3i << 16) & 0xFFFF0000) | (($dt3i >> 16) & 0x0000FFFF); + $dt2[] = (($dt3i << 8) & 0xFFFFFF00) | (($dt3i >> 24) & 0x000000FF); + }; + + $tables = array( + // The Precomputed inverse mixColumns tables dt0 - dt3 + $dt0, + $dt1, + $dt2, + $dt3, + // The inverse SubByte S-Box + array( + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D + ) + ); + } + return $tables; + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see \phpseclib\Crypt\Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + // Note: _setupInlineCrypt() will be called only if $this->changed === true + // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt(). + // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible. + + $lambda_functions =& self::_getLambdaFunctions(); + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // (Currently, for Crypt_Rijndael/AES, one generated $lambda_function cost on php5.5@32bit ~80kb unfreeable mem and ~130kb on php5.5@64bit) + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a uniqe hash for our generated code + $code_hash = "Crypt_Rijndael, {$this->mode}, {$this->Nr}, {$this->Nb}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + // The hi-optimized $lambda_functions will use the key-words hardcoded for better performance. + $w = $this->w; + $dw = $this->dw; + $init_encrypt = ''; + $init_decrypt = ''; + break; + default: + for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) { + $w[] = '$w[' . $i . ']'; + $dw[] = '$dw[' . $i . ']'; + } + $init_encrypt = '$w = $self->w;'; + $init_decrypt = '$dw = $self->dw;'; + } + + $Nr = $this->Nr; + $Nb = $this->Nb; + $c = $this->c; + + // Generating encrypt code: + $init_encrypt.= ' + static $tables; + if (empty($tables)) { + $tables = &$self->_getTables(); + } + $t0 = $tables[0]; + $t1 = $tables[1]; + $t2 = $tables[2]; + $t3 = $tables[3]; + $sbox = $tables[4]; + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $encrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $t0[($'.$s.$i .' >> 24) & 0xff] ^ + $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^ + $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^ + $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^ + '.$w[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $sbox[ $'.$e.$i.' & 0xff] | + ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $encrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= ', + ($'.$e.$i .' & '.((int)0xFF000000).') ^ + ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000 ) ^ + ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00 ) ^ + ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF ) ^ + '.$w[$i]."\n"; + } + $encrypt_block .= ');'; + + // Generating decrypt code: + $init_decrypt.= ' + static $invtables; + if (empty($invtables)) { + $invtables = &$self->_getInvTables(); + } + $dt0 = $invtables[0]; + $dt1 = $invtables[1]; + $dt2 = $invtables[2]; + $dt3 = $invtables[3]; + $isbox = $invtables[4]; + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $decrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $dt0[($'.$s.$i .' >> 24) & 0xff] ^ + $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^ + $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^ + $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^ + '.$dw[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $isbox[ $'.$e.$i.' & 0xff] | + ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $decrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= ', + ($'.$e.$i. ' & '.((int)0xFF000000).') ^ + ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000 ) ^ + ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00 ) ^ + ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF ) ^ + '.$dw[$i]."\n"; + } + $decrypt_block .= ');'; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => '', + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php new file mode 100644 index 0000000..e7f6646 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php @@ -0,0 +1,3787 @@ +> and << cannot be used, nor can the modulo operator %, + * which only supports integers. Although this fact will slow this library down, the fact that such a high + * base is being used should more than compensate. + * + * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie. + * (new \phpseclib\Math\BigInteger(pow(2, 26)))->value = array(0, 1) + * + * Useful resources are as follows: + * + * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)} + * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)} + * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip + * + * Here's an example of how to use this library: + * + * add($b); + * + * echo $c->toString(); // outputs 5 + * ?> + * + * + * @category Math + * @package BigInteger + * @author Jim Wigginton + * @copyright 2006 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +namespace phpseclib\Math; + +use phpseclib\Crypt\Random; + +/** + * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 + * numbers. + * + * @package BigInteger + * @author Jim Wigginton + * @access public + */ +class BigInteger +{ + /**#@+ + * Reduction constants + * + * @access private + * @see BigInteger::_reduce() + */ + /** + * @see BigInteger::_montgomery() + * @see BigInteger::_prepMontgomery() + */ + const MONTGOMERY = 0; + /** + * @see BigInteger::_barrett() + */ + const BARRETT = 1; + /** + * @see BigInteger::_mod2() + */ + const POWEROF2 = 2; + /** + * @see BigInteger::_remainder() + */ + const CLASSIC = 3; + /** + * @see BigInteger::__clone() + */ + const NONE = 4; + /**#@-*/ + + /**#@+ + * Array constants + * + * Rather than create a thousands and thousands of new BigInteger objects in repeated function calls to add() and + * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. + * + * @access private + */ + /** + * $result[self::VALUE] contains the value. + */ + const VALUE = 0; + /** + * $result[self::SIGN] contains the sign. + */ + const SIGN = 1; + /**#@-*/ + + /**#@+ + * @access private + * @see BigInteger::_montgomery() + * @see BigInteger::_barrett() + */ + /** + * Cache constants + * + * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. + */ + const VARIABLE = 0; + /** + * $cache[self::DATA] contains the cached data. + */ + const DATA = 1; + /**#@-*/ + + /**#@+ + * Mode constants. + * + * @access private + * @see BigInteger::__construct() + */ + /** + * To use the pure-PHP implementation + */ + const MODE_INTERNAL = 1; + /** + * To use the BCMath library + * + * (if enabled; otherwise, the internal implementation will be used) + */ + const MODE_BCMATH = 2; + /** + * To use the GMP library + * + * (if present; otherwise, either the BCMath or the internal implementation will be used) + */ + const MODE_GMP = 3; + /**#@-*/ + + /** + * Karatsuba Cutoff + * + * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? + * + * @access private + */ + const KARATSUBA_CUTOFF = 25; + + /**#@+ + * Static properties used by the pure-PHP implementation. + * + * @see __construct() + */ + protected static $base; + protected static $baseFull; + protected static $maxDigit; + protected static $msb; + + /** + * $max10 in greatest $max10Len satisfying + * $max10 = 10**$max10Len <= 2**$base. + */ + protected static $max10; + + /** + * $max10Len in greatest $max10Len satisfying + * $max10 = 10**$max10Len <= 2**$base. + */ + protected static $max10Len; + protected static $maxDigit2; + /**#@-*/ + + /** + * Holds the BigInteger's value. + * + * @var array + * @access private + */ + var $value; + + /** + * Holds the BigInteger's magnitude. + * + * @var bool + * @access private + */ + var $is_negative = false; + + /** + * Precision + * + * @see self::setPrecision() + * @access private + */ + var $precision = -1; + + /** + * Precision Bitmask + * + * @see self::setPrecision() + * @access private + */ + var $bitmask = false; + + /** + * Mode independent value used for serialization. + * + * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for + * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value, + * however, $this->hex is only calculated when $this->__sleep() is called. + * + * @see self::__sleep() + * @see self::__wakeup() + * @var string + * @access private + */ + var $hex; + + /** + * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. + * + * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using + * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @param $x base-10 number or base-$base number if $base set. + * @param int $base + * @return \phpseclib\Math\BigInteger + * @access public + */ + function __construct($x = 0, $base = 10) + { + if (!defined('MATH_BIGINTEGER_MODE')) { + switch (true) { + case extension_loaded('gmp'): + define('MATH_BIGINTEGER_MODE', self::MODE_GMP); + break; + case extension_loaded('bcmath'): + define('MATH_BIGINTEGER_MODE', self::MODE_BCMATH); + break; + default: + define('MATH_BIGINTEGER_MODE', self::MODE_INTERNAL); + } + } + + if (extension_loaded('openssl') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + $versions = array(); + + // avoid generating errors (even with suppression) when phpinfo() is disabled (common in production systems) + if (strpos(ini_get('disable_functions'), 'phpinfo') === false) { + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0: + define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); + break; + default: + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + } + + if (!defined('PHP_INT_SIZE')) { + define('PHP_INT_SIZE', 4); + } + + if (empty(self::$base) && MATH_BIGINTEGER_MODE == self::MODE_INTERNAL) { + switch (PHP_INT_SIZE) { + case 8: // use 64-bit integers if int size is 8 bytes + self::$base = 31; + self::$baseFull = 0x80000000; + self::$maxDigit = 0x7FFFFFFF; + self::$msb = 0x40000000; + self::$max10 = 1000000000; + self::$max10Len = 9; + self::$maxDigit2 = pow(2, 62); + break; + //case 4: // use 64-bit floats if int size is 4 bytes + default: + self::$base = 26; + self::$baseFull = 0x4000000; + self::$maxDigit = 0x3FFFFFF; + self::$msb = 0x2000000; + self::$max10 = 10000000; + self::$max10Len = 7; + self::$maxDigit2 = pow(2, 52); // pow() prevents truncation + } + } + + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + switch (true) { + case is_resource($x) && get_resource_type($x) == 'GMP integer': + // PHP 5.6 switched GMP from using resources to objects + case $x instanceof \GMP: + $this->value = $x; + return; + } + $this->value = gmp_init(0); + break; + case self::MODE_BCMATH: + $this->value = '0'; + break; + default: + $this->value = array(); + } + + // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 + // '0' is the only value like this per http://php.net/empty + if (empty($x) && (abs($base) != 256 || $x !== '0')) { + return; + } + + switch ($base) { + case -256: + if (ord($x[0]) & 0x80) { + $x = ~$x; + $this->is_negative = true; + } + case 256: + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $this->value = function_exists('gmp_import') ? + gmp_import($x) : + gmp_init('0x' . bin2hex($x)); + if ($this->is_negative) { + $this->value = gmp_neg($this->value); + } + break; + case self::MODE_BCMATH: + // round $len to the nearest 4 (thanks, DavidMJ!) + $len = (strlen($x) + 3) & 0xFFFFFFFC; + + $x = str_pad($x, $len, chr(0), STR_PAD_LEFT); + + for ($i = 0; $i < $len; $i+= 4) { + $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 + $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0); + } + + if ($this->is_negative) { + $this->value = '-' . $this->value; + } + + break; + // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb) + default: + while (strlen($x)) { + $this->value[] = $this->_bytes2int($this->_base256_rshift($x, self::$base)); + } + } + + if ($this->is_negative) { + if (MATH_BIGINTEGER_MODE != self::MODE_INTERNAL) { + $this->is_negative = false; + } + $temp = $this->add(new static('-1')); + $this->value = $temp->value; + } + break; + case 16: + case -16: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x); + + $is_negative = false; + if ($base < 0 && hexdec($x[0]) >= 8) { + $this->is_negative = $is_negative = true; + $x = bin2hex(~pack('H*', $x)); + } + + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = $this->is_negative ? '-0x' . $x : '0x' . $x; + $this->value = gmp_init($temp); + $this->is_negative = false; + break; + case self::MODE_BCMATH: + $x = (strlen($x) & 1) ? '0' . $x : $x; + $temp = new static(pack('H*', $x), 256); + $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; + $this->is_negative = false; + break; + default: + $x = (strlen($x) & 1) ? '0' . $x : $x; + $temp = new static(pack('H*', $x), 256); + $this->value = $temp->value; + } + + if ($is_negative) { + $temp = $this->add(new static('-1')); + $this->value = $temp->value; + } + break; + case 10: + case -10: + // (?value = gmp_init($x); + break; + case self::MODE_BCMATH: + // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different + // results then doing it on '-1' does (modInverse does $x[0]) + $this->value = $x === '-' ? '0' : (string) $x; + break; + default: + $temp = new static(); + + $multiplier = new static(); + $multiplier->value = array(self::$max10); + + if ($x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = str_pad($x, strlen($x) + ((self::$max10Len - 1) * strlen($x)) % self::$max10Len, 0, STR_PAD_LEFT); + while (strlen($x)) { + $temp = $temp->multiply($multiplier); + $temp = $temp->add(new static($this->_int2bytes(substr($x, 0, self::$max10Len)), 256)); + $x = substr($x, self::$max10Len); + } + + $this->value = $temp->value; + } + break; + case 2: // base-2 support originally implemented by Lluis Pamies - thanks! + case -2: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^([01]*).*#', '$1', $x); + $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT); + + $str = '0x'; + while (strlen($x)) { + $part = substr($x, 0, 4); + $str.= dechex(bindec($part)); + $x = substr($x, 4); + } + + if ($this->is_negative) { + $str = '-' . $str; + } + + $temp = new static($str, 8 * $base); // ie. either -16 or +16 + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + + break; + default: + // base not supported, so we'll let $this == 0 + } + } + + /** + * Converts a BigInteger to a byte string (eg. base-256). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBytes(); // outputs chr(65) + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toBytes($twos_compliment = false) + { + if ($twos_compliment) { + $comparison = $this->compare(new static()); + if ($comparison == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $temp = $comparison < 0 ? $this->add(new static(1)) : $this->copy(); + $bytes = $temp->toBytes(); + + if (!strlen($bytes)) { // eg. if the number we're trying to convert is -1 + $bytes = chr(0); + } + + if ($this->precision <= 0 && (ord($bytes[0]) & 0x80)) { + $bytes = chr(0) . $bytes; + } + + return $comparison < 0 ? ~$bytes : $bytes; + } + + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + if (gmp_cmp($this->value, gmp_init(0)) == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + if (function_exists('gmp_export')) { + $temp = gmp_export($this->value); + } else { + $temp = gmp_strval(gmp_abs($this->value), 16); + $temp = (strlen($temp) & 1) ? '0' . $temp : $temp; + $temp = pack('H*', $temp); + } + + return $this->precision > 0 ? + substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($temp, chr(0)); + case self::MODE_BCMATH: + if ($this->value === '0') { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $value = ''; + $current = $this->value; + + if ($current[0] == '-') { + $current = substr($current, 1); + } + + while (bccomp($current, '0', 0) > 0) { + $temp = bcmod($current, '16777216'); + $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; + $current = bcdiv($current, '16777216', 0); + } + + return $this->precision > 0 ? + substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($value, chr(0)); + } + + if (!count($this->value)) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + $result = $this->_int2bytes($this->value[count($this->value) - 1]); + + $temp = $this->copy(); + + for ($i = count($temp->value) - 2; $i >= 0; --$i) { + $temp->_base256_lshift($result, self::$base); + $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT); + } + + return $this->precision > 0 ? + str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) : + $result; + } + + /** + * Converts a BigInteger to a hex string (eg. base-16)). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toHex(); // outputs '41' + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toHex($twos_compliment = false) + { + return bin2hex($this->toBytes($twos_compliment)); + } + + /** + * Converts a BigInteger to a bit string (eg. base-2). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBits(); // outputs '1000001' + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**2 + */ + function toBits($twos_compliment = false) + { + $hex = $this->toHex($twos_compliment); + $bits = ''; + for ($i = strlen($hex) - 8, $start = strlen($hex) & 7; $i >= $start; $i-=8) { + $bits = str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT) . $bits; + } + if ($start) { // hexdec('') == 0 + $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8, '0', STR_PAD_LEFT) . $bits; + } + $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); + + if ($twos_compliment && $this->compare(new static()) > 0 && $this->precision <= 0) { + return '0' . $result; + } + + return $result; + } + + /** + * Converts a BigInteger to a base-10 number. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @return string + * @access public + * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10) + */ + function toString() + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + return gmp_strval($this->value); + case self::MODE_BCMATH: + if ($this->value === '0') { + return '0'; + } + + return ltrim($this->value, '0'); + } + + if (!count($this->value)) { + return '0'; + } + + $temp = $this->copy(); + $temp->bitmask = false; + $temp->is_negative = false; + + $divisor = new static(); + $divisor->value = array(self::$max10); + $result = ''; + while (count($temp->value)) { + list($temp, $mod) = $temp->divide($divisor); + $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', self::$max10Len, '0', STR_PAD_LEFT) . $result; + } + $result = ltrim($result, '0'); + if (empty($result)) { + $result = '0'; + } + + if ($this->is_negative) { + $result = '-' . $result; + } + + return $result; + } + + /** + * Copy an object + * + * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee + * that all objects are passed by value, when appropriate. More information can be found here: + * + * {@link http://php.net/language.oop5.basic#51624} + * + * @access public + * @see self::__clone() + * @return \phpseclib\Math\BigInteger + */ + function copy() + { + $temp = new static(); + $temp->value = $this->value; + $temp->is_negative = $this->is_negative; + $temp->precision = $this->precision; + $temp->bitmask = $this->bitmask; + return $temp; + } + + /** + * __toString() magic method + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * toString(). + * + * @access public + * @internal Implemented per a suggestion by Techie-Michael - thanks! + */ + function __toString() + { + return $this->toString(); + } + + /** + * __clone() magic method + * + * Although you can call BigInteger::__toString() directly in PHP5, you cannot call BigInteger::__clone() directly + * in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5 + * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and + * PHP5, call BigInteger::copy(), instead. + * + * @access public + * @see self::copy() + * @return \phpseclib\Math\BigInteger + */ + function __clone() + { + return $this->copy(); + } + + /** + * __sleep() magic method + * + * Will be called, automatically, when serialize() is called on a BigInteger object. + * + * @see self::__wakeup() + * @access public + */ + function __sleep() + { + $this->hex = $this->toHex(true); + $vars = array('hex'); + if ($this->precision > 0) { + $vars[] = 'precision'; + } + return $vars; + } + + /** + * __wakeup() magic method + * + * Will be called, automatically, when unserialize() is called on a BigInteger object. + * + * @see self::__sleep() + * @access public + */ + function __wakeup() + { + $temp = new static($this->hex, -16); + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + if ($this->precision > 0) { + // recalculate $this->bitmask + $this->setPrecision($this->precision); + } + } + + /** + * __debugInfo() magic method + * + * Will be called, automatically, when print_r() or var_dump() are called + * + * @access public + */ + function __debugInfo() + { + $opts = array(); + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $engine = 'gmp'; + break; + case self::MODE_BCMATH: + $engine = 'bcmath'; + break; + case self::MODE_INTERNAL: + $engine = 'internal'; + $opts[] = PHP_INT_SIZE == 8 ? '64-bit' : '32-bit'; + } + if (MATH_BIGINTEGER_MODE != self::MODE_GMP && defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + $opts[] = 'OpenSSL'; + } + if (!empty($opts)) { + $engine.= ' (' . implode('.', $opts) . ')'; + } + return array( + 'value' => '0x' . $this->toHex(true), + 'engine' => $engine + ); + } + + /** + * Adds two BigIntegers. + * + * Here's an example: + * + * add($b); + * + * echo $c->toString(); // outputs 30 + * ?> + * + * + * @param \phpseclib\Math\BigInteger $y + * @return \phpseclib\Math\BigInteger + * @access public + * @internal Performs base-2**52 addition + */ + function add($y) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = new static(); + $temp->value = gmp_add($this->value, $y->value); + + return $this->_normalize($temp); + case self::MODE_BCMATH: + $temp = new static(); + $temp->value = bcadd($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new static(); + $result->value = $temp[self::VALUE]; + $result->is_negative = $temp[self::SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs addition. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _add($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + self::VALUE => $y_value, + self::SIGN => $y_negative + ); + } elseif ($y_size == 0) { + return array( + self::VALUE => $x_value, + self::SIGN => $x_negative + ); + } + + // subtract, if appropriate + if ($x_negative != $y_negative) { + if ($x_value == $y_value) { + return array( + self::VALUE => array(), + self::SIGN => false + ); + } + + $temp = $this->_subtract($x_value, false, $y_value, false); + $temp[self::SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ? + $x_negative : $y_negative; + + return $temp; + } + + if ($x_size < $y_size) { + $size = $x_size; + $value = $y_value; + } else { + $size = $y_size; + $value = $x_value; + } + + $value[count($value)] = 0; // just in case the carry adds an extra digit + + $carry = 0; + for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) { + $sum = $x_value[$j] * self::$baseFull + $x_value[$i] + $y_value[$j] * self::$baseFull + $y_value[$i] + $carry; + $carry = $sum >= self::$maxDigit2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum - self::$maxDigit2 : $sum; + + $temp = self::$base === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $value[$i] = (int) ($sum - self::$baseFull * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) + $value[$j] = $temp; + } + + if ($j == $size) { // ie. if $y_size is odd + $sum = $x_value[$i] + $y_value[$i] + $carry; + $carry = $sum >= self::$baseFull; + $value[$i] = $carry ? $sum - self::$baseFull : $sum; + ++$i; // ie. let $i = $j since we've just done $value[$i] + } + + if ($carry) { + for (; $value[$i] == self::$maxDigit; ++$i) { + $value[$i] = 0; + } + ++$value[$i]; + } + + return array( + self::VALUE => $this->_trim($value), + self::SIGN => $x_negative + ); + } + + /** + * Subtracts two BigIntegers. + * + * Here's an example: + * + * subtract($b); + * + * echo $c->toString(); // outputs -10 + * ?> + * + * + * @param \phpseclib\Math\BigInteger $y + * @return \phpseclib\Math\BigInteger + * @access public + * @internal Performs base-2**52 subtraction + */ + function subtract($y) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = new static(); + $temp->value = gmp_sub($this->value, $y->value); + + return $this->_normalize($temp); + case self::MODE_BCMATH: + $temp = new static(); + $temp->value = bcsub($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new static(); + $result->value = $temp[self::VALUE]; + $result->is_negative = $temp[self::SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs subtraction. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _subtract($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + self::VALUE => $y_value, + self::SIGN => !$y_negative + ); + } elseif ($y_size == 0) { + return array( + self::VALUE => $x_value, + self::SIGN => $x_negative + ); + } + + // add, if appropriate (ie. -$x - +$y or +$x - -$y) + if ($x_negative != $y_negative) { + $temp = $this->_add($x_value, false, $y_value, false); + $temp[self::SIGN] = $x_negative; + + return $temp; + } + + $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative); + + if (!$diff) { + return array( + self::VALUE => array(), + self::SIGN => false + ); + } + + // switch $x and $y around, if appropriate. + if ((!$x_negative && $diff < 0) || ($x_negative && $diff > 0)) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_negative = !$x_negative; + + $x_size = count($x_value); + $y_size = count($y_value); + } + + // at this point, $x_value should be at least as big as - if not bigger than - $y_value + + $carry = 0; + for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) { + $sum = $x_value[$j] * self::$baseFull + $x_value[$i] - $y_value[$j] * self::$baseFull - $y_value[$i] - $carry; + $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum + self::$maxDigit2 : $sum; + + $temp = self::$base === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $x_value[$i] = (int) ($sum - self::$baseFull * $temp); + $x_value[$j] = $temp; + } + + if ($j == $y_size) { // ie. if $y_size is odd + $sum = $x_value[$i] - $y_value[$i] - $carry; + $carry = $sum < 0; + $x_value[$i] = $carry ? $sum + self::$baseFull : $sum; + ++$i; + } + + if ($carry) { + for (; !$x_value[$i]; ++$i) { + $x_value[$i] = self::$maxDigit; + } + --$x_value[$i]; + } + + return array( + self::VALUE => $this->_trim($x_value), + self::SIGN => $x_negative + ); + } + + /** + * Multiplies two BigIntegers + * + * Here's an example: + * + * multiply($b); + * + * echo $c->toString(); // outputs 200 + * ?> + * + * + * @param \phpseclib\Math\BigInteger $x + * @return \phpseclib\Math\BigInteger + * @access public + */ + function multiply($x) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = new static(); + $temp->value = gmp_mul($this->value, $x->value); + + return $this->_normalize($temp); + case self::MODE_BCMATH: + $temp = new static(); + $temp->value = bcmul($this->value, $x->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative); + + $product = new static(); + $product->value = $temp[self::VALUE]; + $product->is_negative = $temp[self::SIGN]; + + return $this->_normalize($product); + } + + /** + * Performs multiplication. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _multiply($x_value, $x_negative, $y_value, $y_negative) + { + //if ( $x_value == $y_value ) { + // return array( + // self::VALUE => $this->_square($x_value), + // self::SIGN => $x_sign != $y_value + // ); + //} + + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array( + self::VALUE => array(), + self::SIGN => false + ); + } + + return array( + self::VALUE => min($x_length, $y_length) < 2 * self::KARATSUBA_CUTOFF ? + $this->_trim($this->_regularMultiply($x_value, $y_value)) : + $this->_trim($this->_karatsuba($x_value, $y_value)), + self::SIGN => $x_negative != $y_negative + ); + } + + /** + * Performs long multiplication on two BigIntegers + * + * Modeled after 'multiply' in MutableBigInteger.java. + * + * @param array $x_value + * @param array $y_value + * @return array + * @access private + */ + function _regularMultiply($x_value, $y_value) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array(); + } + + if ($x_length < $y_length) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - self::$baseFull * $carry); + } + + $product_value[$j] = $carry; + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - self::$baseFull * $carry); + } + + $product_value[$k] = $carry; + } + + return $product_value; + } + + /** + * Performs Karatsuba multiplication on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. + * + * @param array $x_value + * @param array $y_value + * @return array + * @access private + */ + function _karatsuba($x_value, $y_value) + { + $m = min(count($x_value) >> 1, count($y_value) >> 1); + + if ($m < self::KARATSUBA_CUTOFF) { + return $this->_regularMultiply($x_value, $y_value); + } + + $x1 = array_slice($x_value, $m); + $x0 = array_slice($x_value, 0, $m); + $y1 = array_slice($y_value, $m); + $y0 = array_slice($y_value, 0, $m); + + $z2 = $this->_karatsuba($x1, $y1); + $z0 = $this->_karatsuba($x0, $y0); + + $z1 = $this->_add($x1, false, $x0, false); + $temp = $this->_add($y1, false, $y0, false); + $z1 = $this->_karatsuba($z1[self::VALUE], $temp[self::VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[self::VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[self::VALUE] = array_merge(array_fill(0, $m, 0), $z1[self::VALUE]); + + $xy = $this->_add($z2, false, $z1[self::VALUE], $z1[self::SIGN]); + $xy = $this->_add($xy[self::VALUE], $xy[self::SIGN], $z0, false); + + return $xy[self::VALUE]; + } + + /** + * Performs squaring + * + * @param array $x + * @return array + * @access private + */ + function _square($x = false) + { + return count($x) < 2 * self::KARATSUBA_CUTOFF ? + $this->_trim($this->_baseSquare($x)) : + $this->_trim($this->_karatsubaSquare($x)); + } + + /** + * Performs traditional squaring on two BigIntegers + * + * Squaring can be done faster than multiplying a number by itself can be. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. + * + * @param array $value + * @return array + * @access private + */ + function _baseSquare($value) + { + if (empty($value)) { + return array(); + } + $square_value = $this->_array_repeat(0, 2 * count($value)); + + for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { + $i2 = $i << 1; + + $temp = $square_value[$i2] + $value[$i] * $value[$i]; + $carry = self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$i2] = (int) ($temp - self::$baseFull * $carry); + + // note how we start from $i+1 instead of 0 as we do in multiplication. + for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { + $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; + $carry = self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$k] = (int) ($temp - self::$baseFull * $carry); + } + + // the following line can yield values larger 2**15. at this point, PHP should switch + // over to floats. + $square_value[$i + $max_index + 1] = $carry; + } + + return $square_value; + } + + /** + * Performs Karatsuba "squaring" on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. + * + * @param array $value + * @return array + * @access private + */ + function _karatsubaSquare($value) + { + $m = count($value) >> 1; + + if ($m < self::KARATSUBA_CUTOFF) { + return $this->_baseSquare($value); + } + + $x1 = array_slice($value, $m); + $x0 = array_slice($value, 0, $m); + + $z2 = $this->_karatsubaSquare($x1); + $z0 = $this->_karatsubaSquare($x0); + + $z1 = $this->_add($x1, false, $x0, false); + $z1 = $this->_karatsubaSquare($z1[self::VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[self::VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[self::VALUE] = array_merge(array_fill(0, $m, 0), $z1[self::VALUE]); + + $xx = $this->_add($z2, false, $z1[self::VALUE], $z1[self::SIGN]); + $xx = $this->_add($xx[self::VALUE], $xx[self::SIGN], $z0, false); + + return $xx[self::VALUE]; + } + + /** + * Divides two BigIntegers. + * + * Returns an array whose first element contains the quotient and whose second element contains the + * "common residue". If the remainder would be positive, the "common residue" and the remainder are the + * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder + * and the divisor (basically, the "common residue" is the first positive modulo). + * + * Here's an example: + * + * divide($b); + * + * echo $quotient->toString(); // outputs 0 + * echo "\r\n"; + * echo $remainder->toString(); // outputs 10 + * ?> + * + * + * @param \phpseclib\Math\BigInteger $y + * @return array + * @access public + * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. + */ + function divide($y) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $quotient = new static(); + $remainder = new static(); + + list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); + + if (gmp_sign($remainder->value) < 0) { + $remainder->value = gmp_add($remainder->value, gmp_abs($y->value)); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + case self::MODE_BCMATH: + $quotient = new static(); + $remainder = new static(); + + $quotient->value = bcdiv($this->value, $y->value, 0); + $remainder->value = bcmod($this->value, $y->value); + + if ($remainder->value[0] == '-') { + $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + if (count($y->value) == 1) { + list($q, $r) = $this->_divide_digit($this->value, $y->value[0]); + $quotient = new static(); + $remainder = new static(); + $quotient->value = $q; + $remainder->value = array($r); + $quotient->is_negative = $this->is_negative != $y->is_negative; + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + static $zero; + if (!isset($zero)) { + $zero = new static(); + } + + $x = $this->copy(); + $y = $y->copy(); + + $x_sign = $x->is_negative; + $y_sign = $y->is_negative; + + $x->is_negative = $y->is_negative = false; + + $diff = $x->compare($y); + + if (!$diff) { + $temp = new static(); + $temp->value = array(1); + $temp->is_negative = $x_sign != $y_sign; + return array($this->_normalize($temp), $this->_normalize(new static())); + } + + if ($diff < 0) { + // if $x is negative, "add" $y. + if ($x_sign) { + $x = $y->subtract($x); + } + return array($this->_normalize(new static()), $this->_normalize($x)); + } + + // normalize $x and $y as described in HAC 14.23 / 14.24 + $msb = $y->value[count($y->value) - 1]; + for ($shift = 0; !($msb & self::$msb); ++$shift) { + $msb <<= 1; + } + $x->_lshift($shift); + $y->_lshift($shift); + $y_value = &$y->value; + + $x_max = count($x->value) - 1; + $y_max = count($y->value) - 1; + + $quotient = new static(); + $quotient_value = &$quotient->value; + $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1); + + static $temp, $lhs, $rhs; + if (!isset($temp)) { + $temp = new static(); + $lhs = new static(); + $rhs = new static(); + } + $temp_value = &$temp->value; + $rhs_value = &$rhs->value; + + // $temp = $y << ($x_max - $y_max-1) in base 2**26 + $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value); + + while ($x->compare($temp) >= 0) { + // calculate the "common residue" + ++$quotient_value[$x_max - $y_max]; + $x = $x->subtract($temp); + $x_max = count($x->value) - 1; + } + + for ($i = $x_max; $i >= $y_max + 1; --$i) { + $x_value = &$x->value; + $x_window = array( + isset($x_value[$i]) ? $x_value[$i] : 0, + isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, + isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 + ); + $y_window = array( + $y_value[$y_max], + ($y_max > 0) ? $y_value[$y_max - 1] : 0 + ); + + $q_index = $i - $y_max - 1; + if ($x_window[0] == $y_window[0]) { + $quotient_value[$q_index] = self::$maxDigit; + } else { + $quotient_value[$q_index] = $this->_safe_divide( + $x_window[0] * self::$baseFull + $x_window[1], + $y_window[0] + ); + } + + $temp_value = array($y_window[1], $y_window[0]); + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + + $rhs_value = array($x_window[2], $x_window[1], $x_window[0]); + + while ($lhs->compare($rhs) > 0) { + --$quotient_value[$q_index]; + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + } + + $adjust = $this->_array_repeat(0, $q_index); + $temp_value = array($quotient_value[$q_index]); + $temp = $temp->multiply($y); + $temp_value = &$temp->value; + if (count($temp_value)) { + $temp_value = array_merge($adjust, $temp_value); + } + + $x = $x->subtract($temp); + + if ($x->compare($zero) < 0) { + $temp_value = array_merge($adjust, $y_value); + $x = $x->add($temp); + + --$quotient_value[$q_index]; + } + + $x_max = count($x_value) - 1; + } + + // unnormalize the remainder + $x->_rshift($shift); + + $quotient->is_negative = $x_sign != $y_sign; + + // calculate the "common residue", if appropriate + if ($x_sign) { + $y->_rshift($shift); + $x = $y->subtract($x); + } + + return array($this->_normalize($quotient), $this->_normalize($x)); + } + + /** + * Divides a BigInteger by a regular integer + * + * abc / x = a00 / x + b0 / x + c / x + * + * @param array $dividend + * @param array $divisor + * @return array + * @access private + */ + function _divide_digit($dividend, $divisor) + { + $carry = 0; + $result = array(); + + for ($i = count($dividend) - 1; $i >= 0; --$i) { + $temp = self::$baseFull * $carry + $dividend[$i]; + $result[$i] = $this->_safe_divide($temp, $divisor); + $carry = (int) ($temp - $divisor * $result[$i]); + } + + return array($result, $carry); + } + + /** + * Performs modular exponentiation. + * + * Here's an example: + * + * modPow($b, $c); + * + * echo $c->toString(); // outputs 10 + * ?> + * + * + * @param \phpseclib\Math\BigInteger $e + * @param \phpseclib\Math\BigInteger $n + * @return \phpseclib\Math\BigInteger + * @access public + * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and + * and although the approach involving repeated squaring does vastly better, it, too, is impractical + * for our purposes. The reason being that division - by far the most complicated and time-consuming + * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. + * + * Modular reductions resolve this issue. Although an individual modular reduction takes more time + * then an individual division, when performed in succession (with the same modulo), they're a lot faster. + * + * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, + * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the + * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because + * the product of two odd numbers is odd), but what about when RSA isn't used? + * + * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a + * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the + * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, + * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and + * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. + * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. + */ + function modPow($e, $n) + { + $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); + + if ($e->compare(new static()) < 0) { + $e = $e->abs(); + + $temp = $this->modInverse($n); + if ($temp === false) { + return false; + } + + return $this->_normalize($temp->modPow($e, $n)); + } + + if (MATH_BIGINTEGER_MODE == self::MODE_GMP) { + $temp = new static(); + $temp->value = gmp_powm($this->value, $e->value, $n->value); + + return $this->_normalize($temp); + } + + if ($this->compare(new static()) < 0 || $this->compare($n) > 0) { + list(, $temp) = $this->divide($n); + return $temp->modPow($e, $n); + } + + if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + $components = array( + 'modulus' => $n->toBytes(true), + 'publicExponent' => $e->toBytes(true) + ); + + $components = array( + 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']), + 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent']) + ); + + $RSAPublicKey = pack( + 'Ca*a*a*', + 48, + $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], + $components['publicExponent'] + ); + + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey; + + $encapsulated = pack( + 'Ca*a*', + 48, + $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), + $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($encapsulated)) . + '-----END PUBLIC KEY-----'; + + $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT); + + if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) { + return new static($result, 256); + } + } + + if (MATH_BIGINTEGER_MODE == self::MODE_BCMATH) { + $temp = new static(); + $temp->value = bcpowmod($this->value, $e->value, $n->value, 0); + + return $this->_normalize($temp); + } + + if (empty($e->value)) { + $temp = new static(); + $temp->value = array(1); + return $this->_normalize($temp); + } + + if ($e->value == array(1)) { + list(, $temp) = $this->divide($n); + return $this->_normalize($temp); + } + + if ($e->value == array(2)) { + $temp = new static(); + $temp->value = $this->_square($this->value); + list(, $temp) = $temp->divide($n); + return $this->_normalize($temp); + } + + return $this->_normalize($this->_slidingWindow($e, $n, self::BARRETT)); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + // is the modulo odd? + if ($n->value[0] & 1) { + return $this->_normalize($this->_slidingWindow($e, $n, self::MONTGOMERY)); + } + // if it's not, it's even + + // find the lowest set bit (eg. the max pow of 2 that divides $n) + for ($i = 0; $i < count($n->value); ++$i) { + if ($n->value[$i]) { + $temp = decbin($n->value[$i]); + $j = strlen($temp) - strrpos($temp, '1') - 1; + $j+= 26 * $i; + break; + } + } + // at this point, 2^$j * $n/(2^$j) == $n + + $mod1 = $n->copy(); + $mod1->_rshift($j); + $mod2 = new static(); + $mod2->value = array(1); + $mod2->_lshift($j); + + $part1 = ($mod1->value != array(1)) ? $this->_slidingWindow($e, $mod1, self::MONTGOMERY) : new static(); + $part2 = $this->_slidingWindow($e, $mod2, self::POWEROF2); + + $y1 = $mod2->modInverse($mod1); + $y2 = $mod1->modInverse($mod2); + + $result = $part1->multiply($mod2); + $result = $result->multiply($y1); + + $temp = $part2->multiply($mod1); + $temp = $temp->multiply($y2); + + $result = $result->add($temp); + list(, $result) = $result->divide($n); + + return $this->_normalize($result); + } + + /** + * Performs modular exponentiation. + * + * Alias for modPow(). + * + * @param \phpseclib\Math\BigInteger $e + * @param \phpseclib\Math\BigInteger $n + * @return \phpseclib\Math\BigInteger + * @access public + */ + function powMod($e, $n) + { + return $this->modPow($e, $n); + } + + /** + * Sliding Window k-ary Modular Exponentiation + * + * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, + * however, this function performs a modular reduction after every multiplication and squaring operation. + * As such, this function has the same preconditions that the reductions being used do. + * + * @param \phpseclib\Math\BigInteger $e + * @param \phpseclib\Math\BigInteger $n + * @param int $mode + * @return \phpseclib\Math\BigInteger + * @access private + */ + function _slidingWindow($e, $n, $mode) + { + static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function + //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1 + + $e_value = $e->value; + $e_length = count($e_value) - 1; + $e_bits = decbin($e_value[$e_length]); + for ($i = $e_length - 1; $i >= 0; --$i) { + $e_bits.= str_pad(decbin($e_value[$i]), self::$base, '0', STR_PAD_LEFT); + } + + $e_length = strlen($e_bits); + + // calculate the appropriate window size. + // $window_size == 3 if $window_ranges is between 25 and 81, for example. + for ($i = 0, $window_size = 1; $i < count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) { + } + + $n_value = $n->value; + + // precompute $this^0 through $this^$window_size + $powers = array(); + $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode); + $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode); + + // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end + // in a 1. ie. it's supposed to be odd. + $temp = 1 << ($window_size - 1); + for ($i = 1; $i < $temp; ++$i) { + $i2 = $i << 1; + $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode); + } + + $result = array(1); + $result = $this->_prepareReduce($result, $n_value, $mode); + + for ($i = 0; $i < $e_length;) { + if (!$e_bits[$i]) { + $result = $this->_squareReduce($result, $n_value, $mode); + ++$i; + } else { + for ($j = $window_size - 1; $j > 0; --$j) { + if (!empty($e_bits[$i + $j])) { + break; + } + } + + // eg. the length of substr($e_bits, $i, $j + 1) + for ($k = 0; $k <= $j; ++$k) { + $result = $this->_squareReduce($result, $n_value, $mode); + } + + $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode); + + $i += $j + 1; + } + } + + $temp = new static(); + $temp->value = $this->_reduce($result, $n_value, $mode); + + return $temp; + } + + /** + * Modular reduction + * + * For most $modes this will return the remainder. + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _reduce($x, $n, $mode) + { + switch ($mode) { + case self::MONTGOMERY: + return $this->_montgomery($x, $n); + case self::BARRETT: + return $this->_barrett($x, $n); + case self::POWEROF2: + $lhs = new static(); + $lhs->value = $x; + $rhs = new static(); + $rhs->value = $n; + return $x->_mod2($n); + case self::CLASSIC: + $lhs = new static(); + $lhs->value = $x; + $rhs = new static(); + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + case self::NONE: + return $x; + default: + // an invalid $mode was provided + } + } + + /** + * Modular reduction preperation + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _prepareReduce($x, $n, $mode) + { + if ($mode == self::MONTGOMERY) { + return $this->_prepMontgomery($x, $n); + } + return $this->_reduce($x, $n, $mode); + } + + /** + * Modular multiply + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $y + * @param array $n + * @param int $mode + * @return array + */ + function _multiplyReduce($x, $y, $n, $mode) + { + if ($mode == self::MONTGOMERY) { + return $this->_montgomeryMultiply($x, $y, $n); + } + $temp = $this->_multiply($x, false, $y, false); + return $this->_reduce($temp[self::VALUE], $n, $mode); + } + + /** + * Modular square + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _squareReduce($x, $n, $mode) + { + if ($mode == self::MONTGOMERY) { + return $this->_montgomeryMultiply($x, $x, $n); + } + return $this->_reduce($this->_square($x), $n, $mode); + } + + /** + * Modulos for Powers of Two + * + * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1), + * we'll just use this function as a wrapper for doing that. + * + * @see self::_slidingWindow() + * @access private + * @param \phpseclib\Math\BigInteger + * @return \phpseclib\Math\BigInteger + */ + function _mod2($n) + { + $temp = new static(); + $temp->value = array(1); + return $this->bitwise_and($n->subtract($temp)); + } + + /** + * Barrett Modular Reduction + * + * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, + * so as not to require negative numbers (initially, this script didn't support negative numbers). + * + * Employs "folding", as described at + * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from + * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." + * + * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that + * usable on account of (1) its not using reasonable radix points as discussed in + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable + * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that + * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line + * comments for details. + * + * @see self::_slidingWindow() + * @access private + * @param array $n + * @param array $m + * @return array + */ + function _barrett($n, $m) + { + static $cache = array( + self::VARIABLE => array(), + self::DATA => array() + ); + + $m_length = count($m); + + // if ($this->_compare($n, $this->_square($m)) >= 0) { + if (count($n) > 2 * $m_length) { + $lhs = new static(); + $rhs = new static(); + $lhs->value = $n; + $rhs->value = $m; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced + if ($m_length < 5) { + return $this->_regularBarrett($n, $m); + } + + // n = 2 * m.length + + if (($key = array_search($m, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); + $cache[self::VARIABLE][] = $m; + + $lhs = new static(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1)); + $lhs_value[] = 1; + $rhs = new static(); + $rhs->value = $m; + + list($u, $m1) = $lhs->divide($rhs); + $u = $u->value; + $m1 = $m1->value; + + $cache[self::DATA][] = array( + 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) + 'm1'=> $m1 // m.length + ); + } else { + extract($cache[self::DATA][$key]); + } + + $cutoff = $m_length + ($m_length >> 1); + $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) + $msd = array_slice($n, $cutoff); // m.length >> 1 + $lsd = $this->_trim($lsd); + $temp = $this->_multiply($msd, false, $m1, false); + $n = $this->_add($lsd, false, $temp[self::VALUE], false); // m.length + (m.length >> 1) + 1 + + if ($m_length & 1) { + return $this->_regularBarrett($n[self::VALUE], $m); + } + + // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 + $temp = array_slice($n[self::VALUE], $m_length - 1); + // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 + // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 + $temp = $this->_multiply($temp, false, $u, false); + // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 + // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + $temp = array_slice($temp[self::VALUE], ($m_length >> 1) + 1); + // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 + // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) + $temp = $this->_multiply($temp, false, $m, false); + + // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit + // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop + // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). + + $result = $this->_subtract($n[self::VALUE], false, $temp[self::VALUE], false); + + while ($this->_compare($result[self::VALUE], $result[self::SIGN], $m, false) >= 0) { + $result = $this->_subtract($result[self::VALUE], $result[self::SIGN], $m, false); + } + + return $result[self::VALUE]; + } + + /** + * (Regular) Barrett Modular Reduction + * + * For numbers with more than four digits BigInteger::_barrett() is faster. The difference between that and this + * is that this function does not fold the denominator into a smaller form. + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _regularBarrett($x, $n) + { + static $cache = array( + self::VARIABLE => array(), + self::DATA => array() + ); + + $n_length = count($n); + + if (count($x) > 2 * $n_length) { + $lhs = new static(); + $rhs = new static(); + $lhs->value = $x; + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + if (($key = array_search($n, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); + $cache[self::VARIABLE][] = $n; + $lhs = new static(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, 2 * $n_length); + $lhs_value[] = 1; + $rhs = new static(); + $rhs->value = $n; + list($temp, ) = $lhs->divide($rhs); // m.length + $cache[self::DATA][] = $temp->value; + } + + // 2 * m.length - (m.length - 1) = m.length + 1 + $temp = array_slice($x, $n_length - 1); + // (m.length + 1) + m.length = 2 * m.length + 1 + $temp = $this->_multiply($temp, false, $cache[self::DATA][$key], false); + // (2 * m.length + 1) - (m.length - 1) = m.length + 2 + $temp = array_slice($temp[self::VALUE], $n_length + 1); + + // m.length + 1 + $result = array_slice($x, 0, $n_length + 1); + // m.length + 1 + $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1); + // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1) + + if ($this->_compare($result, false, $temp[self::VALUE], $temp[self::SIGN]) < 0) { + $corrector_value = $this->_array_repeat(0, $n_length + 1); + $corrector_value[count($corrector_value)] = 1; + $result = $this->_add($result, false, $corrector_value, false); + $result = $result[self::VALUE]; + } + + // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits + $result = $this->_subtract($result, false, $temp[self::VALUE], $temp[self::SIGN]); + while ($this->_compare($result[self::VALUE], $result[self::SIGN], $n, false) > 0) { + $result = $this->_subtract($result[self::VALUE], $result[self::SIGN], $n, false); + } + + return $result[self::VALUE]; + } + + /** + * Performs long multiplication up to $stop digits + * + * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. + * + * @see self::_regularBarrett() + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @param int $stop + * @return array + * @access private + */ + function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array( + self::VALUE => array(), + self::SIGN => false + ); + } + + if ($x_length < $y_length) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - self::$baseFull * $carry); + } + + if ($j < $stop) { + $product_value[$j] = $carry; + } + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - self::$baseFull * $carry); + } + + if ($k < $stop) { + $product_value[$k] = $carry; + } + } + + return array( + self::VALUE => $this->_trim($product_value), + self::SIGN => $x_negative != $y_negative + ); + } + + /** + * Montgomery Modular Reduction + * + * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n. + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be + * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function + * to work correctly. + * + * @see self::_prepMontgomery() + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _montgomery($x, $n) + { + static $cache = array( + self::VARIABLE => array(), + self::DATA => array() + ); + + if (($key = array_search($n, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); + $cache[self::VARIABLE][] = $x; + $cache[self::DATA][] = $this->_modInverse67108864($n); + } + + $k = count($n); + + $result = array(self::VALUE => $x); + + for ($i = 0; $i < $k; ++$i) { + $temp = $result[self::VALUE][$i] * $cache[self::DATA][$key]; + $temp = $temp - self::$baseFull * (self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_regularMultiply(array($temp), $n); + $temp = array_merge($this->_array_repeat(0, $i), $temp); + $result = $this->_add($result[self::VALUE], false, $temp, false); + } + + $result[self::VALUE] = array_slice($result[self::VALUE], $k); + + if ($this->_compare($result, false, $n, false) >= 0) { + $result = $this->_subtract($result[self::VALUE], false, $n, false); + } + + return $result[self::VALUE]; + } + + /** + * Montgomery Multiply + * + * Interleaves the montgomery reduction and long multiplication algorithms together as described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} + * + * @see self::_prepMontgomery() + * @see self::_montgomery() + * @access private + * @param array $x + * @param array $y + * @param array $m + * @return array + */ + function _montgomeryMultiply($x, $y, $m) + { + $temp = $this->_multiply($x, false, $y, false); + return $this->_montgomery($temp[self::VALUE], $m); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + static $cache = array( + self::VARIABLE => array(), + self::DATA => array() + ); + + if (($key = array_search($m, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); + $cache[self::VARIABLE][] = $m; + $cache[self::DATA][] = $this->_modInverse67108864($m); + } + + $n = max(count($x), count($y), count($m)); + $x = array_pad($x, $n, 0); + $y = array_pad($y, $n, 0); + $m = array_pad($m, $n, 0); + $a = array(self::VALUE => $this->_array_repeat(0, $n + 1)); + for ($i = 0; $i < $n; ++$i) { + $temp = $a[self::VALUE][0] + $x[$i] * $y[0]; + $temp = $temp - self::$baseFull * (self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $temp * $cache[self::DATA][$key]; + $temp = $temp - self::$baseFull * (self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false); + $a = $this->_add($a[self::VALUE], false, $temp[self::VALUE], false); + $a[self::VALUE] = array_slice($a[self::VALUE], 1); + } + if ($this->_compare($a[self::VALUE], false, $m, false) >= 0) { + $a = $this->_subtract($a[self::VALUE], false, $m, false); + } + return $a[self::VALUE]; + } + + /** + * Prepare a number for use in Montgomery Modular Reductions + * + * @see self::_montgomery() + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _prepMontgomery($x, $n) + { + $lhs = new static(); + $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x); + $rhs = new static(); + $rhs->value = $n; + + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + /** + * Modular Inverse of a number mod 2**26 (eg. 67108864) + * + * Based off of the bnpInvDigit function implemented and justified in the following URL: + * + * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} + * + * The following URL provides more info: + * + * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} + * + * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For + * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields + * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't + * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that + * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the + * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to + * 40 bits, which only 64-bit floating points will support. + * + * Thanks to Pedro Gimeno Fortea for input! + * + * @see self::_montgomery() + * @access private + * @param array $x + * @return int + */ + function _modInverse67108864($x) // 2**26 == 67,108,864 + { + $x = -$x[0]; + $result = $x & 0x3; // x**-1 mod 2**2 + $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 + $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 + $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 + $result = fmod($result * (2 - fmod($x * $result, self::$baseFull)), self::$baseFull); // x**-1 mod 2**26 + return $result & self::$maxDigit; + } + + /** + * Calculates modular inverses. + * + * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. + * + * Here's an example: + * + * modInverse($b); + * echo $c->toString(); // outputs 4 + * + * echo "\r\n"; + * + * $d = $a->multiply($c); + * list(, $d) = $d->divide($b); + * echo $d; // outputs 1 (as per the definition of modular inverse) + * ?> + * + * + * @param \phpseclib\Math\BigInteger $n + * @return \phpseclib\Math\BigInteger|false + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information. + */ + function modInverse($n) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = new static(); + $temp->value = gmp_invert($this->value, $n->value); + + return ($temp->value === false) ? false : $this->_normalize($temp); + } + + static $zero, $one; + if (!isset($zero)) { + $zero = new static(); + $one = new static(1); + } + + // $x mod -$n == $x mod $n. + $n = $n->abs(); + + if ($this->compare($zero) < 0) { + $temp = $this->abs(); + $temp = $temp->modInverse($n); + return $this->_normalize($n->subtract($temp)); + } + + extract($this->extendedGCD($n)); + + if (!$gcd->equals($one)) { + return false; + } + + $x = $x->compare($zero) < 0 ? $x->add($n) : $x; + + return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x); + } + + /** + * Calculates the greatest common divisor and Bezout's identity. + * + * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that + * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which + * combination is returned is dependent upon which mode is in use. See + * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. + * + * Here's an example: + * + * extendedGCD($b)); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21 + * ?> + * + * + * @param \phpseclib\Math\BigInteger $n + * @return \phpseclib\Math\BigInteger + * @access public + * @internal Calculates the GCD using the binary xGCD algorithim described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes, + * the more traditional algorithim requires "relatively costly multiple-precision divisions". + */ + function extendedGCD($n) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + extract(gmp_gcdext($this->value, $n->value)); + + return array( + 'gcd' => $this->_normalize(new static($g)), + 'x' => $this->_normalize(new static($s)), + 'y' => $this->_normalize(new static($t)) + ); + case self::MODE_BCMATH: + // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works + // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, + // the basic extended euclidean algorithim is what we're using. + + $u = $this->value; + $v = $n->value; + + $a = '1'; + $b = '0'; + $c = '0'; + $d = '1'; + + while (bccomp($v, '0', 0) != 0) { + $q = bcdiv($u, $v, 0); + + $temp = $u; + $u = $v; + $v = bcsub($temp, bcmul($v, $q, 0), 0); + + $temp = $a; + $a = $c; + $c = bcsub($temp, bcmul($a, $q, 0), 0); + + $temp = $b; + $b = $d; + $d = bcsub($temp, bcmul($b, $q, 0), 0); + } + + return array( + 'gcd' => $this->_normalize(new static($u)), + 'x' => $this->_normalize(new static($a)), + 'y' => $this->_normalize(new static($b)) + ); + } + + $y = $n->copy(); + $x = $this->copy(); + $g = new static(); + $g->value = array(1); + + while (!(($x->value[0] & 1)|| ($y->value[0] & 1))) { + $x->_rshift(1); + $y->_rshift(1); + $g->_lshift(1); + } + + $u = $x->copy(); + $v = $y->copy(); + + $a = new static(); + $b = new static(); + $c = new static(); + $d = new static(); + + $a->value = $d->value = $g->value = array(1); + $b->value = $c->value = array(); + + while (!empty($u->value)) { + while (!($u->value[0] & 1)) { + $u->_rshift(1); + if ((!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1))) { + $a = $a->add($y); + $b = $b->subtract($x); + } + $a->_rshift(1); + $b->_rshift(1); + } + + while (!($v->value[0] & 1)) { + $v->_rshift(1); + if ((!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1))) { + $c = $c->add($y); + $d = $d->subtract($x); + } + $c->_rshift(1); + $d->_rshift(1); + } + + if ($u->compare($v) >= 0) { + $u = $u->subtract($v); + $a = $a->subtract($c); + $b = $b->subtract($d); + } else { + $v = $v->subtract($u); + $c = $c->subtract($a); + $d = $d->subtract($b); + } + } + + return array( + 'gcd' => $this->_normalize($g->multiply($v)), + 'x' => $this->_normalize($c), + 'y' => $this->_normalize($d) + ); + } + + /** + * Calculates the greatest common divisor + * + * Say you have 693 and 609. The GCD is 21. + * + * Here's an example: + * + * extendedGCD($b); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * ?> + * + * + * @param \phpseclib\Math\BigInteger $n + * @return \phpseclib\Math\BigInteger + * @access public + */ + function gcd($n) + { + extract($this->extendedGCD($n)); + return $gcd; + } + + /** + * Absolute value. + * + * @return \phpseclib\Math\BigInteger + * @access public + */ + function abs() + { + $temp = new static(); + + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp->value = gmp_abs($this->value); + break; + case self::MODE_BCMATH: + $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value; + break; + default: + $temp->value = $this->value; + } + + return $temp; + } + + /** + * Compares two numbers. + * + * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is + * demonstrated thusly: + * + * $x > $y: $x->compare($y) > 0 + * $x < $y: $x->compare($y) < 0 + * $x == $y: $x->compare($y) == 0 + * + * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). + * + * @param \phpseclib\Math\BigInteger $y + * @return int < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. + * @access public + * @see self::equals() + * @internal Could return $this->subtract($x), but that's not as fast as what we do do. + */ + function compare($y) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $r = gmp_cmp($this->value, $y->value); + if ($r < -1) { + $r = -1; + } + if ($r > 1) { + $r = 1; + } + return $r; + case self::MODE_BCMATH: + return bccomp($this->value, $y->value, 0); + } + + return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative); + } + + /** + * Compares two numbers. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return int + * @see self::compare() + * @access private + */ + function _compare($x_value, $x_negative, $y_value, $y_negative) + { + if ($x_negative != $y_negative) { + return (!$x_negative && $y_negative) ? 1 : -1; + } + + $result = $x_negative ? -1 : 1; + + if (count($x_value) != count($y_value)) { + return (count($x_value) > count($y_value)) ? $result : -$result; + } + $size = max(count($x_value), count($y_value)); + + $x_value = array_pad($x_value, $size, 0); + $y_value = array_pad($y_value, $size, 0); + + for ($i = count($x_value) - 1; $i >= 0; --$i) { + if ($x_value[$i] != $y_value[$i]) { + return ($x_value[$i] > $y_value[$i]) ? $result : -$result; + } + } + + return 0; + } + + /** + * Tests the equality of two numbers. + * + * If you need to see if one number is greater than or less than another number, use BigInteger::compare() + * + * @param \phpseclib\Math\BigInteger $x + * @return bool + * @access public + * @see self::compare() + */ + function equals($x) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + return gmp_cmp($this->value, $x->value) == 0; + default: + return $this->value === $x->value && $this->is_negative == $x->is_negative; + } + } + + /** + * Set Precision + * + * Some bitwise operations give different results depending on the precision being used. Examples include left + * shift, not, and rotates. + * + * @param int $bits + * @access public + */ + function setPrecision($bits) + { + $this->precision = $bits; + if (MATH_BIGINTEGER_MODE != self::MODE_BCMATH) { + $this->bitmask = new static(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); + } else { + $this->bitmask = new static(bcpow('2', $bits, 0)); + } + + $temp = $this->_normalize($this); + $this->value = $temp->value; + } + + /** + * Logical And + * + * @param \phpseclib\Math\BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return \phpseclib\Math\BigInteger + */ + function bitwise_and($x) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = new static(); + $temp->value = gmp_and($this->value, $x->value); + + return $this->_normalize($temp); + case self::MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new static($left & $right, 256)); + } + + $result = $this->copy(); + + $length = min(count($x->value), count($this->value)); + + $result->value = array_slice($result->value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]&= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Or + * + * @param \phpseclib\Math\BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return \phpseclib\Math\BigInteger + */ + function bitwise_or($x) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = new static(); + $temp->value = gmp_or($this->value, $x->value); + + return $this->_normalize($temp); + case self::MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new static($left | $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]|= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Exclusive-Or + * + * @param \phpseclib\Math\BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return \phpseclib\Math\BigInteger + */ + function bitwise_xor($x) + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + $temp = new static(); + $temp->value = gmp_xor(gmp_abs($this->value), gmp_abs($x->value)); + return $this->_normalize($temp); + case self::MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new static($left ^ $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->is_negative = false; + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]^= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Not + * + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return \phpseclib\Math\BigInteger + */ + function bitwise_not() + { + // calculuate "not" without regard to $this->precision + // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) + $temp = $this->toBytes(); + if ($temp == '') { + return $this->_normalize(new static()); + } + $pre_msb = decbin(ord($temp[0])); + $temp = ~$temp; + $msb = decbin(ord($temp[0])); + if (strlen($msb) == 8) { + $msb = substr($msb, strpos($msb, '0')); + } + $temp[0] = chr(bindec($msb)); + + // see if we need to add extra leading 1's + $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; + $new_bits = $this->precision - $current_bits; + if ($new_bits <= 0) { + return $this->_normalize(new static($temp, 256)); + } + + // generate as many leading 1's as we need to. + $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); + $this->_base256_lshift($leading_ones, $current_bits); + + $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); + + return $this->_normalize(new static($leading_ones | $temp, 256)); + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. + * + * @param int $shift + * @return \phpseclib\Math\BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_rightShift($shift) + { + $temp = new static(); + + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift)); + + break; + case self::MODE_BCMATH: + $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_rshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. + * + * @param int $shift + * @return \phpseclib\Math\BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_leftShift($shift) + { + $temp = new static(); + + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_mul($this->value, gmp_pow($two, $shift)); + + break; + case self::MODE_BCMATH: + $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_lshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Rotate + * + * Instead of the top x bits being dropped they're appended to the shifted bit string. + * + * @param int $shift + * @return \phpseclib\Math\BigInteger + * @access public + */ + function bitwise_leftRotate($shift) + { + $bits = $this->toBytes(); + + if ($this->precision > 0) { + $precision = $this->precision; + if (MATH_BIGINTEGER_MODE == self::MODE_BCMATH) { + $mask = $this->bitmask->subtract(new static(1)); + $mask = $mask->toBytes(); + } else { + $mask = $this->bitmask->toBytes(); + } + } else { + $temp = ord($bits[0]); + for ($i = 0; $temp >> $i; ++$i) { + } + $precision = 8 * strlen($bits) - 8 + $i; + $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); + } + + if ($shift < 0) { + $shift+= $precision; + } + $shift%= $precision; + + if (!$shift) { + return $this->copy(); + } + + $left = $this->bitwise_leftShift($shift); + $left = $left->bitwise_and(new static($mask, 256)); + $right = $this->bitwise_rightShift($precision - $shift); + $result = MATH_BIGINTEGER_MODE != self::MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right); + return $this->_normalize($result); + } + + /** + * Logical Right Rotate + * + * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. + * + * @param int $shift + * @return \phpseclib\Math\BigInteger + * @access public + */ + function bitwise_rightRotate($shift) + { + return $this->bitwise_leftRotate(-$shift); + } + + /** + * Generates a random BigInteger + * + * Byte length is equal to $length. Uses \phpseclib\Crypt\Random if it's loaded and mt_rand if it's not. + * + * @param int $length + * @return \phpseclib\Math\BigInteger + * @access private + */ + function _random_number_helper($size) + { + if (class_exists('\phpseclib\Crypt\Random')) { + $random = Random::string($size); + } else { + $random = ''; + + if ($size & 1) { + $random.= chr(mt_rand(0, 255)); + } + + $blocks = $size >> 1; + for ($i = 0; $i < $blocks; ++$i) { + // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems + $random.= pack('n', mt_rand(0, 0xFFFF)); + } + } + + return new static($random, 256); + } + + /** + * Generate a random number + * + * Returns a random number between $min and $max where $min and $max + * can be defined using one of the two methods: + * + * $min->random($max) + * $max->random($min) + * + * @param \phpseclib\Math\BigInteger $arg1 + * @param \phpseclib\Math\BigInteger $arg2 + * @return \phpseclib\Math\BigInteger + * @access public + * @internal The API for creating random numbers used to be $a->random($min, $max), where $a was a BigInteger object. + * That method is still supported for BC purposes. + */ + function random($arg1, $arg2 = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $this->_normalize($min); + } elseif ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one; + if (!isset($one)) { + $one = new static(1); + } + + $max = $max->subtract($min->subtract($one)); + $size = strlen(ltrim($max->toBytes(), chr(0))); + + /* + doing $random % $max doesn't work because some numbers will be more likely to occur than others. + eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 + would produce 5 whereas the only value of random that could produce 139 would be 139. ie. + not all numbers would be equally likely. some would be more likely than others. + + creating a whole new random number until you find one that is within the range doesn't work + because, for sufficiently small ranges, the likelihood that you'd get a number within that range + would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability + would be pretty high that $random would be greater than $max. + + phpseclib works around this using the technique described here: + + http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string + */ + $random_max = new static(chr(1) . str_repeat("\0", $size), 256); + $random = $this->_random_number_helper($size); + + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + + while ($random->compare($max_multiple) >= 0) { + $random = $random->subtract($max_multiple); + $random_max = $random_max->subtract($max_multiple); + $random = $random->bitwise_leftShift(8); + $random = $random->add($this->_random_number_helper(1)); + $random_max = $random_max->bitwise_leftShift(8); + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + } + list(, $random) = $random->divide($max); + + return $this->_normalize($random->add($min)); + } + + /** + * Generate a random prime number. + * + * If there's not a prime within the given range, false will be returned. + * If more than $timeout seconds have elapsed, give up and return false. + * + * @param \phpseclib\Math\BigInteger $arg1 + * @param \phpseclib\Math\BigInteger $arg2 + * @param int $timeout + * @return Math_BigInteger|false + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}. + */ + function randomPrime($arg1, $arg2 = false, $timeout = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $min->isPrime() ? $min : false; + } elseif ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one, $two; + if (!isset($one)) { + $one = new static(1); + $two = new static(2); + } + + $start = time(); + + $x = $this->random($min, $max); + + // gmp_nextprime() requires PHP 5 >= 5.2.0 per . + if (MATH_BIGINTEGER_MODE == self::MODE_GMP && extension_loaded('gmp')) { + $p = new static(); + $p->value = gmp_nextprime($x->value); + + if ($p->compare($max) <= 0) { + return $p; + } + + if (!$min->equals($x)) { + $x = $x->subtract($one); + } + + return $x->randomPrime($min, $x); + } + + if ($x->equals($two)) { + return $x; + } + + $x->_make_odd(); + if ($x->compare($max) > 0) { + // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range + if ($min->equals($max)) { + return false; + } + $x = $min->copy(); + $x->_make_odd(); + } + + $initial_x = $x->copy(); + + while (true) { + if ($timeout !== false && time() - $start > $timeout) { + return false; + } + + if ($x->isPrime()) { + return $x; + } + + $x = $x->add($two); + + if ($x->compare($max) > 0) { + $x = $min->copy(); + if ($x->equals($two)) { + return $x; + } + $x->_make_odd(); + } + + if ($x->equals($initial_x)) { + return false; + } + } + } + + /** + * Make the current number odd + * + * If the current number is odd it'll be unchanged. If it's even, one will be added to it. + * + * @see self::randomPrime() + * @access private + */ + function _make_odd() + { + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + gmp_setbit($this->value, 0); + break; + case self::MODE_BCMATH: + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + $this->value = bcadd($this->value, '1'); + } + break; + default: + $this->value[0] |= 1; + } + } + + /** + * Checks a numer to see if it's prime + * + * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the + * $t parameter is distributability. BigInteger::randomPrime() can be distributed across multiple pageloads + * on a website instead of just one. + * + * @param \phpseclib\Math\BigInteger $t + * @return bool + * @access public + * @internal Uses the + * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}. + */ + function isPrime($t = false) + { + $length = strlen($this->toBytes()); + + if (!$t) { + // see HAC 4.49 "Note (controlling the error probability)" + // @codingStandardsIgnoreStart + if ($length >= 163) { $t = 2; } // floor(1300 / 8) + else if ($length >= 106) { $t = 3; } // floor( 850 / 8) + else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) + else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) + else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) + else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) + else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) + else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) + else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) + else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) + else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) + else { $t = 27; } + // @codingStandardsIgnoreEnd + } + + // ie. gmp_testbit($this, 0) + // ie. isEven() or !isOdd() + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + return gmp_prob_prime($this->value, $t) != 0; + case self::MODE_BCMATH: + if ($this->value === '2') { + return true; + } + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + return false; + } + break; + default: + if ($this->value == array(2)) { + return true; + } + if (~$this->value[0] & 1) { + return false; + } + } + + static $primes, $zero, $one, $two; + + if (!isset($primes)) { + $primes = array( + 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, + 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, + 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, + 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, + 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, + 953, 967, 971, 977, 983, 991, 997 + ); + + if (MATH_BIGINTEGER_MODE != self::MODE_INTERNAL) { + for ($i = 0; $i < count($primes); ++$i) { + $primes[$i] = new static($primes[$i]); + } + } + + $zero = new static(); + $one = new static(1); + $two = new static(2); + } + + if ($this->equals($one)) { + return false; + } + + // see HAC 4.4.1 "Random search for probable primes" + if (MATH_BIGINTEGER_MODE != self::MODE_INTERNAL) { + foreach ($primes as $prime) { + list(, $r) = $this->divide($prime); + if ($r->equals($zero)) { + return $this->equals($prime); + } + } + } else { + $value = $this->value; + foreach ($primes as $prime) { + list(, $r) = $this->_divide_digit($value, $prime); + if (!$r) { + return count($value) == 1 && $value[0] == $prime; + } + } + } + + $n = $this->copy(); + $n_1 = $n->subtract($one); + $n_2 = $n->subtract($two); + + $r = $n_1->copy(); + $r_value = $r->value; + // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); + if (MATH_BIGINTEGER_MODE == self::MODE_BCMATH) { + $s = 0; + // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier + while ($r->value[strlen($r->value) - 1] % 2 == 0) { + $r->value = bcdiv($r->value, '2', 0); + ++$s; + } + } else { + for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { + $temp = ~$r_value[$i] & 0xFFFFFF; + for ($j = 1; ($temp >> $j) & 1; ++$j) { + } + if ($j != 25) { + break; + } + } + $s = 26 * $i + $j; + $r->_rshift($s); + } + + for ($i = 0; $i < $t; ++$i) { + $a = $this->random($two, $n_2); + $y = $a->modPow($r, $n); + + if (!$y->equals($one) && !$y->equals($n_1)) { + for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { + $y = $y->modPow($two, $n); + if ($y->equals($one)) { + return false; + } + } + + if (!$y->equals($n_1)) { + return false; + } + } + } + return true; + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param int $shift + * @access private + */ + function _lshift($shift) + { + if ($shift == 0) { + return; + } + + $num_digits = (int) ($shift / self::$base); + $shift %= self::$base; + $shift = 1 << $shift; + + $carry = 0; + + for ($i = 0; $i < count($this->value); ++$i) { + $temp = $this->value[$i] * $shift + $carry; + $carry = self::$base === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $this->value[$i] = (int) ($temp - $carry * self::$baseFull); + } + + if ($carry) { + $this->value[count($this->value)] = $carry; + } + + while ($num_digits--) { + array_unshift($this->value, 0); + } + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param int $shift + * @access private + */ + function _rshift($shift) + { + if ($shift == 0) { + return; + } + + $num_digits = (int) ($shift / self::$base); + $shift %= self::$base; + $carry_shift = self::$base - $shift; + $carry_mask = (1 << $shift) - 1; + + if ($num_digits) { + $this->value = array_slice($this->value, $num_digits); + } + + $carry = 0; + + for ($i = count($this->value) - 1; $i >= 0; --$i) { + $temp = $this->value[$i] >> $shift | $carry; + $carry = ($this->value[$i] & $carry_mask) << $carry_shift; + $this->value[$i] = $temp; + } + + $this->value = $this->_trim($this->value); + } + + /** + * Normalize + * + * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision + * + * @param \phpseclib\Math\BigInteger + * @return \phpseclib\Math\BigInteger + * @see self::_trim() + * @access private + */ + function _normalize($result) + { + $result->precision = $this->precision; + $result->bitmask = $this->bitmask; + + switch (MATH_BIGINTEGER_MODE) { + case self::MODE_GMP: + if ($this->bitmask !== false) { + $flip = gmp_cmp($result->value, gmp_init(0)) < 0; + if ($flip) { + $result->value = gmp_neg($result->value); + } + $result->value = gmp_and($result->value, $result->bitmask->value); + if ($flip) { + $result->value = gmp_neg($result->value); + } + } + + return $result; + case self::MODE_BCMATH: + if (!empty($result->bitmask->value)) { + $result->value = bcmod($result->value, $result->bitmask->value); + } + + return $result; + } + + $value = &$result->value; + + if (!count($value)) { + $result->is_negative = false; + return $result; + } + + $value = $this->_trim($value); + + if (!empty($result->bitmask->value)) { + $length = min(count($value), count($this->bitmask->value)); + $value = array_slice($value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $value[$i] = $value[$i] & $this->bitmask->value[$i]; + } + } + + return $result; + } + + /** + * Trim + * + * Removes leading zeros + * + * @param array $value + * @return \phpseclib\Math\BigInteger + * @access private + */ + function _trim($value) + { + for ($i = count($value) - 1; $i >= 0; --$i) { + if ($value[$i]) { + break; + } + unset($value[$i]); + } + + return $value; + } + + /** + * Array Repeat + * + * @param $input Array + * @param $multiplier mixed + * @return array + * @access private + */ + function _array_repeat($input, $multiplier) + { + return ($multiplier) ? array_fill(0, $multiplier, $input) : array(); + } + + /** + * Logical Left Shift + * + * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. + * + * @param $x String + * @param $shift Integer + * @return string + * @access private + */ + function _base256_lshift(&$x, $shift) + { + if ($shift == 0) { + return; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $carry = 0; + for ($i = strlen($x) - 1; $i >= 0; --$i) { + $temp = ord($x[$i]) << $shift | $carry; + $x[$i] = chr($temp); + $carry = $temp >> 8; + } + $carry = ($carry != 0) ? chr($carry) : ''; + $x = $carry . $x . str_repeat(chr(0), $num_bytes); + } + + /** + * Logical Right Shift + * + * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder. + * + * @param $x String + * @param $shift Integer + * @return string + * @access private + */ + function _base256_rshift(&$x, $shift) + { + if ($shift == 0) { + $x = ltrim($x, chr(0)); + return ''; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $remainder = ''; + if ($num_bytes) { + $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes; + $remainder = substr($x, $start); + $x = substr($x, 0, -$num_bytes); + } + + $carry = 0; + $carry_shift = 8 - $shift; + for ($i = 0; $i < strlen($x); ++$i) { + $temp = (ord($x[$i]) >> $shift) | $carry; + $carry = (ord($x[$i]) << $carry_shift) & 0xFF; + $x[$i] = chr($temp); + } + $x = ltrim($x, chr(0)); + + $remainder = chr($carry >> $carry_shift) . $remainder; + + return ltrim($remainder, chr(0)); + } + + // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long + // at 32-bits, while java's longs are 64-bits. + + /** + * Converts 32-bit integers to bytes. + * + * @param int $x + * @return string + * @access private + */ + function _int2bytes($x) + { + return ltrim(pack('N', $x), chr(0)); + } + + /** + * Converts bytes to 32-bit integers + * + * @param string $x + * @return int + * @access private + */ + function _bytes2int($x) + { + $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT)); + return $temp['int']; + } + + /** + * DER-encode an integer + * + * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL + * + * @see self::modPow() + * @access private + * @param int $length + * @return string + */ + function _encodeASN1Length($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * Single digit division + * + * Even if int64 is being used the division operator will return a float64 value + * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't + * have the precision of int64 this is a problem so, when int64 is being used, + * we'll guarantee that the dividend is divisible by first subtracting the remainder. + * + * @access private + * @param int $x + * @param int $y + * @return int + */ + function _safe_divide($x, $y) + { + if (self::$base === 26) { + return (int) ($x / $y); + } + + // self::$base === 31 + return ($x - ($x % $y)) / $y; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/bootstrap.php b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/bootstrap.php new file mode 100644 index 0000000..0da0999 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/phpseclib/phpseclib/phpseclib/bootstrap.php @@ -0,0 +1,16 @@ +getHeaders() as $name => $values) { + * echo $name . ": " . implode(", ", $values); + * } + * + * // Emit headers iteratively: + * foreach ($message->getHeaders() as $name => $values) { + * foreach ($values as $value) { + * header(sprintf('%s: %s', $name, $value), false); + * } + * } + * + * While header names are not case-sensitive, getHeaders() will preserve the + * exact case in which headers were originally specified. + * + * @return string[][] Returns an associative array of the message's headers. Each + * key MUST be a header name, and each value MUST be an array of strings + * for that header. + */ + public function getHeaders(); + + /** + * Checks if a header exists by the given case-insensitive name. + * + * @param string $name Case-insensitive header field name. + * @return bool Returns true if any header names match the given header + * name using a case-insensitive string comparison. Returns false if + * no matching header name is found in the message. + */ + public function hasHeader($name); + + /** + * Retrieves a message header value by the given case-insensitive name. + * + * This method returns an array of all the header values of the given + * case-insensitive header name. + * + * If the header does not appear in the message, this method MUST return an + * empty array. + * + * @param string $name Case-insensitive header field name. + * @return string[] An array of string values as provided for the given + * header. If the header does not appear in the message, this method MUST + * return an empty array. + */ + public function getHeader($name); + + /** + * Retrieves a comma-separated string of the values for a single header. + * + * This method returns all of the header values of the given + * case-insensitive header name as a string concatenated together using + * a comma. + * + * NOTE: Not all header values may be appropriately represented using + * comma concatenation. For such headers, use getHeader() instead + * and supply your own delimiter when concatenating. + * + * If the header does not appear in the message, this method MUST return + * an empty string. + * + * @param string $name Case-insensitive header field name. + * @return string A string of values as provided for the given header + * concatenated together using a comma. If the header does not appear in + * the message, this method MUST return an empty string. + */ + public function getHeaderLine($name); + + /** + * Return an instance with the provided value replacing the specified header. + * + * While header names are case-insensitive, the casing of the header will + * be preserved by this function, and returned from getHeaders(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new and/or updated header and value. + * + * @param string $name Case-insensitive header field name. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withHeader($name, $value); + + /** + * Return an instance with the specified header appended with the given value. + * + * Existing values for the specified header will be maintained. The new + * value(s) will be appended to the existing list. If the header did not + * exist previously, it will be added. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new header and/or value. + * + * @param string $name Case-insensitive header field name to add. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withAddedHeader($name, $value); + + /** + * Return an instance without the specified header. + * + * Header resolution MUST be done without case-sensitivity. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the named header. + * + * @param string $name Case-insensitive header field name to remove. + * @return static + */ + public function withoutHeader($name); + + /** + * Gets the body of the message. + * + * @return StreamInterface Returns the body as a stream. + */ + public function getBody(); + + /** + * Return an instance with the specified message body. + * + * The body MUST be a StreamInterface object. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return a new instance that has the + * new body stream. + * + * @param StreamInterface $body Body. + * @return static + * @throws \InvalidArgumentException When the body is not valid. + */ + public function withBody(StreamInterface $body); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/RequestInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/RequestInterface.php new file mode 100644 index 0000000..a96d4fd --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/RequestInterface.php @@ -0,0 +1,129 @@ +getQuery()` + * or from the `QUERY_STRING` server param. + * + * @return array + */ + public function getQueryParams(); + + /** + * Return an instance with the specified query string arguments. + * + * These values SHOULD remain immutable over the course of the incoming + * request. They MAY be injected during instantiation, such as from PHP's + * $_GET superglobal, or MAY be derived from some other value such as the + * URI. In cases where the arguments are parsed from the URI, the data + * MUST be compatible with what PHP's parse_str() would return for + * purposes of how duplicate query parameters are handled, and how nested + * sets are handled. + * + * Setting query string arguments MUST NOT change the URI stored by the + * request, nor the values in the server params. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated query string arguments. + * + * @param array $query Array of query string arguments, typically from + * $_GET. + * @return static + */ + public function withQueryParams(array $query); + + /** + * Retrieve normalized file upload data. + * + * This method returns upload metadata in a normalized tree, with each leaf + * an instance of Psr\Http\Message\UploadedFileInterface. + * + * These values MAY be prepared from $_FILES or the message body during + * instantiation, or MAY be injected via withUploadedFiles(). + * + * @return array An array tree of UploadedFileInterface instances; an empty + * array MUST be returned if no data is present. + */ + public function getUploadedFiles(); + + /** + * Create a new instance with the specified uploaded files. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. + * @return static + * @throws \InvalidArgumentException if an invalid structure is provided. + */ + public function withUploadedFiles(array $uploadedFiles); + + /** + * Retrieve any parameters provided in the request body. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, this method MUST + * return the contents of $_POST. + * + * Otherwise, this method may return any results of deserializing + * the request body content; as parsing returns structured content, the + * potential types MUST be arrays or objects only. A null value indicates + * the absence of body content. + * + * @return null|array|object The deserialized body parameters, if any. + * These will typically be an array or object. + */ + public function getParsedBody(); + + /** + * Return an instance with the specified body parameters. + * + * These MAY be injected during instantiation. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, use this method + * ONLY to inject the contents of $_POST. + * + * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of + * deserializing the request body content. Deserialization/parsing returns + * structured data, and, as such, this method ONLY accepts arrays or objects, + * or a null value if nothing was available to parse. + * + * As an example, if content negotiation determines that the request data + * is a JSON payload, this method could be used to create a request + * instance with the deserialized parameters. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param null|array|object $data The deserialized body data. This will + * typically be in an array or object. + * @return static + * @throws \InvalidArgumentException if an unsupported argument type is + * provided. + */ + public function withParsedBody($data); + + /** + * Retrieve attributes derived from the request. + * + * The request "attributes" may be used to allow injection of any + * parameters derived from the request: e.g., the results of path + * match operations; the results of decrypting cookies; the results of + * deserializing non-form-encoded message bodies; etc. Attributes + * will be application and request specific, and CAN be mutable. + * + * @return array Attributes derived from the request. + */ + public function getAttributes(); + + /** + * Retrieve a single derived request attribute. + * + * Retrieves a single derived request attribute as described in + * getAttributes(). If the attribute has not been previously set, returns + * the default value as provided. + * + * This method obviates the need for a hasAttribute() method, as it allows + * specifying a default value to return if the attribute is not found. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $default Default value to return if the attribute does not exist. + * @return mixed + */ + public function getAttribute($name, $default = null); + + /** + * Return an instance with the specified derived request attribute. + * + * This method allows setting a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $value The value of the attribute. + * @return static + */ + public function withAttribute($name, $value); + + /** + * Return an instance that removes the specified derived request attribute. + * + * This method allows removing a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @return static + */ + public function withoutAttribute($name); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/StreamInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/StreamInterface.php new file mode 100644 index 0000000..f68f391 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/psr/http-message/src/StreamInterface.php @@ -0,0 +1,158 @@ + + * [user-info@]host[:port] + * + * + * If the port component is not set or is the standard port for the current + * scheme, it SHOULD NOT be included. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2 + * @return string The URI authority, in "[user-info@]host[:port]" format. + */ + public function getAuthority(); + + /** + * Retrieve the user information component of the URI. + * + * If no user information is present, this method MUST return an empty + * string. + * + * If a user is present in the URI, this will return that value; + * additionally, if the password is also present, it will be appended to the + * user value, with a colon (":") separating the values. + * + * The trailing "@" character is not part of the user information and MUST + * NOT be added. + * + * @return string The URI user information, in "username[:password]" format. + */ + public function getUserInfo(); + + /** + * Retrieve the host component of the URI. + * + * If no host is present, this method MUST return an empty string. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.2.2. + * + * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 + * @return string The URI host. + */ + public function getHost(); + + /** + * Retrieve the port component of the URI. + * + * If a port is present, and it is non-standard for the current scheme, + * this method MUST return it as an integer. If the port is the standard port + * used with the current scheme, this method SHOULD return null. + * + * If no port is present, and no scheme is present, this method MUST return + * a null value. + * + * If no port is present, but a scheme is present, this method MAY return + * the standard port for that scheme, but SHOULD return null. + * + * @return null|int The URI port. + */ + public function getPort(); + + /** + * Retrieve the path component of the URI. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * Normally, the empty path "" and absolute path "/" are considered equal as + * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically + * do this normalization because in contexts with a trimmed base path, e.g. + * the front controller, this difference becomes significant. It's the task + * of the user to handle both "" and "/". + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.3. + * + * As an example, if the value should include a slash ("/") not intended as + * delimiter between path segments, that value MUST be passed in encoded + * form (e.g., "%2F") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.3 + * @return string The URI path. + */ + public function getPath(); + + /** + * Retrieve the query string of the URI. + * + * If no query string is present, this method MUST return an empty string. + * + * The leading "?" character is not part of the query and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.4. + * + * As an example, if a value in a key/value pair of the query string should + * include an ampersand ("&") not intended as a delimiter between values, + * that value MUST be passed in encoded form (e.g., "%26") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.4 + * @return string The URI query string. + */ + public function getQuery(); + + /** + * Retrieve the fragment component of the URI. + * + * If no fragment is present, this method MUST return an empty string. + * + * The leading "#" character is not part of the fragment and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.5. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.5 + * @return string The URI fragment. + */ + public function getFragment(); + + /** + * Return an instance with the specified scheme. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified scheme. + * + * Implementations MUST support the schemes "http" and "https" case + * insensitively, and MAY accommodate other schemes if required. + * + * An empty scheme is equivalent to removing the scheme. + * + * @param string $scheme The scheme to use with the new instance. + * @return static A new instance with the specified scheme. + * @throws \InvalidArgumentException for invalid or unsupported schemes. + */ + public function withScheme($scheme); + + /** + * Return an instance with the specified user information. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified user information. + * + * Password is optional, but the user information MUST include the + * user; an empty string for the user is equivalent to removing user + * information. + * + * @param string $user The user name to use for authority. + * @param null|string $password The password associated with $user. + * @return static A new instance with the specified user information. + */ + public function withUserInfo($user, $password = null); + + /** + * Return an instance with the specified host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified host. + * + * An empty host value is equivalent to removing the host. + * + * @param string $host The hostname to use with the new instance. + * @return static A new instance with the specified host. + * @throws \InvalidArgumentException for invalid hostnames. + */ + public function withHost($host); + + /** + * Return an instance with the specified port. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified port. + * + * Implementations MUST raise an exception for ports outside the + * established TCP and UDP port ranges. + * + * A null value provided for the port is equivalent to removing the port + * information. + * + * @param null|int $port The port to use with the new instance; a null value + * removes the port information. + * @return static A new instance with the specified port. + * @throws \InvalidArgumentException for invalid ports. + */ + public function withPort($port); + + /** + * Return an instance with the specified path. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified path. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * If the path is intended to be domain-relative rather than path relative then + * it must begin with a slash ("/"). Paths not starting with a slash ("/") + * are assumed to be relative to some base path known to the application or + * consumer. + * + * Users can provide both encoded and decoded path characters. + * Implementations ensure the correct encoding as outlined in getPath(). + * + * @param string $path The path to use with the new instance. + * @return static A new instance with the specified path. + * @throws \InvalidArgumentException for invalid paths. + */ + public function withPath($path); + + /** + * Return an instance with the specified query string. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified query string. + * + * Users can provide both encoded and decoded query characters. + * Implementations ensure the correct encoding as outlined in getQuery(). + * + * An empty query string value is equivalent to removing the query string. + * + * @param string $query The query string to use with the new instance. + * @return static A new instance with the specified query string. + * @throws \InvalidArgumentException for invalid query strings. + */ + public function withQuery($query); + + /** + * Return an instance with the specified URI fragment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified URI fragment. + * + * Users can provide both encoded and decoded fragment characters. + * Implementations ensure the correct encoding as outlined in getFragment(). + * + * An empty fragment value is equivalent to removing the fragment. + * + * @param string $fragment The fragment to use with the new instance. + * @return static A new instance with the specified fragment. + */ + public function withFragment($fragment); + + /** + * Return the string representation as a URI reference. + * + * Depending on which components of the URI are present, the resulting + * string is either a full URI or relative reference according to RFC 3986, + * Section 4.1. The method concatenates the various components of the URI, + * using the appropriate delimiters: + * + * - If a scheme is present, it MUST be suffixed by ":". + * - If an authority is present, it MUST be prefixed by "//". + * - The path can be concatenated without delimiters. But there are two + * cases where the path has to be adjusted to make the URI reference + * valid as PHP does not allow to throw an exception in __toString(): + * - If the path is rootless and an authority is present, the path MUST + * be prefixed by "/". + * - If the path is starting with more than one "/" and no authority is + * present, the starting slashes MUST be reduced to one. + * - If a query is present, it MUST be prefixed by "?". + * - If a fragment is present, it MUST be prefixed by "#". + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + * @return string + */ + public function __toString(); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/psr/log/LICENSE b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/LICENSE new file mode 100644 index 0000000..474c952 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/AbstractLogger.php b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/AbstractLogger.php new file mode 100644 index 0000000..90e721a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/AbstractLogger.php @@ -0,0 +1,128 @@ +log(LogLevel::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function alert($message, array $context = array()) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function critical($message, array $context = array()) + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function error($message, array $context = array()) + { + $this->log(LogLevel::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function warning($message, array $context = array()) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function notice($message, array $context = array()) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function info($message, array $context = array()) + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function debug($message, array $context = array()) + { + $this->log(LogLevel::DEBUG, $message, $context); + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/InvalidArgumentException.php new file mode 100644 index 0000000..67f852d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/InvalidArgumentException.php @@ -0,0 +1,7 @@ +logger = $logger; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LoggerInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LoggerInterface.php new file mode 100644 index 0000000..e695046 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/LoggerInterface.php @@ -0,0 +1,125 @@ +log(LogLevel::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function alert($message, array $context = array()) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function critical($message, array $context = array()) + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function error($message, array $context = array()) + { + $this->log(LogLevel::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function warning($message, array $context = array()) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function notice($message, array $context = array()) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function info($message, array $context = array()) + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function debug($message, array $context = array()) + { + $this->log(LogLevel::DEBUG, $message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + abstract public function log($level, $message, array $context = array()); +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/NullLogger.php b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/NullLogger.php new file mode 100644 index 0000000..c8f7293 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/psr/log/Psr/Log/NullLogger.php @@ -0,0 +1,30 @@ +logger) { }` + * blocks. + */ +class NullLogger extends AbstractLogger +{ + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + public function log($level, $message, array $context = array()) + { + // noop + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/LICENSE b/wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/LICENSE new file mode 100644 index 0000000..be5540c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ralph Khattar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/src/getallheaders.php b/wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/src/getallheaders.php new file mode 100644 index 0000000..c7285a5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/src/getallheaders.php @@ -0,0 +1,46 @@ + 'Content-Type', + 'CONTENT_LENGTH' => 'Content-Length', + 'CONTENT_MD5' => 'Content-Md5', + ); + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) === 'HTTP_') { + $key = substr($key, 5); + if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { + $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key)))); + $headers[$key] = $value; + } + } elseif (isset($copy_server[$key])) { + $headers[$copy_server[$key]] = $value; + } + } + + if (!isset($headers['Authorization'])) { + if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { + $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; + } elseif (isset($_SERVER['PHP_AUTH_USER'])) { + $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; + $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); + } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { + $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; + } + } + + return $headers; + } + +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AccountApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AccountApi.php new file mode 100644 index 0000000..18cc8ed --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AccountApi.php @@ -0,0 +1,356 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation getAccount + * + * Get your account informations, plans and credits details + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetAccount + */ + public function getAccount() + { + list($response) = $this->getAccountWithHttpInfo(); + return $response; + } + + /** + * Operation getAccountWithHttpInfo + * + * Get your account informations, plans and credits details + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetAccount, HTTP status code, HTTP response headers (array of strings) + */ + public function getAccountWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetAccount'; + $request = $this->getAccountRequest(); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetAccount', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getAccountAsync + * + * Get your account informations, plans and credits details + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAccountAsync() + { + return $this->getAccountAsyncWithHttpInfo() + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getAccountAsyncWithHttpInfo + * + * Get your account informations, plans and credits details + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAccountAsyncWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetAccount'; + $request = $this->getAccountRequest(); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getAccount' + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getAccountRequest() + { + + $resourcePath = '/account'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AttributesApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AttributesApi.php new file mode 100644 index 0000000..a0b5df3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/AttributesApi.php @@ -0,0 +1,1186 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation createAttribute + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function createAttribute($attributeCategory, $attributeName, $createAttribute) + { + $this->createAttributeWithHttpInfo($attributeCategory, $attributeName, $createAttribute); + } + + /** + * Operation createAttributeWithHttpInfo + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function createAttributeWithHttpInfo($attributeCategory, $attributeName, $createAttribute) + { + $returnType = ''; + $request = $this->createAttributeRequest($attributeCategory, $attributeName, $createAttribute); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createAttributeAsync + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createAttributeAsync($attributeCategory, $attributeName, $createAttribute) + { + return $this->createAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $createAttribute) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createAttributeAsyncWithHttpInfo + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $createAttribute) + { + $returnType = ''; + $request = $this->createAttributeRequest($attributeCategory, $attributeName, $createAttribute); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createAttribute' + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createAttributeRequest($attributeCategory, $attributeName, $createAttribute) + { + // verify the required parameter 'attributeCategory' is set + if ($attributeCategory === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeCategory when calling createAttribute' + ); + } + // verify the required parameter 'attributeName' is set + if ($attributeName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeName when calling createAttribute' + ); + } + // verify the required parameter 'createAttribute' is set + if ($createAttribute === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createAttribute when calling createAttribute' + ); + } + + $resourcePath = '/contacts/attributes/{attributeCategory}/{attributeName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($attributeCategory !== null) { + $resourcePath = str_replace( + '{' . 'attributeCategory' . '}', + ObjectSerializer::toPathValue($attributeCategory), + $resourcePath + ); + } + // path params + if ($attributeName !== null) { + $resourcePath = str_replace( + '{' . 'attributeName' . '}', + ObjectSerializer::toPathValue($attributeName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($createAttribute)) { + $_tempBody = $createAttribute; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteAttribute + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteAttribute($attributeCategory, $attributeName) + { + $this->deleteAttributeWithHttpInfo($attributeCategory, $attributeName); + } + + /** + * Operation deleteAttributeWithHttpInfo + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteAttributeWithHttpInfo($attributeCategory, $attributeName) + { + $returnType = ''; + $request = $this->deleteAttributeRequest($attributeCategory, $attributeName); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteAttributeAsync + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteAttributeAsync($attributeCategory, $attributeName) + { + return $this->deleteAttributeAsyncWithHttpInfo($attributeCategory, $attributeName) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteAttributeAsyncWithHttpInfo + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteAttributeAsyncWithHttpInfo($attributeCategory, $attributeName) + { + $returnType = ''; + $request = $this->deleteAttributeRequest($attributeCategory, $attributeName); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteAttribute' + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteAttributeRequest($attributeCategory, $attributeName) + { + // verify the required parameter 'attributeCategory' is set + if ($attributeCategory === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeCategory when calling deleteAttribute' + ); + } + // verify the required parameter 'attributeName' is set + if ($attributeName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeName when calling deleteAttribute' + ); + } + + $resourcePath = '/contacts/attributes/{attributeCategory}/{attributeName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($attributeCategory !== null) { + $resourcePath = str_replace( + '{' . 'attributeCategory' . '}', + ObjectSerializer::toPathValue($attributeCategory), + $resourcePath + ); + } + // path params + if ($attributeName !== null) { + $resourcePath = str_replace( + '{' . 'attributeName' . '}', + ObjectSerializer::toPathValue($attributeName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getAttributes + * + * Lists all attributes + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetAttributes + */ + public function getAttributes() + { + list($response) = $this->getAttributesWithHttpInfo(); + return $response; + } + + /** + * Operation getAttributesWithHttpInfo + * + * Lists all attributes + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetAttributes, HTTP status code, HTTP response headers (array of strings) + */ + public function getAttributesWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetAttributes'; + $request = $this->getAttributesRequest(); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetAttributes', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getAttributesAsync + * + * Lists all attributes + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAttributesAsync() + { + return $this->getAttributesAsyncWithHttpInfo() + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getAttributesAsyncWithHttpInfo + * + * Lists all attributes + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAttributesAsyncWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetAttributes'; + $request = $this->getAttributesRequest(); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getAttributes' + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getAttributesRequest() + { + + $resourcePath = '/contacts/attributes'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateAttribute + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateAttribute($attributeCategory, $attributeName, $updateAttribute) + { + $this->updateAttributeWithHttpInfo($attributeCategory, $attributeName, $updateAttribute); + } + + /** + * Operation updateAttributeWithHttpInfo + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateAttributeWithHttpInfo($attributeCategory, $attributeName, $updateAttribute) + { + $returnType = ''; + $request = $this->updateAttributeRequest($attributeCategory, $attributeName, $updateAttribute); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateAttributeAsync + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateAttributeAsync($attributeCategory, $attributeName, $updateAttribute) + { + return $this->updateAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $updateAttribute) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateAttributeAsyncWithHttpInfo + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $updateAttribute) + { + $returnType = ''; + $request = $this->updateAttributeRequest($attributeCategory, $attributeName, $updateAttribute); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateAttribute' + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateAttributeRequest($attributeCategory, $attributeName, $updateAttribute) + { + // verify the required parameter 'attributeCategory' is set + if ($attributeCategory === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeCategory when calling updateAttribute' + ); + } + // verify the required parameter 'attributeName' is set + if ($attributeName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeName when calling updateAttribute' + ); + } + // verify the required parameter 'updateAttribute' is set + if ($updateAttribute === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateAttribute when calling updateAttribute' + ); + } + + $resourcePath = '/contacts/attributes/{attributeCategory}/{attributeName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($attributeCategory !== null) { + $resourcePath = str_replace( + '{' . 'attributeCategory' . '}', + ObjectSerializer::toPathValue($attributeCategory), + $resourcePath + ); + } + // path params + if ($attributeName !== null) { + $resourcePath = str_replace( + '{' . 'attributeName' . '}', + ObjectSerializer::toPathValue($attributeName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateAttribute)) { + $_tempBody = $updateAttribute; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ContactsApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ContactsApi.php new file mode 100644 index 0000000..f8cadee --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ContactsApi.php @@ -0,0 +1,7380 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation addContactToList + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\PostContactInfo + */ + public function addContactToList($listId, $contactEmails) + { + list($response) = $this->addContactToListWithHttpInfo($listId, $contactEmails); + return $response; + } + + /** + * Operation addContactToListWithHttpInfo + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\PostContactInfo, HTTP status code, HTTP response headers (array of strings) + */ + public function addContactToListWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->addContactToListRequest($listId, $contactEmails); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostContactInfo', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation addContactToListAsync + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function addContactToListAsync($listId, $contactEmails) + { + return $this->addContactToListAsyncWithHttpInfo($listId, $contactEmails) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation addContactToListAsyncWithHttpInfo + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function addContactToListAsyncWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->addContactToListRequest($listId, $contactEmails); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'addContactToList' + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function addContactToListRequest($listId, $contactEmails) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling addContactToList' + ); + } + // verify the required parameter 'contactEmails' is set + if ($contactEmails === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $contactEmails when calling addContactToList' + ); + } + + $resourcePath = '/contacts/lists/{listId}/contacts/add'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($contactEmails)) { + $_tempBody = $contactEmails; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation createAttribute + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function createAttribute($attributeCategory, $attributeName, $createAttribute) + { + $this->createAttributeWithHttpInfo($attributeCategory, $attributeName, $createAttribute); + } + + /** + * Operation createAttributeWithHttpInfo + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function createAttributeWithHttpInfo($attributeCategory, $attributeName, $createAttribute) + { + $returnType = ''; + $request = $this->createAttributeRequest($attributeCategory, $attributeName, $createAttribute); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createAttributeAsync + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createAttributeAsync($attributeCategory, $attributeName, $createAttribute) + { + return $this->createAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $createAttribute) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createAttributeAsyncWithHttpInfo + * + * Creates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $createAttribute) + { + $returnType = ''; + $request = $this->createAttributeRequest($attributeCategory, $attributeName, $createAttribute); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createAttribute' + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the attribute (required) + * @param \SendinBlue\Client\Model\CreateAttribute $createAttribute Values to create an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createAttributeRequest($attributeCategory, $attributeName, $createAttribute) + { + // verify the required parameter 'attributeCategory' is set + if ($attributeCategory === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeCategory when calling createAttribute' + ); + } + // verify the required parameter 'attributeName' is set + if ($attributeName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeName when calling createAttribute' + ); + } + // verify the required parameter 'createAttribute' is set + if ($createAttribute === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createAttribute when calling createAttribute' + ); + } + + $resourcePath = '/contacts/attributes/{attributeCategory}/{attributeName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($attributeCategory !== null) { + $resourcePath = str_replace( + '{' . 'attributeCategory' . '}', + ObjectSerializer::toPathValue($attributeCategory), + $resourcePath + ); + } + // path params + if ($attributeName !== null) { + $resourcePath = str_replace( + '{' . 'attributeName' . '}', + ObjectSerializer::toPathValue($attributeName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($createAttribute)) { + $_tempBody = $createAttribute; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation createContact + * + * Create a contact + * + * @param \SendinBlue\Client\Model\CreateContact $createContact Values to create a contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateUpdateContactModel + */ + public function createContact($createContact) + { + list($response) = $this->createContactWithHttpInfo($createContact); + return $response; + } + + /** + * Operation createContactWithHttpInfo + * + * Create a contact + * + * @param \SendinBlue\Client\Model\CreateContact $createContact Values to create a contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateUpdateContactModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createContactWithHttpInfo($createContact) + { + $returnType = '\SendinBlue\Client\Model\CreateUpdateContactModel'; + $request = $this->createContactRequest($createContact); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateUpdateContactModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 204: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateUpdateContactModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createContactAsync + * + * Create a contact + * + * @param \SendinBlue\Client\Model\CreateContact $createContact Values to create a contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createContactAsync($createContact) + { + return $this->createContactAsyncWithHttpInfo($createContact) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createContactAsyncWithHttpInfo + * + * Create a contact + * + * @param \SendinBlue\Client\Model\CreateContact $createContact Values to create a contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createContactAsyncWithHttpInfo($createContact) + { + $returnType = '\SendinBlue\Client\Model\CreateUpdateContactModel'; + $request = $this->createContactRequest($createContact); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createContact' + * + * @param \SendinBlue\Client\Model\CreateContact $createContact Values to create a contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createContactRequest($createContact) + { + // verify the required parameter 'createContact' is set + if ($createContact === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createContact when calling createContact' + ); + } + + $resourcePath = '/contacts'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($createContact)) { + $_tempBody = $createContact; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation createFolder + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createFolder($createFolder) + { + list($response) = $this->createFolderWithHttpInfo($createFolder); + return $response; + } + + /** + * Operation createFolderWithHttpInfo + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createFolderWithHttpInfo($createFolder) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createFolderRequest($createFolder); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createFolderAsync + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createFolderAsync($createFolder) + { + return $this->createFolderAsyncWithHttpInfo($createFolder) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createFolderAsyncWithHttpInfo + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createFolderAsyncWithHttpInfo($createFolder) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createFolderRequest($createFolder); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createFolder' + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createFolderRequest($createFolder) + { + // verify the required parameter 'createFolder' is set + if ($createFolder === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createFolder when calling createFolder' + ); + } + + $resourcePath = '/contacts/folders'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($createFolder)) { + $_tempBody = $createFolder; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation createList + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createList($createList) + { + list($response) = $this->createListWithHttpInfo($createList); + return $response; + } + + /** + * Operation createListWithHttpInfo + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createListWithHttpInfo($createList) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createListRequest($createList); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createListAsync + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createListAsync($createList) + { + return $this->createListAsyncWithHttpInfo($createList) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createListAsyncWithHttpInfo + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createListAsyncWithHttpInfo($createList) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createListRequest($createList); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createList' + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createListRequest($createList) + { + // verify the required parameter 'createList' is set + if ($createList === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createList when calling createList' + ); + } + + $resourcePath = '/contacts/lists'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($createList)) { + $_tempBody = $createList; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteAttribute + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteAttribute($attributeCategory, $attributeName) + { + $this->deleteAttributeWithHttpInfo($attributeCategory, $attributeName); + } + + /** + * Operation deleteAttributeWithHttpInfo + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteAttributeWithHttpInfo($attributeCategory, $attributeName) + { + $returnType = ''; + $request = $this->deleteAttributeRequest($attributeCategory, $attributeName); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteAttributeAsync + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteAttributeAsync($attributeCategory, $attributeName) + { + return $this->deleteAttributeAsyncWithHttpInfo($attributeCategory, $attributeName) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteAttributeAsyncWithHttpInfo + * + * Deletes an attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteAttributeAsyncWithHttpInfo($attributeCategory, $attributeName) + { + $returnType = ''; + $request = $this->deleteAttributeRequest($attributeCategory, $attributeName); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteAttribute' + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteAttributeRequest($attributeCategory, $attributeName) + { + // verify the required parameter 'attributeCategory' is set + if ($attributeCategory === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeCategory when calling deleteAttribute' + ); + } + // verify the required parameter 'attributeName' is set + if ($attributeName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeName when calling deleteAttribute' + ); + } + + $resourcePath = '/contacts/attributes/{attributeCategory}/{attributeName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($attributeCategory !== null) { + $resourcePath = str_replace( + '{' . 'attributeCategory' . '}', + ObjectSerializer::toPathValue($attributeCategory), + $resourcePath + ); + } + // path params + if ($attributeName !== null) { + $resourcePath = str_replace( + '{' . 'attributeName' . '}', + ObjectSerializer::toPathValue($attributeName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteContact + * + * Deletes a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteContact($email) + { + $this->deleteContactWithHttpInfo($email); + } + + /** + * Operation deleteContactWithHttpInfo + * + * Deletes a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteContactWithHttpInfo($email) + { + $returnType = ''; + $request = $this->deleteContactRequest($email); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 405: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteContactAsync + * + * Deletes a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteContactAsync($email) + { + return $this->deleteContactAsyncWithHttpInfo($email) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteContactAsyncWithHttpInfo + * + * Deletes a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteContactAsyncWithHttpInfo($email) + { + $returnType = ''; + $request = $this->deleteContactRequest($email); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteContact' + * + * @param string $email Email (urlencoded) of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteContactRequest($email) + { + // verify the required parameter 'email' is set + if ($email === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $email when calling deleteContact' + ); + } + + $resourcePath = '/contacts/{email}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($email !== null) { + $resourcePath = str_replace( + '{' . 'email' . '}', + ObjectSerializer::toPathValue($email), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteFolder + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteFolder($folderId) + { + $this->deleteFolderWithHttpInfo($folderId); + } + + /** + * Operation deleteFolderWithHttpInfo + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteFolderWithHttpInfo($folderId) + { + $returnType = ''; + $request = $this->deleteFolderRequest($folderId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteFolderAsync + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteFolderAsync($folderId) + { + return $this->deleteFolderAsyncWithHttpInfo($folderId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteFolderAsyncWithHttpInfo + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteFolderAsyncWithHttpInfo($folderId) + { + $returnType = ''; + $request = $this->deleteFolderRequest($folderId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteFolder' + * + * @param int $folderId Id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteFolderRequest($folderId) + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling deleteFolder' + ); + } + + $resourcePath = '/contacts/folders/{folderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteList + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteList($listId) + { + $this->deleteListWithHttpInfo($listId); + } + + /** + * Operation deleteListWithHttpInfo + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteListWithHttpInfo($listId) + { + $returnType = ''; + $request = $this->deleteListRequest($listId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteListAsync + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteListAsync($listId) + { + return $this->deleteListAsyncWithHttpInfo($listId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteListAsyncWithHttpInfo + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteListAsyncWithHttpInfo($listId) + { + $returnType = ''; + $request = $this->deleteListRequest($listId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteList' + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteListRequest($listId) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling deleteList' + ); + } + + $resourcePath = '/contacts/lists/{listId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getAttributes + * + * Lists all attributes + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetAttributes + */ + public function getAttributes() + { + list($response) = $this->getAttributesWithHttpInfo(); + return $response; + } + + /** + * Operation getAttributesWithHttpInfo + * + * Lists all attributes + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetAttributes, HTTP status code, HTTP response headers (array of strings) + */ + public function getAttributesWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetAttributes'; + $request = $this->getAttributesRequest(); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetAttributes', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getAttributesAsync + * + * Lists all attributes + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAttributesAsync() + { + return $this->getAttributesAsyncWithHttpInfo() + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getAttributesAsyncWithHttpInfo + * + * Lists all attributes + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAttributesAsyncWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetAttributes'; + $request = $this->getAttributesRequest(); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getAttributes' + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getAttributesRequest() + { + + $resourcePath = '/contacts/attributes'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getContactInfo + * + * Retrieves contact informations + * + * @param string $email Email (urlencoded) of the contact OR its SMS attribute value (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetExtendedContactDetails + */ + public function getContactInfo($email) + { + list($response) = $this->getContactInfoWithHttpInfo($email); + return $response; + } + + /** + * Operation getContactInfoWithHttpInfo + * + * Retrieves contact informations + * + * @param string $email Email (urlencoded) of the contact OR its SMS attribute value (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetExtendedContactDetails, HTTP status code, HTTP response headers (array of strings) + */ + public function getContactInfoWithHttpInfo($email) + { + $returnType = '\SendinBlue\Client\Model\GetExtendedContactDetails'; + $request = $this->getContactInfoRequest($email); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetExtendedContactDetails', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getContactInfoAsync + * + * Retrieves contact informations + * + * @param string $email Email (urlencoded) of the contact OR its SMS attribute value (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactInfoAsync($email) + { + return $this->getContactInfoAsyncWithHttpInfo($email) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getContactInfoAsyncWithHttpInfo + * + * Retrieves contact informations + * + * @param string $email Email (urlencoded) of the contact OR its SMS attribute value (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactInfoAsyncWithHttpInfo($email) + { + $returnType = '\SendinBlue\Client\Model\GetExtendedContactDetails'; + $request = $this->getContactInfoRequest($email); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getContactInfo' + * + * @param string $email Email (urlencoded) of the contact OR its SMS attribute value (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getContactInfoRequest($email) + { + // verify the required parameter 'email' is set + if ($email === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $email when calling getContactInfo' + ); + } + + $resourcePath = '/contacts/{email}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($email !== null) { + $resourcePath = str_replace( + '{' . 'email' . '}', + ObjectSerializer::toPathValue($email), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getContactStats + * + * Get the campaigns statistics for a contact + * + * @param string $email Email address (urlencoded) of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetContactCampaignStats + */ + public function getContactStats($email) + { + list($response) = $this->getContactStatsWithHttpInfo($email); + return $response; + } + + /** + * Operation getContactStatsWithHttpInfo + * + * Get the campaigns statistics for a contact + * + * @param string $email Email address (urlencoded) of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetContactCampaignStats, HTTP status code, HTTP response headers (array of strings) + */ + public function getContactStatsWithHttpInfo($email) + { + $returnType = '\SendinBlue\Client\Model\GetContactCampaignStats'; + $request = $this->getContactStatsRequest($email); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetContactCampaignStats', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getContactStatsAsync + * + * Get the campaigns statistics for a contact + * + * @param string $email Email address (urlencoded) of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactStatsAsync($email) + { + return $this->getContactStatsAsyncWithHttpInfo($email) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getContactStatsAsyncWithHttpInfo + * + * Get the campaigns statistics for a contact + * + * @param string $email Email address (urlencoded) of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactStatsAsyncWithHttpInfo($email) + { + $returnType = '\SendinBlue\Client\Model\GetContactCampaignStats'; + $request = $this->getContactStatsRequest($email); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getContactStats' + * + * @param string $email Email address (urlencoded) of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getContactStatsRequest($email) + { + // verify the required parameter 'email' is set + if ($email === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $email when calling getContactStats' + ); + } + + $resourcePath = '/contacts/{email}/campaignStats'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($email !== null) { + $resourcePath = str_replace( + '{' . 'email' . '}', + ObjectSerializer::toPathValue($email), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getContacts + * + * Get all the contacts + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetContacts + */ + public function getContacts($limit = '50', $offset = '0', $modifiedSince = null) + { + list($response) = $this->getContactsWithHttpInfo($limit, $offset, $modifiedSince); + return $response; + } + + /** + * Operation getContactsWithHttpInfo + * + * Get all the contacts + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetContacts, HTTP status code, HTTP response headers (array of strings) + */ + public function getContactsWithHttpInfo($limit = '50', $offset = '0', $modifiedSince = null) + { + $returnType = '\SendinBlue\Client\Model\GetContacts'; + $request = $this->getContactsRequest($limit, $offset, $modifiedSince); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetContacts', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getContactsAsync + * + * Get all the contacts + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactsAsync($limit = '50', $offset = '0', $modifiedSince = null) + { + return $this->getContactsAsyncWithHttpInfo($limit, $offset, $modifiedSince) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getContactsAsyncWithHttpInfo + * + * Get all the contacts + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactsAsyncWithHttpInfo($limit = '50', $offset = '0', $modifiedSince = null) + { + $returnType = '\SendinBlue\Client\Model\GetContacts'; + $request = $this->getContactsRequest($limit, $offset, $modifiedSince); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getContacts' + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getContactsRequest($limit = '50', $offset = '0', $modifiedSince = null) + { + if ($limit !== null && $limit > 1000) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ContactsApi.getContacts, must be smaller than or equal to 1000.'); + } + + + $resourcePath = '/contacts'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + // query params + if ($modifiedSince !== null) { + $queryParams['modifiedSince'] = ObjectSerializer::toQueryValue($modifiedSince); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getContactsFromList + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetContacts + */ + public function getContactsFromList($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + list($response) = $this->getContactsFromListWithHttpInfo($listId, $modifiedSince, $limit, $offset); + return $response; + } + + /** + * Operation getContactsFromListWithHttpInfo + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetContacts, HTTP status code, HTTP response headers (array of strings) + */ + public function getContactsFromListWithHttpInfo($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetContacts'; + $request = $this->getContactsFromListRequest($listId, $modifiedSince, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetContacts', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getContactsFromListAsync + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactsFromListAsync($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + return $this->getContactsFromListAsyncWithHttpInfo($listId, $modifiedSince, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getContactsFromListAsyncWithHttpInfo + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactsFromListAsyncWithHttpInfo($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetContacts'; + $request = $this->getContactsFromListRequest($listId, $modifiedSince, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getContactsFromList' + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getContactsFromListRequest($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling getContactsFromList' + ); + } + if ($limit !== null && $limit > 500) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ContactsApi.getContactsFromList, must be smaller than or equal to 500.'); + } + + + $resourcePath = '/contacts/lists/{listId}/contacts'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($modifiedSince !== null) { + $queryParams['modifiedSince'] = ObjectSerializer::toQueryValue($modifiedSince); + } + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getFolder + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetFolder + */ + public function getFolder($folderId) + { + list($response) = $this->getFolderWithHttpInfo($folderId); + return $response; + } + + /** + * Operation getFolderWithHttpInfo + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetFolder, HTTP status code, HTTP response headers (array of strings) + */ + public function getFolderWithHttpInfo($folderId) + { + $returnType = '\SendinBlue\Client\Model\GetFolder'; + $request = $this->getFolderRequest($folderId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetFolder', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getFolderAsync + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderAsync($folderId) + { + return $this->getFolderAsyncWithHttpInfo($folderId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getFolderAsyncWithHttpInfo + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderAsyncWithHttpInfo($folderId) + { + $returnType = '\SendinBlue\Client\Model\GetFolder'; + $request = $this->getFolderRequest($folderId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getFolder' + * + * @param int $folderId id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getFolderRequest($folderId) + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling getFolder' + ); + } + + $resourcePath = '/contacts/folders/{folderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getFolderLists + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetFolderLists + */ + public function getFolderLists($folderId, $limit = '10', $offset = '0') + { + list($response) = $this->getFolderListsWithHttpInfo($folderId, $limit, $offset); + return $response; + } + + /** + * Operation getFolderListsWithHttpInfo + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetFolderLists, HTTP status code, HTTP response headers (array of strings) + */ + public function getFolderListsWithHttpInfo($folderId, $limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetFolderLists'; + $request = $this->getFolderListsRequest($folderId, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetFolderLists', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getFolderListsAsync + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderListsAsync($folderId, $limit = '10', $offset = '0') + { + return $this->getFolderListsAsyncWithHttpInfo($folderId, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getFolderListsAsyncWithHttpInfo + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderListsAsyncWithHttpInfo($folderId, $limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetFolderLists'; + $request = $this->getFolderListsRequest($folderId, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getFolderLists' + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getFolderListsRequest($folderId, $limit = '10', $offset = '0') + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling getFolderLists' + ); + } + if ($limit !== null && $limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ContactsApi.getFolderLists, must be smaller than or equal to 50.'); + } + + + $resourcePath = '/contacts/folders/{folderId}/lists'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getFolders + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetFolders + */ + public function getFolders($limit, $offset) + { + list($response) = $this->getFoldersWithHttpInfo($limit, $offset); + return $response; + } + + /** + * Operation getFoldersWithHttpInfo + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetFolders, HTTP status code, HTTP response headers (array of strings) + */ + public function getFoldersWithHttpInfo($limit, $offset) + { + $returnType = '\SendinBlue\Client\Model\GetFolders'; + $request = $this->getFoldersRequest($limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetFolders', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getFoldersAsync + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFoldersAsync($limit, $offset) + { + return $this->getFoldersAsyncWithHttpInfo($limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getFoldersAsyncWithHttpInfo + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFoldersAsyncWithHttpInfo($limit, $offset) + { + $returnType = '\SendinBlue\Client\Model\GetFolders'; + $request = $this->getFoldersRequest($limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getFolders' + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getFoldersRequest($limit, $offset) + { + // verify the required parameter 'limit' is set + if ($limit === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $limit when calling getFolders' + ); + } + if ($limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ContactsApi.getFolders, must be smaller than or equal to 50.'); + } + + // verify the required parameter 'offset' is set + if ($offset === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $offset when calling getFolders' + ); + } + + $resourcePath = '/contacts/folders'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getList + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetExtendedList + */ + public function getList($listId) + { + list($response) = $this->getListWithHttpInfo($listId); + return $response; + } + + /** + * Operation getListWithHttpInfo + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetExtendedList, HTTP status code, HTTP response headers (array of strings) + */ + public function getListWithHttpInfo($listId) + { + $returnType = '\SendinBlue\Client\Model\GetExtendedList'; + $request = $this->getListRequest($listId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetExtendedList', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getListAsync + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListAsync($listId) + { + return $this->getListAsyncWithHttpInfo($listId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getListAsyncWithHttpInfo + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListAsyncWithHttpInfo($listId) + { + $returnType = '\SendinBlue\Client\Model\GetExtendedList'; + $request = $this->getListRequest($listId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getList' + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getListRequest($listId) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling getList' + ); + } + + $resourcePath = '/contacts/lists/{listId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getLists + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetLists + */ + public function getLists($limit = '10', $offset = '0') + { + list($response) = $this->getListsWithHttpInfo($limit, $offset); + return $response; + } + + /** + * Operation getListsWithHttpInfo + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetLists, HTTP status code, HTTP response headers (array of strings) + */ + public function getListsWithHttpInfo($limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetLists'; + $request = $this->getListsRequest($limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetLists', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getListsAsync + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListsAsync($limit = '10', $offset = '0') + { + return $this->getListsAsyncWithHttpInfo($limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getListsAsyncWithHttpInfo + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListsAsyncWithHttpInfo($limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetLists'; + $request = $this->getListsRequest($limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getLists' + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getListsRequest($limit = '10', $offset = '0') + { + if ($limit !== null && $limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ContactsApi.getLists, must be smaller than or equal to 50.'); + } + + + $resourcePath = '/contacts/lists'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation importContacts + * + * Import contacts + * + * @param \SendinBlue\Client\Model\RequestContactImport $requestContactImport Values to import contacts in Sendinblue. To know more about the expected format, please have a look at ``https://help.sendinblue.com/hc/en-us/articles/209499265-Build-contacts-lists-for-your-email-marketing-campaigns`` (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreatedProcessId + */ + public function importContacts($requestContactImport) + { + list($response) = $this->importContactsWithHttpInfo($requestContactImport); + return $response; + } + + /** + * Operation importContactsWithHttpInfo + * + * Import contacts + * + * @param \SendinBlue\Client\Model\RequestContactImport $requestContactImport Values to import contacts in Sendinblue. To know more about the expected format, please have a look at ``https://help.sendinblue.com/hc/en-us/articles/209499265-Build-contacts-lists-for-your-email-marketing-campaigns`` (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreatedProcessId, HTTP status code, HTTP response headers (array of strings) + */ + public function importContactsWithHttpInfo($requestContactImport) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->importContactsRequest($requestContactImport); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 202: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreatedProcessId', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation importContactsAsync + * + * Import contacts + * + * @param \SendinBlue\Client\Model\RequestContactImport $requestContactImport Values to import contacts in Sendinblue. To know more about the expected format, please have a look at ``https://help.sendinblue.com/hc/en-us/articles/209499265-Build-contacts-lists-for-your-email-marketing-campaigns`` (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function importContactsAsync($requestContactImport) + { + return $this->importContactsAsyncWithHttpInfo($requestContactImport) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation importContactsAsyncWithHttpInfo + * + * Import contacts + * + * @param \SendinBlue\Client\Model\RequestContactImport $requestContactImport Values to import contacts in Sendinblue. To know more about the expected format, please have a look at ``https://help.sendinblue.com/hc/en-us/articles/209499265-Build-contacts-lists-for-your-email-marketing-campaigns`` (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function importContactsAsyncWithHttpInfo($requestContactImport) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->importContactsRequest($requestContactImport); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'importContacts' + * + * @param \SendinBlue\Client\Model\RequestContactImport $requestContactImport Values to import contacts in Sendinblue. To know more about the expected format, please have a look at ``https://help.sendinblue.com/hc/en-us/articles/209499265-Build-contacts-lists-for-your-email-marketing-campaigns`` (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function importContactsRequest($requestContactImport) + { + // verify the required parameter 'requestContactImport' is set + if ($requestContactImport === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $requestContactImport when calling importContacts' + ); + } + + $resourcePath = '/contacts/import'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($requestContactImport)) { + $_tempBody = $requestContactImport; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation removeContactFromList + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\PostContactInfo + */ + public function removeContactFromList($listId, $contactEmails) + { + list($response) = $this->removeContactFromListWithHttpInfo($listId, $contactEmails); + return $response; + } + + /** + * Operation removeContactFromListWithHttpInfo + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\PostContactInfo, HTTP status code, HTTP response headers (array of strings) + */ + public function removeContactFromListWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->removeContactFromListRequest($listId, $contactEmails); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostContactInfo', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation removeContactFromListAsync + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function removeContactFromListAsync($listId, $contactEmails) + { + return $this->removeContactFromListAsyncWithHttpInfo($listId, $contactEmails) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation removeContactFromListAsyncWithHttpInfo + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function removeContactFromListAsyncWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->removeContactFromListRequest($listId, $contactEmails); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'removeContactFromList' + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function removeContactFromListRequest($listId, $contactEmails) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling removeContactFromList' + ); + } + // verify the required parameter 'contactEmails' is set + if ($contactEmails === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $contactEmails when calling removeContactFromList' + ); + } + + $resourcePath = '/contacts/lists/{listId}/contacts/remove'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($contactEmails)) { + $_tempBody = $contactEmails; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation requestContactExport + * + * Export contacts + * + * @param \SendinBlue\Client\Model\RequestContactExport $requestContactExport Values to request a contact export (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreatedProcessId + */ + public function requestContactExport($requestContactExport) + { + list($response) = $this->requestContactExportWithHttpInfo($requestContactExport); + return $response; + } + + /** + * Operation requestContactExportWithHttpInfo + * + * Export contacts + * + * @param \SendinBlue\Client\Model\RequestContactExport $requestContactExport Values to request a contact export (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreatedProcessId, HTTP status code, HTTP response headers (array of strings) + */ + public function requestContactExportWithHttpInfo($requestContactExport) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->requestContactExportRequest($requestContactExport); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 202: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreatedProcessId', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation requestContactExportAsync + * + * Export contacts + * + * @param \SendinBlue\Client\Model\RequestContactExport $requestContactExport Values to request a contact export (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function requestContactExportAsync($requestContactExport) + { + return $this->requestContactExportAsyncWithHttpInfo($requestContactExport) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation requestContactExportAsyncWithHttpInfo + * + * Export contacts + * + * @param \SendinBlue\Client\Model\RequestContactExport $requestContactExport Values to request a contact export (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function requestContactExportAsyncWithHttpInfo($requestContactExport) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->requestContactExportRequest($requestContactExport); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'requestContactExport' + * + * @param \SendinBlue\Client\Model\RequestContactExport $requestContactExport Values to request a contact export (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function requestContactExportRequest($requestContactExport) + { + // verify the required parameter 'requestContactExport' is set + if ($requestContactExport === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $requestContactExport when calling requestContactExport' + ); + } + + $resourcePath = '/contacts/export'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($requestContactExport)) { + $_tempBody = $requestContactExport; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateAttribute + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateAttribute($attributeCategory, $attributeName, $updateAttribute) + { + $this->updateAttributeWithHttpInfo($attributeCategory, $attributeName, $updateAttribute); + } + + /** + * Operation updateAttributeWithHttpInfo + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateAttributeWithHttpInfo($attributeCategory, $attributeName, $updateAttribute) + { + $returnType = ''; + $request = $this->updateAttributeRequest($attributeCategory, $attributeName, $updateAttribute); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateAttributeAsync + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateAttributeAsync($attributeCategory, $attributeName, $updateAttribute) + { + return $this->updateAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $updateAttribute) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateAttributeAsyncWithHttpInfo + * + * Updates contact attribute + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateAttributeAsyncWithHttpInfo($attributeCategory, $attributeName, $updateAttribute) + { + $returnType = ''; + $request = $this->updateAttributeRequest($attributeCategory, $attributeName, $updateAttribute); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateAttribute' + * + * @param string $attributeCategory Category of the attribute (required) + * @param string $attributeName Name of the existing attribute (required) + * @param \SendinBlue\Client\Model\UpdateAttribute $updateAttribute Values to update an attribute (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateAttributeRequest($attributeCategory, $attributeName, $updateAttribute) + { + // verify the required parameter 'attributeCategory' is set + if ($attributeCategory === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeCategory when calling updateAttribute' + ); + } + // verify the required parameter 'attributeName' is set + if ($attributeName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $attributeName when calling updateAttribute' + ); + } + // verify the required parameter 'updateAttribute' is set + if ($updateAttribute === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateAttribute when calling updateAttribute' + ); + } + + $resourcePath = '/contacts/attributes/{attributeCategory}/{attributeName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($attributeCategory !== null) { + $resourcePath = str_replace( + '{' . 'attributeCategory' . '}', + ObjectSerializer::toPathValue($attributeCategory), + $resourcePath + ); + } + // path params + if ($attributeName !== null) { + $resourcePath = str_replace( + '{' . 'attributeName' . '}', + ObjectSerializer::toPathValue($attributeName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateAttribute)) { + $_tempBody = $updateAttribute; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateContact + * + * Updates a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * @param \SendinBlue\Client\Model\UpdateContact $updateContact Values to update a contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateContact($email, $updateContact) + { + $this->updateContactWithHttpInfo($email, $updateContact); + } + + /** + * Operation updateContactWithHttpInfo + * + * Updates a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * @param \SendinBlue\Client\Model\UpdateContact $updateContact Values to update a contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateContactWithHttpInfo($email, $updateContact) + { + $returnType = ''; + $request = $this->updateContactRequest($email, $updateContact); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateContactAsync + * + * Updates a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * @param \SendinBlue\Client\Model\UpdateContact $updateContact Values to update a contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateContactAsync($email, $updateContact) + { + return $this->updateContactAsyncWithHttpInfo($email, $updateContact) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateContactAsyncWithHttpInfo + * + * Updates a contact + * + * @param string $email Email (urlencoded) of the contact (required) + * @param \SendinBlue\Client\Model\UpdateContact $updateContact Values to update a contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateContactAsyncWithHttpInfo($email, $updateContact) + { + $returnType = ''; + $request = $this->updateContactRequest($email, $updateContact); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateContact' + * + * @param string $email Email (urlencoded) of the contact (required) + * @param \SendinBlue\Client\Model\UpdateContact $updateContact Values to update a contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateContactRequest($email, $updateContact) + { + // verify the required parameter 'email' is set + if ($email === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $email when calling updateContact' + ); + } + // verify the required parameter 'updateContact' is set + if ($updateContact === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateContact when calling updateContact' + ); + } + + $resourcePath = '/contacts/{email}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($email !== null) { + $resourcePath = str_replace( + '{' . 'email' . '}', + ObjectSerializer::toPathValue($email), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateContact)) { + $_tempBody = $updateContact; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateFolder + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateFolder($folderId, $updateFolder) + { + $this->updateFolderWithHttpInfo($folderId, $updateFolder); + } + + /** + * Operation updateFolderWithHttpInfo + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateFolderWithHttpInfo($folderId, $updateFolder) + { + $returnType = ''; + $request = $this->updateFolderRequest($folderId, $updateFolder); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateFolderAsync + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateFolderAsync($folderId, $updateFolder) + { + return $this->updateFolderAsyncWithHttpInfo($folderId, $updateFolder) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateFolderAsyncWithHttpInfo + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateFolderAsyncWithHttpInfo($folderId, $updateFolder) + { + $returnType = ''; + $request = $this->updateFolderRequest($folderId, $updateFolder); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateFolder' + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateFolderRequest($folderId, $updateFolder) + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling updateFolder' + ); + } + // verify the required parameter 'updateFolder' is set + if ($updateFolder === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateFolder when calling updateFolder' + ); + } + + $resourcePath = '/contacts/folders/{folderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateFolder)) { + $_tempBody = $updateFolder; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateList + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateList($listId, $updateList) + { + $this->updateListWithHttpInfo($listId, $updateList); + } + + /** + * Operation updateListWithHttpInfo + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateListWithHttpInfo($listId, $updateList) + { + $returnType = ''; + $request = $this->updateListRequest($listId, $updateList); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateListAsync + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateListAsync($listId, $updateList) + { + return $this->updateListAsyncWithHttpInfo($listId, $updateList) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateListAsyncWithHttpInfo + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateListAsyncWithHttpInfo($listId, $updateList) + { + $returnType = ''; + $request = $this->updateListRequest($listId, $updateList); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateList' + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateListRequest($listId, $updateList) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling updateList' + ); + } + // verify the required parameter 'updateList' is set + if ($updateList === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateList when calling updateList' + ); + } + + $resourcePath = '/contacts/lists/{listId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateList)) { + $_tempBody = $updateList; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/EmailCampaignsApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/EmailCampaignsApi.php new file mode 100644 index 0000000..049f9df --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/EmailCampaignsApi.php @@ -0,0 +1,2851 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation createEmailCampaign + * + * Create an email campaign + * + * @param \SendinBlue\Client\Model\CreateEmailCampaign $emailCampaigns Values to create a campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createEmailCampaign($emailCampaigns) + { + list($response) = $this->createEmailCampaignWithHttpInfo($emailCampaigns); + return $response; + } + + /** + * Operation createEmailCampaignWithHttpInfo + * + * Create an email campaign + * + * @param \SendinBlue\Client\Model\CreateEmailCampaign $emailCampaigns Values to create a campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createEmailCampaignWithHttpInfo($emailCampaigns) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createEmailCampaignRequest($emailCampaigns); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createEmailCampaignAsync + * + * Create an email campaign + * + * @param \SendinBlue\Client\Model\CreateEmailCampaign $emailCampaigns Values to create a campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createEmailCampaignAsync($emailCampaigns) + { + return $this->createEmailCampaignAsyncWithHttpInfo($emailCampaigns) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createEmailCampaignAsyncWithHttpInfo + * + * Create an email campaign + * + * @param \SendinBlue\Client\Model\CreateEmailCampaign $emailCampaigns Values to create a campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createEmailCampaignAsyncWithHttpInfo($emailCampaigns) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createEmailCampaignRequest($emailCampaigns); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createEmailCampaign' + * + * @param \SendinBlue\Client\Model\CreateEmailCampaign $emailCampaigns Values to create a campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createEmailCampaignRequest($emailCampaigns) + { + // verify the required parameter 'emailCampaigns' is set + if ($emailCampaigns === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $emailCampaigns when calling createEmailCampaign' + ); + } + + $resourcePath = '/emailCampaigns'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($emailCampaigns)) { + $_tempBody = $emailCampaigns; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteEmailCampaign + * + * Delete an email campaign + * + * @param int $campaignId id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteEmailCampaign($campaignId) + { + $this->deleteEmailCampaignWithHttpInfo($campaignId); + } + + /** + * Operation deleteEmailCampaignWithHttpInfo + * + * Delete an email campaign + * + * @param int $campaignId id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteEmailCampaignWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->deleteEmailCampaignRequest($campaignId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteEmailCampaignAsync + * + * Delete an email campaign + * + * @param int $campaignId id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteEmailCampaignAsync($campaignId) + { + return $this->deleteEmailCampaignAsyncWithHttpInfo($campaignId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteEmailCampaignAsyncWithHttpInfo + * + * Delete an email campaign + * + * @param int $campaignId id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteEmailCampaignAsyncWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->deleteEmailCampaignRequest($campaignId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteEmailCampaign' + * + * @param int $campaignId id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteEmailCampaignRequest($campaignId) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling deleteEmailCampaign' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation emailExportRecipients + * + * Export the recipients of a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\EmailExportRecipients $recipientExport Values to send for a recipient export request (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreatedProcessId + */ + public function emailExportRecipients($campaignId, $recipientExport = null) + { + list($response) = $this->emailExportRecipientsWithHttpInfo($campaignId, $recipientExport); + return $response; + } + + /** + * Operation emailExportRecipientsWithHttpInfo + * + * Export the recipients of a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\EmailExportRecipients $recipientExport Values to send for a recipient export request (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreatedProcessId, HTTP status code, HTTP response headers (array of strings) + */ + public function emailExportRecipientsWithHttpInfo($campaignId, $recipientExport = null) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->emailExportRecipientsRequest($campaignId, $recipientExport); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 202: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreatedProcessId', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation emailExportRecipientsAsync + * + * Export the recipients of a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\EmailExportRecipients $recipientExport Values to send for a recipient export request (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function emailExportRecipientsAsync($campaignId, $recipientExport = null) + { + return $this->emailExportRecipientsAsyncWithHttpInfo($campaignId, $recipientExport) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation emailExportRecipientsAsyncWithHttpInfo + * + * Export the recipients of a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\EmailExportRecipients $recipientExport Values to send for a recipient export request (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function emailExportRecipientsAsyncWithHttpInfo($campaignId, $recipientExport = null) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->emailExportRecipientsRequest($campaignId, $recipientExport); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'emailExportRecipients' + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\EmailExportRecipients $recipientExport Values to send for a recipient export request (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function emailExportRecipientsRequest($campaignId, $recipientExport = null) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling emailExportRecipients' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}/exportRecipients'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($recipientExport)) { + $_tempBody = $recipientExport; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getEmailCampaign + * + * Get campaign informations + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetEmailCampaign + */ + public function getEmailCampaign($campaignId) + { + list($response) = $this->getEmailCampaignWithHttpInfo($campaignId); + return $response; + } + + /** + * Operation getEmailCampaignWithHttpInfo + * + * Get campaign informations + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetEmailCampaign, HTTP status code, HTTP response headers (array of strings) + */ + public function getEmailCampaignWithHttpInfo($campaignId) + { + $returnType = '\SendinBlue\Client\Model\GetEmailCampaign'; + $request = $this->getEmailCampaignRequest($campaignId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetEmailCampaign', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getEmailCampaignAsync + * + * Get campaign informations + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getEmailCampaignAsync($campaignId) + { + return $this->getEmailCampaignAsyncWithHttpInfo($campaignId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getEmailCampaignAsyncWithHttpInfo + * + * Get campaign informations + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getEmailCampaignAsyncWithHttpInfo($campaignId) + { + $returnType = '\SendinBlue\Client\Model\GetEmailCampaign'; + $request = $this->getEmailCampaignRequest($campaignId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getEmailCampaign' + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getEmailCampaignRequest($campaignId) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling getEmailCampaign' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getEmailCampaigns + * + * Return all your created campaigns + * + * @param string $type Filter on the type of the campaigns (optional) + * @param string $status Filter on the status of the campaign (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number of documents per page (optional, default to 500) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetEmailCampaigns + */ + public function getEmailCampaigns($type = null, $status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + list($response) = $this->getEmailCampaignsWithHttpInfo($type, $status, $startDate, $endDate, $limit, $offset); + return $response; + } + + /** + * Operation getEmailCampaignsWithHttpInfo + * + * Return all your created campaigns + * + * @param string $type Filter on the type of the campaigns (optional) + * @param string $status Filter on the status of the campaign (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number of documents per page (optional, default to 500) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetEmailCampaigns, HTTP status code, HTTP response headers (array of strings) + */ + public function getEmailCampaignsWithHttpInfo($type = null, $status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetEmailCampaigns'; + $request = $this->getEmailCampaignsRequest($type, $status, $startDate, $endDate, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetEmailCampaigns', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getEmailCampaignsAsync + * + * Return all your created campaigns + * + * @param string $type Filter on the type of the campaigns (optional) + * @param string $status Filter on the status of the campaign (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number of documents per page (optional, default to 500) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getEmailCampaignsAsync($type = null, $status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + return $this->getEmailCampaignsAsyncWithHttpInfo($type, $status, $startDate, $endDate, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getEmailCampaignsAsyncWithHttpInfo + * + * Return all your created campaigns + * + * @param string $type Filter on the type of the campaigns (optional) + * @param string $status Filter on the status of the campaign (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number of documents per page (optional, default to 500) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getEmailCampaignsAsyncWithHttpInfo($type = null, $status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetEmailCampaigns'; + $request = $this->getEmailCampaignsRequest($type, $status, $startDate, $endDate, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getEmailCampaigns' + * + * @param string $type Filter on the type of the campaigns (optional) + * @param string $status Filter on the status of the campaign (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent email campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number of documents per page (optional, default to 500) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getEmailCampaignsRequest($type = null, $status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + if ($limit !== null && $limit > 1000) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling EmailCampaignsApi.getEmailCampaigns, must be smaller than or equal to 1000.'); + } + + + $resourcePath = '/emailCampaigns'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($type !== null) { + $queryParams['type'] = ObjectSerializer::toQueryValue($type); + } + // query params + if ($status !== null) { + $queryParams['status'] = ObjectSerializer::toQueryValue($status); + } + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendEmailCampaignNow + * + * Send an email campaign id of the campaign immediately + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function sendEmailCampaignNow($campaignId) + { + $this->sendEmailCampaignNowWithHttpInfo($campaignId); + } + + /** + * Operation sendEmailCampaignNowWithHttpInfo + * + * Send an email campaign id of the campaign immediately + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function sendEmailCampaignNowWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->sendEmailCampaignNowRequest($campaignId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 402: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendEmailCampaignNowAsync + * + * Send an email campaign id of the campaign immediately + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendEmailCampaignNowAsync($campaignId) + { + return $this->sendEmailCampaignNowAsyncWithHttpInfo($campaignId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendEmailCampaignNowAsyncWithHttpInfo + * + * Send an email campaign id of the campaign immediately + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendEmailCampaignNowAsyncWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->sendEmailCampaignNowRequest($campaignId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendEmailCampaignNow' + * + * @param int $campaignId Id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendEmailCampaignNowRequest($campaignId) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling sendEmailCampaignNow' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}/sendNow'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendReport + * + * Send the report of a campaigns + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function sendReport($campaignId, $sendReport) + { + $this->sendReportWithHttpInfo($campaignId, $sendReport); + } + + /** + * Operation sendReportWithHttpInfo + * + * Send the report of a campaigns + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function sendReportWithHttpInfo($campaignId, $sendReport) + { + $returnType = ''; + $request = $this->sendReportRequest($campaignId, $sendReport); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendReportAsync + * + * Send the report of a campaigns + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendReportAsync($campaignId, $sendReport) + { + return $this->sendReportAsyncWithHttpInfo($campaignId, $sendReport) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendReportAsyncWithHttpInfo + * + * Send the report of a campaigns + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendReportAsyncWithHttpInfo($campaignId, $sendReport) + { + $returnType = ''; + $request = $this->sendReportRequest($campaignId, $sendReport); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendReport' + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendReportRequest($campaignId, $sendReport) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling sendReport' + ); + } + // verify the required parameter 'sendReport' is set + if ($sendReport === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $sendReport when calling sendReport' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}/sendReport'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($sendReport)) { + $_tempBody = $sendReport; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendTestEmail + * + * Send an email campaign to your test list + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendTestEmail $emailTo emailTo (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function sendTestEmail($campaignId, $emailTo) + { + $this->sendTestEmailWithHttpInfo($campaignId, $emailTo); + } + + /** + * Operation sendTestEmailWithHttpInfo + * + * Send an email campaign to your test list + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendTestEmail $emailTo (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function sendTestEmailWithHttpInfo($campaignId, $emailTo) + { + $returnType = ''; + $request = $this->sendTestEmailRequest($campaignId, $emailTo); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostSendFailed', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendTestEmailAsync + * + * Send an email campaign to your test list + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendTestEmail $emailTo (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTestEmailAsync($campaignId, $emailTo) + { + return $this->sendTestEmailAsyncWithHttpInfo($campaignId, $emailTo) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendTestEmailAsyncWithHttpInfo + * + * Send an email campaign to your test list + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendTestEmail $emailTo (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTestEmailAsyncWithHttpInfo($campaignId, $emailTo) + { + $returnType = ''; + $request = $this->sendTestEmailRequest($campaignId, $emailTo); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendTestEmail' + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\SendTestEmail $emailTo (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendTestEmailRequest($campaignId, $emailTo) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling sendTestEmail' + ); + } + // verify the required parameter 'emailTo' is set + if ($emailTo === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $emailTo when calling sendTestEmail' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}/sendTest'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($emailTo)) { + $_tempBody = $emailTo; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateCampaignStatus + * + * Update a campaign status + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateCampaignStatus($campaignId, $status) + { + $this->updateCampaignStatusWithHttpInfo($campaignId, $status); + } + + /** + * Operation updateCampaignStatusWithHttpInfo + * + * Update a campaign status + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateCampaignStatusWithHttpInfo($campaignId, $status) + { + $returnType = ''; + $request = $this->updateCampaignStatusRequest($campaignId, $status); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateCampaignStatusAsync + * + * Update a campaign status + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateCampaignStatusAsync($campaignId, $status) + { + return $this->updateCampaignStatusAsyncWithHttpInfo($campaignId, $status) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateCampaignStatusAsyncWithHttpInfo + * + * Update a campaign status + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateCampaignStatusAsyncWithHttpInfo($campaignId, $status) + { + $returnType = ''; + $request = $this->updateCampaignStatusRequest($campaignId, $status); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateCampaignStatus' + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateCampaignStatusRequest($campaignId, $status) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling updateCampaignStatus' + ); + } + // verify the required parameter 'status' is set + if ($status === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $status when calling updateCampaignStatus' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}/status'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($status)) { + $_tempBody = $status; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateEmailCampaign + * + * Update a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateEmailCampaign $emailCampaign Values to update a campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateEmailCampaign($campaignId, $emailCampaign) + { + $this->updateEmailCampaignWithHttpInfo($campaignId, $emailCampaign); + } + + /** + * Operation updateEmailCampaignWithHttpInfo + * + * Update a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateEmailCampaign $emailCampaign Values to update a campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateEmailCampaignWithHttpInfo($campaignId, $emailCampaign) + { + $returnType = ''; + $request = $this->updateEmailCampaignRequest($campaignId, $emailCampaign); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateEmailCampaignAsync + * + * Update a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateEmailCampaign $emailCampaign Values to update a campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateEmailCampaignAsync($campaignId, $emailCampaign) + { + return $this->updateEmailCampaignAsyncWithHttpInfo($campaignId, $emailCampaign) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateEmailCampaignAsyncWithHttpInfo + * + * Update a campaign + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateEmailCampaign $emailCampaign Values to update a campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateEmailCampaignAsyncWithHttpInfo($campaignId, $emailCampaign) + { + $returnType = ''; + $request = $this->updateEmailCampaignRequest($campaignId, $emailCampaign); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateEmailCampaign' + * + * @param int $campaignId Id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateEmailCampaign $emailCampaign Values to update a campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateEmailCampaignRequest($campaignId, $emailCampaign) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling updateEmailCampaign' + ); + } + // verify the required parameter 'emailCampaign' is set + if ($emailCampaign === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $emailCampaign when calling updateEmailCampaign' + ); + } + + $resourcePath = '/emailCampaigns/{campaignId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($emailCampaign)) { + $_tempBody = $emailCampaign; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/FoldersApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/FoldersApi.php new file mode 100644 index 0000000..df78954 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/FoldersApi.php @@ -0,0 +1,1787 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation createFolder + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createFolder($createFolder) + { + list($response) = $this->createFolderWithHttpInfo($createFolder); + return $response; + } + + /** + * Operation createFolderWithHttpInfo + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createFolderWithHttpInfo($createFolder) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createFolderRequest($createFolder); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createFolderAsync + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createFolderAsync($createFolder) + { + return $this->createFolderAsyncWithHttpInfo($createFolder) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createFolderAsyncWithHttpInfo + * + * Create a folder + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createFolderAsyncWithHttpInfo($createFolder) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createFolderRequest($createFolder); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createFolder' + * + * @param \SendinBlue\Client\Model\CreateUpdateFolder $createFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createFolderRequest($createFolder) + { + // verify the required parameter 'createFolder' is set + if ($createFolder === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createFolder when calling createFolder' + ); + } + + $resourcePath = '/contacts/folders'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($createFolder)) { + $_tempBody = $createFolder; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteFolder + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteFolder($folderId) + { + $this->deleteFolderWithHttpInfo($folderId); + } + + /** + * Operation deleteFolderWithHttpInfo + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteFolderWithHttpInfo($folderId) + { + $returnType = ''; + $request = $this->deleteFolderRequest($folderId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteFolderAsync + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteFolderAsync($folderId) + { + return $this->deleteFolderAsyncWithHttpInfo($folderId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteFolderAsyncWithHttpInfo + * + * Delete a folder (and all its lists) + * + * @param int $folderId Id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteFolderAsyncWithHttpInfo($folderId) + { + $returnType = ''; + $request = $this->deleteFolderRequest($folderId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteFolder' + * + * @param int $folderId Id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteFolderRequest($folderId) + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling deleteFolder' + ); + } + + $resourcePath = '/contacts/folders/{folderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getFolder + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetFolder + */ + public function getFolder($folderId) + { + list($response) = $this->getFolderWithHttpInfo($folderId); + return $response; + } + + /** + * Operation getFolderWithHttpInfo + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetFolder, HTTP status code, HTTP response headers (array of strings) + */ + public function getFolderWithHttpInfo($folderId) + { + $returnType = '\SendinBlue\Client\Model\GetFolder'; + $request = $this->getFolderRequest($folderId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetFolder', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getFolderAsync + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderAsync($folderId) + { + return $this->getFolderAsyncWithHttpInfo($folderId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getFolderAsyncWithHttpInfo + * + * Returns folder details + * + * @param int $folderId id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderAsyncWithHttpInfo($folderId) + { + $returnType = '\SendinBlue\Client\Model\GetFolder'; + $request = $this->getFolderRequest($folderId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getFolder' + * + * @param int $folderId id of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getFolderRequest($folderId) + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling getFolder' + ); + } + + $resourcePath = '/contacts/folders/{folderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getFolderLists + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetFolderLists + */ + public function getFolderLists($folderId, $limit = '10', $offset = '0') + { + list($response) = $this->getFolderListsWithHttpInfo($folderId, $limit, $offset); + return $response; + } + + /** + * Operation getFolderListsWithHttpInfo + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetFolderLists, HTTP status code, HTTP response headers (array of strings) + */ + public function getFolderListsWithHttpInfo($folderId, $limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetFolderLists'; + $request = $this->getFolderListsRequest($folderId, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetFolderLists', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getFolderListsAsync + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderListsAsync($folderId, $limit = '10', $offset = '0') + { + return $this->getFolderListsAsyncWithHttpInfo($folderId, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getFolderListsAsyncWithHttpInfo + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderListsAsyncWithHttpInfo($folderId, $limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetFolderLists'; + $request = $this->getFolderListsRequest($folderId, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getFolderLists' + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getFolderListsRequest($folderId, $limit = '10', $offset = '0') + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling getFolderLists' + ); + } + if ($limit !== null && $limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling FoldersApi.getFolderLists, must be smaller than or equal to 50.'); + } + + + $resourcePath = '/contacts/folders/{folderId}/lists'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getFolders + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetFolders + */ + public function getFolders($limit, $offset) + { + list($response) = $this->getFoldersWithHttpInfo($limit, $offset); + return $response; + } + + /** + * Operation getFoldersWithHttpInfo + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetFolders, HTTP status code, HTTP response headers (array of strings) + */ + public function getFoldersWithHttpInfo($limit, $offset) + { + $returnType = '\SendinBlue\Client\Model\GetFolders'; + $request = $this->getFoldersRequest($limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetFolders', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getFoldersAsync + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFoldersAsync($limit, $offset) + { + return $this->getFoldersAsyncWithHttpInfo($limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getFoldersAsyncWithHttpInfo + * + * Get all the folders + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFoldersAsyncWithHttpInfo($limit, $offset) + { + $returnType = '\SendinBlue\Client\Model\GetFolders'; + $request = $this->getFoldersRequest($limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getFolders' + * + * @param int $limit Number of documents per page (required) + * @param int $offset Index of the first document of the page (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getFoldersRequest($limit, $offset) + { + // verify the required parameter 'limit' is set + if ($limit === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $limit when calling getFolders' + ); + } + if ($limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling FoldersApi.getFolders, must be smaller than or equal to 50.'); + } + + // verify the required parameter 'offset' is set + if ($offset === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $offset when calling getFolders' + ); + } + + $resourcePath = '/contacts/folders'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateFolder + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateFolder($folderId, $updateFolder) + { + $this->updateFolderWithHttpInfo($folderId, $updateFolder); + } + + /** + * Operation updateFolderWithHttpInfo + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateFolderWithHttpInfo($folderId, $updateFolder) + { + $returnType = ''; + $request = $this->updateFolderRequest($folderId, $updateFolder); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateFolderAsync + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateFolderAsync($folderId, $updateFolder) + { + return $this->updateFolderAsyncWithHttpInfo($folderId, $updateFolder) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateFolderAsyncWithHttpInfo + * + * Update a contact folder + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateFolderAsyncWithHttpInfo($folderId, $updateFolder) + { + $returnType = ''; + $request = $this->updateFolderRequest($folderId, $updateFolder); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateFolder' + * + * @param int $folderId Id of the folder (required) + * @param \SendinBlue\Client\Model\CreateUpdateFolder $updateFolder Name of the folder (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateFolderRequest($folderId, $updateFolder) + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling updateFolder' + ); + } + // verify the required parameter 'updateFolder' is set + if ($updateFolder === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateFolder when calling updateFolder' + ); + } + + $resourcePath = '/contacts/folders/{folderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateFolder)) { + $_tempBody = $updateFolder; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ListsApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ListsApi.php new file mode 100644 index 0000000..206c481 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ListsApi.php @@ -0,0 +1,2698 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation addContactToList + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\PostContactInfo + */ + public function addContactToList($listId, $contactEmails) + { + list($response) = $this->addContactToListWithHttpInfo($listId, $contactEmails); + return $response; + } + + /** + * Operation addContactToListWithHttpInfo + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\PostContactInfo, HTTP status code, HTTP response headers (array of strings) + */ + public function addContactToListWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->addContactToListRequest($listId, $contactEmails); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostContactInfo', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation addContactToListAsync + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function addContactToListAsync($listId, $contactEmails) + { + return $this->addContactToListAsyncWithHttpInfo($listId, $contactEmails) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation addContactToListAsyncWithHttpInfo + * + * Add existing contacts to a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function addContactToListAsyncWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->addContactToListRequest($listId, $contactEmails); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'addContactToList' + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\AddContactToList $contactEmails Emails addresses of the contacts (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function addContactToListRequest($listId, $contactEmails) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling addContactToList' + ); + } + // verify the required parameter 'contactEmails' is set + if ($contactEmails === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $contactEmails when calling addContactToList' + ); + } + + $resourcePath = '/contacts/lists/{listId}/contacts/add'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($contactEmails)) { + $_tempBody = $contactEmails; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation createList + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createList($createList) + { + list($response) = $this->createListWithHttpInfo($createList); + return $response; + } + + /** + * Operation createListWithHttpInfo + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createListWithHttpInfo($createList) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createListRequest($createList); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createListAsync + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createListAsync($createList) + { + return $this->createListAsyncWithHttpInfo($createList) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createListAsyncWithHttpInfo + * + * Create a list + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createListAsyncWithHttpInfo($createList) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createListRequest($createList); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createList' + * + * @param \SendinBlue\Client\Model\CreateList $createList Values to create a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createListRequest($createList) + { + // verify the required parameter 'createList' is set + if ($createList === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createList when calling createList' + ); + } + + $resourcePath = '/contacts/lists'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($createList)) { + $_tempBody = $createList; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteList + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteList($listId) + { + $this->deleteListWithHttpInfo($listId); + } + + /** + * Operation deleteListWithHttpInfo + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteListWithHttpInfo($listId) + { + $returnType = ''; + $request = $this->deleteListRequest($listId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteListAsync + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteListAsync($listId) + { + return $this->deleteListAsyncWithHttpInfo($listId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteListAsyncWithHttpInfo + * + * Delete a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteListAsyncWithHttpInfo($listId) + { + $returnType = ''; + $request = $this->deleteListRequest($listId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteList' + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteListRequest($listId) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling deleteList' + ); + } + + $resourcePath = '/contacts/lists/{listId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getContactsFromList + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetContacts + */ + public function getContactsFromList($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + list($response) = $this->getContactsFromListWithHttpInfo($listId, $modifiedSince, $limit, $offset); + return $response; + } + + /** + * Operation getContactsFromListWithHttpInfo + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetContacts, HTTP status code, HTTP response headers (array of strings) + */ + public function getContactsFromListWithHttpInfo($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetContacts'; + $request = $this->getContactsFromListRequest($listId, $modifiedSince, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetContacts', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getContactsFromListAsync + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactsFromListAsync($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + return $this->getContactsFromListAsyncWithHttpInfo($listId, $modifiedSince, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getContactsFromListAsyncWithHttpInfo + * + * Get the contacts in a list + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getContactsFromListAsyncWithHttpInfo($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetContacts'; + $request = $this->getContactsFromListRequest($listId, $modifiedSince, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getContactsFromList' + * + * @param int $listId Id of the list (required) + * @param \DateTime $modifiedSince Filter (urlencoded) the contacts modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. (optional) + * @param int $limit Number of documents per page (optional, default to 50) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getContactsFromListRequest($listId, $modifiedSince = null, $limit = '50', $offset = '0') + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling getContactsFromList' + ); + } + if ($limit !== null && $limit > 500) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ListsApi.getContactsFromList, must be smaller than or equal to 500.'); + } + + + $resourcePath = '/contacts/lists/{listId}/contacts'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($modifiedSince !== null) { + $queryParams['modifiedSince'] = ObjectSerializer::toQueryValue($modifiedSince); + } + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getFolderLists + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetFolderLists + */ + public function getFolderLists($folderId, $limit = '10', $offset = '0') + { + list($response) = $this->getFolderListsWithHttpInfo($folderId, $limit, $offset); + return $response; + } + + /** + * Operation getFolderListsWithHttpInfo + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetFolderLists, HTTP status code, HTTP response headers (array of strings) + */ + public function getFolderListsWithHttpInfo($folderId, $limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetFolderLists'; + $request = $this->getFolderListsRequest($folderId, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetFolderLists', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getFolderListsAsync + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderListsAsync($folderId, $limit = '10', $offset = '0') + { + return $this->getFolderListsAsyncWithHttpInfo($folderId, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getFolderListsAsyncWithHttpInfo + * + * Get the lists in a folder + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getFolderListsAsyncWithHttpInfo($folderId, $limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetFolderLists'; + $request = $this->getFolderListsRequest($folderId, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getFolderLists' + * + * @param int $folderId Id of the folder (required) + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getFolderListsRequest($folderId, $limit = '10', $offset = '0') + { + // verify the required parameter 'folderId' is set + if ($folderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $folderId when calling getFolderLists' + ); + } + if ($limit !== null && $limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ListsApi.getFolderLists, must be smaller than or equal to 50.'); + } + + + $resourcePath = '/contacts/folders/{folderId}/lists'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + // path params + if ($folderId !== null) { + $resourcePath = str_replace( + '{' . 'folderId' . '}', + ObjectSerializer::toPathValue($folderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getList + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetExtendedList + */ + public function getList($listId) + { + list($response) = $this->getListWithHttpInfo($listId); + return $response; + } + + /** + * Operation getListWithHttpInfo + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetExtendedList, HTTP status code, HTTP response headers (array of strings) + */ + public function getListWithHttpInfo($listId) + { + $returnType = '\SendinBlue\Client\Model\GetExtendedList'; + $request = $this->getListRequest($listId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetExtendedList', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getListAsync + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListAsync($listId) + { + return $this->getListAsyncWithHttpInfo($listId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getListAsyncWithHttpInfo + * + * Get the details of a list + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListAsyncWithHttpInfo($listId) + { + $returnType = '\SendinBlue\Client\Model\GetExtendedList'; + $request = $this->getListRequest($listId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getList' + * + * @param int $listId Id of the list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getListRequest($listId) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling getList' + ); + } + + $resourcePath = '/contacts/lists/{listId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getLists + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetLists + */ + public function getLists($limit = '10', $offset = '0') + { + list($response) = $this->getListsWithHttpInfo($limit, $offset); + return $response; + } + + /** + * Operation getListsWithHttpInfo + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetLists, HTTP status code, HTTP response headers (array of strings) + */ + public function getListsWithHttpInfo($limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetLists'; + $request = $this->getListsRequest($limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetLists', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getListsAsync + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListsAsync($limit = '10', $offset = '0') + { + return $this->getListsAsyncWithHttpInfo($limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getListsAsyncWithHttpInfo + * + * Get all the lists + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getListsAsyncWithHttpInfo($limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetLists'; + $request = $this->getListsRequest($limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getLists' + * + * @param int $limit Number of documents per page (optional, default to 10) + * @param int $offset Index of the first document of the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getListsRequest($limit = '10', $offset = '0') + { + if ($limit !== null && $limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ListsApi.getLists, must be smaller than or equal to 50.'); + } + + + $resourcePath = '/contacts/lists'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation removeContactFromList + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\PostContactInfo + */ + public function removeContactFromList($listId, $contactEmails) + { + list($response) = $this->removeContactFromListWithHttpInfo($listId, $contactEmails); + return $response; + } + + /** + * Operation removeContactFromListWithHttpInfo + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\PostContactInfo, HTTP status code, HTTP response headers (array of strings) + */ + public function removeContactFromListWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->removeContactFromListRequest($listId, $contactEmails); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostContactInfo', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation removeContactFromListAsync + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function removeContactFromListAsync($listId, $contactEmails) + { + return $this->removeContactFromListAsyncWithHttpInfo($listId, $contactEmails) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation removeContactFromListAsyncWithHttpInfo + * + * Remove existing contacts from a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function removeContactFromListAsyncWithHttpInfo($listId, $contactEmails) + { + $returnType = '\SendinBlue\Client\Model\PostContactInfo'; + $request = $this->removeContactFromListRequest($listId, $contactEmails); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'removeContactFromList' + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\RemoveContactFromList $contactEmails Emails adresses of the contact (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function removeContactFromListRequest($listId, $contactEmails) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling removeContactFromList' + ); + } + // verify the required parameter 'contactEmails' is set + if ($contactEmails === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $contactEmails when calling removeContactFromList' + ); + } + + $resourcePath = '/contacts/lists/{listId}/contacts/remove'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($contactEmails)) { + $_tempBody = $contactEmails; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateList + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateList($listId, $updateList) + { + $this->updateListWithHttpInfo($listId, $updateList); + } + + /** + * Operation updateListWithHttpInfo + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateListWithHttpInfo($listId, $updateList) + { + $returnType = ''; + $request = $this->updateListRequest($listId, $updateList); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateListAsync + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateListAsync($listId, $updateList) + { + return $this->updateListAsyncWithHttpInfo($listId, $updateList) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateListAsyncWithHttpInfo + * + * Update a list + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateListAsyncWithHttpInfo($listId, $updateList) + { + $returnType = ''; + $request = $this->updateListRequest($listId, $updateList); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateList' + * + * @param int $listId Id of the list (required) + * @param \SendinBlue\Client\Model\UpdateList $updateList Values to update a list (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateListRequest($listId, $updateList) + { + // verify the required parameter 'listId' is set + if ($listId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $listId when calling updateList' + ); + } + // verify the required parameter 'updateList' is set + if ($updateList === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateList when calling updateList' + ); + } + + $resourcePath = '/contacts/lists/{listId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($listId !== null) { + $resourcePath = str_replace( + '{' . 'listId' . '}', + ObjectSerializer::toPathValue($listId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateList)) { + $_tempBody = $updateList; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ProcessApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ProcessApi.php new file mode 100644 index 0000000..a8f1cd8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ProcessApi.php @@ -0,0 +1,674 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation getProcess + * + * Return the informations for a process + * + * @param int $processId Id of the process (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetProcess + */ + public function getProcess($processId) + { + list($response) = $this->getProcessWithHttpInfo($processId); + return $response; + } + + /** + * Operation getProcessWithHttpInfo + * + * Return the informations for a process + * + * @param int $processId Id of the process (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetProcess, HTTP status code, HTTP response headers (array of strings) + */ + public function getProcessWithHttpInfo($processId) + { + $returnType = '\SendinBlue\Client\Model\GetProcess'; + $request = $this->getProcessRequest($processId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetProcess', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getProcessAsync + * + * Return the informations for a process + * + * @param int $processId Id of the process (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getProcessAsync($processId) + { + return $this->getProcessAsyncWithHttpInfo($processId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getProcessAsyncWithHttpInfo + * + * Return the informations for a process + * + * @param int $processId Id of the process (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getProcessAsyncWithHttpInfo($processId) + { + $returnType = '\SendinBlue\Client\Model\GetProcess'; + $request = $this->getProcessRequest($processId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getProcess' + * + * @param int $processId Id of the process (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getProcessRequest($processId) + { + // verify the required parameter 'processId' is set + if ($processId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $processId when calling getProcess' + ); + } + + $resourcePath = '/processes/{processId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($processId !== null) { + $resourcePath = str_replace( + '{' . 'processId' . '}', + ObjectSerializer::toPathValue($processId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getProcesses + * + * Return all the processes for your account + * + * @param int $limit Number limitation for the result returned (optional, default to 10) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetProcesses + */ + public function getProcesses($limit = '10', $offset = '0') + { + list($response) = $this->getProcessesWithHttpInfo($limit, $offset); + return $response; + } + + /** + * Operation getProcessesWithHttpInfo + * + * Return all the processes for your account + * + * @param int $limit Number limitation for the result returned (optional, default to 10) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetProcesses, HTTP status code, HTTP response headers (array of strings) + */ + public function getProcessesWithHttpInfo($limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetProcesses'; + $request = $this->getProcessesRequest($limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetProcesses', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getProcessesAsync + * + * Return all the processes for your account + * + * @param int $limit Number limitation for the result returned (optional, default to 10) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getProcessesAsync($limit = '10', $offset = '0') + { + return $this->getProcessesAsyncWithHttpInfo($limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getProcessesAsyncWithHttpInfo + * + * Return all the processes for your account + * + * @param int $limit Number limitation for the result returned (optional, default to 10) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getProcessesAsyncWithHttpInfo($limit = '10', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetProcesses'; + $request = $this->getProcessesRequest($limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getProcesses' + * + * @param int $limit Number limitation for the result returned (optional, default to 10) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getProcessesRequest($limit = '10', $offset = '0') + { + if ($limit !== null && $limit > 50) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling ProcessApi.getProcesses, must be smaller than or equal to 50.'); + } + + + $resourcePath = '/processes'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ResellerApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ResellerApi.php new file mode 100644 index 0000000..cf7cf83 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/ResellerApi.php @@ -0,0 +1,4327 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation addCredits + * + * Add Email and/or SMS credits to a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddCredits $addCredits Values to post to add credit to a specific child account (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\RemainingCreditModel + */ + public function addCredits($childAuthKey, $addCredits) + { + list($response) = $this->addCreditsWithHttpInfo($childAuthKey, $addCredits); + return $response; + } + + /** + * Operation addCreditsWithHttpInfo + * + * Add Email and/or SMS credits to a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddCredits $addCredits Values to post to add credit to a specific child account (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\RemainingCreditModel, HTTP status code, HTTP response headers (array of strings) + */ + public function addCreditsWithHttpInfo($childAuthKey, $addCredits) + { + $returnType = '\SendinBlue\Client\Model\RemainingCreditModel'; + $request = $this->addCreditsRequest($childAuthKey, $addCredits); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\RemainingCreditModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation addCreditsAsync + * + * Add Email and/or SMS credits to a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddCredits $addCredits Values to post to add credit to a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function addCreditsAsync($childAuthKey, $addCredits) + { + return $this->addCreditsAsyncWithHttpInfo($childAuthKey, $addCredits) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation addCreditsAsyncWithHttpInfo + * + * Add Email and/or SMS credits to a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddCredits $addCredits Values to post to add credit to a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function addCreditsAsyncWithHttpInfo($childAuthKey, $addCredits) + { + $returnType = '\SendinBlue\Client\Model\RemainingCreditModel'; + $request = $this->addCreditsRequest($childAuthKey, $addCredits); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'addCredits' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddCredits $addCredits Values to post to add credit to a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function addCreditsRequest($childAuthKey, $addCredits) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling addCredits' + ); + } + // verify the required parameter 'addCredits' is set + if ($addCredits === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $addCredits when calling addCredits' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/credits/add'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($addCredits)) { + $_tempBody = $addCredits; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation associateIpToChild + * + * Associate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to associate (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function associateIpToChild($childAuthKey, $ip) + { + $this->associateIpToChildWithHttpInfo($childAuthKey, $ip); + } + + /** + * Operation associateIpToChildWithHttpInfo + * + * Associate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to associate (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function associateIpToChildWithHttpInfo($childAuthKey, $ip) + { + $returnType = ''; + $request = $this->associateIpToChildRequest($childAuthKey, $ip); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation associateIpToChildAsync + * + * Associate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to associate (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function associateIpToChildAsync($childAuthKey, $ip) + { + return $this->associateIpToChildAsyncWithHttpInfo($childAuthKey, $ip) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation associateIpToChildAsyncWithHttpInfo + * + * Associate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to associate (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function associateIpToChildAsyncWithHttpInfo($childAuthKey, $ip) + { + $returnType = ''; + $request = $this->associateIpToChildRequest($childAuthKey, $ip); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'associateIpToChild' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to associate (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function associateIpToChildRequest($childAuthKey, $ip) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling associateIpToChild' + ); + } + // verify the required parameter 'ip' is set + if ($ip === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $ip when calling associateIpToChild' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/ips/associate'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($ip)) { + $_tempBody = $ip; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation createChildDomain + * + * Creates a domain for a child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddChildDomain $addChildDomain Sender domain to add for a specific child account (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function createChildDomain($childAuthKey, $addChildDomain) + { + $this->createChildDomainWithHttpInfo($childAuthKey, $addChildDomain); + } + + /** + * Operation createChildDomainWithHttpInfo + * + * Creates a domain for a child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddChildDomain $addChildDomain Sender domain to add for a specific child account (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function createChildDomainWithHttpInfo($childAuthKey, $addChildDomain) + { + $returnType = ''; + $request = $this->createChildDomainRequest($childAuthKey, $addChildDomain); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createChildDomainAsync + * + * Creates a domain for a child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddChildDomain $addChildDomain Sender domain to add for a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createChildDomainAsync($childAuthKey, $addChildDomain) + { + return $this->createChildDomainAsyncWithHttpInfo($childAuthKey, $addChildDomain) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createChildDomainAsyncWithHttpInfo + * + * Creates a domain for a child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddChildDomain $addChildDomain Sender domain to add for a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createChildDomainAsyncWithHttpInfo($childAuthKey, $addChildDomain) + { + $returnType = ''; + $request = $this->createChildDomainRequest($childAuthKey, $addChildDomain); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createChildDomain' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\AddChildDomain $addChildDomain Sender domain to add for a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createChildDomainRequest($childAuthKey, $addChildDomain) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling createChildDomain' + ); + } + // verify the required parameter 'addChildDomain' is set + if ($addChildDomain === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $addChildDomain when calling createChildDomain' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/domains'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($addChildDomain)) { + $_tempBody = $addChildDomain; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation createResellerChild + * + * Creates a reseller child + * + * @param \SendinBlue\Client\Model\CreateChild $resellerChild reseller child to add (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateReseller + */ + public function createResellerChild($resellerChild = null) + { + list($response) = $this->createResellerChildWithHttpInfo($resellerChild); + return $response; + } + + /** + * Operation createResellerChildWithHttpInfo + * + * Creates a reseller child + * + * @param \SendinBlue\Client\Model\CreateChild $resellerChild reseller child to add (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateReseller, HTTP status code, HTTP response headers (array of strings) + */ + public function createResellerChildWithHttpInfo($resellerChild = null) + { + $returnType = '\SendinBlue\Client\Model\CreateReseller'; + $request = $this->createResellerChildRequest($resellerChild); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateReseller', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createResellerChildAsync + * + * Creates a reseller child + * + * @param \SendinBlue\Client\Model\CreateChild $resellerChild reseller child to add (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createResellerChildAsync($resellerChild = null) + { + return $this->createResellerChildAsyncWithHttpInfo($resellerChild) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createResellerChildAsyncWithHttpInfo + * + * Creates a reseller child + * + * @param \SendinBlue\Client\Model\CreateChild $resellerChild reseller child to add (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createResellerChildAsyncWithHttpInfo($resellerChild = null) + { + $returnType = '\SendinBlue\Client\Model\CreateReseller'; + $request = $this->createResellerChildRequest($resellerChild); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createResellerChild' + * + * @param \SendinBlue\Client\Model\CreateChild $resellerChild reseller child to add (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createResellerChildRequest($resellerChild = null) + { + + $resourcePath = '/reseller/children'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($resellerChild)) { + $_tempBody = $resellerChild; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteChildDomain + * + * Deletes the sender domain of the reseller child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be deleted (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteChildDomain($childAuthKey, $domainName) + { + $this->deleteChildDomainWithHttpInfo($childAuthKey, $domainName); + } + + /** + * Operation deleteChildDomainWithHttpInfo + * + * Deletes the sender domain of the reseller child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be deleted (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteChildDomainWithHttpInfo($childAuthKey, $domainName) + { + $returnType = ''; + $request = $this->deleteChildDomainRequest($childAuthKey, $domainName); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteChildDomainAsync + * + * Deletes the sender domain of the reseller child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be deleted (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteChildDomainAsync($childAuthKey, $domainName) + { + return $this->deleteChildDomainAsyncWithHttpInfo($childAuthKey, $domainName) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteChildDomainAsyncWithHttpInfo + * + * Deletes the sender domain of the reseller child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be deleted (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteChildDomainAsyncWithHttpInfo($childAuthKey, $domainName) + { + $returnType = ''; + $request = $this->deleteChildDomainRequest($childAuthKey, $domainName); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteChildDomain' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be deleted (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteChildDomainRequest($childAuthKey, $domainName) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling deleteChildDomain' + ); + } + // verify the required parameter 'domainName' is set + if ($domainName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $domainName when calling deleteChildDomain' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/domains/{domainName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + // path params + if ($domainName !== null) { + $resourcePath = str_replace( + '{' . 'domainName' . '}', + ObjectSerializer::toPathValue($domainName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteResellerChild + * + * Deletes a single reseller child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteResellerChild($childAuthKey) + { + $this->deleteResellerChildWithHttpInfo($childAuthKey); + } + + /** + * Operation deleteResellerChildWithHttpInfo + * + * Deletes a single reseller child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteResellerChildWithHttpInfo($childAuthKey) + { + $returnType = ''; + $request = $this->deleteResellerChildRequest($childAuthKey); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteResellerChildAsync + * + * Deletes a single reseller child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteResellerChildAsync($childAuthKey) + { + return $this->deleteResellerChildAsyncWithHttpInfo($childAuthKey) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteResellerChildAsyncWithHttpInfo + * + * Deletes a single reseller child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteResellerChildAsyncWithHttpInfo($childAuthKey) + { + $returnType = ''; + $request = $this->deleteResellerChildRequest($childAuthKey); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteResellerChild' + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteResellerChildRequest($childAuthKey) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling deleteResellerChild' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation dissociateIpFromChild + * + * Dissociate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to dissociate (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function dissociateIpFromChild($childAuthKey, $ip) + { + $this->dissociateIpFromChildWithHttpInfo($childAuthKey, $ip); + } + + /** + * Operation dissociateIpFromChildWithHttpInfo + * + * Dissociate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to dissociate (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function dissociateIpFromChildWithHttpInfo($childAuthKey, $ip) + { + $returnType = ''; + $request = $this->dissociateIpFromChildRequest($childAuthKey, $ip); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation dissociateIpFromChildAsync + * + * Dissociate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to dissociate (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function dissociateIpFromChildAsync($childAuthKey, $ip) + { + return $this->dissociateIpFromChildAsyncWithHttpInfo($childAuthKey, $ip) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation dissociateIpFromChildAsyncWithHttpInfo + * + * Dissociate a dedicated IP to the child + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to dissociate (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function dissociateIpFromChildAsyncWithHttpInfo($childAuthKey, $ip) + { + $returnType = ''; + $request = $this->dissociateIpFromChildRequest($childAuthKey, $ip); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'dissociateIpFromChild' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\ManageIp $ip IP to dissociate (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function dissociateIpFromChildRequest($childAuthKey, $ip) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling dissociateIpFromChild' + ); + } + // verify the required parameter 'ip' is set + if ($ip === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $ip when calling dissociateIpFromChild' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/ips/dissociate'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($ip)) { + $_tempBody = $ip; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getChildDomains + * + * Gets all the sender domains of a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetChildDomains + */ + public function getChildDomains($childAuthKey) + { + list($response) = $this->getChildDomainsWithHttpInfo($childAuthKey); + return $response; + } + + /** + * Operation getChildDomainsWithHttpInfo + * + * Gets all the sender domains of a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetChildDomains, HTTP status code, HTTP response headers (array of strings) + */ + public function getChildDomainsWithHttpInfo($childAuthKey) + { + $returnType = '\SendinBlue\Client\Model\GetChildDomains'; + $request = $this->getChildDomainsRequest($childAuthKey); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetChildDomains', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getChildDomainsAsync + * + * Gets all the sender domains of a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getChildDomainsAsync($childAuthKey) + { + return $this->getChildDomainsAsyncWithHttpInfo($childAuthKey) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getChildDomainsAsyncWithHttpInfo + * + * Gets all the sender domains of a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getChildDomainsAsyncWithHttpInfo($childAuthKey) + { + $returnType = '\SendinBlue\Client\Model\GetChildDomains'; + $request = $this->getChildDomainsRequest($childAuthKey); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getChildDomains' + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getChildDomainsRequest($childAuthKey) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling getChildDomains' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/domains'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getChildInfo + * + * Gets the info about a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetChildInfo + */ + public function getChildInfo($childAuthKey) + { + list($response) = $this->getChildInfoWithHttpInfo($childAuthKey); + return $response; + } + + /** + * Operation getChildInfoWithHttpInfo + * + * Gets the info about a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetChildInfo, HTTP status code, HTTP response headers (array of strings) + */ + public function getChildInfoWithHttpInfo($childAuthKey) + { + $returnType = '\SendinBlue\Client\Model\GetChildInfo'; + $request = $this->getChildInfoRequest($childAuthKey); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetChildInfo', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getChildInfoAsync + * + * Gets the info about a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getChildInfoAsync($childAuthKey) + { + return $this->getChildInfoAsyncWithHttpInfo($childAuthKey) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getChildInfoAsyncWithHttpInfo + * + * Gets the info about a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getChildInfoAsyncWithHttpInfo($childAuthKey) + { + $returnType = '\SendinBlue\Client\Model\GetChildInfo'; + $request = $this->getChildInfoRequest($childAuthKey); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getChildInfo' + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getChildInfoRequest($childAuthKey) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling getChildInfo' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getResellerChilds + * + * Gets the list of all reseller's children accounts + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetChildrenList + */ + public function getResellerChilds() + { + list($response) = $this->getResellerChildsWithHttpInfo(); + return $response; + } + + /** + * Operation getResellerChildsWithHttpInfo + * + * Gets the list of all reseller's children accounts + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetChildrenList, HTTP status code, HTTP response headers (array of strings) + */ + public function getResellerChildsWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetChildrenList'; + $request = $this->getResellerChildsRequest(); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetChildrenList', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getResellerChildsAsync + * + * Gets the list of all reseller's children accounts + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getResellerChildsAsync() + { + return $this->getResellerChildsAsyncWithHttpInfo() + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getResellerChildsAsyncWithHttpInfo + * + * Gets the list of all reseller's children accounts + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getResellerChildsAsyncWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetChildrenList'; + $request = $this->getResellerChildsRequest(); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getResellerChilds' + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getResellerChildsRequest() + { + + $resourcePath = '/reseller/children'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getSsoToken + * + * Get session token to access Sendinblue (SSO) + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetSsoToken + */ + public function getSsoToken($childAuthKey) + { + list($response) = $this->getSsoTokenWithHttpInfo($childAuthKey); + return $response; + } + + /** + * Operation getSsoTokenWithHttpInfo + * + * Get session token to access Sendinblue (SSO) + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetSsoToken, HTTP status code, HTTP response headers (array of strings) + */ + public function getSsoTokenWithHttpInfo($childAuthKey) + { + $returnType = '\SendinBlue\Client\Model\GetSsoToken'; + $request = $this->getSsoTokenRequest($childAuthKey); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetSsoToken', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSsoTokenAsync + * + * Get session token to access Sendinblue (SSO) + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSsoTokenAsync($childAuthKey) + { + return $this->getSsoTokenAsyncWithHttpInfo($childAuthKey) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSsoTokenAsyncWithHttpInfo + * + * Get session token to access Sendinblue (SSO) + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSsoTokenAsyncWithHttpInfo($childAuthKey) + { + $returnType = '\SendinBlue\Client\Model\GetSsoToken'; + $request = $this->getSsoTokenRequest($childAuthKey); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSsoToken' + * + * @param string $childAuthKey auth key of reseller's child (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSsoTokenRequest($childAuthKey) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling getSsoToken' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/auth'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation removeCredits + * + * Remove Email and/or SMS credits from a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\RemoveCredits $removeCredits Values to post to remove email or SMS credits from a specific child account (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\RemainingCreditModel + */ + public function removeCredits($childAuthKey, $removeCredits) + { + list($response) = $this->removeCreditsWithHttpInfo($childAuthKey, $removeCredits); + return $response; + } + + /** + * Operation removeCreditsWithHttpInfo + * + * Remove Email and/or SMS credits from a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\RemoveCredits $removeCredits Values to post to remove email or SMS credits from a specific child account (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\RemainingCreditModel, HTTP status code, HTTP response headers (array of strings) + */ + public function removeCreditsWithHttpInfo($childAuthKey, $removeCredits) + { + $returnType = '\SendinBlue\Client\Model\RemainingCreditModel'; + $request = $this->removeCreditsRequest($childAuthKey, $removeCredits); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\RemainingCreditModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation removeCreditsAsync + * + * Remove Email and/or SMS credits from a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\RemoveCredits $removeCredits Values to post to remove email or SMS credits from a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function removeCreditsAsync($childAuthKey, $removeCredits) + { + return $this->removeCreditsAsyncWithHttpInfo($childAuthKey, $removeCredits) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation removeCreditsAsyncWithHttpInfo + * + * Remove Email and/or SMS credits from a specific child account + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\RemoveCredits $removeCredits Values to post to remove email or SMS credits from a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function removeCreditsAsyncWithHttpInfo($childAuthKey, $removeCredits) + { + $returnType = '\SendinBlue\Client\Model\RemainingCreditModel'; + $request = $this->removeCreditsRequest($childAuthKey, $removeCredits); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'removeCredits' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\RemoveCredits $removeCredits Values to post to remove email or SMS credits from a specific child account (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function removeCreditsRequest($childAuthKey, $removeCredits) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling removeCredits' + ); + } + // verify the required parameter 'removeCredits' is set + if ($removeCredits === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $removeCredits when calling removeCredits' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/credits/remove'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($removeCredits)) { + $_tempBody = $removeCredits; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateChildAccountStatus + * + * Updates infos of reseller's child account status based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChildAccountStatus $updateChildAccountStatus values to update in child account status (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateChildAccountStatus($childAuthKey, $updateChildAccountStatus) + { + $this->updateChildAccountStatusWithHttpInfo($childAuthKey, $updateChildAccountStatus); + } + + /** + * Operation updateChildAccountStatusWithHttpInfo + * + * Updates infos of reseller's child account status based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChildAccountStatus $updateChildAccountStatus values to update in child account status (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateChildAccountStatusWithHttpInfo($childAuthKey, $updateChildAccountStatus) + { + $returnType = ''; + $request = $this->updateChildAccountStatusRequest($childAuthKey, $updateChildAccountStatus); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateChildAccountStatusAsync + * + * Updates infos of reseller's child account status based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChildAccountStatus $updateChildAccountStatus values to update in child account status (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateChildAccountStatusAsync($childAuthKey, $updateChildAccountStatus) + { + return $this->updateChildAccountStatusAsyncWithHttpInfo($childAuthKey, $updateChildAccountStatus) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateChildAccountStatusAsyncWithHttpInfo + * + * Updates infos of reseller's child account status based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChildAccountStatus $updateChildAccountStatus values to update in child account status (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateChildAccountStatusAsyncWithHttpInfo($childAuthKey, $updateChildAccountStatus) + { + $returnType = ''; + $request = $this->updateChildAccountStatusRequest($childAuthKey, $updateChildAccountStatus); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateChildAccountStatus' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChildAccountStatus $updateChildAccountStatus values to update in child account status (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateChildAccountStatusRequest($childAuthKey, $updateChildAccountStatus) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling updateChildAccountStatus' + ); + } + // verify the required parameter 'updateChildAccountStatus' is set + if ($updateChildAccountStatus === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateChildAccountStatus when calling updateChildAccountStatus' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/accountStatus'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateChildAccountStatus)) { + $_tempBody = $updateChildAccountStatus; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateChildDomain + * + * Updates the sender domain of reseller's child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be updated (required) + * @param \SendinBlue\Client\Model\UpdateChildDomain $updateChildDomain value to update for sender domain (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateChildDomain($childAuthKey, $domainName, $updateChildDomain) + { + $this->updateChildDomainWithHttpInfo($childAuthKey, $domainName, $updateChildDomain); + } + + /** + * Operation updateChildDomainWithHttpInfo + * + * Updates the sender domain of reseller's child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be updated (required) + * @param \SendinBlue\Client\Model\UpdateChildDomain $updateChildDomain value to update for sender domain (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateChildDomainWithHttpInfo($childAuthKey, $domainName, $updateChildDomain) + { + $returnType = ''; + $request = $this->updateChildDomainRequest($childAuthKey, $domainName, $updateChildDomain); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateChildDomainAsync + * + * Updates the sender domain of reseller's child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be updated (required) + * @param \SendinBlue\Client\Model\UpdateChildDomain $updateChildDomain value to update for sender domain (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateChildDomainAsync($childAuthKey, $domainName, $updateChildDomain) + { + return $this->updateChildDomainAsyncWithHttpInfo($childAuthKey, $domainName, $updateChildDomain) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateChildDomainAsyncWithHttpInfo + * + * Updates the sender domain of reseller's child based on the childAuthKey and domainName passed + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be updated (required) + * @param \SendinBlue\Client\Model\UpdateChildDomain $updateChildDomain value to update for sender domain (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateChildDomainAsyncWithHttpInfo($childAuthKey, $domainName, $updateChildDomain) + { + $returnType = ''; + $request = $this->updateChildDomainRequest($childAuthKey, $domainName, $updateChildDomain); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateChildDomain' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param string $domainName Pass the existing domain that needs to be updated (required) + * @param \SendinBlue\Client\Model\UpdateChildDomain $updateChildDomain value to update for sender domain (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateChildDomainRequest($childAuthKey, $domainName, $updateChildDomain) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling updateChildDomain' + ); + } + // verify the required parameter 'domainName' is set + if ($domainName === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $domainName when calling updateChildDomain' + ); + } + // verify the required parameter 'updateChildDomain' is set + if ($updateChildDomain === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateChildDomain when calling updateChildDomain' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}/domains/{domainName}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + // path params + if ($domainName !== null) { + $resourcePath = str_replace( + '{' . 'domainName' . '}', + ObjectSerializer::toPathValue($domainName), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateChildDomain)) { + $_tempBody = $updateChildDomain; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateResellerChild + * + * Updates infos of reseller's child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChild $resellerChild values to update in child profile (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateResellerChild($childAuthKey, $resellerChild) + { + $this->updateResellerChildWithHttpInfo($childAuthKey, $resellerChild); + } + + /** + * Operation updateResellerChildWithHttpInfo + * + * Updates infos of reseller's child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChild $resellerChild values to update in child profile (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateResellerChildWithHttpInfo($childAuthKey, $resellerChild) + { + $returnType = ''; + $request = $this->updateResellerChildRequest($childAuthKey, $resellerChild); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 403: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateResellerChildAsync + * + * Updates infos of reseller's child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChild $resellerChild values to update in child profile (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateResellerChildAsync($childAuthKey, $resellerChild) + { + return $this->updateResellerChildAsyncWithHttpInfo($childAuthKey, $resellerChild) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateResellerChildAsyncWithHttpInfo + * + * Updates infos of reseller's child based on the childAuthKey supplied + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChild $resellerChild values to update in child profile (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateResellerChildAsyncWithHttpInfo($childAuthKey, $resellerChild) + { + $returnType = ''; + $request = $this->updateResellerChildRequest($childAuthKey, $resellerChild); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateResellerChild' + * + * @param string $childAuthKey auth key of reseller's child (required) + * @param \SendinBlue\Client\Model\UpdateChild $resellerChild values to update in child profile (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateResellerChildRequest($childAuthKey, $resellerChild) + { + // verify the required parameter 'childAuthKey' is set + if ($childAuthKey === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $childAuthKey when calling updateResellerChild' + ); + } + // verify the required parameter 'resellerChild' is set + if ($resellerChild === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $resellerChild when calling updateResellerChild' + ); + } + + $resourcePath = '/reseller/children/{childAuthKey}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($childAuthKey !== null) { + $resourcePath = str_replace( + '{' . 'childAuthKey' . '}', + ObjectSerializer::toPathValue($childAuthKey), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($resellerChild)) { + $_tempBody = $resellerChild; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMSCampaignsApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMSCampaignsApi.php new file mode 100644 index 0000000..31345a8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMSCampaignsApi.php @@ -0,0 +1,2842 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation createSmsCampaign + * + * Creates an SMS campaign + * + * @param \SendinBlue\Client\Model\CreateSmsCampaign $createSmsCampaign Values to create an SMS Campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createSmsCampaign($createSmsCampaign) + { + list($response) = $this->createSmsCampaignWithHttpInfo($createSmsCampaign); + return $response; + } + + /** + * Operation createSmsCampaignWithHttpInfo + * + * Creates an SMS campaign + * + * @param \SendinBlue\Client\Model\CreateSmsCampaign $createSmsCampaign Values to create an SMS Campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createSmsCampaignWithHttpInfo($createSmsCampaign) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createSmsCampaignRequest($createSmsCampaign); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createSmsCampaignAsync + * + * Creates an SMS campaign + * + * @param \SendinBlue\Client\Model\CreateSmsCampaign $createSmsCampaign Values to create an SMS Campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createSmsCampaignAsync($createSmsCampaign) + { + return $this->createSmsCampaignAsyncWithHttpInfo($createSmsCampaign) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createSmsCampaignAsyncWithHttpInfo + * + * Creates an SMS campaign + * + * @param \SendinBlue\Client\Model\CreateSmsCampaign $createSmsCampaign Values to create an SMS Campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createSmsCampaignAsyncWithHttpInfo($createSmsCampaign) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createSmsCampaignRequest($createSmsCampaign); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createSmsCampaign' + * + * @param \SendinBlue\Client\Model\CreateSmsCampaign $createSmsCampaign Values to create an SMS Campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createSmsCampaignRequest($createSmsCampaign) + { + // verify the required parameter 'createSmsCampaign' is set + if ($createSmsCampaign === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createSmsCampaign when calling createSmsCampaign' + ); + } + + $resourcePath = '/smsCampaigns'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($createSmsCampaign)) { + $_tempBody = $createSmsCampaign; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteSmsCampaign + * + * Delete the SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteSmsCampaign($campaignId) + { + $this->deleteSmsCampaignWithHttpInfo($campaignId); + } + + /** + * Operation deleteSmsCampaignWithHttpInfo + * + * Delete the SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteSmsCampaignWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->deleteSmsCampaignRequest($campaignId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteSmsCampaignAsync + * + * Delete the SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteSmsCampaignAsync($campaignId) + { + return $this->deleteSmsCampaignAsyncWithHttpInfo($campaignId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteSmsCampaignAsyncWithHttpInfo + * + * Delete the SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteSmsCampaignAsyncWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->deleteSmsCampaignRequest($campaignId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteSmsCampaign' + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteSmsCampaignRequest($campaignId) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling deleteSmsCampaign' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getSmsCampaign + * + * Get an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetSmsCampaign + */ + public function getSmsCampaign($campaignId) + { + list($response) = $this->getSmsCampaignWithHttpInfo($campaignId); + return $response; + } + + /** + * Operation getSmsCampaignWithHttpInfo + * + * Get an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetSmsCampaign, HTTP status code, HTTP response headers (array of strings) + */ + public function getSmsCampaignWithHttpInfo($campaignId) + { + $returnType = '\SendinBlue\Client\Model\GetSmsCampaign'; + $request = $this->getSmsCampaignRequest($campaignId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetSmsCampaign', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSmsCampaignAsync + * + * Get an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmsCampaignAsync($campaignId) + { + return $this->getSmsCampaignAsyncWithHttpInfo($campaignId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSmsCampaignAsyncWithHttpInfo + * + * Get an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmsCampaignAsyncWithHttpInfo($campaignId) + { + $returnType = '\SendinBlue\Client\Model\GetSmsCampaign'; + $request = $this->getSmsCampaignRequest($campaignId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSmsCampaign' + * + * @param int $campaignId id of the SMS campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSmsCampaignRequest($campaignId) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling getSmsCampaign' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getSmsCampaigns + * + * Returns the informations for all your created SMS campaigns + * + * @param string $status Status of campaign. (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number limitation for the result returned (optional, default to 500) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetSmsCampaigns + */ + public function getSmsCampaigns($status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + list($response) = $this->getSmsCampaignsWithHttpInfo($status, $startDate, $endDate, $limit, $offset); + return $response; + } + + /** + * Operation getSmsCampaignsWithHttpInfo + * + * Returns the informations for all your created SMS campaigns + * + * @param string $status Status of campaign. (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number limitation for the result returned (optional, default to 500) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetSmsCampaigns, HTTP status code, HTTP response headers (array of strings) + */ + public function getSmsCampaignsWithHttpInfo($status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetSmsCampaigns'; + $request = $this->getSmsCampaignsRequest($status, $startDate, $endDate, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetSmsCampaigns', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSmsCampaignsAsync + * + * Returns the informations for all your created SMS campaigns + * + * @param string $status Status of campaign. (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number limitation for the result returned (optional, default to 500) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmsCampaignsAsync($status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + return $this->getSmsCampaignsAsyncWithHttpInfo($status, $startDate, $endDate, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSmsCampaignsAsyncWithHttpInfo + * + * Returns the informations for all your created SMS campaigns + * + * @param string $status Status of campaign. (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number limitation for the result returned (optional, default to 500) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmsCampaignsAsyncWithHttpInfo($status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetSmsCampaigns'; + $request = $this->getSmsCampaignsRequest($status, $startDate, $endDate, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSmsCampaigns' + * + * @param string $status Status of campaign. (optional) + * @param \DateTime $startDate Mandatory if endDate is used. Starting (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param \DateTime $endDate Mandatory if startDate is used. Ending (urlencoded) UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) to filter the sent sms campaigns. Prefer to pass your timezone in date-time format for accurate result ( only available if either 'status' not passed and if passed is set to 'sent' ) (optional) + * @param int $limit Number limitation for the result returned (optional, default to 500) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSmsCampaignsRequest($status = null, $startDate = null, $endDate = null, $limit = '500', $offset = '0') + { + if ($limit !== null && $limit > 1000) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling SMSCampaignsApi.getSmsCampaigns, must be smaller than or equal to 1000.'); + } + + + $resourcePath = '/smsCampaigns'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($status !== null) { + $queryParams['status'] = ObjectSerializer::toQueryValue($status); + } + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation requestSmsRecipientExport + * + * Exports the recipients of the specified campaign. + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\RequestSmsRecipientExport $recipientExport Values to send for a recipient export request (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreatedProcessId + */ + public function requestSmsRecipientExport($campaignId, $recipientExport = null) + { + list($response) = $this->requestSmsRecipientExportWithHttpInfo($campaignId, $recipientExport); + return $response; + } + + /** + * Operation requestSmsRecipientExportWithHttpInfo + * + * Exports the recipients of the specified campaign. + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\RequestSmsRecipientExport $recipientExport Values to send for a recipient export request (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreatedProcessId, HTTP status code, HTTP response headers (array of strings) + */ + public function requestSmsRecipientExportWithHttpInfo($campaignId, $recipientExport = null) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->requestSmsRecipientExportRequest($campaignId, $recipientExport); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 202: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreatedProcessId', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation requestSmsRecipientExportAsync + * + * Exports the recipients of the specified campaign. + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\RequestSmsRecipientExport $recipientExport Values to send for a recipient export request (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function requestSmsRecipientExportAsync($campaignId, $recipientExport = null) + { + return $this->requestSmsRecipientExportAsyncWithHttpInfo($campaignId, $recipientExport) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation requestSmsRecipientExportAsyncWithHttpInfo + * + * Exports the recipients of the specified campaign. + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\RequestSmsRecipientExport $recipientExport Values to send for a recipient export request (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function requestSmsRecipientExportAsyncWithHttpInfo($campaignId, $recipientExport = null) + { + $returnType = '\SendinBlue\Client\Model\CreatedProcessId'; + $request = $this->requestSmsRecipientExportRequest($campaignId, $recipientExport); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'requestSmsRecipientExport' + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\RequestSmsRecipientExport $recipientExport Values to send for a recipient export request (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function requestSmsRecipientExportRequest($campaignId, $recipientExport = null) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling requestSmsRecipientExport' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}/exportRecipients'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($recipientExport)) { + $_tempBody = $recipientExport; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendSmsCampaignNow + * + * Send your SMS campaign immediately + * + * @param int $campaignId id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function sendSmsCampaignNow($campaignId) + { + $this->sendSmsCampaignNowWithHttpInfo($campaignId); + } + + /** + * Operation sendSmsCampaignNowWithHttpInfo + * + * Send your SMS campaign immediately + * + * @param int $campaignId id of the campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function sendSmsCampaignNowWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->sendSmsCampaignNowRequest($campaignId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 402: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendSmsCampaignNowAsync + * + * Send your SMS campaign immediately + * + * @param int $campaignId id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendSmsCampaignNowAsync($campaignId) + { + return $this->sendSmsCampaignNowAsyncWithHttpInfo($campaignId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendSmsCampaignNowAsyncWithHttpInfo + * + * Send your SMS campaign immediately + * + * @param int $campaignId id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendSmsCampaignNowAsyncWithHttpInfo($campaignId) + { + $returnType = ''; + $request = $this->sendSmsCampaignNowRequest($campaignId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendSmsCampaignNow' + * + * @param int $campaignId id of the campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendSmsCampaignNowRequest($campaignId) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling sendSmsCampaignNow' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}/sendNow'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendSmsReport + * + * Send report of SMS campaigns + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function sendSmsReport($campaignId, $sendReport) + { + $this->sendSmsReportWithHttpInfo($campaignId, $sendReport); + } + + /** + * Operation sendSmsReportWithHttpInfo + * + * Send report of SMS campaigns + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function sendSmsReportWithHttpInfo($campaignId, $sendReport) + { + $returnType = ''; + $request = $this->sendSmsReportRequest($campaignId, $sendReport); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendSmsReportAsync + * + * Send report of SMS campaigns + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendSmsReportAsync($campaignId, $sendReport) + { + return $this->sendSmsReportAsyncWithHttpInfo($campaignId, $sendReport) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendSmsReportAsyncWithHttpInfo + * + * Send report of SMS campaigns + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendSmsReportAsyncWithHttpInfo($campaignId, $sendReport) + { + $returnType = ''; + $request = $this->sendSmsReportRequest($campaignId, $sendReport); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendSmsReport' + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\SendReport $sendReport Values for send a report (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendSmsReportRequest($campaignId, $sendReport) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling sendSmsReport' + ); + } + // verify the required parameter 'sendReport' is set + if ($sendReport === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $sendReport when calling sendSmsReport' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}/sendReport'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($sendReport)) { + $_tempBody = $sendReport; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendTestSms + * + * Send an SMS + * + * @param int $campaignId Id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\SendTestSms $phoneNumber Mobile number of the recipient with the country code. This number must belong to one of your contacts in SendinBlue account and must not be blacklisted (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function sendTestSms($campaignId, $phoneNumber) + { + $this->sendTestSmsWithHttpInfo($campaignId, $phoneNumber); + } + + /** + * Operation sendTestSmsWithHttpInfo + * + * Send an SMS + * + * @param int $campaignId Id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\SendTestSms $phoneNumber Mobile number of the recipient with the country code. This number must belong to one of your contacts in SendinBlue account and must not be blacklisted (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function sendTestSmsWithHttpInfo($campaignId, $phoneNumber) + { + $returnType = ''; + $request = $this->sendTestSmsRequest($campaignId, $phoneNumber); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostSendSmsTestFailed', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendTestSmsAsync + * + * Send an SMS + * + * @param int $campaignId Id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\SendTestSms $phoneNumber Mobile number of the recipient with the country code. This number must belong to one of your contacts in SendinBlue account and must not be blacklisted (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTestSmsAsync($campaignId, $phoneNumber) + { + return $this->sendTestSmsAsyncWithHttpInfo($campaignId, $phoneNumber) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendTestSmsAsyncWithHttpInfo + * + * Send an SMS + * + * @param int $campaignId Id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\SendTestSms $phoneNumber Mobile number of the recipient with the country code. This number must belong to one of your contacts in SendinBlue account and must not be blacklisted (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTestSmsAsyncWithHttpInfo($campaignId, $phoneNumber) + { + $returnType = ''; + $request = $this->sendTestSmsRequest($campaignId, $phoneNumber); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendTestSms' + * + * @param int $campaignId Id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\SendTestSms $phoneNumber Mobile number of the recipient with the country code. This number must belong to one of your contacts in SendinBlue account and must not be blacklisted (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendTestSmsRequest($campaignId, $phoneNumber) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling sendTestSms' + ); + } + // verify the required parameter 'phoneNumber' is set + if ($phoneNumber === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $phoneNumber when calling sendTestSms' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}/sendTest'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($phoneNumber)) { + $_tempBody = $phoneNumber; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateSmsCampaign + * + * Updates an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\UpdateSmsCampaign $updateSmsCampaign Values to update an SMS Campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateSmsCampaign($campaignId, $updateSmsCampaign) + { + $this->updateSmsCampaignWithHttpInfo($campaignId, $updateSmsCampaign); + } + + /** + * Operation updateSmsCampaignWithHttpInfo + * + * Updates an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\UpdateSmsCampaign $updateSmsCampaign Values to update an SMS Campaign (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateSmsCampaignWithHttpInfo($campaignId, $updateSmsCampaign) + { + $returnType = ''; + $request = $this->updateSmsCampaignRequest($campaignId, $updateSmsCampaign); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateSmsCampaignAsync + * + * Updates an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\UpdateSmsCampaign $updateSmsCampaign Values to update an SMS Campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSmsCampaignAsync($campaignId, $updateSmsCampaign) + { + return $this->updateSmsCampaignAsyncWithHttpInfo($campaignId, $updateSmsCampaign) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateSmsCampaignAsyncWithHttpInfo + * + * Updates an SMS campaign + * + * @param int $campaignId id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\UpdateSmsCampaign $updateSmsCampaign Values to update an SMS Campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSmsCampaignAsyncWithHttpInfo($campaignId, $updateSmsCampaign) + { + $returnType = ''; + $request = $this->updateSmsCampaignRequest($campaignId, $updateSmsCampaign); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateSmsCampaign' + * + * @param int $campaignId id of the SMS campaign (required) + * @param \SendinBlue\Client\Model\UpdateSmsCampaign $updateSmsCampaign Values to update an SMS Campaign (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateSmsCampaignRequest($campaignId, $updateSmsCampaign) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling updateSmsCampaign' + ); + } + // verify the required parameter 'updateSmsCampaign' is set + if ($updateSmsCampaign === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateSmsCampaign when calling updateSmsCampaign' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateSmsCampaign)) { + $_tempBody = $updateSmsCampaign; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateSmsCampaignStatus + * + * Update the campaign status + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign. (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateSmsCampaignStatus($campaignId, $status) + { + $this->updateSmsCampaignStatusWithHttpInfo($campaignId, $status); + } + + /** + * Operation updateSmsCampaignStatusWithHttpInfo + * + * Update the campaign status + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign. (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateSmsCampaignStatusWithHttpInfo($campaignId, $status) + { + $returnType = ''; + $request = $this->updateSmsCampaignStatusRequest($campaignId, $status); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateSmsCampaignStatusAsync + * + * Update the campaign status + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign. (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSmsCampaignStatusAsync($campaignId, $status) + { + return $this->updateSmsCampaignStatusAsyncWithHttpInfo($campaignId, $status) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateSmsCampaignStatusAsyncWithHttpInfo + * + * Update the campaign status + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign. (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSmsCampaignStatusAsyncWithHttpInfo($campaignId, $status) + { + $returnType = ''; + $request = $this->updateSmsCampaignStatusRequest($campaignId, $status); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateSmsCampaignStatus' + * + * @param int $campaignId id of the campaign (required) + * @param \SendinBlue\Client\Model\UpdateCampaignStatus $status Status of the campaign. (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateSmsCampaignStatusRequest($campaignId, $status) + { + // verify the required parameter 'campaignId' is set + if ($campaignId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $campaignId when calling updateSmsCampaignStatus' + ); + } + // verify the required parameter 'status' is set + if ($status === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $status when calling updateSmsCampaignStatus' + ); + } + + $resourcePath = '/smsCampaigns/{campaignId}/status'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($campaignId !== null) { + $resourcePath = str_replace( + '{' . 'campaignId' . '}', + ObjectSerializer::toPathValue($campaignId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($status)) { + $_tempBody = $status; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMTPApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMTPApi.php new file mode 100644 index 0000000..6789ffb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SMTPApi.php @@ -0,0 +1,3519 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation createSmtpTemplate + * + * Create an smtp template + * + * @param \SendinBlue\Client\Model\CreateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createSmtpTemplate($smtpTemplate) + { + list($response) = $this->createSmtpTemplateWithHttpInfo($smtpTemplate); + return $response; + } + + /** + * Operation createSmtpTemplateWithHttpInfo + * + * Create an smtp template + * + * @param \SendinBlue\Client\Model\CreateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createSmtpTemplateWithHttpInfo($smtpTemplate) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createSmtpTemplateRequest($smtpTemplate); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createSmtpTemplateAsync + * + * Create an smtp template + * + * @param \SendinBlue\Client\Model\CreateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createSmtpTemplateAsync($smtpTemplate) + { + return $this->createSmtpTemplateAsyncWithHttpInfo($smtpTemplate) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createSmtpTemplateAsyncWithHttpInfo + * + * Create an smtp template + * + * @param \SendinBlue\Client\Model\CreateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createSmtpTemplateAsyncWithHttpInfo($smtpTemplate) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createSmtpTemplateRequest($smtpTemplate); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createSmtpTemplate' + * + * @param \SendinBlue\Client\Model\CreateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createSmtpTemplateRequest($smtpTemplate) + { + // verify the required parameter 'smtpTemplate' is set + if ($smtpTemplate === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $smtpTemplate when calling createSmtpTemplate' + ); + } + + $resourcePath = '/smtp/templates'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($smtpTemplate)) { + $_tempBody = $smtpTemplate; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteHardbounces + * + * Delete hardbounces + * + * @param \SendinBlue\Client\Model\DeleteHardbounces $deleteHardbounces values to delete hardbounces (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteHardbounces($deleteHardbounces = null) + { + $this->deleteHardbouncesWithHttpInfo($deleteHardbounces); + } + + /** + * Operation deleteHardbouncesWithHttpInfo + * + * Delete hardbounces + * + * @param \SendinBlue\Client\Model\DeleteHardbounces $deleteHardbounces values to delete hardbounces (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteHardbouncesWithHttpInfo($deleteHardbounces = null) + { + $returnType = ''; + $request = $this->deleteHardbouncesRequest($deleteHardbounces); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteHardbouncesAsync + * + * Delete hardbounces + * + * @param \SendinBlue\Client\Model\DeleteHardbounces $deleteHardbounces values to delete hardbounces (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteHardbouncesAsync($deleteHardbounces = null) + { + return $this->deleteHardbouncesAsyncWithHttpInfo($deleteHardbounces) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteHardbouncesAsyncWithHttpInfo + * + * Delete hardbounces + * + * @param \SendinBlue\Client\Model\DeleteHardbounces $deleteHardbounces values to delete hardbounces (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteHardbouncesAsyncWithHttpInfo($deleteHardbounces = null) + { + $returnType = ''; + $request = $this->deleteHardbouncesRequest($deleteHardbounces); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteHardbounces' + * + * @param \SendinBlue\Client\Model\DeleteHardbounces $deleteHardbounces values to delete hardbounces (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteHardbouncesRequest($deleteHardbounces = null) + { + + $resourcePath = '/smtp/deleteHardbounces'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($deleteHardbounces)) { + $_tempBody = $deleteHardbounces; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteSmtpTemplate + * + * Delete an inactive smtp template + * + * @param int $templateId id of the template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteSmtpTemplate($templateId) + { + $this->deleteSmtpTemplateWithHttpInfo($templateId); + } + + /** + * Operation deleteSmtpTemplateWithHttpInfo + * + * Delete an inactive smtp template + * + * @param int $templateId id of the template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteSmtpTemplateWithHttpInfo($templateId) + { + $returnType = ''; + $request = $this->deleteSmtpTemplateRequest($templateId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteSmtpTemplateAsync + * + * Delete an inactive smtp template + * + * @param int $templateId id of the template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteSmtpTemplateAsync($templateId) + { + return $this->deleteSmtpTemplateAsyncWithHttpInfo($templateId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteSmtpTemplateAsyncWithHttpInfo + * + * Delete an inactive smtp template + * + * @param int $templateId id of the template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteSmtpTemplateAsyncWithHttpInfo($templateId) + { + $returnType = ''; + $request = $this->deleteSmtpTemplateRequest($templateId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteSmtpTemplate' + * + * @param int $templateId id of the template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteSmtpTemplateRequest($templateId) + { + // verify the required parameter 'templateId' is set + if ($templateId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $templateId when calling deleteSmtpTemplate' + ); + } + + $resourcePath = '/smtp/templates/{templateId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($templateId !== null) { + $resourcePath = str_replace( + '{' . 'templateId' . '}', + ObjectSerializer::toPathValue($templateId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getAggregatedSmtpReport + * + * Get your SMTP activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetAggregatedReport + */ + public function getAggregatedSmtpReport($startDate = null, $endDate = null, $days = null, $tag = null) + { + list($response) = $this->getAggregatedSmtpReportWithHttpInfo($startDate, $endDate, $days, $tag); + return $response; + } + + /** + * Operation getAggregatedSmtpReportWithHttpInfo + * + * Get your SMTP activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetAggregatedReport, HTTP status code, HTTP response headers (array of strings) + */ + public function getAggregatedSmtpReportWithHttpInfo($startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetAggregatedReport'; + $request = $this->getAggregatedSmtpReportRequest($startDate, $endDate, $days, $tag); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetAggregatedReport', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getAggregatedSmtpReportAsync + * + * Get your SMTP activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAggregatedSmtpReportAsync($startDate = null, $endDate = null, $days = null, $tag = null) + { + return $this->getAggregatedSmtpReportAsyncWithHttpInfo($startDate, $endDate, $days, $tag) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getAggregatedSmtpReportAsyncWithHttpInfo + * + * Get your SMTP activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getAggregatedSmtpReportAsyncWithHttpInfo($startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetAggregatedReport'; + $request = $this->getAggregatedSmtpReportRequest($startDate, $endDate, $days, $tag); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getAggregatedSmtpReport' + * + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getAggregatedSmtpReportRequest($startDate = null, $endDate = null, $days = null, $tag = null) + { + + $resourcePath = '/smtp/statistics/aggregatedReport'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($days !== null) { + $queryParams['days'] = ObjectSerializer::toQueryValue($days); + } + // query params + if ($tag !== null) { + $queryParams['tag'] = ObjectSerializer::toQueryValue($tag); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getEmailEventReport + * + * Get all your SMTP activity (unaggregated events) + * + * @param int $limit Number limitation for the result returned (optional, default to 50) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $email Filter the report for a specific email addresses (optional) + * @param string $event Filter the report for a specific event type (optional) + * @param string $tags Filter the report for tags (serialized and urlencoded array) (optional) + * @param string $messageId Filter on a specific message id (optional) + * @param int $templateId Filter on a specific template id (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetEmailEventReport + */ + public function getEmailEventReport($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $email = null, $event = null, $tags = null, $messageId = null, $templateId = null) + { + list($response) = $this->getEmailEventReportWithHttpInfo($limit, $offset, $startDate, $endDate, $days, $email, $event, $tags, $messageId, $templateId); + return $response; + } + + /** + * Operation getEmailEventReportWithHttpInfo + * + * Get all your SMTP activity (unaggregated events) + * + * @param int $limit Number limitation for the result returned (optional, default to 50) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $email Filter the report for a specific email addresses (optional) + * @param string $event Filter the report for a specific event type (optional) + * @param string $tags Filter the report for tags (serialized and urlencoded array) (optional) + * @param string $messageId Filter on a specific message id (optional) + * @param int $templateId Filter on a specific template id (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetEmailEventReport, HTTP status code, HTTP response headers (array of strings) + */ + public function getEmailEventReportWithHttpInfo($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $email = null, $event = null, $tags = null, $messageId = null, $templateId = null) + { + $returnType = '\SendinBlue\Client\Model\GetEmailEventReport'; + $request = $this->getEmailEventReportRequest($limit, $offset, $startDate, $endDate, $days, $email, $event, $tags, $messageId, $templateId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetEmailEventReport', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getEmailEventReportAsync + * + * Get all your SMTP activity (unaggregated events) + * + * @param int $limit Number limitation for the result returned (optional, default to 50) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $email Filter the report for a specific email addresses (optional) + * @param string $event Filter the report for a specific event type (optional) + * @param string $tags Filter the report for tags (serialized and urlencoded array) (optional) + * @param string $messageId Filter on a specific message id (optional) + * @param int $templateId Filter on a specific template id (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getEmailEventReportAsync($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $email = null, $event = null, $tags = null, $messageId = null, $templateId = null) + { + return $this->getEmailEventReportAsyncWithHttpInfo($limit, $offset, $startDate, $endDate, $days, $email, $event, $tags, $messageId, $templateId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getEmailEventReportAsyncWithHttpInfo + * + * Get all your SMTP activity (unaggregated events) + * + * @param int $limit Number limitation for the result returned (optional, default to 50) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $email Filter the report for a specific email addresses (optional) + * @param string $event Filter the report for a specific event type (optional) + * @param string $tags Filter the report for tags (serialized and urlencoded array) (optional) + * @param string $messageId Filter on a specific message id (optional) + * @param int $templateId Filter on a specific template id (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getEmailEventReportAsyncWithHttpInfo($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $email = null, $event = null, $tags = null, $messageId = null, $templateId = null) + { + $returnType = '\SendinBlue\Client\Model\GetEmailEventReport'; + $request = $this->getEmailEventReportRequest($limit, $offset, $startDate, $endDate, $days, $email, $event, $tags, $messageId, $templateId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getEmailEventReport' + * + * @param int $limit Number limitation for the result returned (optional, default to 50) + * @param int $offset Beginning point in the list to retrieve from. (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD). Must be lower than equal to endDate (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD). Must be greater than equal to startDate (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $email Filter the report for a specific email addresses (optional) + * @param string $event Filter the report for a specific event type (optional) + * @param string $tags Filter the report for tags (serialized and urlencoded array) (optional) + * @param string $messageId Filter on a specific message id (optional) + * @param int $templateId Filter on a specific template id (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getEmailEventReportRequest($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $email = null, $event = null, $tags = null, $messageId = null, $templateId = null) + { + if ($limit !== null && $limit > 100) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling SMTPApi.getEmailEventReport, must be smaller than or equal to 100.'); + } + + + $resourcePath = '/smtp/statistics/events'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($days !== null) { + $queryParams['days'] = ObjectSerializer::toQueryValue($days); + } + // query params + if ($email !== null) { + $queryParams['email'] = ObjectSerializer::toQueryValue($email); + } + // query params + if ($event !== null) { + $queryParams['event'] = ObjectSerializer::toQueryValue($event); + } + // query params + if ($tags !== null) { + $queryParams['tags'] = ObjectSerializer::toQueryValue($tags); + } + // query params + if ($messageId !== null) { + $queryParams['messageId'] = ObjectSerializer::toQueryValue($messageId); + } + // query params + if ($templateId !== null) { + $queryParams['templateId'] = ObjectSerializer::toQueryValue($templateId); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getSmtpReport + * + * Get your SMTP activity aggregated per day + * + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document on the page (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD) (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD) (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetReports + */ + public function getSmtpReport($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $tag = null) + { + list($response) = $this->getSmtpReportWithHttpInfo($limit, $offset, $startDate, $endDate, $days, $tag); + return $response; + } + + /** + * Operation getSmtpReportWithHttpInfo + * + * Get your SMTP activity aggregated per day + * + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document on the page (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD) (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD) (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetReports, HTTP status code, HTTP response headers (array of strings) + */ + public function getSmtpReportWithHttpInfo($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetReports'; + $request = $this->getSmtpReportRequest($limit, $offset, $startDate, $endDate, $days, $tag); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetReports', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSmtpReportAsync + * + * Get your SMTP activity aggregated per day + * + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document on the page (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD) (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD) (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmtpReportAsync($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $tag = null) + { + return $this->getSmtpReportAsyncWithHttpInfo($limit, $offset, $startDate, $endDate, $days, $tag) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSmtpReportAsyncWithHttpInfo + * + * Get your SMTP activity aggregated per day + * + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document on the page (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD) (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD) (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmtpReportAsyncWithHttpInfo($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetReports'; + $request = $this->getSmtpReportRequest($limit, $offset, $startDate, $endDate, $days, $tag); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSmtpReport' + * + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document on the page (optional, default to 0) + * @param string $startDate Mandatory if endDate is used. Starting date of the report (YYYY-MM-DD) (optional) + * @param string $endDate Mandatory if startDate is used. Ending date of the report (YYYY-MM-DD) (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Tag of the emails (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSmtpReportRequest($limit = '50', $offset = '0', $startDate = null, $endDate = null, $days = null, $tag = null) + { + if ($limit !== null && $limit > 100) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling SMTPApi.getSmtpReport, must be smaller than or equal to 100.'); + } + + + $resourcePath = '/smtp/statistics/reports'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($days !== null) { + $queryParams['days'] = ObjectSerializer::toQueryValue($days); + } + // query params + if ($tag !== null) { + $queryParams['tag'] = ObjectSerializer::toQueryValue($tag); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getSmtpTemplate + * + * Returns the template informations + * + * @param int $templateId id of the template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetSmtpTemplateOverview + */ + public function getSmtpTemplate($templateId) + { + list($response) = $this->getSmtpTemplateWithHttpInfo($templateId); + return $response; + } + + /** + * Operation getSmtpTemplateWithHttpInfo + * + * Returns the template informations + * + * @param int $templateId id of the template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetSmtpTemplateOverview, HTTP status code, HTTP response headers (array of strings) + */ + public function getSmtpTemplateWithHttpInfo($templateId) + { + $returnType = '\SendinBlue\Client\Model\GetSmtpTemplateOverview'; + $request = $this->getSmtpTemplateRequest($templateId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetSmtpTemplateOverview', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSmtpTemplateAsync + * + * Returns the template informations + * + * @param int $templateId id of the template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmtpTemplateAsync($templateId) + { + return $this->getSmtpTemplateAsyncWithHttpInfo($templateId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSmtpTemplateAsyncWithHttpInfo + * + * Returns the template informations + * + * @param int $templateId id of the template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmtpTemplateAsyncWithHttpInfo($templateId) + { + $returnType = '\SendinBlue\Client\Model\GetSmtpTemplateOverview'; + $request = $this->getSmtpTemplateRequest($templateId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSmtpTemplate' + * + * @param int $templateId id of the template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSmtpTemplateRequest($templateId) + { + // verify the required parameter 'templateId' is set + if ($templateId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $templateId when calling getSmtpTemplate' + ); + } + + $resourcePath = '/smtp/templates/{templateId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($templateId !== null) { + $resourcePath = str_replace( + '{' . 'templateId' . '}', + ObjectSerializer::toPathValue($templateId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getSmtpTemplates + * + * Get the list of SMTP templates + * + * @param bool $templateStatus Filter on the status of the template. Active = true, inactive = false (optional) + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetSmtpTemplates + */ + public function getSmtpTemplates($templateStatus = null, $limit = '50', $offset = '0') + { + list($response) = $this->getSmtpTemplatesWithHttpInfo($templateStatus, $limit, $offset); + return $response; + } + + /** + * Operation getSmtpTemplatesWithHttpInfo + * + * Get the list of SMTP templates + * + * @param bool $templateStatus Filter on the status of the template. Active = true, inactive = false (optional) + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetSmtpTemplates, HTTP status code, HTTP response headers (array of strings) + */ + public function getSmtpTemplatesWithHttpInfo($templateStatus = null, $limit = '50', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetSmtpTemplates'; + $request = $this->getSmtpTemplatesRequest($templateStatus, $limit, $offset); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetSmtpTemplates', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSmtpTemplatesAsync + * + * Get the list of SMTP templates + * + * @param bool $templateStatus Filter on the status of the template. Active = true, inactive = false (optional) + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmtpTemplatesAsync($templateStatus = null, $limit = '50', $offset = '0') + { + return $this->getSmtpTemplatesAsyncWithHttpInfo($templateStatus, $limit, $offset) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSmtpTemplatesAsyncWithHttpInfo + * + * Get the list of SMTP templates + * + * @param bool $templateStatus Filter on the status of the template. Active = true, inactive = false (optional) + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmtpTemplatesAsyncWithHttpInfo($templateStatus = null, $limit = '50', $offset = '0') + { + $returnType = '\SendinBlue\Client\Model\GetSmtpTemplates'; + $request = $this->getSmtpTemplatesRequest($templateStatus, $limit, $offset); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSmtpTemplates' + * + * @param bool $templateStatus Filter on the status of the template. Active = true, inactive = false (optional) + * @param int $limit Number of documents returned per page (optional, default to 50) + * @param int $offset Index of the first document in the page (optional, default to 0) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSmtpTemplatesRequest($templateStatus = null, $limit = '50', $offset = '0') + { + if ($limit !== null && $limit > 1000) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling SMTPApi.getSmtpTemplates, must be smaller than or equal to 1000.'); + } + + + $resourcePath = '/smtp/templates'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($templateStatus !== null) { + $queryParams['templateStatus'] = ObjectSerializer::toQueryValue($templateStatus); + } + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendTemplate + * + * Send a template + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendEmail $sendEmail sendEmail (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\SendTemplateEmail + */ + public function sendTemplate($templateId, $sendEmail) + { + list($response) = $this->sendTemplateWithHttpInfo($templateId, $sendEmail); + return $response; + } + + /** + * Operation sendTemplateWithHttpInfo + * + * Send a template + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendEmail $sendEmail (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\SendTemplateEmail, HTTP status code, HTTP response headers (array of strings) + */ + public function sendTemplateWithHttpInfo($templateId, $sendEmail) + { + $returnType = '\SendinBlue\Client\Model\SendTemplateEmail'; + $request = $this->sendTemplateRequest($templateId, $sendEmail); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\SendTemplateEmail', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostSendFailed', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendTemplateAsync + * + * Send a template + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendEmail $sendEmail (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTemplateAsync($templateId, $sendEmail) + { + return $this->sendTemplateAsyncWithHttpInfo($templateId, $sendEmail) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendTemplateAsyncWithHttpInfo + * + * Send a template + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendEmail $sendEmail (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTemplateAsyncWithHttpInfo($templateId, $sendEmail) + { + $returnType = '\SendinBlue\Client\Model\SendTemplateEmail'; + $request = $this->sendTemplateRequest($templateId, $sendEmail); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendTemplate' + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendEmail $sendEmail (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendTemplateRequest($templateId, $sendEmail) + { + // verify the required parameter 'templateId' is set + if ($templateId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $templateId when calling sendTemplate' + ); + } + // verify the required parameter 'sendEmail' is set + if ($sendEmail === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $sendEmail when calling sendTemplate' + ); + } + + $resourcePath = '/smtp/templates/{templateId}/send'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($templateId !== null) { + $resourcePath = str_replace( + '{' . 'templateId' . '}', + ObjectSerializer::toPathValue($templateId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($sendEmail)) { + $_tempBody = $sendEmail; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendTestTemplate + * + * Send a template to your test list + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendTestEmail $sendTestEmail sendTestEmail (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function sendTestTemplate($templateId, $sendTestEmail) + { + $this->sendTestTemplateWithHttpInfo($templateId, $sendTestEmail); + } + + /** + * Operation sendTestTemplateWithHttpInfo + * + * Send a template to your test list + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendTestEmail $sendTestEmail (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function sendTestTemplateWithHttpInfo($templateId, $sendTestEmail) + { + $returnType = ''; + $request = $this->sendTestTemplateRequest($templateId, $sendTestEmail); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\PostSendFailed', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendTestTemplateAsync + * + * Send a template to your test list + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendTestEmail $sendTestEmail (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTestTemplateAsync($templateId, $sendTestEmail) + { + return $this->sendTestTemplateAsyncWithHttpInfo($templateId, $sendTestEmail) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendTestTemplateAsyncWithHttpInfo + * + * Send a template to your test list + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendTestEmail $sendTestEmail (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTestTemplateAsyncWithHttpInfo($templateId, $sendTestEmail) + { + $returnType = ''; + $request = $this->sendTestTemplateRequest($templateId, $sendTestEmail); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendTestTemplate' + * + * @param int $templateId Id of the template (required) + * @param \SendinBlue\Client\Model\SendTestEmail $sendTestEmail (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendTestTemplateRequest($templateId, $sendTestEmail) + { + // verify the required parameter 'templateId' is set + if ($templateId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $templateId when calling sendTestTemplate' + ); + } + // verify the required parameter 'sendTestEmail' is set + if ($sendTestEmail === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $sendTestEmail when calling sendTestTemplate' + ); + } + + $resourcePath = '/smtp/templates/{templateId}/sendTest'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($templateId !== null) { + $resourcePath = str_replace( + '{' . 'templateId' . '}', + ObjectSerializer::toPathValue($templateId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($sendTestEmail)) { + $_tempBody = $sendTestEmail; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendTransacEmail + * + * Send a transactional email + * + * @param \SendinBlue\Client\Model\SendSmtpEmail $sendSmtpEmail Values to send a transactional email (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateSmtpEmail + */ + public function sendTransacEmail($sendSmtpEmail) + { + list($response) = $this->sendTransacEmailWithHttpInfo($sendSmtpEmail); + return $response; + } + + /** + * Operation sendTransacEmailWithHttpInfo + * + * Send a transactional email + * + * @param \SendinBlue\Client\Model\SendSmtpEmail $sendSmtpEmail Values to send a transactional email (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateSmtpEmail, HTTP status code, HTTP response headers (array of strings) + */ + public function sendTransacEmailWithHttpInfo($sendSmtpEmail) + { + $returnType = '\SendinBlue\Client\Model\CreateSmtpEmail'; + $request = $this->sendTransacEmailRequest($sendSmtpEmail); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateSmtpEmail', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendTransacEmailAsync + * + * Send a transactional email + * + * @param \SendinBlue\Client\Model\SendSmtpEmail $sendSmtpEmail Values to send a transactional email (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTransacEmailAsync($sendSmtpEmail) + { + return $this->sendTransacEmailAsyncWithHttpInfo($sendSmtpEmail) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendTransacEmailAsyncWithHttpInfo + * + * Send a transactional email + * + * @param \SendinBlue\Client\Model\SendSmtpEmail $sendSmtpEmail Values to send a transactional email (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTransacEmailAsyncWithHttpInfo($sendSmtpEmail) + { + $returnType = '\SendinBlue\Client\Model\CreateSmtpEmail'; + $request = $this->sendTransacEmailRequest($sendSmtpEmail); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendTransacEmail' + * + * @param \SendinBlue\Client\Model\SendSmtpEmail $sendSmtpEmail Values to send a transactional email (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendTransacEmailRequest($sendSmtpEmail) + { + // verify the required parameter 'sendSmtpEmail' is set + if ($sendSmtpEmail === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $sendSmtpEmail when calling sendTransacEmail' + ); + } + + $resourcePath = '/smtp/email'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($sendSmtpEmail)) { + $_tempBody = $sendSmtpEmail; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateSmtpTemplate + * + * Updates an smtp templates + * + * @param int $templateId id of the template (required) + * @param \SendinBlue\Client\Model\UpdateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateSmtpTemplate($templateId, $smtpTemplate) + { + $this->updateSmtpTemplateWithHttpInfo($templateId, $smtpTemplate); + } + + /** + * Operation updateSmtpTemplateWithHttpInfo + * + * Updates an smtp templates + * + * @param int $templateId id of the template (required) + * @param \SendinBlue\Client\Model\UpdateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateSmtpTemplateWithHttpInfo($templateId, $smtpTemplate) + { + $returnType = ''; + $request = $this->updateSmtpTemplateRequest($templateId, $smtpTemplate); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateSmtpTemplateAsync + * + * Updates an smtp templates + * + * @param int $templateId id of the template (required) + * @param \SendinBlue\Client\Model\UpdateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSmtpTemplateAsync($templateId, $smtpTemplate) + { + return $this->updateSmtpTemplateAsyncWithHttpInfo($templateId, $smtpTemplate) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateSmtpTemplateAsyncWithHttpInfo + * + * Updates an smtp templates + * + * @param int $templateId id of the template (required) + * @param \SendinBlue\Client\Model\UpdateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSmtpTemplateAsyncWithHttpInfo($templateId, $smtpTemplate) + { + $returnType = ''; + $request = $this->updateSmtpTemplateRequest($templateId, $smtpTemplate); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateSmtpTemplate' + * + * @param int $templateId id of the template (required) + * @param \SendinBlue\Client\Model\UpdateSmtpTemplate $smtpTemplate values to update in smtp template (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateSmtpTemplateRequest($templateId, $smtpTemplate) + { + // verify the required parameter 'templateId' is set + if ($templateId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $templateId when calling updateSmtpTemplate' + ); + } + // verify the required parameter 'smtpTemplate' is set + if ($smtpTemplate === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $smtpTemplate when calling updateSmtpTemplate' + ); + } + + $resourcePath = '/smtp/templates/{templateId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($templateId !== null) { + $resourcePath = str_replace( + '{' . 'templateId' . '}', + ObjectSerializer::toPathValue($templateId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($smtpTemplate)) { + $_tempBody = $smtpTemplate; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SendersApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SendersApi.php new file mode 100644 index 0000000..fade455 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/SendersApi.php @@ -0,0 +1,1702 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation createSender + * + * Create a new sender + * + * @param \SendinBlue\Client\Model\CreateSender $sender sender's name (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateSenderModel + */ + public function createSender($sender = null) + { + list($response) = $this->createSenderWithHttpInfo($sender); + return $response; + } + + /** + * Operation createSenderWithHttpInfo + * + * Create a new sender + * + * @param \SendinBlue\Client\Model\CreateSender $sender sender's name (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateSenderModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createSenderWithHttpInfo($sender = null) + { + $returnType = '\SendinBlue\Client\Model\CreateSenderModel'; + $request = $this->createSenderRequest($sender); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateSenderModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createSenderAsync + * + * Create a new sender + * + * @param \SendinBlue\Client\Model\CreateSender $sender sender's name (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createSenderAsync($sender = null) + { + return $this->createSenderAsyncWithHttpInfo($sender) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createSenderAsyncWithHttpInfo + * + * Create a new sender + * + * @param \SendinBlue\Client\Model\CreateSender $sender sender's name (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createSenderAsyncWithHttpInfo($sender = null) + { + $returnType = '\SendinBlue\Client\Model\CreateSenderModel'; + $request = $this->createSenderRequest($sender); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createSender' + * + * @param \SendinBlue\Client\Model\CreateSender $sender sender's name (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createSenderRequest($sender = null) + { + + $resourcePath = '/senders'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($sender)) { + $_tempBody = $sender; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteSender + * + * Delete a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteSender($senderId) + { + $this->deleteSenderWithHttpInfo($senderId); + } + + /** + * Operation deleteSenderWithHttpInfo + * + * Delete a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteSenderWithHttpInfo($senderId) + { + $returnType = ''; + $request = $this->deleteSenderRequest($senderId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteSenderAsync + * + * Delete a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteSenderAsync($senderId) + { + return $this->deleteSenderAsyncWithHttpInfo($senderId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteSenderAsyncWithHttpInfo + * + * Delete a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteSenderAsyncWithHttpInfo($senderId) + { + $returnType = ''; + $request = $this->deleteSenderRequest($senderId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteSender' + * + * @param int $senderId Id of the sender (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteSenderRequest($senderId) + { + // verify the required parameter 'senderId' is set + if ($senderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $senderId when calling deleteSender' + ); + } + + $resourcePath = '/senders/{senderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($senderId !== null) { + $resourcePath = str_replace( + '{' . 'senderId' . '}', + ObjectSerializer::toPathValue($senderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getIps + * + * Return all the dedicated IPs for your account + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetIps + */ + public function getIps() + { + list($response) = $this->getIpsWithHttpInfo(); + return $response; + } + + /** + * Operation getIpsWithHttpInfo + * + * Return all the dedicated IPs for your account + * + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetIps, HTTP status code, HTTP response headers (array of strings) + */ + public function getIpsWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetIps'; + $request = $this->getIpsRequest(); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetIps', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getIpsAsync + * + * Return all the dedicated IPs for your account + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getIpsAsync() + { + return $this->getIpsAsyncWithHttpInfo() + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getIpsAsyncWithHttpInfo + * + * Return all the dedicated IPs for your account + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getIpsAsyncWithHttpInfo() + { + $returnType = '\SendinBlue\Client\Model\GetIps'; + $request = $this->getIpsRequest(); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getIps' + * + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getIpsRequest() + { + + $resourcePath = '/senders/ips'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getIpsFromSender + * + * Return all the dedicated IPs for a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetIpsFromSender + */ + public function getIpsFromSender($senderId) + { + list($response) = $this->getIpsFromSenderWithHttpInfo($senderId); + return $response; + } + + /** + * Operation getIpsFromSenderWithHttpInfo + * + * Return all the dedicated IPs for a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetIpsFromSender, HTTP status code, HTTP response headers (array of strings) + */ + public function getIpsFromSenderWithHttpInfo($senderId) + { + $returnType = '\SendinBlue\Client\Model\GetIpsFromSender'; + $request = $this->getIpsFromSenderRequest($senderId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetIpsFromSender', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getIpsFromSenderAsync + * + * Return all the dedicated IPs for a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getIpsFromSenderAsync($senderId) + { + return $this->getIpsFromSenderAsyncWithHttpInfo($senderId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getIpsFromSenderAsyncWithHttpInfo + * + * Return all the dedicated IPs for a sender + * + * @param int $senderId Id of the sender (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getIpsFromSenderAsyncWithHttpInfo($senderId) + { + $returnType = '\SendinBlue\Client\Model\GetIpsFromSender'; + $request = $this->getIpsFromSenderRequest($senderId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getIpsFromSender' + * + * @param int $senderId Id of the sender (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getIpsFromSenderRequest($senderId) + { + // verify the required parameter 'senderId' is set + if ($senderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $senderId when calling getIpsFromSender' + ); + } + + $resourcePath = '/senders/{senderId}/ips'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($senderId !== null) { + $resourcePath = str_replace( + '{' . 'senderId' . '}', + ObjectSerializer::toPathValue($senderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getSenders + * + * Get the list of all your senders + * + * @param string $ip Filter your senders for a specific ip (available for dedicated IP usage only) (optional) + * @param string $domain Filter your senders for a specific domain (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetSendersList + */ + public function getSenders($ip = null, $domain = null) + { + list($response) = $this->getSendersWithHttpInfo($ip, $domain); + return $response; + } + + /** + * Operation getSendersWithHttpInfo + * + * Get the list of all your senders + * + * @param string $ip Filter your senders for a specific ip (available for dedicated IP usage only) (optional) + * @param string $domain Filter your senders for a specific domain (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetSendersList, HTTP status code, HTTP response headers (array of strings) + */ + public function getSendersWithHttpInfo($ip = null, $domain = null) + { + $returnType = '\SendinBlue\Client\Model\GetSendersList'; + $request = $this->getSendersRequest($ip, $domain); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetSendersList', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSendersAsync + * + * Get the list of all your senders + * + * @param string $ip Filter your senders for a specific ip (available for dedicated IP usage only) (optional) + * @param string $domain Filter your senders for a specific domain (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSendersAsync($ip = null, $domain = null) + { + return $this->getSendersAsyncWithHttpInfo($ip, $domain) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSendersAsyncWithHttpInfo + * + * Get the list of all your senders + * + * @param string $ip Filter your senders for a specific ip (available for dedicated IP usage only) (optional) + * @param string $domain Filter your senders for a specific domain (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSendersAsyncWithHttpInfo($ip = null, $domain = null) + { + $returnType = '\SendinBlue\Client\Model\GetSendersList'; + $request = $this->getSendersRequest($ip, $domain); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSenders' + * + * @param string $ip Filter your senders for a specific ip (available for dedicated IP usage only) (optional) + * @param string $domain Filter your senders for a specific domain (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSendersRequest($ip = null, $domain = null) + { + + $resourcePath = '/senders'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($ip !== null) { + $queryParams['ip'] = ObjectSerializer::toQueryValue($ip); + } + // query params + if ($domain !== null) { + $queryParams['domain'] = ObjectSerializer::toQueryValue($domain); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateSender + * + * Update a sender + * + * @param int $senderId Id of the sender (required) + * @param \SendinBlue\Client\Model\UpdateSender $sender sender's name (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateSender($senderId, $sender = null) + { + $this->updateSenderWithHttpInfo($senderId, $sender); + } + + /** + * Operation updateSenderWithHttpInfo + * + * Update a sender + * + * @param int $senderId Id of the sender (required) + * @param \SendinBlue\Client\Model\UpdateSender $sender sender's name (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateSenderWithHttpInfo($senderId, $sender = null) + { + $returnType = ''; + $request = $this->updateSenderRequest($senderId, $sender); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateSenderAsync + * + * Update a sender + * + * @param int $senderId Id of the sender (required) + * @param \SendinBlue\Client\Model\UpdateSender $sender sender's name (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSenderAsync($senderId, $sender = null) + { + return $this->updateSenderAsyncWithHttpInfo($senderId, $sender) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateSenderAsyncWithHttpInfo + * + * Update a sender + * + * @param int $senderId Id of the sender (required) + * @param \SendinBlue\Client\Model\UpdateSender $sender sender's name (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateSenderAsyncWithHttpInfo($senderId, $sender = null) + { + $returnType = ''; + $request = $this->updateSenderRequest($senderId, $sender); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateSender' + * + * @param int $senderId Id of the sender (required) + * @param \SendinBlue\Client\Model\UpdateSender $sender sender's name (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateSenderRequest($senderId, $sender = null) + { + // verify the required parameter 'senderId' is set + if ($senderId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $senderId when calling updateSender' + ); + } + + $resourcePath = '/senders/{senderId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($senderId !== null) { + $resourcePath = str_replace( + '{' . 'senderId' . '}', + ObjectSerializer::toPathValue($senderId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($sender)) { + $_tempBody = $sender; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/TransactionalSMSApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/TransactionalSMSApi.php new file mode 100644 index 0000000..3391fdf --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/TransactionalSMSApi.php @@ -0,0 +1,1317 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation getSmsEvents + * + * Get all the SMS activity (unaggregated events) + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $phoneNumber Filter the report for a specific phone number (optional) + * @param string $event Filter the report for specific events (optional) + * @param string $tags Filter the report for specific tags passed as a serialized urlencoded array (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetSmsEventReport + */ + public function getSmsEvents($limit = '50', $startDate = null, $endDate = null, $offset = '0', $days = null, $phoneNumber = null, $event = null, $tags = null) + { + list($response) = $this->getSmsEventsWithHttpInfo($limit, $startDate, $endDate, $offset, $days, $phoneNumber, $event, $tags); + return $response; + } + + /** + * Operation getSmsEventsWithHttpInfo + * + * Get all the SMS activity (unaggregated events) + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $phoneNumber Filter the report for a specific phone number (optional) + * @param string $event Filter the report for specific events (optional) + * @param string $tags Filter the report for specific tags passed as a serialized urlencoded array (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetSmsEventReport, HTTP status code, HTTP response headers (array of strings) + */ + public function getSmsEventsWithHttpInfo($limit = '50', $startDate = null, $endDate = null, $offset = '0', $days = null, $phoneNumber = null, $event = null, $tags = null) + { + $returnType = '\SendinBlue\Client\Model\GetSmsEventReport'; + $request = $this->getSmsEventsRequest($limit, $startDate, $endDate, $offset, $days, $phoneNumber, $event, $tags); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetSmsEventReport', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getSmsEventsAsync + * + * Get all the SMS activity (unaggregated events) + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $phoneNumber Filter the report for a specific phone number (optional) + * @param string $event Filter the report for specific events (optional) + * @param string $tags Filter the report for specific tags passed as a serialized urlencoded array (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmsEventsAsync($limit = '50', $startDate = null, $endDate = null, $offset = '0', $days = null, $phoneNumber = null, $event = null, $tags = null) + { + return $this->getSmsEventsAsyncWithHttpInfo($limit, $startDate, $endDate, $offset, $days, $phoneNumber, $event, $tags) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getSmsEventsAsyncWithHttpInfo + * + * Get all the SMS activity (unaggregated events) + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $phoneNumber Filter the report for a specific phone number (optional) + * @param string $event Filter the report for specific events (optional) + * @param string $tags Filter the report for specific tags passed as a serialized urlencoded array (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getSmsEventsAsyncWithHttpInfo($limit = '50', $startDate = null, $endDate = null, $offset = '0', $days = null, $phoneNumber = null, $event = null, $tags = null) + { + $returnType = '\SendinBlue\Client\Model\GetSmsEventReport'; + $request = $this->getSmsEventsRequest($limit, $startDate, $endDate, $offset, $days, $phoneNumber, $event, $tags); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getSmsEvents' + * + * @param int $limit Number of documents per page (optional, default to 50) + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $offset Index of the first document of the page (optional, default to 0) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $phoneNumber Filter the report for a specific phone number (optional) + * @param string $event Filter the report for specific events (optional) + * @param string $tags Filter the report for specific tags passed as a serialized urlencoded array (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getSmsEventsRequest($limit = '50', $startDate = null, $endDate = null, $offset = '0', $days = null, $phoneNumber = null, $event = null, $tags = null) + { + if ($limit !== null && $limit > 100) { + throw new \InvalidArgumentException('invalid value for "$limit" when calling TransactionalSMSApi.getSmsEvents, must be smaller than or equal to 100.'); + } + + + $resourcePath = '/transactionalSMS/statistics/events'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($limit !== null) { + $queryParams['limit'] = ObjectSerializer::toQueryValue($limit); + } + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($offset !== null) { + $queryParams['offset'] = ObjectSerializer::toQueryValue($offset); + } + // query params + if ($days !== null) { + $queryParams['days'] = ObjectSerializer::toQueryValue($days); + } + // query params + if ($phoneNumber !== null) { + $queryParams['phoneNumber'] = ObjectSerializer::toQueryValue($phoneNumber); + } + // query params + if ($event !== null) { + $queryParams['event'] = ObjectSerializer::toQueryValue($event); + } + // query params + if ($tags !== null) { + $queryParams['tags'] = ObjectSerializer::toQueryValue($tags); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getTransacAggregatedSmsReport + * + * Get your SMS activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with startDate and endDate (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetTransacAggregatedSmsReport + */ + public function getTransacAggregatedSmsReport($startDate = null, $endDate = null, $days = null, $tag = null) + { + list($response) = $this->getTransacAggregatedSmsReportWithHttpInfo($startDate, $endDate, $days, $tag); + return $response; + } + + /** + * Operation getTransacAggregatedSmsReportWithHttpInfo + * + * Get your SMS activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with startDate and endDate (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetTransacAggregatedSmsReport, HTTP status code, HTTP response headers (array of strings) + */ + public function getTransacAggregatedSmsReportWithHttpInfo($startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetTransacAggregatedSmsReport'; + $request = $this->getTransacAggregatedSmsReportRequest($startDate, $endDate, $days, $tag); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetTransacAggregatedSmsReport', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getTransacAggregatedSmsReportAsync + * + * Get your SMS activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with startDate and endDate (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getTransacAggregatedSmsReportAsync($startDate = null, $endDate = null, $days = null, $tag = null) + { + return $this->getTransacAggregatedSmsReportAsyncWithHttpInfo($startDate, $endDate, $days, $tag) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getTransacAggregatedSmsReportAsyncWithHttpInfo + * + * Get your SMS activity aggregated over a period of time + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with startDate and endDate (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getTransacAggregatedSmsReportAsyncWithHttpInfo($startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetTransacAggregatedSmsReport'; + $request = $this->getTransacAggregatedSmsReportRequest($startDate, $endDate, $days, $tag); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getTransacAggregatedSmsReport' + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with startDate and endDate (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getTransacAggregatedSmsReportRequest($startDate = null, $endDate = null, $days = null, $tag = null) + { + + $resourcePath = '/transactionalSMS/statistics/aggregatedReport'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($days !== null) { + $queryParams['days'] = ObjectSerializer::toQueryValue($days); + } + // query params + if ($tag !== null) { + $queryParams['tag'] = ObjectSerializer::toQueryValue($tag); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getTransacSmsReport + * + * Get your SMS activity aggregated per day + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetTransacSmsReport + */ + public function getTransacSmsReport($startDate = null, $endDate = null, $days = null, $tag = null) + { + list($response) = $this->getTransacSmsReportWithHttpInfo($startDate, $endDate, $days, $tag); + return $response; + } + + /** + * Operation getTransacSmsReportWithHttpInfo + * + * Get your SMS activity aggregated per day + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetTransacSmsReport, HTTP status code, HTTP response headers (array of strings) + */ + public function getTransacSmsReportWithHttpInfo($startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetTransacSmsReport'; + $request = $this->getTransacSmsReportRequest($startDate, $endDate, $days, $tag); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetTransacSmsReport', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getTransacSmsReportAsync + * + * Get your SMS activity aggregated per day + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getTransacSmsReportAsync($startDate = null, $endDate = null, $days = null, $tag = null) + { + return $this->getTransacSmsReportAsyncWithHttpInfo($startDate, $endDate, $days, $tag) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getTransacSmsReportAsyncWithHttpInfo + * + * Get your SMS activity aggregated per day + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getTransacSmsReportAsyncWithHttpInfo($startDate = null, $endDate = null, $days = null, $tag = null) + { + $returnType = '\SendinBlue\Client\Model\GetTransacSmsReport'; + $request = $this->getTransacSmsReportRequest($startDate, $endDate, $days, $tag); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getTransacSmsReport' + * + * @param string $startDate Mandatory if endDate is used. Starting date (YYYY-MM-DD) of the report (optional) + * @param string $endDate Mandatory if startDate is used. Ending date (YYYY-MM-DD) of the report (optional) + * @param int $days Number of days in the past including today (positive integer). Not compatible with 'startDate' and 'endDate' (optional) + * @param string $tag Filter on a tag (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getTransacSmsReportRequest($startDate = null, $endDate = null, $days = null, $tag = null) + { + + $resourcePath = '/transactionalSMS/statistics/reports'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($startDate !== null) { + $queryParams['startDate'] = ObjectSerializer::toQueryValue($startDate); + } + // query params + if ($endDate !== null) { + $queryParams['endDate'] = ObjectSerializer::toQueryValue($endDate); + } + // query params + if ($days !== null) { + $queryParams['days'] = ObjectSerializer::toQueryValue($days); + } + // query params + if ($tag !== null) { + $queryParams['tag'] = ObjectSerializer::toQueryValue($tag); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation sendTransacSms + * + * Send the SMS campaign to the specified mobile number + * + * @param \SendinBlue\Client\Model\SendTransacSms $sendTransacSms Values to send a transactional SMS (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\SendSms + */ + public function sendTransacSms($sendTransacSms) + { + list($response) = $this->sendTransacSmsWithHttpInfo($sendTransacSms); + return $response; + } + + /** + * Operation sendTransacSmsWithHttpInfo + * + * Send the SMS campaign to the specified mobile number + * + * @param \SendinBlue\Client\Model\SendTransacSms $sendTransacSms Values to send a transactional SMS (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\SendSms, HTTP status code, HTTP response headers (array of strings) + */ + public function sendTransacSmsWithHttpInfo($sendTransacSms) + { + $returnType = '\SendinBlue\Client\Model\SendSms'; + $request = $this->sendTransacSmsRequest($sendTransacSms); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\SendSms', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 402: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation sendTransacSmsAsync + * + * Send the SMS campaign to the specified mobile number + * + * @param \SendinBlue\Client\Model\SendTransacSms $sendTransacSms Values to send a transactional SMS (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTransacSmsAsync($sendTransacSms) + { + return $this->sendTransacSmsAsyncWithHttpInfo($sendTransacSms) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation sendTransacSmsAsyncWithHttpInfo + * + * Send the SMS campaign to the specified mobile number + * + * @param \SendinBlue\Client\Model\SendTransacSms $sendTransacSms Values to send a transactional SMS (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function sendTransacSmsAsyncWithHttpInfo($sendTransacSms) + { + $returnType = '\SendinBlue\Client\Model\SendSms'; + $request = $this->sendTransacSmsRequest($sendTransacSms); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'sendTransacSms' + * + * @param \SendinBlue\Client\Model\SendTransacSms $sendTransacSms Values to send a transactional SMS (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function sendTransacSmsRequest($sendTransacSms) + { + // verify the required parameter 'sendTransacSms' is set + if ($sendTransacSms === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $sendTransacSms when calling sendTransacSms' + ); + } + + $resourcePath = '/transactionalSMS/sms'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($sendTransacSms)) { + $_tempBody = $sendTransacSms; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/WebhooksApi.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/WebhooksApi.php new file mode 100644 index 0000000..38c7116 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Api/WebhooksApi.php @@ -0,0 +1,1452 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation createWebhook + * + * Create a webhook + * + * @param \SendinBlue\Client\Model\CreateWebhook $createWebhook Values to create a webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\CreateModel + */ + public function createWebhook($createWebhook) + { + list($response) = $this->createWebhookWithHttpInfo($createWebhook); + return $response; + } + + /** + * Operation createWebhookWithHttpInfo + * + * Create a webhook + * + * @param \SendinBlue\Client\Model\CreateWebhook $createWebhook Values to create a webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\CreateModel, HTTP status code, HTTP response headers (array of strings) + */ + public function createWebhookWithHttpInfo($createWebhook) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createWebhookRequest($createWebhook); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 201: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\CreateModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation createWebhookAsync + * + * Create a webhook + * + * @param \SendinBlue\Client\Model\CreateWebhook $createWebhook Values to create a webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createWebhookAsync($createWebhook) + { + return $this->createWebhookAsyncWithHttpInfo($createWebhook) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation createWebhookAsyncWithHttpInfo + * + * Create a webhook + * + * @param \SendinBlue\Client\Model\CreateWebhook $createWebhook Values to create a webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function createWebhookAsyncWithHttpInfo($createWebhook) + { + $returnType = '\SendinBlue\Client\Model\CreateModel'; + $request = $this->createWebhookRequest($createWebhook); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'createWebhook' + * + * @param \SendinBlue\Client\Model\CreateWebhook $createWebhook Values to create a webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function createWebhookRequest($createWebhook) + { + // verify the required parameter 'createWebhook' is set + if ($createWebhook === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $createWebhook when calling createWebhook' + ); + } + + $resourcePath = '/webhooks'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($createWebhook)) { + $_tempBody = $createWebhook; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'POST', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation deleteWebhook + * + * Delete a webhook + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function deleteWebhook($webhookId) + { + $this->deleteWebhookWithHttpInfo($webhookId); + } + + /** + * Operation deleteWebhookWithHttpInfo + * + * Delete a webhook + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function deleteWebhookWithHttpInfo($webhookId) + { + $returnType = ''; + $request = $this->deleteWebhookRequest($webhookId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation deleteWebhookAsync + * + * Delete a webhook + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteWebhookAsync($webhookId) + { + return $this->deleteWebhookAsyncWithHttpInfo($webhookId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation deleteWebhookAsyncWithHttpInfo + * + * Delete a webhook + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function deleteWebhookAsyncWithHttpInfo($webhookId) + { + $returnType = ''; + $request = $this->deleteWebhookRequest($webhookId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'deleteWebhook' + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function deleteWebhookRequest($webhookId) + { + // verify the required parameter 'webhookId' is set + if ($webhookId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $webhookId when calling deleteWebhook' + ); + } + + $resourcePath = '/webhooks/{webhookId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($webhookId !== null) { + $resourcePath = str_replace( + '{' . 'webhookId' . '}', + ObjectSerializer::toPathValue($webhookId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'DELETE', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getWebhook + * + * Get a webhook details + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetWebhook + */ + public function getWebhook($webhookId) + { + list($response) = $this->getWebhookWithHttpInfo($webhookId); + return $response; + } + + /** + * Operation getWebhookWithHttpInfo + * + * Get a webhook details + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetWebhook, HTTP status code, HTTP response headers (array of strings) + */ + public function getWebhookWithHttpInfo($webhookId) + { + $returnType = '\SendinBlue\Client\Model\GetWebhook'; + $request = $this->getWebhookRequest($webhookId); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetWebhook', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getWebhookAsync + * + * Get a webhook details + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getWebhookAsync($webhookId) + { + return $this->getWebhookAsyncWithHttpInfo($webhookId) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getWebhookAsyncWithHttpInfo + * + * Get a webhook details + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getWebhookAsyncWithHttpInfo($webhookId) + { + $returnType = '\SendinBlue\Client\Model\GetWebhook'; + $request = $this->getWebhookRequest($webhookId); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getWebhook' + * + * @param int $webhookId Id of the webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getWebhookRequest($webhookId) + { + // verify the required parameter 'webhookId' is set + if ($webhookId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $webhookId when calling getWebhook' + ); + } + + $resourcePath = '/webhooks/{webhookId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($webhookId !== null) { + $resourcePath = str_replace( + '{' . 'webhookId' . '}', + ObjectSerializer::toPathValue($webhookId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation getWebhooks + * + * Get all webhooks + * + * @param string $type Filter on webhook type (optional, default to transactional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return \SendinBlue\Client\Model\GetWebhooks + */ + public function getWebhooks($type = 'transactional') + { + list($response) = $this->getWebhooksWithHttpInfo($type); + return $response; + } + + /** + * Operation getWebhooksWithHttpInfo + * + * Get all webhooks + * + * @param string $type Filter on webhook type (optional, default to transactional) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of \SendinBlue\Client\Model\GetWebhooks, HTTP status code, HTTP response headers (array of strings) + */ + public function getWebhooksWithHttpInfo($type = 'transactional') + { + $returnType = '\SendinBlue\Client\Model\GetWebhooks'; + $request = $this->getWebhooksRequest($type); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\GetWebhooks', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation getWebhooksAsync + * + * Get all webhooks + * + * @param string $type Filter on webhook type (optional, default to transactional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getWebhooksAsync($type = 'transactional') + { + return $this->getWebhooksAsyncWithHttpInfo($type) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation getWebhooksAsyncWithHttpInfo + * + * Get all webhooks + * + * @param string $type Filter on webhook type (optional, default to transactional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function getWebhooksAsyncWithHttpInfo($type = 'transactional') + { + $returnType = '\SendinBlue\Client\Model\GetWebhooks'; + $request = $this->getWebhooksRequest($type); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + $responseBody = $response->getBody(); + if ($returnType === '\SplFileObject') { + $content = $responseBody; //stream goes to serializer + } else { + $content = $responseBody->getContents(); + if ($returnType !== 'string') { + $content = json_decode($content); + } + } + + return [ + ObjectSerializer::deserialize($content, $returnType, []), + $response->getStatusCode(), + $response->getHeaders() + ]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'getWebhooks' + * + * @param string $type Filter on webhook type (optional, default to transactional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function getWebhooksRequest($type = 'transactional') + { + + $resourcePath = '/webhooks'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + // query params + if ($type !== null) { + $queryParams['type'] = ObjectSerializer::toQueryValue($type); + } + + + // body params + $_tempBody = null; + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'GET', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Operation updateWebhook + * + * Update a webhook + * + * @param int $webhookId Id of the webhook (required) + * @param \SendinBlue\Client\Model\UpdateWebhook $updateWebhook Values to update a webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function updateWebhook($webhookId, $updateWebhook) + { + $this->updateWebhookWithHttpInfo($webhookId, $updateWebhook); + } + + /** + * Operation updateWebhookWithHttpInfo + * + * Update a webhook + * + * @param int $webhookId Id of the webhook (required) + * @param \SendinBlue\Client\Model\UpdateWebhook $updateWebhook Values to update a webhook (required) + * + * @throws \SendinBlue\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function updateWebhookWithHttpInfo($webhookId, $updateWebhook) + { + $returnType = ''; + $request = $this->updateWebhookRequest($webhookId, $updateWebhook); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 400: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + case 404: + $data = ObjectSerializer::deserialize( + $e->getResponseBody(), + '\SendinBlue\Client\Model\ErrorModel', + $e->getResponseHeaders() + ); + $e->setResponseObject($data); + break; + } + throw $e; + } + } + + /** + * Operation updateWebhookAsync + * + * Update a webhook + * + * @param int $webhookId Id of the webhook (required) + * @param \SendinBlue\Client\Model\UpdateWebhook $updateWebhook Values to update a webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateWebhookAsync($webhookId, $updateWebhook) + { + return $this->updateWebhookAsyncWithHttpInfo($webhookId, $updateWebhook) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation updateWebhookAsyncWithHttpInfo + * + * Update a webhook + * + * @param int $webhookId Id of the webhook (required) + * @param \SendinBlue\Client\Model\UpdateWebhook $updateWebhook Values to update a webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function updateWebhookAsyncWithHttpInfo($webhookId, $updateWebhook) + { + $returnType = ''; + $request = $this->updateWebhookRequest($webhookId, $updateWebhook); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'updateWebhook' + * + * @param int $webhookId Id of the webhook (required) + * @param \SendinBlue\Client\Model\UpdateWebhook $updateWebhook Values to update a webhook (required) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function updateWebhookRequest($webhookId, $updateWebhook) + { + // verify the required parameter 'webhookId' is set + if ($webhookId === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $webhookId when calling updateWebhook' + ); + } + // verify the required parameter 'updateWebhook' is set + if ($updateWebhook === null) { + throw new \InvalidArgumentException( + 'Missing the required parameter $updateWebhook when calling updateWebhook' + ); + } + + $resourcePath = '/webhooks/{webhookId}'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + // path params + if ($webhookId !== null) { + $resourcePath = str_replace( + '{' . 'webhookId' . '}', + ObjectSerializer::toPathValue($webhookId), + $resourcePath + ); + } + + // body params + $_tempBody = null; + if (isset($updateWebhook)) { + $_tempBody = $updateWebhook; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + ['application/json'] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + ['application/json'], + ['application/json'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('api-key'); + if ($apiKey !== null) { + $headers['api-key'] = $apiKey; + } + // this endpoint requires API key authentication + $apiKey = $this->config->getApiKeyWithPrefix('partner-key'); + if ($apiKey !== null) { + $headers['partner-key'] = $apiKey; + } + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ApiException.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ApiException.php new file mode 100644 index 0000000..ff45e00 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ApiException.php @@ -0,0 +1,121 @@ +responseHeaders = $responseHeaders; + $this->responseBody = $responseBody; + } + + /** + * Gets the HTTP response header + * + * @return string[]|null HTTP response header + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * Gets the HTTP body of the server response either as Json or string + * + * @return mixed HTTP body of the server response either as \stdClass or string + */ + public function getResponseBody() + { + return $this->responseBody; + } + + /** + * Sets the deseralized response object (during deserialization) + * + * @param mixed $obj Deserialized response object + * + * @return void + */ + public function setResponseObject($obj) + { + $this->responseObject = $obj; + } + + /** + * Gets the deseralized response object (during deserialization) + * + * @return mixed the deserialized response object + */ + public function getResponseObject() + { + return $this->responseObject; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Configuration.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Configuration.php new file mode 100644 index 0000000..06d6bb5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Configuration.php @@ -0,0 +1,429 @@ +tempFolderPath = sys_get_temp_dir(); + } + + /** + * Sets API key + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * @param string $key API key or token + * + * @return $this + */ + public function setApiKey($apiKeyIdentifier, $key) + { + $this->apiKeys[$apiKeyIdentifier] = $key; + return $this; + } + + /** + * Gets API key + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * + * @return string API key or token + */ + public function getApiKey($apiKeyIdentifier) + { + return isset($this->apiKeys[$apiKeyIdentifier]) ? $this->apiKeys[$apiKeyIdentifier] : null; + } + + /** + * Sets the prefix for API key (e.g. Bearer) + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * @param string $prefix API key prefix, e.g. Bearer + * + * @return $this + */ + public function setApiKeyPrefix($apiKeyIdentifier, $prefix) + { + $this->apiKeyPrefixes[$apiKeyIdentifier] = $prefix; + return $this; + } + + /** + * Gets API key prefix + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * + * @return string + */ + public function getApiKeyPrefix($apiKeyIdentifier) + { + return isset($this->apiKeyPrefixes[$apiKeyIdentifier]) ? $this->apiKeyPrefixes[$apiKeyIdentifier] : null; + } + + /** + * Sets the access token for OAuth + * + * @param string $accessToken Token for OAuth + * + * @return $this + */ + public function setAccessToken($accessToken) + { + $this->accessToken = $accessToken; + return $this; + } + + /** + * Gets the access token for OAuth + * + * @return string Access token for OAuth + */ + public function getAccessToken() + { + return $this->accessToken; + } + + /** + * Sets the username for HTTP basic authentication + * + * @param string $username Username for HTTP basic authentication + * + * @return $this + */ + public function setUsername($username) + { + $this->username = $username; + return $this; + } + + /** + * Gets the username for HTTP basic authentication + * + * @return string Username for HTTP basic authentication + */ + public function getUsername() + { + return $this->username; + } + + /** + * Sets the password for HTTP basic authentication + * + * @param string $password Password for HTTP basic authentication + * + * @return $this + */ + public function setPassword($password) + { + $this->password = $password; + return $this; + } + + /** + * Gets the password for HTTP basic authentication + * + * @return string Password for HTTP basic authentication + */ + public function getPassword() + { + return $this->password; + } + + /** + * Sets the host + * + * @param string $host Host + * + * @return $this + */ + public function setHost($host) + { + $this->host = $host; + return $this; + } + + /** + * Gets the host + * + * @return string Host + */ + public function getHost() + { + return $this->host; + } + + /** + * Sets the user agent of the api client + * + * @param string $userAgent the user agent of the api client + * + * @throws \InvalidArgumentException + * @return $this + */ + public function setUserAgent($userAgent) + { + if (!is_string($userAgent)) { + throw new \InvalidArgumentException('User-agent must be a string.'); + } + + $this->userAgent = $userAgent; + return $this; + } + + /** + * Gets the user agent of the api client + * + * @return string user agent + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Sets debug flag + * + * @param bool $debug Debug flag + * + * @return $this + */ + public function setDebug($debug) + { + $this->debug = $debug; + return $this; + } + + /** + * Gets the debug flag + * + * @return bool + */ + public function getDebug() + { + return $this->debug; + } + + /** + * Sets the debug file + * + * @param string $debugFile Debug file + * + * @return $this + */ + public function setDebugFile($debugFile) + { + $this->debugFile = $debugFile; + return $this; + } + + /** + * Gets the debug file + * + * @return string + */ + public function getDebugFile() + { + return $this->debugFile; + } + + /** + * Sets the temp folder path + * + * @param string $tempFolderPath Temp folder path + * + * @return $this + */ + public function setTempFolderPath($tempFolderPath) + { + $this->tempFolderPath = $tempFolderPath; + return $this; + } + + /** + * Gets the temp folder path + * + * @return string Temp folder path + */ + public function getTempFolderPath() + { + return $this->tempFolderPath; + } + + /** + * Gets the default configuration instance + * + * @return Configuration + */ + public static function getDefaultConfiguration() + { + if (self::$defaultConfiguration === null) { + self::$defaultConfiguration = new Configuration(); + } + + return self::$defaultConfiguration; + } + + /** + * Sets the detault configuration instance + * + * @param Configuration $config An instance of the Configuration Object + * + * @return void + */ + public static function setDefaultConfiguration(Configuration $config) + { + self::$defaultConfiguration = $config; + } + + /** + * Gets the essential information for debugging + * + * @return string The report for debugging + */ + public static function toDebugReport() + { + $report = 'PHP SDK (SendinBlue\Client) Debug Report:' . PHP_EOL; + $report .= ' OS: ' . php_uname() . PHP_EOL; + $report .= ' PHP Version: ' . PHP_VERSION . PHP_EOL; + $report .= ' OpenAPI Spec Version: 3.0.0' . PHP_EOL; + $report .= ' Temp Folder Path: ' . self::getDefaultConfiguration()->getTempFolderPath() . PHP_EOL; + + return $report; + } + + /** + * Get API key (with prefix if set) + * + * @param string $apiKeyIdentifier name of apikey + * + * @return string API key with the prefix + */ + public function getApiKeyWithPrefix($apiKeyIdentifier) + { + $prefix = $this->getApiKeyPrefix($apiKeyIdentifier); + $apiKey = $this->getApiKey($apiKeyIdentifier); + + if ($apiKey === null) { + return null; + } + + if ($prefix === null) { + $keyWithPrefix = $apiKey; + } else { + $keyWithPrefix = $prefix . ' ' . $apiKey; + } + + return $keyWithPrefix; + } +} diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/HeaderSelector.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/HeaderSelector.php new file mode 100644 index 0000000..214dff6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/HeaderSelector.php @@ -0,0 +1,110 @@ +selectAcceptHeader($accept); + if ($accept !== null) { + $headers['Accept'] = $accept; + } + + $headers['Content-Type'] = $this->selectContentTypeHeader($contentTypes); + return $headers; + } + + /** + * @param string[] $accept + * @return array + */ + public function selectHeadersForMultipart($accept) + { + $headers = $this->selectHeaders($accept, []); + + unset($headers['Content-Type']); + return $headers; + } + + /** + * Return the header 'Accept' based on an array of Accept provided + * + * @param string[] $accept Array of header + * + * @return string Accept (e.g. application/json) + */ + private function selectAcceptHeader($accept) + { + if (count($accept) === 0 || (count($accept) === 1 && $accept[0] === '')) { + return null; + } elseif (preg_grep("/application\/json/i", $accept)) { + return 'application/json'; + } else { + return implode(',', $accept); + } + } + + /** + * Return the content type based on an array of content-type provided + * + * @param string[] $contentType Array fo content-type + * + * @return string Content-Type (e.g. application/json) + */ + private function selectContentTypeHeader($contentType) + { + if (count($contentType) === 0 || (count($contentType) === 1 && $contentType[0] === '')) { + return 'application/json'; + } elseif (preg_grep("/application\/json/i", $contentType)) { + return 'application/json'; + } else { + return implode(',', $contentType); + } + } +} + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddChildDomain.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddChildDomain.php new file mode 100644 index 0000000..3c24c86 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddChildDomain.php @@ -0,0 +1,302 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'domain' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'domain' => 'domain' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'domain' => 'setDomain' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'domain' => 'getDomain' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['domain'] = isset($data['domain']) ? $data['domain'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets domain + * + * @return string + */ + public function getDomain() + { + return $this->container['domain']; + } + + /** + * Sets domain + * + * @param string $domain Sender domain to add for a specific child account + * + * @return $this + */ + public function setDomain($domain) + { + $this->container['domain'] = $domain; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddContactToList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddContactToList.php new file mode 100644 index 0000000..673e1ed --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddContactToList.php @@ -0,0 +1,302 @@ + 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'emails' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'emails' => 'emails' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'emails' => 'setEmails' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'emails' => 'getEmails' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['emails'] = isset($data['emails']) ? $data['emails'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets emails + * + * @return string[] + */ + public function getEmails() + { + return $this->container['emails']; + } + + /** + * Sets emails + * + * @param string[] $emails Emails to add to a list + * + * @return $this + */ + public function setEmails($emails) + { + $this->container['emails'] = $emails; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddCredits.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddCredits.php new file mode 100644 index 0000000..1714ad1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/AddCredits.php @@ -0,0 +1,332 @@ + 'int', + 'email' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'sms' => 'int64', + 'email' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'sms' => 'sms', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'sms' => 'setSms', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'sms' => 'getSms', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['sms'] = isset($data['sms']) ? $data['sms'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets sms + * + * @return int + */ + public function getSms() + { + return $this->container['sms']; + } + + /** + * Sets sms + * + * @param int $sms Required if email credits are empty. SMS credits to be added to the child account + * + * @return $this + */ + public function setSms($sms) + { + $this->container['sms'] = $sms; + + return $this; + } + + /** + * Gets email + * + * @return int + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param int $email Required if sms credits are empty. Email credits to be added to the child account + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttribute.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttribute.php new file mode 100644 index 0000000..86a338a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttribute.php @@ -0,0 +1,406 @@ + 'string', + 'enumeration' => '\SendinBlue\Client\Model\CreateAttributeEnumeration[]', + 'type' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'value' => null, + 'enumeration' => null, + 'type' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'value' => 'value', + 'enumeration' => 'enumeration', + 'type' => 'type' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'value' => 'setValue', + 'enumeration' => 'setEnumeration', + 'type' => 'setType' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'value' => 'getValue', + 'enumeration' => 'getEnumeration', + 'type' => 'getType' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const TYPE_TEXT = 'text'; + const TYPE_DATE = 'date'; + const TYPE_FLOAT = 'float'; + const TYPE_BOOLEAN = 'boolean'; + const TYPE_ID = 'id'; + const TYPE_CATEGORY = 'category'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_TEXT, + self::TYPE_DATE, + self::TYPE_FLOAT, + self::TYPE_BOOLEAN, + self::TYPE_ID, + self::TYPE_CATEGORY, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['value'] = isset($data['value']) ? $data['value'] : null; + $this->container['enumeration'] = isset($data['enumeration']) ? $data['enumeration'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets value + * + * @return string + */ + public function getValue() + { + return $this->container['value']; + } + + /** + * Sets value + * + * @param string $value Value of the attribute. Use only if the attribute's category is 'calculated' or 'global' + * + * @return $this + */ + public function setValue($value) + { + $this->container['value'] = $value; + + return $this; + } + + /** + * Gets enumeration + * + * @return \SendinBlue\Client\Model\CreateAttributeEnumeration[] + */ + public function getEnumeration() + { + return $this->container['enumeration']; + } + + /** + * Sets enumeration + * + * @param \SendinBlue\Client\Model\CreateAttributeEnumeration[] $enumeration List of values and labels that the attribute can take. Use only if the attribute's category is \"category\". For example, `[{\"value\":1, \"label\":\"male\"}, {\"value\":2, \"label\":\"female\"}]` + * + * @return $this + */ + public function setEnumeration($enumeration) + { + $this->container['enumeration'] = $enumeration; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of the attribute. Use only if the attribute's category is 'normal', 'category' or 'transactional' ( type 'boolean' is only available if the category is 'normal' attribute, type 'id' is only available if the category is 'transactional' attribute & type 'category' is only available if the category is 'category' attribute ) + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!is_null($type) && !in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttributeEnumeration.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttributeEnumeration.php new file mode 100644 index 0000000..fad0af8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateAttributeEnumeration.php @@ -0,0 +1,344 @@ + 'int', + 'label' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'value' => null, + 'label' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'value' => 'value', + 'label' => 'label' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'value' => 'setValue', + 'label' => 'setLabel' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'value' => 'getValue', + 'label' => 'getLabel' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['value'] = isset($data['value']) ? $data['value'] : null; + $this->container['label'] = isset($data['label']) ? $data['label'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['value'] === null) { + $invalidProperties[] = "'value' can't be null"; + } + if ($this->container['label'] === null) { + $invalidProperties[] = "'label' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['value'] === null) { + return false; + } + if ($this->container['label'] === null) { + return false; + } + return true; + } + + + /** + * Gets value + * + * @return int + */ + public function getValue() + { + return $this->container['value']; + } + + /** + * Sets value + * + * @param int $value Id of the value + * + * @return $this + */ + public function setValue($value) + { + $this->container['value'] = $value; + + return $this; + } + + /** + * Gets label + * + * @return string + */ + public function getLabel() + { + return $this->container['label']; + } + + /** + * Sets label + * + * @param string $label Label of the value + * + * @return $this + */ + public function setLabel($label) + { + $this->container['label'] = $label; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateChild.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateChild.php new file mode 100644 index 0000000..5e5c980 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateChild.php @@ -0,0 +1,452 @@ + 'string', + 'firstName' => 'string', + 'lastName' => 'string', + 'companyName' => 'string', + 'password' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'firstName' => null, + 'lastName' => null, + 'companyName' => null, + 'password' => 'password' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'firstName' => 'firstName', + 'lastName' => 'lastName', + 'companyName' => 'companyName', + 'password' => 'password' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'firstName' => 'setFirstName', + 'lastName' => 'setLastName', + 'companyName' => 'setCompanyName', + 'password' => 'setPassword' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'firstName' => 'getFirstName', + 'lastName' => 'getLastName', + 'companyName' => 'getCompanyName', + 'password' => 'getPassword' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['firstName'] = isset($data['firstName']) ? $data['firstName'] : null; + $this->container['lastName'] = isset($data['lastName']) ? $data['lastName'] : null; + $this->container['companyName'] = isset($data['companyName']) ? $data['companyName'] : null; + $this->container['password'] = isset($data['password']) ? $data['password'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['firstName'] === null) { + $invalidProperties[] = "'firstName' can't be null"; + } + if ($this->container['lastName'] === null) { + $invalidProperties[] = "'lastName' can't be null"; + } + if ($this->container['companyName'] === null) { + $invalidProperties[] = "'companyName' can't be null"; + } + if ($this->container['password'] === null) { + $invalidProperties[] = "'password' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['firstName'] === null) { + return false; + } + if ($this->container['lastName'] === null) { + return false; + } + if ($this->container['companyName'] === null) { + return false; + } + if ($this->container['password'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address to create the child account + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets firstName + * + * @return string + */ + public function getFirstName() + { + return $this->container['firstName']; + } + + /** + * Sets firstName + * + * @param string $firstName First name to use to create the child account + * + * @return $this + */ + public function setFirstName($firstName) + { + $this->container['firstName'] = $firstName; + + return $this; + } + + /** + * Gets lastName + * + * @return string + */ + public function getLastName() + { + return $this->container['lastName']; + } + + /** + * Sets lastName + * + * @param string $lastName Last name to use to create the child account + * + * @return $this + */ + public function setLastName($lastName) + { + $this->container['lastName'] = $lastName; + + return $this; + } + + /** + * Gets companyName + * + * @return string + */ + public function getCompanyName() + { + return $this->container['companyName']; + } + + /** + * Sets companyName + * + * @param string $companyName Company name to use to create the child account + * + * @return $this + */ + public function setCompanyName($companyName) + { + $this->container['companyName'] = $companyName; + + return $this; + } + + /** + * Gets password + * + * @return string + */ + public function getPassword() + { + return $this->container['password']; + } + + /** + * Sets password + * + * @param string $password Password for the child account to login + * + * @return $this + */ + public function setPassword($password) + { + $this->container['password'] = $password; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateContact.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateContact.php new file mode 100644 index 0000000..c362203 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateContact.php @@ -0,0 +1,482 @@ + 'string', + 'attributes' => 'object', + 'emailBlacklisted' => 'bool', + 'smsBlacklisted' => 'bool', + 'listIds' => 'int[]', + 'updateEnabled' => 'bool', + 'smtpBlacklistSender' => 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'attributes' => null, + 'emailBlacklisted' => null, + 'smsBlacklisted' => null, + 'listIds' => 'int64', + 'updateEnabled' => null, + 'smtpBlacklistSender' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'attributes' => 'attributes', + 'emailBlacklisted' => 'emailBlacklisted', + 'smsBlacklisted' => 'smsBlacklisted', + 'listIds' => 'listIds', + 'updateEnabled' => 'updateEnabled', + 'smtpBlacklistSender' => 'smtpBlacklistSender' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'attributes' => 'setAttributes', + 'emailBlacklisted' => 'setEmailBlacklisted', + 'smsBlacklisted' => 'setSmsBlacklisted', + 'listIds' => 'setListIds', + 'updateEnabled' => 'setUpdateEnabled', + 'smtpBlacklistSender' => 'setSmtpBlacklistSender' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'attributes' => 'getAttributes', + 'emailBlacklisted' => 'getEmailBlacklisted', + 'smsBlacklisted' => 'getSmsBlacklisted', + 'listIds' => 'getListIds', + 'updateEnabled' => 'getUpdateEnabled', + 'smtpBlacklistSender' => 'getSmtpBlacklistSender' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['attributes'] = isset($data['attributes']) ? $data['attributes'] : null; + $this->container['emailBlacklisted'] = isset($data['emailBlacklisted']) ? $data['emailBlacklisted'] : null; + $this->container['smsBlacklisted'] = isset($data['smsBlacklisted']) ? $data['smsBlacklisted'] : null; + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + $this->container['updateEnabled'] = isset($data['updateEnabled']) ? $data['updateEnabled'] : false; + $this->container['smtpBlacklistSender'] = isset($data['smtpBlacklistSender']) ? $data['smtpBlacklistSender'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address of the user. Mandatory if \"sms\" field is not passed in \"attributes\" parameter' + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets attributes + * + * @return object + */ + public function getAttributes() + { + return $this->container['attributes']; + } + + /** + * Sets attributes + * + * @param object $attributes Pass the set of attributes and their values. These attributes must be present in your SendinBlue account. For example, `{\"FNAME\":\"Elly\", \"LNAME\":\"Roger\"}` + * + * @return $this + */ + public function setAttributes($attributes) + { + $this->container['attributes'] = $attributes; + + return $this; + } + + /** + * Gets emailBlacklisted + * + * @return bool + */ + public function getEmailBlacklisted() + { + return $this->container['emailBlacklisted']; + } + + /** + * Sets emailBlacklisted + * + * @param bool $emailBlacklisted Set this field to blacklist the contact for emails (emailBlacklisted = true) + * + * @return $this + */ + public function setEmailBlacklisted($emailBlacklisted) + { + $this->container['emailBlacklisted'] = $emailBlacklisted; + + return $this; + } + + /** + * Gets smsBlacklisted + * + * @return bool + */ + public function getSmsBlacklisted() + { + return $this->container['smsBlacklisted']; + } + + /** + * Sets smsBlacklisted + * + * @param bool $smsBlacklisted Set this field to blacklist the contact for SMS (smsBlacklisted = true) + * + * @return $this + */ + public function setSmsBlacklisted($smsBlacklisted) + { + $this->container['smsBlacklisted'] = $smsBlacklisted; + + return $this; + } + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds Ids of the lists to add the contact to + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + + /** + * Gets updateEnabled + * + * @return bool + */ + public function getUpdateEnabled() + { + return $this->container['updateEnabled']; + } + + /** + * Sets updateEnabled + * + * @param bool $updateEnabled Facilitate to update the existing contact in the same request (updateEnabled = true) + * + * @return $this + */ + public function setUpdateEnabled($updateEnabled) + { + $this->container['updateEnabled'] = $updateEnabled; + + return $this; + } + + /** + * Gets smtpBlacklistSender + * + * @return string[] + */ + public function getSmtpBlacklistSender() + { + return $this->container['smtpBlacklistSender']; + } + + /** + * Sets smtpBlacklistSender + * + * @param string[] $smtpBlacklistSender SMTP forbidden sender for contact. Use only for email Contact ( only available if updateEnabled = true ) + * + * @return $this + */ + public function setSmtpBlacklistSender($smtpBlacklistSender) + { + $this->container['smtpBlacklistSender'] = $smtpBlacklistSender; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaign.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaign.php new file mode 100644 index 0000000..572ab1b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaign.php @@ -0,0 +1,1114 @@ + 'string', + 'sender' => '\SendinBlue\Client\Model\CreateEmailCampaignSender', + 'name' => 'string', + 'htmlContent' => 'string', + 'htmlUrl' => 'string', + 'templateId' => 'int', + 'scheduledAt' => '\DateTime', + 'subject' => 'string', + 'replyTo' => 'string', + 'toField' => 'string', + 'recipients' => '\SendinBlue\Client\Model\CreateEmailCampaignRecipients', + 'attachmentUrl' => 'string', + 'inlineImageActivation' => 'bool', + 'mirrorActive' => 'bool', + 'footer' => 'string', + 'header' => 'string', + 'utmCampaign' => 'string', + 'params' => 'object', + 'sendAtBestTime' => 'bool', + 'abTesting' => 'bool', + 'subjectA' => 'string', + 'subjectB' => 'string', + 'splitRule' => 'int', + 'winnerCriteria' => 'string', + 'winnerDelay' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'tag' => null, + 'sender' => null, + 'name' => null, + 'htmlContent' => null, + 'htmlUrl' => 'url', + 'templateId' => 'int64', + 'scheduledAt' => 'date-time', + 'subject' => null, + 'replyTo' => 'email', + 'toField' => null, + 'recipients' => null, + 'attachmentUrl' => 'url', + 'inlineImageActivation' => null, + 'mirrorActive' => null, + 'footer' => null, + 'header' => null, + 'utmCampaign' => null, + 'params' => null, + 'sendAtBestTime' => null, + 'abTesting' => null, + 'subjectA' => null, + 'subjectB' => null, + 'splitRule' => 'int64', + 'winnerCriteria' => null, + 'winnerDelay' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'tag' => 'tag', + 'sender' => 'sender', + 'name' => 'name', + 'htmlContent' => 'htmlContent', + 'htmlUrl' => 'htmlUrl', + 'templateId' => 'templateId', + 'scheduledAt' => 'scheduledAt', + 'subject' => 'subject', + 'replyTo' => 'replyTo', + 'toField' => 'toField', + 'recipients' => 'recipients', + 'attachmentUrl' => 'attachmentUrl', + 'inlineImageActivation' => 'inlineImageActivation', + 'mirrorActive' => 'mirrorActive', + 'footer' => 'footer', + 'header' => 'header', + 'utmCampaign' => 'utmCampaign', + 'params' => 'params', + 'sendAtBestTime' => 'sendAtBestTime', + 'abTesting' => 'abTesting', + 'subjectA' => 'subjectA', + 'subjectB' => 'subjectB', + 'splitRule' => 'splitRule', + 'winnerCriteria' => 'winnerCriteria', + 'winnerDelay' => 'winnerDelay' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'tag' => 'setTag', + 'sender' => 'setSender', + 'name' => 'setName', + 'htmlContent' => 'setHtmlContent', + 'htmlUrl' => 'setHtmlUrl', + 'templateId' => 'setTemplateId', + 'scheduledAt' => 'setScheduledAt', + 'subject' => 'setSubject', + 'replyTo' => 'setReplyTo', + 'toField' => 'setToField', + 'recipients' => 'setRecipients', + 'attachmentUrl' => 'setAttachmentUrl', + 'inlineImageActivation' => 'setInlineImageActivation', + 'mirrorActive' => 'setMirrorActive', + 'footer' => 'setFooter', + 'header' => 'setHeader', + 'utmCampaign' => 'setUtmCampaign', + 'params' => 'setParams', + 'sendAtBestTime' => 'setSendAtBestTime', + 'abTesting' => 'setAbTesting', + 'subjectA' => 'setSubjectA', + 'subjectB' => 'setSubjectB', + 'splitRule' => 'setSplitRule', + 'winnerCriteria' => 'setWinnerCriteria', + 'winnerDelay' => 'setWinnerDelay' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'tag' => 'getTag', + 'sender' => 'getSender', + 'name' => 'getName', + 'htmlContent' => 'getHtmlContent', + 'htmlUrl' => 'getHtmlUrl', + 'templateId' => 'getTemplateId', + 'scheduledAt' => 'getScheduledAt', + 'subject' => 'getSubject', + 'replyTo' => 'getReplyTo', + 'toField' => 'getToField', + 'recipients' => 'getRecipients', + 'attachmentUrl' => 'getAttachmentUrl', + 'inlineImageActivation' => 'getInlineImageActivation', + 'mirrorActive' => 'getMirrorActive', + 'footer' => 'getFooter', + 'header' => 'getHeader', + 'utmCampaign' => 'getUtmCampaign', + 'params' => 'getParams', + 'sendAtBestTime' => 'getSendAtBestTime', + 'abTesting' => 'getAbTesting', + 'subjectA' => 'getSubjectA', + 'subjectB' => 'getSubjectB', + 'splitRule' => 'getSplitRule', + 'winnerCriteria' => 'getWinnerCriteria', + 'winnerDelay' => 'getWinnerDelay' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const WINNER_CRITERIA_OPEN = 'open'; + const WINNER_CRITERIA_CLICK = 'click'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getWinnerCriteriaAllowableValues() + { + return [ + self::WINNER_CRITERIA_OPEN, + self::WINNER_CRITERIA_CLICK, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['htmlUrl'] = isset($data['htmlUrl']) ? $data['htmlUrl'] : null; + $this->container['templateId'] = isset($data['templateId']) ? $data['templateId'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['toField'] = isset($data['toField']) ? $data['toField'] : null; + $this->container['recipients'] = isset($data['recipients']) ? $data['recipients'] : null; + $this->container['attachmentUrl'] = isset($data['attachmentUrl']) ? $data['attachmentUrl'] : null; + $this->container['inlineImageActivation'] = isset($data['inlineImageActivation']) ? $data['inlineImageActivation'] : false; + $this->container['mirrorActive'] = isset($data['mirrorActive']) ? $data['mirrorActive'] : null; + $this->container['footer'] = isset($data['footer']) ? $data['footer'] : null; + $this->container['header'] = isset($data['header']) ? $data['header'] : null; + $this->container['utmCampaign'] = isset($data['utmCampaign']) ? $data['utmCampaign'] : null; + $this->container['params'] = isset($data['params']) ? $data['params'] : null; + $this->container['sendAtBestTime'] = isset($data['sendAtBestTime']) ? $data['sendAtBestTime'] : false; + $this->container['abTesting'] = isset($data['abTesting']) ? $data['abTesting'] : false; + $this->container['subjectA'] = isset($data['subjectA']) ? $data['subjectA'] : null; + $this->container['subjectB'] = isset($data['subjectB']) ? $data['subjectB'] : null; + $this->container['splitRule'] = isset($data['splitRule']) ? $data['splitRule'] : null; + $this->container['winnerCriteria'] = isset($data['winnerCriteria']) ? $data['winnerCriteria'] : null; + $this->container['winnerDelay'] = isset($data['winnerDelay']) ? $data['winnerDelay'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if (!is_null($this->container['splitRule']) && ($this->container['splitRule'] > 50)) { + $invalidProperties[] = "invalid value for 'splitRule', must be smaller than or equal to 50."; + } + + if (!is_null($this->container['splitRule']) && ($this->container['splitRule'] < 1)) { + $invalidProperties[] = "invalid value for 'splitRule', must be bigger than or equal to 1."; + } + + $allowedValues = $this->getWinnerCriteriaAllowableValues(); + if (!in_array($this->container['winnerCriteria'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'winnerCriteria', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if (!is_null($this->container['winnerDelay']) && ($this->container['winnerDelay'] > 168)) { + $invalidProperties[] = "invalid value for 'winnerDelay', must be smaller than or equal to 168."; + } + + if (!is_null($this->container['winnerDelay']) && ($this->container['winnerDelay'] < 1)) { + $invalidProperties[] = "invalid value for 'winnerDelay', must be bigger than or equal to 1."; + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['sender'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['splitRule'] > 50) { + return false; + } + if ($this->container['splitRule'] < 1) { + return false; + } + $allowedValues = $this->getWinnerCriteriaAllowableValues(); + if (!in_array($this->container['winnerCriteria'], $allowedValues)) { + return false; + } + if ($this->container['winnerDelay'] > 168) { + return false; + } + if ($this->container['winnerDelay'] < 1) { + return false; + } + return true; + } + + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the campaign + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\CreateEmailCampaignSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\CreateEmailCampaignSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent Mandatory if htmlUrl and templateId are empty. Body of the message (HTML) + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets htmlUrl + * + * @return string + */ + public function getHtmlUrl() + { + return $this->container['htmlUrl']; + } + + /** + * Sets htmlUrl + * + * @param string $htmlUrl Mandatory if htmlContent and templateId are empty. Url to the message (HTML) + * + * @return $this + */ + public function setHtmlUrl($htmlUrl) + { + $this->container['htmlUrl'] = $htmlUrl; + + return $this; + } + + /** + * Gets templateId + * + * @return int + */ + public function getTemplateId() + { + return $this->container['templateId']; + } + + /** + * Sets templateId + * + * @param int $templateId Mandatory if htmlContent and htmlUrl are empty. Id of the SMTP template with status 'active'. Used to copy only its content fetched from htmlContent/htmlUrl to an email campaign for RSS feature. + * + * @return $this + */ + public function setTemplateId($templateId) + { + $this->container['templateId'] = $templateId; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt Sending UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. If sendAtBestTime is set to true, your campaign will be sent according to the date passed (ignoring the time part). + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the campaign. Mandatory if abTesting is false. Ignored if abTesting is true. + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email on which the campaign recipients will be able to reply to + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets toField + * + * @return string + */ + public function getToField() + { + return $this->container['toField']; + } + + /** + * Sets toField + * + * @param string $toField To personalize the «To» Field. If you want to include the first name and last name of your recipient, add `{FNAME} {LNAME}`. These contact attributes must already exist in your SendinBlue account. If input parameter 'params' used please use `{{contact.FNAME}} {{contact.LNAME}}` for personalization + * + * @return $this + */ + public function setToField($toField) + { + $this->container['toField'] = $toField; + + return $this; + } + + /** + * Gets recipients + * + * @return \SendinBlue\Client\Model\CreateEmailCampaignRecipients + */ + public function getRecipients() + { + return $this->container['recipients']; + } + + /** + * Sets recipients + * + * @param \SendinBlue\Client\Model\CreateEmailCampaignRecipients $recipients recipients + * + * @return $this + */ + public function setRecipients($recipients) + { + $this->container['recipients'] = $recipients; + + return $this; + } + + /** + * Gets attachmentUrl + * + * @return string + */ + public function getAttachmentUrl() + { + return $this->container['attachmentUrl']; + } + + /** + * Sets attachmentUrl + * + * @param string $attachmentUrl Absolute url of the attachment (no local file). Extension allowed: xlsx, xls, ods, docx, docm, doc, csv, pdf, txt, gif, jpg, jpeg, png, tif, tiff, rtf, bmp, cgm, css, shtml, html, htm, zip, xml, ppt, pptx, tar, ez, ics, mobi, msg, pub and eps + * + * @return $this + */ + public function setAttachmentUrl($attachmentUrl) + { + $this->container['attachmentUrl'] = $attachmentUrl; + + return $this; + } + + /** + * Gets inlineImageActivation + * + * @return bool + */ + public function getInlineImageActivation() + { + return $this->container['inlineImageActivation']; + } + + /** + * Sets inlineImageActivation + * + * @param bool $inlineImageActivation Use true to embedded the images in your email. Final size of the email should be less than 4MB. Campaigns with embedded images can not be sent to more than 5000 contacts + * + * @return $this + */ + public function setInlineImageActivation($inlineImageActivation) + { + $this->container['inlineImageActivation'] = $inlineImageActivation; + + return $this; + } + + /** + * Gets mirrorActive + * + * @return bool + */ + public function getMirrorActive() + { + return $this->container['mirrorActive']; + } + + /** + * Sets mirrorActive + * + * @param bool $mirrorActive Use true to enable the mirror link + * + * @return $this + */ + public function setMirrorActive($mirrorActive) + { + $this->container['mirrorActive'] = $mirrorActive; + + return $this; + } + + /** + * Gets footer + * + * @return string + */ + public function getFooter() + { + return $this->container['footer']; + } + + /** + * Sets footer + * + * @param string $footer Footer of the email campaign + * + * @return $this + */ + public function setFooter($footer) + { + $this->container['footer'] = $footer; + + return $this; + } + + /** + * Gets header + * + * @return string + */ + public function getHeader() + { + return $this->container['header']; + } + + /** + * Sets header + * + * @param string $header Header of the email campaign + * + * @return $this + */ + public function setHeader($header) + { + $this->container['header'] = $header; + + return $this; + } + + /** + * Gets utmCampaign + * + * @return string + */ + public function getUtmCampaign() + { + return $this->container['utmCampaign']; + } + + /** + * Sets utmCampaign + * + * @param string $utmCampaign Customize the utm_campaign value. If this field is empty, the campaign name will be used. Only alphanumeric characters and spaces are allowed + * + * @return $this + */ + public function setUtmCampaign($utmCampaign) + { + $this->container['utmCampaign'] = $utmCampaign; + + return $this; + } + + /** + * Gets params + * + * @return object + */ + public function getParams() + { + return $this->container['params']; + } + + /** + * Sets params + * + * @param object $params Pass the set of attributes to customize the type classic campaign. For example, `{\"FNAME\":\"Joe\", \"LNAME:\"Doe\"}`. Only available if 'type' is 'classic'. It's considered only if campaign is in New Template Language format. The New Template Language is dependent on the values of 'subject', 'htmlContent/htmlUrl', 'sender.name' & 'toField' + * + * @return $this + */ + public function setParams($params) + { + $this->container['params'] = $params; + + return $this; + } + + /** + * Gets sendAtBestTime + * + * @return bool + */ + public function getSendAtBestTime() + { + return $this->container['sendAtBestTime']; + } + + /** + * Sets sendAtBestTime + * + * @param bool $sendAtBestTime Set this to true if you want to send your campaign at best time. + * + * @return $this + */ + public function setSendAtBestTime($sendAtBestTime) + { + $this->container['sendAtBestTime'] = $sendAtBestTime; + + return $this; + } + + /** + * Gets abTesting + * + * @return bool + */ + public function getAbTesting() + { + return $this->container['abTesting']; + } + + /** + * Sets abTesting + * + * @param bool $abTesting Status of A/B Test. abTesting = false means it is disabled, & abTesting = true means it is enabled. 'subjectA', 'subjectB', 'splitRule', 'winnerCriteria' & 'winnerDelay' will be considered when abTesting is set to true. 'subjectA' & 'subjectB' are mandatory together & 'subject' if passed is ignored. Can be set to true only if 'sendAtBestTime' is 'false'. You will be able to set up two subject lines for your campaign and send them to a random sample of your total recipients. Half of the test group will receive version A, and the other half will receive version B + * + * @return $this + */ + public function setAbTesting($abTesting) + { + $this->container['abTesting'] = $abTesting; + + return $this; + } + + /** + * Gets subjectA + * + * @return string + */ + public function getSubjectA() + { + return $this->container['subjectA']; + } + + /** + * Sets subjectA + * + * @param string $subjectA Subject A of the campaign. Mandatory if abTesting = true. subjectA & subjectB should have unique value + * + * @return $this + */ + public function setSubjectA($subjectA) + { + $this->container['subjectA'] = $subjectA; + + return $this; + } + + /** + * Gets subjectB + * + * @return string + */ + public function getSubjectB() + { + return $this->container['subjectB']; + } + + /** + * Sets subjectB + * + * @param string $subjectB Subject B of the campaign. Mandatory if abTesting = true. subjectA & subjectB should have unique value + * + * @return $this + */ + public function setSubjectB($subjectB) + { + $this->container['subjectB'] = $subjectB; + + return $this; + } + + /** + * Gets splitRule + * + * @return int + */ + public function getSplitRule() + { + return $this->container['splitRule']; + } + + /** + * Sets splitRule + * + * @param int $splitRule Add the size of your test groups. Mandatory if abTesting = true & 'recipients' is passed. We'll send version A and B to a random sample of recipients, and then the winning version to everyone else + * + * @return $this + */ + public function setSplitRule($splitRule) + { + + if (!is_null($splitRule) && ($splitRule > 50)) { + throw new \InvalidArgumentException('invalid value for $splitRule when calling CreateEmailCampaign., must be smaller than or equal to 50.'); + } + if (!is_null($splitRule) && ($splitRule < 1)) { + throw new \InvalidArgumentException('invalid value for $splitRule when calling CreateEmailCampaign., must be bigger than or equal to 1.'); + } + + $this->container['splitRule'] = $splitRule; + + return $this; + } + + /** + * Gets winnerCriteria + * + * @return string + */ + public function getWinnerCriteria() + { + return $this->container['winnerCriteria']; + } + + /** + * Sets winnerCriteria + * + * @param string $winnerCriteria Choose the metrics that will determinate the winning version. Mandatory if 'splitRule' >= 1 and < 50. If splitRule = 50, 'winnerCriteria' is ignored if passed + * + * @return $this + */ + public function setWinnerCriteria($winnerCriteria) + { + $allowedValues = $this->getWinnerCriteriaAllowableValues(); + if (!is_null($winnerCriteria) && !in_array($winnerCriteria, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'winnerCriteria', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['winnerCriteria'] = $winnerCriteria; + + return $this; + } + + /** + * Gets winnerDelay + * + * @return int + */ + public function getWinnerDelay() + { + return $this->container['winnerDelay']; + } + + /** + * Sets winnerDelay + * + * @param int $winnerDelay Choose the duration of the test in hours. Maximum is 7 days, pass 24*7 = 168 hours. The winning version will be sent at the end of the test. Mandatory if 'splitRule' >= 1 and < 50. If splitRule = 50, 'winnerDelay' is ignored if passed + * + * @return $this + */ + public function setWinnerDelay($winnerDelay) + { + + if (!is_null($winnerDelay) && ($winnerDelay > 168)) { + throw new \InvalidArgumentException('invalid value for $winnerDelay when calling CreateEmailCampaign., must be smaller than or equal to 168.'); + } + if (!is_null($winnerDelay) && ($winnerDelay < 1)) { + throw new \InvalidArgumentException('invalid value for $winnerDelay when calling CreateEmailCampaign., must be bigger than or equal to 1.'); + } + + $this->container['winnerDelay'] = $winnerDelay; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignRecipients.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignRecipients.php new file mode 100644 index 0000000..eb83145 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignRecipients.php @@ -0,0 +1,333 @@ + 'int[]', + 'listIds' => 'int[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'exclusionListIds' => 'int64', + 'listIds' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'exclusionListIds' => 'exclusionListIds', + 'listIds' => 'listIds' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'exclusionListIds' => 'setExclusionListIds', + 'listIds' => 'setListIds' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'exclusionListIds' => 'getExclusionListIds', + 'listIds' => 'getListIds' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['exclusionListIds'] = isset($data['exclusionListIds']) ? $data['exclusionListIds'] : null; + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets exclusionListIds + * + * @return int[] + */ + public function getExclusionListIds() + { + return $this->container['exclusionListIds']; + } + + /** + * Sets exclusionListIds + * + * @param int[] $exclusionListIds List ids to exclude from the campaign + * + * @return $this + */ + public function setExclusionListIds($exclusionListIds) + { + $this->container['exclusionListIds'] = $exclusionListIds; + + return $this; + } + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds Mandatory if scheduledAt is not empty. List Ids to send the campaign to + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignSender.php new file mode 100644 index 0000000..71fe1a3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateEmailCampaignSender.php @@ -0,0 +1,339 @@ + 'string', + 'email' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Sender Name + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Sender email + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateList.php new file mode 100644 index 0000000..f3698d9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateList.php @@ -0,0 +1,344 @@ + 'string', + 'folderId' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'folderId' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'folderId' => 'folderId' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'folderId' => 'setFolderId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'folderId' => 'getFolderId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['folderId'] = isset($data['folderId']) ? $data['folderId'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['folderId'] === null) { + $invalidProperties[] = "'folderId' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['name'] === null) { + return false; + } + if ($this->container['folderId'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the list + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets folderId + * + * @return int + */ + public function getFolderId() + { + return $this->container['folderId']; + } + + /** + * Sets folderId + * + * @param int $folderId Id of the parent folder in which this list is to be created + * + * @return $this + */ + public function setFolderId($folderId) + { + $this->container['folderId'] = $folderId; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateModel.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateModel.php new file mode 100644 index 0000000..15a1cf4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateModel.php @@ -0,0 +1,308 @@ + 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the object created + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateReseller.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateReseller.php new file mode 100644 index 0000000..b384daa --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateReseller.php @@ -0,0 +1,308 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'authKey' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'authKey' => 'authKey' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'authKey' => 'setAuthKey' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'authKey' => 'getAuthKey' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['authKey'] = isset($data['authKey']) ? $data['authKey'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['authKey'] === null) { + $invalidProperties[] = "'authKey' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['authKey'] === null) { + return false; + } + return true; + } + + + /** + * Gets authKey + * + * @return string + */ + public function getAuthKey() + { + return $this->container['authKey']; + } + + /** + * Sets authKey + * + * @param string $authKey AuthKey of Reseller child created + * + * @return $this + */ + public function setAuthKey($authKey) + { + $this->container['authKey'] = $authKey; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSender.php new file mode 100644 index 0000000..87cb01e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSender.php @@ -0,0 +1,374 @@ + 'string', + 'email' => 'string', + 'ips' => '\SendinBlue\Client\Model\CreateSenderIps[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email', + 'ips' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email', + 'ips' => 'ips' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail', + 'ips' => 'setIps' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail', + 'ips' => 'getIps' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['ips'] = isset($data['ips']) ? $data['ips'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['name'] === null) { + return false; + } + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name From Name to use for the sender + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email From Email to use for the sender + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets ips + * + * @return \SendinBlue\Client\Model\CreateSenderIps[] + */ + public function getIps() + { + return $this->container['ips']; + } + + /** + * Sets ips + * + * @param \SendinBlue\Client\Model\CreateSenderIps[] $ips Mandatory in case of dedicated IP, IPs to associate to the sender + * + * @return $this + */ + public function setIps($ips) + { + $this->container['ips'] = $ips; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderIps.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderIps.php new file mode 100644 index 0000000..82b885b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderIps.php @@ -0,0 +1,396 @@ + 'string', + 'domain' => 'string', + 'weight' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'ip' => null, + 'domain' => null, + 'weight' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'ip' => 'ip', + 'domain' => 'domain', + 'weight' => 'weight' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'ip' => 'setIp', + 'domain' => 'setDomain', + 'weight' => 'setWeight' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'ip' => 'getIp', + 'domain' => 'getDomain', + 'weight' => 'getWeight' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + $this->container['domain'] = isset($data['domain']) ? $data['domain'] : null; + $this->container['weight'] = isset($data['weight']) ? $data['weight'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + if ($this->container['domain'] === null) { + $invalidProperties[] = "'domain' can't be null"; + } + if (!is_null($this->container['weight']) && ($this->container['weight'] > 100)) { + $invalidProperties[] = "invalid value for 'weight', must be smaller than or equal to 100."; + } + + if (!is_null($this->container['weight']) && ($this->container['weight'] < 1)) { + $invalidProperties[] = "invalid value for 'weight', must be bigger than or equal to 1."; + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['ip'] === null) { + return false; + } + if ($this->container['domain'] === null) { + return false; + } + if ($this->container['weight'] > 100) { + return false; + } + if ($this->container['weight'] < 1) { + return false; + } + return true; + } + + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip Dedicated IP available in your account + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + + /** + * Gets domain + * + * @return string + */ + public function getDomain() + { + return $this->container['domain']; + } + + /** + * Sets domain + * + * @param string $domain Domain of the IP + * + * @return $this + */ + public function setDomain($domain) + { + $this->container['domain'] = $domain; + + return $this; + } + + /** + * Gets weight + * + * @return int + */ + public function getWeight() + { + return $this->container['weight']; + } + + /** + * Sets weight + * + * @param int $weight Weight to apply to the IP. Sum of all IP weights must be 100. Should be passed for either ALL or NONE of the IPs. If it's not passed, the sending will be equally balanced on all IPs. + * + * @return $this + */ + public function setWeight($weight) + { + + if (!is_null($weight) && ($weight > 100)) { + throw new \InvalidArgumentException('invalid value for $weight when calling CreateSenderIps., must be smaller than or equal to 100.'); + } + if (!is_null($weight) && ($weight < 1)) { + throw new \InvalidArgumentException('invalid value for $weight when calling CreateSenderIps., must be bigger than or equal to 1.'); + } + + $this->container['weight'] = $weight; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderModel.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderModel.php new file mode 100644 index 0000000..597078b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSenderModel.php @@ -0,0 +1,368 @@ + 'int', + 'spfError' => 'bool', + 'dkimError' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'spfError' => null, + 'dkimError' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'spfError' => 'spfError', + 'dkimError' => 'dkimError' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'spfError' => 'setSpfError', + 'dkimError' => 'setDkimError' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'spfError' => 'getSpfError', + 'dkimError' => 'getDkimError' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['spfError'] = isset($data['spfError']) ? $data['spfError'] : null; + $this->container['dkimError'] = isset($data['dkimError']) ? $data['dkimError'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the Sender created + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets spfError + * + * @return bool + */ + public function getSpfError() + { + return $this->container['spfError']; + } + + /** + * Sets spfError + * + * @param bool $spfError Status of SPF configuration for the sender (true = SPF not well configured, false = SPF well configured) + * + * @return $this + */ + public function setSpfError($spfError) + { + $this->container['spfError'] = $spfError; + + return $this; + } + + /** + * Gets dkimError + * + * @return bool + */ + public function getDkimError() + { + return $this->container['dkimError']; + } + + /** + * Sets dkimError + * + * @param bool $dkimError Status of DKIM configuration for the sender (true = DKIM not well configured, false = DKIM well configured) + * + * @return $this + */ + public function setDkimError($dkimError) + { + $this->container['dkimError'] = $dkimError; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaign.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaign.php new file mode 100644 index 0000000..09502e6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaign.php @@ -0,0 +1,451 @@ + 'string', + 'sender' => 'string', + 'content' => 'string', + 'recipients' => '\SendinBlue\Client\Model\CreateSmsCampaignRecipients', + 'scheduledAt' => '\DateTime' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'sender' => null, + 'content' => null, + 'recipients' => null, + 'scheduledAt' => 'date-time' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'sender' => 'sender', + 'content' => 'content', + 'recipients' => 'recipients', + 'scheduledAt' => 'scheduledAt' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'sender' => 'setSender', + 'content' => 'setContent', + 'recipients' => 'setRecipients', + 'scheduledAt' => 'setScheduledAt' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'sender' => 'getSender', + 'content' => 'getContent', + 'recipients' => 'getRecipients', + 'scheduledAt' => 'getScheduledAt' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['content'] = isset($data['content']) ? $data['content'] : null; + $this->container['recipients'] = isset($data['recipients']) ? $data['recipients'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ((strlen($this->container['sender']) > 11)) { + $invalidProperties[] = "invalid value for 'sender', the character length must be smaller than or equal to 11."; + } + + if ($this->container['content'] === null) { + $invalidProperties[] = "'content' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['name'] === null) { + return false; + } + if ($this->container['sender'] === null) { + return false; + } + if (strlen($this->container['sender']) > 11) { + return false; + } + if ($this->container['content'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets sender + * + * @return string + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param string $sender Name of the sender. The number of characters is limited to 11 + * + * @return $this + */ + public function setSender($sender) + { + if ((strlen($sender) > 11)) { + throw new \InvalidArgumentException('invalid length for $sender when calling CreateSmsCampaign., must be smaller than or equal to 11.'); + } + + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets content + * + * @return string + */ + public function getContent() + { + return $this->container['content']; + } + + /** + * Sets content + * + * @param string $content Content of the message. The maximum characters used per SMS is 160, if used more than that, it will be counted as more than one SMS + * + * @return $this + */ + public function setContent($content) + { + $this->container['content'] = $content; + + return $this; + } + + /** + * Gets recipients + * + * @return \SendinBlue\Client\Model\CreateSmsCampaignRecipients + */ + public function getRecipients() + { + return $this->container['recipients']; + } + + /** + * Sets recipients + * + * @param \SendinBlue\Client\Model\CreateSmsCampaignRecipients $recipients recipients + * + * @return $this + */ + public function setRecipients($recipients) + { + $this->container['recipients'] = $recipients; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which the campaign has to run (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaignRecipients.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaignRecipients.php new file mode 100644 index 0000000..90b817d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmsCampaignRecipients.php @@ -0,0 +1,338 @@ + 'int[]', + 'exclusionListIds' => 'int[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'listIds' => 'int64', + 'exclusionListIds' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'listIds' => 'listIds', + 'exclusionListIds' => 'exclusionListIds' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'listIds' => 'setListIds', + 'exclusionListIds' => 'setExclusionListIds' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'listIds' => 'getListIds', + 'exclusionListIds' => 'getExclusionListIds' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + $this->container['exclusionListIds'] = isset($data['exclusionListIds']) ? $data['exclusionListIds'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['listIds'] === null) { + $invalidProperties[] = "'listIds' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['listIds'] === null) { + return false; + } + return true; + } + + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds Lists Ids to send the campaign to. REQUIRED if scheduledAt is not empty + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + + /** + * Gets exclusionListIds + * + * @return int[] + */ + public function getExclusionListIds() + { + return $this->container['exclusionListIds']; + } + + /** + * Sets exclusionListIds + * + * @param int[] $exclusionListIds List ids which have to be excluded from a campaign + * + * @return $this + */ + public function setExclusionListIds($exclusionListIds) + { + $this->container['exclusionListIds'] = $exclusionListIds; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpEmail.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpEmail.php new file mode 100644 index 0000000..63a4d01 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpEmail.php @@ -0,0 +1,308 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'messageId' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'messageId' => 'messageId' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'messageId' => 'setMessageId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'messageId' => 'getMessageId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['messageId'] = isset($data['messageId']) ? $data['messageId'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['messageId'] === null) { + $invalidProperties[] = "'messageId' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['messageId'] === null) { + return false; + } + return true; + } + + + /** + * Gets messageId + * + * @return string + */ + public function getMessageId() + { + return $this->container['messageId']; + } + + /** + * Sets messageId + * + * @param string $messageId Message ID of the SMTP Email sent + * + * @return $this + */ + public function setMessageId($messageId) + { + $this->container['messageId'] = $messageId; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplate.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplate.php new file mode 100644 index 0000000..bea4d64 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplate.php @@ -0,0 +1,590 @@ + 'string', + 'sender' => '\SendinBlue\Client\Model\CreateSmtpTemplateSender', + 'templateName' => 'string', + 'htmlContent' => 'string', + 'htmlUrl' => 'string', + 'subject' => 'string', + 'replyTo' => 'string', + 'toField' => 'string', + 'attachmentUrl' => 'string', + 'isActive' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'tag' => null, + 'sender' => null, + 'templateName' => null, + 'htmlContent' => null, + 'htmlUrl' => 'url', + 'subject' => null, + 'replyTo' => 'email', + 'toField' => null, + 'attachmentUrl' => 'url', + 'isActive' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'tag' => 'tag', + 'sender' => 'sender', + 'templateName' => 'templateName', + 'htmlContent' => 'htmlContent', + 'htmlUrl' => 'htmlUrl', + 'subject' => 'subject', + 'replyTo' => 'replyTo', + 'toField' => 'toField', + 'attachmentUrl' => 'attachmentUrl', + 'isActive' => 'isActive' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'tag' => 'setTag', + 'sender' => 'setSender', + 'templateName' => 'setTemplateName', + 'htmlContent' => 'setHtmlContent', + 'htmlUrl' => 'setHtmlUrl', + 'subject' => 'setSubject', + 'replyTo' => 'setReplyTo', + 'toField' => 'setToField', + 'attachmentUrl' => 'setAttachmentUrl', + 'isActive' => 'setIsActive' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'tag' => 'getTag', + 'sender' => 'getSender', + 'templateName' => 'getTemplateName', + 'htmlContent' => 'getHtmlContent', + 'htmlUrl' => 'getHtmlUrl', + 'subject' => 'getSubject', + 'replyTo' => 'getReplyTo', + 'toField' => 'getToField', + 'attachmentUrl' => 'getAttachmentUrl', + 'isActive' => 'getIsActive' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['templateName'] = isset($data['templateName']) ? $data['templateName'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['htmlUrl'] = isset($data['htmlUrl']) ? $data['htmlUrl'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['toField'] = isset($data['toField']) ? $data['toField'] : null; + $this->container['attachmentUrl'] = isset($data['attachmentUrl']) ? $data['attachmentUrl'] : null; + $this->container['isActive'] = isset($data['isActive']) ? $data['isActive'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ($this->container['templateName'] === null) { + $invalidProperties[] = "'templateName' can't be null"; + } + if ($this->container['subject'] === null) { + $invalidProperties[] = "'subject' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['sender'] === null) { + return false; + } + if ($this->container['templateName'] === null) { + return false; + } + if ($this->container['subject'] === null) { + return false; + } + return true; + } + + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the template + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\CreateSmtpTemplateSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\CreateSmtpTemplateSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets templateName + * + * @return string + */ + public function getTemplateName() + { + return $this->container['templateName']; + } + + /** + * Sets templateName + * + * @param string $templateName Name of the template + * + * @return $this + */ + public function setTemplateName($templateName) + { + $this->container['templateName'] = $templateName; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent Body of the message (HTML version). The field must have more than 10 characters. REQUIRED if htmlUrl is empty + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets htmlUrl + * + * @return string + */ + public function getHtmlUrl() + { + return $this->container['htmlUrl']; + } + + /** + * Sets htmlUrl + * + * @param string $htmlUrl Url which contents the body of the email message. REQUIRED if htmlContent is empty + * + * @return $this + */ + public function setHtmlUrl($htmlUrl) + { + $this->container['htmlUrl'] = $htmlUrl; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the template + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email on which campaign recipients will be able to reply to + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets toField + * + * @return string + */ + public function getToField() + { + return $this->container['toField']; + } + + /** + * Sets toField + * + * @param string $toField To personalize the «To» Field. If you want to include the first name and last name of your recipient, add `{FNAME} {LNAME}`. These contact attributes must already exist in your SendinBlue account. If input parameter 'params' used please use `{{contact.FNAME}} {{contact.LNAME}}` for personalization + * + * @return $this + */ + public function setToField($toField) + { + $this->container['toField'] = $toField; + + return $this; + } + + /** + * Gets attachmentUrl + * + * @return string + */ + public function getAttachmentUrl() + { + return $this->container['attachmentUrl']; + } + + /** + * Sets attachmentUrl + * + * @param string $attachmentUrl Absolute url of the attachment (no local file). Extension allowed: xlsx, xls, ods, docx, docm, doc, csv, pdf, txt, gif, jpg, jpeg, png, tif, tiff, rtf, bmp, cgm, css, shtml, html, htm, zip, xml, ppt, pptx, tar, ez, ics, mobi, msg, pub and eps + * + * @return $this + */ + public function setAttachmentUrl($attachmentUrl) + { + $this->container['attachmentUrl'] = $attachmentUrl; + + return $this; + } + + /** + * Gets isActive + * + * @return bool + */ + public function getIsActive() + { + return $this->container['isActive']; + } + + /** + * Sets isActive + * + * @param bool $isActive Status of template. isActive = true means template is active and isActive = false means template is inactive + * + * @return $this + */ + public function setIsActive($isActive) + { + $this->container['isActive'] = $isActive; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplateSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplateSender.php new file mode 100644 index 0000000..f4f048f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateSmtpTemplateSender.php @@ -0,0 +1,339 @@ + 'string', + 'email' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the sender. If not passed, will be set to default + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email of the sender + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateContactModel.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateContactModel.php new file mode 100644 index 0000000..9198065 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateContactModel.php @@ -0,0 +1,302 @@ + 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the contact when a new contact is created + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateFolder.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateFolder.php new file mode 100644 index 0000000..e51e62a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateUpdateFolder.php @@ -0,0 +1,302 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the folder + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateWebhook.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateWebhook.php new file mode 100644 index 0000000..21524b0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreateWebhook.php @@ -0,0 +1,486 @@ + 'string', + 'description' => 'string', + 'events' => 'string[]', + 'type' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'url' => 'url', + 'description' => null, + 'events' => null, + 'type' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'url' => 'url', + 'description' => 'description', + 'events' => 'events', + 'type' => 'type' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'url' => 'setUrl', + 'description' => 'setDescription', + 'events' => 'setEvents', + 'type' => 'setType' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'url' => 'getUrl', + 'description' => 'getDescription', + 'events' => 'getEvents', + 'type' => 'getType' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const EVENTS_HARD_BOUNCE = 'hardBounce'; + const EVENTS_SOFT_BOUNCE = 'softBounce'; + const EVENTS_BLOCKED = 'blocked'; + const EVENTS_SPAM = 'spam'; + const EVENTS_DELIVERED = 'delivered'; + const EVENTS_REQUEST = 'request'; + const EVENTS_CLICK = 'click'; + const EVENTS_INVALID = 'invalid'; + const EVENTS_DEFERRED = 'deferred'; + const EVENTS_OPENED = 'opened'; + const EVENTS_UNIQUE_OPENED = 'uniqueOpened'; + const EVENTS_UNSUBSCRIBED = 'unsubscribed'; + const EVENTS_LIST_ADDITION = 'listAddition'; + const TYPE_TRANSACTIONAL = 'transactional'; + const TYPE_MARKETING = 'marketing'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getEventsAllowableValues() + { + return [ + self::EVENTS_HARD_BOUNCE, + self::EVENTS_SOFT_BOUNCE, + self::EVENTS_BLOCKED, + self::EVENTS_SPAM, + self::EVENTS_DELIVERED, + self::EVENTS_REQUEST, + self::EVENTS_CLICK, + self::EVENTS_INVALID, + self::EVENTS_DEFERRED, + self::EVENTS_OPENED, + self::EVENTS_UNIQUE_OPENED, + self::EVENTS_UNSUBSCRIBED, + self::EVENTS_LIST_ADDITION, + ]; + } + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_TRANSACTIONAL, + self::TYPE_MARKETING, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['url'] = isset($data['url']) ? $data['url'] : null; + $this->container['description'] = isset($data['description']) ? $data['description'] : null; + $this->container['events'] = isset($data['events']) ? $data['events'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : 'transactional'; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['url'] === null) { + $invalidProperties[] = "'url' can't be null"; + } + if ($this->container['events'] === null) { + $invalidProperties[] = "'events' can't be null"; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['url'] === null) { + return false; + } + if ($this->container['events'] === null) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets url + * + * @return string + */ + public function getUrl() + { + return $this->container['url']; + } + + /** + * Sets url + * + * @param string $url URL of the webhook + * + * @return $this + */ + public function setUrl($url) + { + $this->container['url'] = $url; + + return $this; + } + + /** + * Gets description + * + * @return string + */ + public function getDescription() + { + return $this->container['description']; + } + + /** + * Sets description + * + * @param string $description Description of the webhook + * + * @return $this + */ + public function setDescription($description) + { + $this->container['description'] = $description; + + return $this; + } + + /** + * Gets events + * + * @return string[] + */ + public function getEvents() + { + return $this->container['events']; + } + + /** + * Sets events + * + * @param string[] $events Events triggering the webhook. Possible values for Transactional type webhook – request, delivered, hardBounce, softBounce, blocked, spam, invalid, deferred, click, opened, uniqueOpened and unsubscribed and possible values for Marketing type webhook – spam, opened, click, hardBounce, softBounce, unsubscribed, listAddition & delivered + * + * @return $this + */ + public function setEvents($events) + { + $allowedValues = $this->getEventsAllowableValues(); + if (array_diff($events, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'events', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['events'] = $events; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of the webhook + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!is_null($type) && !in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreatedProcessId.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreatedProcessId.php new file mode 100644 index 0000000..dcf6ecf --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/CreatedProcessId.php @@ -0,0 +1,308 @@ + 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'processId' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'processId' => 'processId' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'processId' => 'setProcessId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'processId' => 'getProcessId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['processId'] = isset($data['processId']) ? $data['processId'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['processId'] === null) { + $invalidProperties[] = "'processId' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['processId'] === null) { + return false; + } + return true; + } + + + /** + * Gets processId + * + * @return int + */ + public function getProcessId() + { + return $this->container['processId']; + } + + /** + * Sets processId + * + * @param int $processId Id of the process created + * + * @return $this + */ + public function setProcessId($processId) + { + $this->container['processId'] = $processId; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/DeleteHardbounces.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/DeleteHardbounces.php new file mode 100644 index 0000000..5b87d5e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/DeleteHardbounces.php @@ -0,0 +1,362 @@ + 'string', + 'endDate' => 'string', + 'contactEmail' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'startDate' => null, + 'endDate' => null, + 'contactEmail' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'startDate' => 'startDate', + 'endDate' => 'endDate', + 'contactEmail' => 'contactEmail' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'startDate' => 'setStartDate', + 'endDate' => 'setEndDate', + 'contactEmail' => 'setContactEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'startDate' => 'getStartDate', + 'endDate' => 'getEndDate', + 'contactEmail' => 'getContactEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['startDate'] = isset($data['startDate']) ? $data['startDate'] : null; + $this->container['endDate'] = isset($data['endDate']) ? $data['endDate'] : null; + $this->container['contactEmail'] = isset($data['contactEmail']) ? $data['contactEmail'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets startDate + * + * @return string + */ + public function getStartDate() + { + return $this->container['startDate']; + } + + /** + * Sets startDate + * + * @param string $startDate Starting date (YYYY-MM-DD) of the time period for deletion. The hardbounces occurred after this date will be deleted. Must be less than or equal to the endDate + * + * @return $this + */ + public function setStartDate($startDate) + { + $this->container['startDate'] = $startDate; + + return $this; + } + + /** + * Gets endDate + * + * @return string + */ + public function getEndDate() + { + return $this->container['endDate']; + } + + /** + * Sets endDate + * + * @param string $endDate Ending date (YYYY-MM-DD) of the time period for deletion. The hardbounces until this date will be deleted. Must be greater than or equal to the startDate + * + * @return $this + */ + public function setEndDate($endDate) + { + $this->container['endDate'] = $endDate; + + return $this; + } + + /** + * Gets contactEmail + * + * @return string + */ + public function getContactEmail() + { + return $this->container['contactEmail']; + } + + /** + * Sets contactEmail + * + * @param string $contactEmail Target a specific email address + * + * @return $this + */ + public function setContactEmail($contactEmail) + { + $this->container['contactEmail'] = $contactEmail; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/EmailExportRecipients.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/EmailExportRecipients.php new file mode 100644 index 0000000..f092a17 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/EmailExportRecipients.php @@ -0,0 +1,386 @@ + 'string', + 'recipientsType' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'notifyURL' => 'url', + 'recipientsType' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'notifyURL' => 'notifyURL', + 'recipientsType' => 'recipientsType' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'notifyURL' => 'setNotifyURL', + 'recipientsType' => 'setRecipientsType' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'notifyURL' => 'getNotifyURL', + 'recipientsType' => 'getRecipientsType' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const RECIPIENTS_TYPE_ALL = 'all'; + const RECIPIENTS_TYPE_NON_CLICKERS = 'nonClickers'; + const RECIPIENTS_TYPE_NON_OPENERS = 'nonOpeners'; + const RECIPIENTS_TYPE_CLICKERS = 'clickers'; + const RECIPIENTS_TYPE_OPENERS = 'openers'; + const RECIPIENTS_TYPE_SOFT_BOUNCES = 'softBounces'; + const RECIPIENTS_TYPE_HARD_BOUNCES = 'hardBounces'; + const RECIPIENTS_TYPE_UNSUBSCRIBED = 'unsubscribed'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getRecipientsTypeAllowableValues() + { + return [ + self::RECIPIENTS_TYPE_ALL, + self::RECIPIENTS_TYPE_NON_CLICKERS, + self::RECIPIENTS_TYPE_NON_OPENERS, + self::RECIPIENTS_TYPE_CLICKERS, + self::RECIPIENTS_TYPE_OPENERS, + self::RECIPIENTS_TYPE_SOFT_BOUNCES, + self::RECIPIENTS_TYPE_HARD_BOUNCES, + self::RECIPIENTS_TYPE_UNSUBSCRIBED, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['notifyURL'] = isset($data['notifyURL']) ? $data['notifyURL'] : null; + $this->container['recipientsType'] = isset($data['recipientsType']) ? $data['recipientsType'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['recipientsType'] === null) { + $invalidProperties[] = "'recipientsType' can't be null"; + } + $allowedValues = $this->getRecipientsTypeAllowableValues(); + if (!in_array($this->container['recipientsType'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'recipientsType', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['recipientsType'] === null) { + return false; + } + $allowedValues = $this->getRecipientsTypeAllowableValues(); + if (!in_array($this->container['recipientsType'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets notifyURL + * + * @return string + */ + public function getNotifyURL() + { + return $this->container['notifyURL']; + } + + /** + * Sets notifyURL + * + * @param string $notifyURL Webhook called once the export process is finished + * + * @return $this + */ + public function setNotifyURL($notifyURL) + { + $this->container['notifyURL'] = $notifyURL; + + return $this; + } + + /** + * Gets recipientsType + * + * @return string + */ + public function getRecipientsType() + { + return $this->container['recipientsType']; + } + + /** + * Sets recipientsType + * + * @param string $recipientsType Type of recipients to export for a campaign + * + * @return $this + */ + public function setRecipientsType($recipientsType) + { + $allowedValues = $this->getRecipientsTypeAllowableValues(); + if (!in_array($recipientsType, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'recipientsType', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['recipientsType'] = $recipientsType; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ErrorModel.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ErrorModel.php new file mode 100644 index 0000000..4c98fb5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ErrorModel.php @@ -0,0 +1,406 @@ + 'string', + 'message' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'code' => null, + 'message' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'code' => 'code', + 'message' => 'message' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'code' => 'setCode', + 'message' => 'setMessage' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'code' => 'getCode', + 'message' => 'getMessage' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const CODE_INVALID_PARAMETER = 'invalid_parameter'; + const CODE_MISSING_PARAMETER = 'missing_parameter'; + const CODE_OUT_OF_RANGE = 'out_of_range'; + const CODE_CAMPAIGN_PROCESSING = 'campaign_processing'; + const CODE_CAMPAIGN_SENT = 'campaign_sent'; + const CODE_DOCUMENT_NOT_FOUND = 'document_not_found'; + const CODE_RESELLER_PERMISSION_DENIED = 'reseller_permission_denied'; + const CODE_NOT_ENOUGH_CREDITS = 'not_enough_credits'; + const CODE_PERMISSION_DENIED = 'permission_denied'; + const CODE_DUPLICATE_PARAMETER = 'duplicate_parameter'; + const CODE_DUPLICATE_REQUEST = 'duplicate_request'; + const CODE_METHOD_NOT_ALLOWED = 'method_not_allowed'; + const CODE_UNAUTHORIZED = 'unauthorized'; + const CODE_ACCOUNT_UNDER_VALIDATION = 'account_under_validation'; + const CODE_NOT_ACCEPTABLE = 'not_acceptable'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getCodeAllowableValues() + { + return [ + self::CODE_INVALID_PARAMETER, + self::CODE_MISSING_PARAMETER, + self::CODE_OUT_OF_RANGE, + self::CODE_CAMPAIGN_PROCESSING, + self::CODE_CAMPAIGN_SENT, + self::CODE_DOCUMENT_NOT_FOUND, + self::CODE_RESELLER_PERMISSION_DENIED, + self::CODE_NOT_ENOUGH_CREDITS, + self::CODE_PERMISSION_DENIED, + self::CODE_DUPLICATE_PARAMETER, + self::CODE_DUPLICATE_REQUEST, + self::CODE_METHOD_NOT_ALLOWED, + self::CODE_UNAUTHORIZED, + self::CODE_ACCOUNT_UNDER_VALIDATION, + self::CODE_NOT_ACCEPTABLE, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['code'] = isset($data['code']) ? $data['code'] : null; + $this->container['message'] = isset($data['message']) ? $data['message'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['code'] === null) { + $invalidProperties[] = "'code' can't be null"; + } + $allowedValues = $this->getCodeAllowableValues(); + if (!in_array($this->container['code'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'code', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['message'] === null) { + $invalidProperties[] = "'message' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['code'] === null) { + return false; + } + $allowedValues = $this->getCodeAllowableValues(); + if (!in_array($this->container['code'], $allowedValues)) { + return false; + } + if ($this->container['message'] === null) { + return false; + } + return true; + } + + + /** + * Gets code + * + * @return string + */ + public function getCode() + { + return $this->container['code']; + } + + /** + * Sets code + * + * @param string $code Error code displayed in case of a failure + * + * @return $this + */ + public function setCode($code) + { + $allowedValues = $this->getCodeAllowableValues(); + if (!in_array($code, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'code', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['code'] = $code; + + return $this; + } + + /** + * Gets message + * + * @return string + */ + public function getMessage() + { + return $this->container['message']; + } + + /** + * Sets message + * + * @param string $message Readable message associated to the failure + * + * @return $this + */ + public function setMessage($message) + { + $this->container['message'] = $message; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccount.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccount.php new file mode 100644 index 0000000..cb9dd7a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccount.php @@ -0,0 +1,554 @@ + 'string', + 'firstName' => 'string', + 'lastName' => 'string', + 'companyName' => 'string', + 'address' => '\SendinBlue\Client\Model\GetExtendedClientAddress', + 'plan' => '\SendinBlue\Client\Model\GetAccountPlan[]', + 'relay' => '\SendinBlue\Client\Model\GetAccountRelay', + 'marketingAutomation' => '\SendinBlue\Client\Model\GetAccountMarketingAutomation' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'firstName' => null, + 'lastName' => null, + 'companyName' => null, + 'address' => null, + 'plan' => null, + 'relay' => null, + 'marketingAutomation' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'firstName' => 'firstName', + 'lastName' => 'lastName', + 'companyName' => 'companyName', + 'address' => 'address', + 'plan' => 'plan', + 'relay' => 'relay', + 'marketingAutomation' => 'marketingAutomation' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'firstName' => 'setFirstName', + 'lastName' => 'setLastName', + 'companyName' => 'setCompanyName', + 'address' => 'setAddress', + 'plan' => 'setPlan', + 'relay' => 'setRelay', + 'marketingAutomation' => 'setMarketingAutomation' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'firstName' => 'getFirstName', + 'lastName' => 'getLastName', + 'companyName' => 'getCompanyName', + 'address' => 'getAddress', + 'plan' => 'getPlan', + 'relay' => 'getRelay', + 'marketingAutomation' => 'getMarketingAutomation' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['firstName'] = isset($data['firstName']) ? $data['firstName'] : null; + $this->container['lastName'] = isset($data['lastName']) ? $data['lastName'] : null; + $this->container['companyName'] = isset($data['companyName']) ? $data['companyName'] : null; + $this->container['address'] = isset($data['address']) ? $data['address'] : null; + $this->container['plan'] = isset($data['plan']) ? $data['plan'] : null; + $this->container['relay'] = isset($data['relay']) ? $data['relay'] : null; + $this->container['marketingAutomation'] = isset($data['marketingAutomation']) ? $data['marketingAutomation'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['firstName'] === null) { + $invalidProperties[] = "'firstName' can't be null"; + } + if ($this->container['lastName'] === null) { + $invalidProperties[] = "'lastName' can't be null"; + } + if ($this->container['companyName'] === null) { + $invalidProperties[] = "'companyName' can't be null"; + } + if ($this->container['address'] === null) { + $invalidProperties[] = "'address' can't be null"; + } + if ($this->container['plan'] === null) { + $invalidProperties[] = "'plan' can't be null"; + } + if ($this->container['relay'] === null) { + $invalidProperties[] = "'relay' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['firstName'] === null) { + return false; + } + if ($this->container['lastName'] === null) { + return false; + } + if ($this->container['companyName'] === null) { + return false; + } + if ($this->container['address'] === null) { + return false; + } + if ($this->container['plan'] === null) { + return false; + } + if ($this->container['relay'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Login Email + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets firstName + * + * @return string + */ + public function getFirstName() + { + return $this->container['firstName']; + } + + /** + * Sets firstName + * + * @param string $firstName First Name + * + * @return $this + */ + public function setFirstName($firstName) + { + $this->container['firstName'] = $firstName; + + return $this; + } + + /** + * Gets lastName + * + * @return string + */ + public function getLastName() + { + return $this->container['lastName']; + } + + /** + * Sets lastName + * + * @param string $lastName Last Name + * + * @return $this + */ + public function setLastName($lastName) + { + $this->container['lastName'] = $lastName; + + return $this; + } + + /** + * Gets companyName + * + * @return string + */ + public function getCompanyName() + { + return $this->container['companyName']; + } + + /** + * Sets companyName + * + * @param string $companyName Name of the company + * + * @return $this + */ + public function setCompanyName($companyName) + { + $this->container['companyName'] = $companyName; + + return $this; + } + + /** + * Gets address + * + * @return \SendinBlue\Client\Model\GetExtendedClientAddress + */ + public function getAddress() + { + return $this->container['address']; + } + + /** + * Sets address + * + * @param \SendinBlue\Client\Model\GetExtendedClientAddress $address address + * + * @return $this + */ + public function setAddress($address) + { + $this->container['address'] = $address; + + return $this; + } + + /** + * Gets plan + * + * @return \SendinBlue\Client\Model\GetAccountPlan[] + */ + public function getPlan() + { + return $this->container['plan']; + } + + /** + * Sets plan + * + * @param \SendinBlue\Client\Model\GetAccountPlan[] $plan Information about your plans and credits + * + * @return $this + */ + public function setPlan($plan) + { + $this->container['plan'] = $plan; + + return $this; + } + + /** + * Gets relay + * + * @return \SendinBlue\Client\Model\GetAccountRelay + */ + public function getRelay() + { + return $this->container['relay']; + } + + /** + * Sets relay + * + * @param \SendinBlue\Client\Model\GetAccountRelay $relay relay + * + * @return $this + */ + public function setRelay($relay) + { + $this->container['relay'] = $relay; + + return $this; + } + + /** + * Gets marketingAutomation + * + * @return \SendinBlue\Client\Model\GetAccountMarketingAutomation + */ + public function getMarketingAutomation() + { + return $this->container['marketingAutomation']; + } + + /** + * Sets marketingAutomation + * + * @param \SendinBlue\Client\Model\GetAccountMarketingAutomation $marketingAutomation marketingAutomation + * + * @return $this + */ + public function setMarketingAutomation($marketingAutomation) + { + $this->container['marketingAutomation'] = $marketingAutomation; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountMarketingAutomation.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountMarketingAutomation.php new file mode 100644 index 0000000..a5721b2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountMarketingAutomation.php @@ -0,0 +1,338 @@ + 'string', + 'enabled' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'key' => null, + 'enabled' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'key' => 'key', + 'enabled' => 'enabled' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'key' => 'setKey', + 'enabled' => 'setEnabled' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'key' => 'getKey', + 'enabled' => 'getEnabled' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['key'] = isset($data['key']) ? $data['key'] : null; + $this->container['enabled'] = isset($data['enabled']) ? $data['enabled'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['enabled'] === null) { + $invalidProperties[] = "'enabled' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['enabled'] === null) { + return false; + } + return true; + } + + + /** + * Gets key + * + * @return string + */ + public function getKey() + { + return $this->container['key']; + } + + /** + * Sets key + * + * @param string $key Marketing Automation Tracker ID + * + * @return $this + */ + public function setKey($key) + { + $this->container['key'] = $key; + + return $this; + } + + /** + * Gets enabled + * + * @return bool + */ + public function getEnabled() + { + return $this->container['enabled']; + } + + /** + * Sets enabled + * + * @param bool $enabled Status of Marketing Automation Plateform activation for your account (true=enabled, false=disabled) + * + * @return $this + */ + public function setEnabled($enabled) + { + $this->container['enabled'] = $enabled; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountPlan.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountPlan.php new file mode 100644 index 0000000..df25b78 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountPlan.php @@ -0,0 +1,546 @@ + 'string', + 'creditsType' => 'string', + 'credits' => 'float', + 'startDate' => '\DateTime', + 'endDate' => '\DateTime', + 'userLimit' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'type' => null, + 'creditsType' => null, + 'credits' => 'float', + 'startDate' => 'date', + 'endDate' => 'date', + 'userLimit' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'type' => 'type', + 'creditsType' => 'creditsType', + 'credits' => 'credits', + 'startDate' => 'startDate', + 'endDate' => 'endDate', + 'userLimit' => 'userLimit' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'type' => 'setType', + 'creditsType' => 'setCreditsType', + 'credits' => 'setCredits', + 'startDate' => 'setStartDate', + 'endDate' => 'setEndDate', + 'userLimit' => 'setUserLimit' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'type' => 'getType', + 'creditsType' => 'getCreditsType', + 'credits' => 'getCredits', + 'startDate' => 'getStartDate', + 'endDate' => 'getEndDate', + 'userLimit' => 'getUserLimit' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const TYPE_PAY_AS_YOU_GO = 'payAsYouGo'; + const TYPE_FREE = 'free'; + const TYPE_SUBSCRIPTION = 'subscription'; + const TYPE_SMS = 'sms'; + const TYPE_RESELLER = 'reseller'; + const CREDITS_TYPE_SEND_LIMIT = 'sendLimit'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_PAY_AS_YOU_GO, + self::TYPE_FREE, + self::TYPE_SUBSCRIPTION, + self::TYPE_SMS, + self::TYPE_RESELLER, + ]; + } + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getCreditsTypeAllowableValues() + { + return [ + self::CREDITS_TYPE_SEND_LIMIT, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['type'] = isset($data['type']) ? $data['type'] : null; + $this->container['creditsType'] = isset($data['creditsType']) ? $data['creditsType'] : null; + $this->container['credits'] = isset($data['credits']) ? $data['credits'] : null; + $this->container['startDate'] = isset($data['startDate']) ? $data['startDate'] : null; + $this->container['endDate'] = isset($data['endDate']) ? $data['endDate'] : null; + $this->container['userLimit'] = isset($data['userLimit']) ? $data['userLimit'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['type'] === null) { + $invalidProperties[] = "'type' can't be null"; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['creditsType'] === null) { + $invalidProperties[] = "'creditsType' can't be null"; + } + $allowedValues = $this->getCreditsTypeAllowableValues(); + if (!in_array($this->container['creditsType'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'creditsType', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['credits'] === null) { + $invalidProperties[] = "'credits' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['type'] === null) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + if ($this->container['creditsType'] === null) { + return false; + } + $allowedValues = $this->getCreditsTypeAllowableValues(); + if (!in_array($this->container['creditsType'], $allowedValues)) { + return false; + } + if ($this->container['credits'] === null) { + return false; + } + return true; + } + + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Displays the plan type of the user + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + + /** + * Gets creditsType + * + * @return string + */ + public function getCreditsType() + { + return $this->container['creditsType']; + } + + /** + * Sets creditsType + * + * @param string $creditsType This is the type of the credit, \"Send Limit\" is one of the possible types of credit of a user. \"Send Limit\" implies the total number of emails you can send to the subscribers in your account. + * + * @return $this + */ + public function setCreditsType($creditsType) + { + $allowedValues = $this->getCreditsTypeAllowableValues(); + if (!in_array($creditsType, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'creditsType', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['creditsType'] = $creditsType; + + return $this; + } + + /** + * Gets credits + * + * @return float + */ + public function getCredits() + { + return $this->container['credits']; + } + + /** + * Sets credits + * + * @param float $credits Remaining credits of the user + * + * @return $this + */ + public function setCredits($credits) + { + $this->container['credits'] = $credits; + + return $this; + } + + /** + * Gets startDate + * + * @return \DateTime + */ + public function getStartDate() + { + return $this->container['startDate']; + } + + /** + * Sets startDate + * + * @param \DateTime $startDate Date of the period from which the plan will start (only available for \"subscription\" and \"reseller\" plan type) + * + * @return $this + */ + public function setStartDate($startDate) + { + $this->container['startDate'] = $startDate; + + return $this; + } + + /** + * Gets endDate + * + * @return \DateTime + */ + public function getEndDate() + { + return $this->container['endDate']; + } + + /** + * Sets endDate + * + * @param \DateTime $endDate Date of the period from which the plan will end (only available for \"subscription\" and \"reseller\" plan type) + * + * @return $this + */ + public function setEndDate($endDate) + { + $this->container['endDate'] = $endDate; + + return $this; + } + + /** + * Gets userLimit + * + * @return int + */ + public function getUserLimit() + { + return $this->container['userLimit']; + } + + /** + * Sets userLimit + * + * @param int $userLimit Only in case of reseller account. It implies the total number of child accounts you can add to your account. + * + * @return $this + */ + public function setUserLimit($userLimit) + { + $this->container['userLimit'] = $userLimit; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelay.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelay.php new file mode 100644 index 0000000..61ae084 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelay.php @@ -0,0 +1,345 @@ + 'bool', + 'data' => '\SendinBlue\Client\Model\GetAccountRelayData' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'enabled' => null, + 'data' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'enabled' => 'enabled', + 'data' => 'data' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'enabled' => 'setEnabled', + 'data' => 'setData' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'enabled' => 'getEnabled', + 'data' => 'getData' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['enabled'] = isset($data['enabled']) ? $data['enabled'] : null; + $this->container['data'] = isset($data['data']) ? $data['data'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['enabled'] === null) { + $invalidProperties[] = "'enabled' can't be null"; + } + if ($this->container['data'] === null) { + $invalidProperties[] = "'data' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['enabled'] === null) { + return false; + } + if ($this->container['data'] === null) { + return false; + } + return true; + } + + + /** + * Gets enabled + * + * @return bool + */ + public function getEnabled() + { + return $this->container['enabled']; + } + + /** + * Sets enabled + * + * @param bool $enabled Status of your SMTP Account (true=Enabled, false=Disabled) + * + * @return $this + */ + public function setEnabled($enabled) + { + $this->container['enabled'] = $enabled; + + return $this; + } + + /** + * Gets data + * + * @return \SendinBlue\Client\Model\GetAccountRelayData + */ + public function getData() + { + return $this->container['data']; + } + + /** + * Sets data + * + * @param \SendinBlue\Client\Model\GetAccountRelayData $data data + * + * @return $this + */ + public function setData($data) + { + $this->container['data'] = $data; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelayData.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelayData.php new file mode 100644 index 0000000..07beaf0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAccountRelayData.php @@ -0,0 +1,381 @@ + 'string', + 'relay' => 'string', + 'port' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'userName' => 'email', + 'relay' => null, + 'port' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'userName' => 'userName', + 'relay' => 'relay', + 'port' => 'port' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'userName' => 'setUserName', + 'relay' => 'setRelay', + 'port' => 'setPort' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'userName' => 'getUserName', + 'relay' => 'getRelay', + 'port' => 'getPort' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['userName'] = isset($data['userName']) ? $data['userName'] : null; + $this->container['relay'] = isset($data['relay']) ? $data['relay'] : null; + $this->container['port'] = isset($data['port']) ? $data['port'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['userName'] === null) { + $invalidProperties[] = "'userName' can't be null"; + } + if ($this->container['relay'] === null) { + $invalidProperties[] = "'relay' can't be null"; + } + if ($this->container['port'] === null) { + $invalidProperties[] = "'port' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['userName'] === null) { + return false; + } + if ($this->container['relay'] === null) { + return false; + } + if ($this->container['port'] === null) { + return false; + } + return true; + } + + + /** + * Gets userName + * + * @return string + */ + public function getUserName() + { + return $this->container['userName']; + } + + /** + * Sets userName + * + * @param string $userName Email to use as login on SMTP + * + * @return $this + */ + public function setUserName($userName) + { + $this->container['userName'] = $userName; + + return $this; + } + + /** + * Gets relay + * + * @return string + */ + public function getRelay() + { + return $this->container['relay']; + } + + /** + * Sets relay + * + * @param string $relay URL of the SMTP Relay + * + * @return $this + */ + public function setRelay($relay) + { + $this->container['relay'] = $relay; + + return $this; + } + + /** + * Gets port + * + * @return int + */ + public function getPort() + { + return $this->container['port']; + } + + /** + * Sets port + * + * @param int $port Port used for SMTP Relay + * + * @return $this + */ + public function setPort($port) + { + $this->container['port'] = $port; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAggregatedReport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAggregatedReport.php new file mode 100644 index 0000000..7bae834 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAggregatedReport.php @@ -0,0 +1,740 @@ + 'string', + 'requests' => 'int', + 'delivered' => 'int', + 'hardBounces' => 'int', + 'softBounces' => 'int', + 'clicks' => 'int', + 'uniqueClicks' => 'int', + 'opens' => 'int', + 'uniqueOpens' => 'int', + 'spamReports' => 'int', + 'blocked' => 'int', + 'invalid' => 'int', + 'unsubscribed' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'range' => null, + 'requests' => 'int64', + 'delivered' => 'int64', + 'hardBounces' => 'int64', + 'softBounces' => 'int64', + 'clicks' => 'int64', + 'uniqueClicks' => 'int64', + 'opens' => 'int64', + 'uniqueOpens' => 'int64', + 'spamReports' => 'int64', + 'blocked' => 'int64', + 'invalid' => 'int64', + 'unsubscribed' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'range' => 'range', + 'requests' => 'requests', + 'delivered' => 'delivered', + 'hardBounces' => 'hardBounces', + 'softBounces' => 'softBounces', + 'clicks' => 'clicks', + 'uniqueClicks' => 'uniqueClicks', + 'opens' => 'opens', + 'uniqueOpens' => 'uniqueOpens', + 'spamReports' => 'spamReports', + 'blocked' => 'blocked', + 'invalid' => 'invalid', + 'unsubscribed' => 'unsubscribed' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'range' => 'setRange', + 'requests' => 'setRequests', + 'delivered' => 'setDelivered', + 'hardBounces' => 'setHardBounces', + 'softBounces' => 'setSoftBounces', + 'clicks' => 'setClicks', + 'uniqueClicks' => 'setUniqueClicks', + 'opens' => 'setOpens', + 'uniqueOpens' => 'setUniqueOpens', + 'spamReports' => 'setSpamReports', + 'blocked' => 'setBlocked', + 'invalid' => 'setInvalid', + 'unsubscribed' => 'setUnsubscribed' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'range' => 'getRange', + 'requests' => 'getRequests', + 'delivered' => 'getDelivered', + 'hardBounces' => 'getHardBounces', + 'softBounces' => 'getSoftBounces', + 'clicks' => 'getClicks', + 'uniqueClicks' => 'getUniqueClicks', + 'opens' => 'getOpens', + 'uniqueOpens' => 'getUniqueOpens', + 'spamReports' => 'getSpamReports', + 'blocked' => 'getBlocked', + 'invalid' => 'getInvalid', + 'unsubscribed' => 'getUnsubscribed' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['range'] = isset($data['range']) ? $data['range'] : null; + $this->container['requests'] = isset($data['requests']) ? $data['requests'] : null; + $this->container['delivered'] = isset($data['delivered']) ? $data['delivered'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['clicks'] = isset($data['clicks']) ? $data['clicks'] : null; + $this->container['uniqueClicks'] = isset($data['uniqueClicks']) ? $data['uniqueClicks'] : null; + $this->container['opens'] = isset($data['opens']) ? $data['opens'] : null; + $this->container['uniqueOpens'] = isset($data['uniqueOpens']) ? $data['uniqueOpens'] : null; + $this->container['spamReports'] = isset($data['spamReports']) ? $data['spamReports'] : null; + $this->container['blocked'] = isset($data['blocked']) ? $data['blocked'] : null; + $this->container['invalid'] = isset($data['invalid']) ? $data['invalid'] : null; + $this->container['unsubscribed'] = isset($data['unsubscribed']) ? $data['unsubscribed'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['range'] === null) { + $invalidProperties[] = "'range' can't be null"; + } + if ($this->container['requests'] === null) { + $invalidProperties[] = "'requests' can't be null"; + } + if ($this->container['delivered'] === null) { + $invalidProperties[] = "'delivered' can't be null"; + } + if ($this->container['hardBounces'] === null) { + $invalidProperties[] = "'hardBounces' can't be null"; + } + if ($this->container['softBounces'] === null) { + $invalidProperties[] = "'softBounces' can't be null"; + } + if ($this->container['clicks'] === null) { + $invalidProperties[] = "'clicks' can't be null"; + } + if ($this->container['uniqueClicks'] === null) { + $invalidProperties[] = "'uniqueClicks' can't be null"; + } + if ($this->container['opens'] === null) { + $invalidProperties[] = "'opens' can't be null"; + } + if ($this->container['uniqueOpens'] === null) { + $invalidProperties[] = "'uniqueOpens' can't be null"; + } + if ($this->container['spamReports'] === null) { + $invalidProperties[] = "'spamReports' can't be null"; + } + if ($this->container['blocked'] === null) { + $invalidProperties[] = "'blocked' can't be null"; + } + if ($this->container['invalid'] === null) { + $invalidProperties[] = "'invalid' can't be null"; + } + if ($this->container['unsubscribed'] === null) { + $invalidProperties[] = "'unsubscribed' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['range'] === null) { + return false; + } + if ($this->container['requests'] === null) { + return false; + } + if ($this->container['delivered'] === null) { + return false; + } + if ($this->container['hardBounces'] === null) { + return false; + } + if ($this->container['softBounces'] === null) { + return false; + } + if ($this->container['clicks'] === null) { + return false; + } + if ($this->container['uniqueClicks'] === null) { + return false; + } + if ($this->container['opens'] === null) { + return false; + } + if ($this->container['uniqueOpens'] === null) { + return false; + } + if ($this->container['spamReports'] === null) { + return false; + } + if ($this->container['blocked'] === null) { + return false; + } + if ($this->container['invalid'] === null) { + return false; + } + if ($this->container['unsubscribed'] === null) { + return false; + } + return true; + } + + + /** + * Gets range + * + * @return string + */ + public function getRange() + { + return $this->container['range']; + } + + /** + * Sets range + * + * @param string $range Time frame of the report + * + * @return $this + */ + public function setRange($range) + { + $this->container['range'] = $range; + + return $this; + } + + /** + * Gets requests + * + * @return int + */ + public function getRequests() + { + return $this->container['requests']; + } + + /** + * Sets requests + * + * @param int $requests Number of requests for the timeframe + * + * @return $this + */ + public function setRequests($requests) + { + $this->container['requests'] = $requests; + + return $this; + } + + /** + * Gets delivered + * + * @return int + */ + public function getDelivered() + { + return $this->container['delivered']; + } + + /** + * Sets delivered + * + * @param int $delivered Number of delivered emails for the timeframe + * + * @return $this + */ + public function setDelivered($delivered) + { + $this->container['delivered'] = $delivered; + + return $this; + } + + /** + * Gets hardBounces + * + * @return int + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param int $hardBounces Number of hardbounces for the timeframe + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets softBounces + * + * @return int + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param int $softBounces Number of softbounces for the timeframe + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets clicks + * + * @return int + */ + public function getClicks() + { + return $this->container['clicks']; + } + + /** + * Sets clicks + * + * @param int $clicks Number of clicks for the timeframe + * + * @return $this + */ + public function setClicks($clicks) + { + $this->container['clicks'] = $clicks; + + return $this; + } + + /** + * Gets uniqueClicks + * + * @return int + */ + public function getUniqueClicks() + { + return $this->container['uniqueClicks']; + } + + /** + * Sets uniqueClicks + * + * @param int $uniqueClicks Number of unique clicks for the timeframe + * + * @return $this + */ + public function setUniqueClicks($uniqueClicks) + { + $this->container['uniqueClicks'] = $uniqueClicks; + + return $this; + } + + /** + * Gets opens + * + * @return int + */ + public function getOpens() + { + return $this->container['opens']; + } + + /** + * Sets opens + * + * @param int $opens Number of openings for the timeframe + * + * @return $this + */ + public function setOpens($opens) + { + $this->container['opens'] = $opens; + + return $this; + } + + /** + * Gets uniqueOpens + * + * @return int + */ + public function getUniqueOpens() + { + return $this->container['uniqueOpens']; + } + + /** + * Sets uniqueOpens + * + * @param int $uniqueOpens Number of unique openings for the timeframe + * + * @return $this + */ + public function setUniqueOpens($uniqueOpens) + { + $this->container['uniqueOpens'] = $uniqueOpens; + + return $this; + } + + /** + * Gets spamReports + * + * @return int + */ + public function getSpamReports() + { + return $this->container['spamReports']; + } + + /** + * Sets spamReports + * + * @param int $spamReports Number of complaint (spam report) for the timeframe + * + * @return $this + */ + public function setSpamReports($spamReports) + { + $this->container['spamReports'] = $spamReports; + + return $this; + } + + /** + * Gets blocked + * + * @return int + */ + public function getBlocked() + { + return $this->container['blocked']; + } + + /** + * Sets blocked + * + * @param int $blocked Number of blocked contact emails for the timeframe + * + * @return $this + */ + public function setBlocked($blocked) + { + $this->container['blocked'] = $blocked; + + return $this; + } + + /** + * Gets invalid + * + * @return int + */ + public function getInvalid() + { + return $this->container['invalid']; + } + + /** + * Sets invalid + * + * @param int $invalid Number of invalid emails for the timeframe + * + * @return $this + */ + public function setInvalid($invalid) + { + $this->container['invalid'] = $invalid; + + return $this; + } + + /** + * Gets unsubscribed + * + * @return int + */ + public function getUnsubscribed() + { + return $this->container['unsubscribed']; + } + + /** + * Sets unsubscribed + * + * @param int $unsubscribed Number of unsubscribed emails for the timeframe + * + * @return $this + */ + public function setUnsubscribed($unsubscribed) + { + $this->container['unsubscribed'] = $unsubscribed; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributes.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributes.php new file mode 100644 index 0000000..1cfc845 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributes.php @@ -0,0 +1,308 @@ + '\SendinBlue\Client\Model\GetAttributesAttributes[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'attributes' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'attributes' => 'attributes' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'attributes' => 'setAttributes' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'attributes' => 'getAttributes' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['attributes'] = isset($data['attributes']) ? $data['attributes'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['attributes'] === null) { + $invalidProperties[] = "'attributes' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['attributes'] === null) { + return false; + } + return true; + } + + + /** + * Gets attributes + * + * @return \SendinBlue\Client\Model\GetAttributesAttributes[] + */ + public function getAttributes() + { + return $this->container['attributes']; + } + + /** + * Sets attributes + * + * @param \SendinBlue\Client\Model\GetAttributesAttributes[] $attributes Listing of available contact attributes in your account + * + * @return $this + */ + public function setAttributes($attributes) + { + $this->container['attributes'] = $attributes; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesAttributes.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesAttributes.php new file mode 100644 index 0000000..7cdea1c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesAttributes.php @@ -0,0 +1,518 @@ + 'string', + 'category' => 'string', + 'type' => 'string', + 'enumeration' => '\SendinBlue\Client\Model\GetAttributesEnumeration[]', + 'calculatedValue' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'category' => null, + 'type' => null, + 'enumeration' => null, + 'calculatedValue' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'category' => 'category', + 'type' => 'type', + 'enumeration' => 'enumeration', + 'calculatedValue' => 'calculatedValue' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'category' => 'setCategory', + 'type' => 'setType', + 'enumeration' => 'setEnumeration', + 'calculatedValue' => 'setCalculatedValue' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'category' => 'getCategory', + 'type' => 'getType', + 'enumeration' => 'getEnumeration', + 'calculatedValue' => 'getCalculatedValue' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const CATEGORY_NORMAL = 'normal'; + const CATEGORY_TRANSACTIONAL = 'transactional'; + const CATEGORY_CATEGORY = 'category'; + const CATEGORY_CALCULATED = 'calculated'; + const CATEGORY__GLOBAL = 'global'; + const TYPE_TEXT = 'text'; + const TYPE_DATE = 'date'; + const TYPE_FLOAT = 'float'; + const TYPE_ID = 'id'; + const TYPE_BOOLEAN = 'boolean'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getCategoryAllowableValues() + { + return [ + self::CATEGORY_NORMAL, + self::CATEGORY_TRANSACTIONAL, + self::CATEGORY_CATEGORY, + self::CATEGORY_CALCULATED, + self::CATEGORY__GLOBAL, + ]; + } + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_TEXT, + self::TYPE_DATE, + self::TYPE_FLOAT, + self::TYPE_ID, + self::TYPE_BOOLEAN, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['category'] = isset($data['category']) ? $data['category'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : null; + $this->container['enumeration'] = isset($data['enumeration']) ? $data['enumeration'] : null; + $this->container['calculatedValue'] = isset($data['calculatedValue']) ? $data['calculatedValue'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['category'] === null) { + $invalidProperties[] = "'category' can't be null"; + } + $allowedValues = $this->getCategoryAllowableValues(); + if (!in_array($this->container['category'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'category', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['name'] === null) { + return false; + } + if ($this->container['category'] === null) { + return false; + } + $allowedValues = $this->getCategoryAllowableValues(); + if (!in_array($this->container['category'], $allowedValues)) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the attribute + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets category + * + * @return string + */ + public function getCategory() + { + return $this->container['category']; + } + + /** + * Sets category + * + * @param string $category Category of the attribute + * + * @return $this + */ + public function setCategory($category) + { + $allowedValues = $this->getCategoryAllowableValues(); + if (!in_array($category, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'category', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['category'] = $category; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of the attribute + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!is_null($type) && !in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + + /** + * Gets enumeration + * + * @return \SendinBlue\Client\Model\GetAttributesEnumeration[] + */ + public function getEnumeration() + { + return $this->container['enumeration']; + } + + /** + * Sets enumeration + * + * @param \SendinBlue\Client\Model\GetAttributesEnumeration[] $enumeration Parameter only available for \"category\" type attributes. + * + * @return $this + */ + public function setEnumeration($enumeration) + { + $this->container['enumeration'] = $enumeration; + + return $this; + } + + /** + * Gets calculatedValue + * + * @return string + */ + public function getCalculatedValue() + { + return $this->container['calculatedValue']; + } + + /** + * Sets calculatedValue + * + * @param string $calculatedValue Calculated value formula + * + * @return $this + */ + public function setCalculatedValue($calculatedValue) + { + $this->container['calculatedValue'] = $calculatedValue; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesEnumeration.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesEnumeration.php new file mode 100644 index 0000000..d6bcb40 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetAttributesEnumeration.php @@ -0,0 +1,344 @@ + 'int', + 'label' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'value' => 'int64', + 'label' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'value' => 'value', + 'label' => 'label' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'value' => 'setValue', + 'label' => 'setLabel' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'value' => 'getValue', + 'label' => 'getLabel' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['value'] = isset($data['value']) ? $data['value'] : null; + $this->container['label'] = isset($data['label']) ? $data['label'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['value'] === null) { + $invalidProperties[] = "'value' can't be null"; + } + if ($this->container['label'] === null) { + $invalidProperties[] = "'label' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['value'] === null) { + return false; + } + if ($this->container['label'] === null) { + return false; + } + return true; + } + + + /** + * Gets value + * + * @return int + */ + public function getValue() + { + return $this->container['value']; + } + + /** + * Sets value + * + * @param int $value ID of Value of the \"category\" type attribute + * + * @return $this + */ + public function setValue($value) + { + $this->container['value'] = $value; + + return $this; + } + + /** + * Gets label + * + * @return string + */ + public function getLabel() + { + return $this->container['label']; + } + + /** + * Sets label + * + * @param string $label Label of the \"category\" type attribute + * + * @return $this + */ + public function setLabel($label) + { + $this->container['label'] = $label; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignOverview.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignOverview.php new file mode 100644 index 0000000..4fb098c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignOverview.php @@ -0,0 +1,766 @@ + 'int', + 'name' => 'string', + 'subject' => 'string', + 'type' => 'string', + 'status' => 'string', + 'scheduledAt' => '\DateTime', + 'abTesting' => 'bool', + 'subjectA' => 'string', + 'subjectB' => 'string', + 'splitRule' => 'int', + 'winnerCriteria' => 'string', + 'winnerDelay' => 'int', + 'sendAtBestTime' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'subject' => null, + 'type' => null, + 'status' => null, + 'scheduledAt' => 'date-time', + 'abTesting' => null, + 'subjectA' => null, + 'subjectB' => null, + 'splitRule' => null, + 'winnerCriteria' => null, + 'winnerDelay' => null, + 'sendAtBestTime' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'subject' => 'subject', + 'type' => 'type', + 'status' => 'status', + 'scheduledAt' => 'scheduledAt', + 'abTesting' => 'abTesting', + 'subjectA' => 'subjectA', + 'subjectB' => 'subjectB', + 'splitRule' => 'splitRule', + 'winnerCriteria' => 'winnerCriteria', + 'winnerDelay' => 'winnerDelay', + 'sendAtBestTime' => 'sendAtBestTime' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'subject' => 'setSubject', + 'type' => 'setType', + 'status' => 'setStatus', + 'scheduledAt' => 'setScheduledAt', + 'abTesting' => 'setAbTesting', + 'subjectA' => 'setSubjectA', + 'subjectB' => 'setSubjectB', + 'splitRule' => 'setSplitRule', + 'winnerCriteria' => 'setWinnerCriteria', + 'winnerDelay' => 'setWinnerDelay', + 'sendAtBestTime' => 'setSendAtBestTime' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'subject' => 'getSubject', + 'type' => 'getType', + 'status' => 'getStatus', + 'scheduledAt' => 'getScheduledAt', + 'abTesting' => 'getAbTesting', + 'subjectA' => 'getSubjectA', + 'subjectB' => 'getSubjectB', + 'splitRule' => 'getSplitRule', + 'winnerCriteria' => 'getWinnerCriteria', + 'winnerDelay' => 'getWinnerDelay', + 'sendAtBestTime' => 'getSendAtBestTime' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const TYPE_CLASSIC = 'classic'; + const TYPE_TRIGGER = 'trigger'; + const STATUS_DRAFT = 'draft'; + const STATUS_SENT = 'sent'; + const STATUS_ARCHIVE = 'archive'; + const STATUS_QUEUED = 'queued'; + const STATUS_SUSPENDED = 'suspended'; + const STATUS_IN_PROCESS = 'in_process'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_CLASSIC, + self::TYPE_TRIGGER, + ]; + } + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getStatusAllowableValues() + { + return [ + self::STATUS_DRAFT, + self::STATUS_SENT, + self::STATUS_ARCHIVE, + self::STATUS_QUEUED, + self::STATUS_SUSPENDED, + self::STATUS_IN_PROCESS, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : null; + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + $this->container['abTesting'] = isset($data['abTesting']) ? $data['abTesting'] : null; + $this->container['subjectA'] = isset($data['subjectA']) ? $data['subjectA'] : null; + $this->container['subjectB'] = isset($data['subjectB']) ? $data['subjectB'] : null; + $this->container['splitRule'] = isset($data['splitRule']) ? $data['splitRule'] : null; + $this->container['winnerCriteria'] = isset($data['winnerCriteria']) ? $data['winnerCriteria'] : null; + $this->container['winnerDelay'] = isset($data['winnerDelay']) ? $data['winnerDelay'] : null; + $this->container['sendAtBestTime'] = isset($data['sendAtBestTime']) ? $data['sendAtBestTime'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['type'] === null) { + $invalidProperties[] = "'type' can't be null"; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['status'] === null) { + $invalidProperties[] = "'status' can't be null"; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['type'] === null) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + if ($this->container['status'] === null) { + return false; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the campaign + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the campaign. Only available if `abTesting` flag of the campaign is `false` + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of campaign + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + + /** + * Gets status + * + * @return string + */ + public function getStatus() + { + return $this->container['status']; + } + + /** + * Sets status + * + * @param string $status Status of the campaign + * + * @return $this + */ + public function setStatus($status) + { + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($status, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['status'] = $status; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which campaign is scheduled (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + + /** + * Gets abTesting + * + * @return bool + */ + public function getAbTesting() + { + return $this->container['abTesting']; + } + + /** + * Sets abTesting + * + * @param bool $abTesting Status of A/B Test for the campaign. abTesting = false means it is disabled, & abTesting = true means it is enabled. + * + * @return $this + */ + public function setAbTesting($abTesting) + { + $this->container['abTesting'] = $abTesting; + + return $this; + } + + /** + * Gets subjectA + * + * @return string + */ + public function getSubjectA() + { + return $this->container['subjectA']; + } + + /** + * Sets subjectA + * + * @param string $subjectA Subject A of the ab-test campaign. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSubjectA($subjectA) + { + $this->container['subjectA'] = $subjectA; + + return $this; + } + + /** + * Gets subjectB + * + * @return string + */ + public function getSubjectB() + { + return $this->container['subjectB']; + } + + /** + * Sets subjectB + * + * @param string $subjectB Subject B of the ab-test campaign. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSubjectB($subjectB) + { + $this->container['subjectB'] = $subjectB; + + return $this; + } + + /** + * Gets splitRule + * + * @return int + */ + public function getSplitRule() + { + return $this->container['splitRule']; + } + + /** + * Sets splitRule + * + * @param int $splitRule The size of your ab-test groups. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSplitRule($splitRule) + { + $this->container['splitRule'] = $splitRule; + + return $this; + } + + /** + * Gets winnerCriteria + * + * @return string + */ + public function getWinnerCriteria() + { + return $this->container['winnerCriteria']; + } + + /** + * Sets winnerCriteria + * + * @param string $winnerCriteria Criteria for the winning version. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setWinnerCriteria($winnerCriteria) + { + $this->container['winnerCriteria'] = $winnerCriteria; + + return $this; + } + + /** + * Gets winnerDelay + * + * @return int + */ + public function getWinnerDelay() + { + return $this->container['winnerDelay']; + } + + /** + * Sets winnerDelay + * + * @param int $winnerDelay The duration of the test in hours at the end of which the winning version will be sent. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setWinnerDelay($winnerDelay) + { + $this->container['winnerDelay'] = $winnerDelay; + + return $this; + } + + /** + * Gets sendAtBestTime + * + * @return bool + */ + public function getSendAtBestTime() + { + return $this->container['sendAtBestTime']; + } + + /** + * Sets sendAtBestTime + * + * @param bool $sendAtBestTime It is true if you have chosen to send your campaign at best time, otherwise it is false + * + * @return $this + */ + public function setSendAtBestTime($sendAtBestTime) + { + $this->container['sendAtBestTime'] = $sendAtBestTime; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignRecipients.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignRecipients.php new file mode 100644 index 0000000..7197818 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignRecipients.php @@ -0,0 +1,344 @@ + 'int[]', + 'exclusionLists' => 'int[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'lists' => 'int64', + 'exclusionLists' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'lists' => 'lists', + 'exclusionLists' => 'exclusionLists' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'lists' => 'setLists', + 'exclusionLists' => 'setExclusionLists' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'lists' => 'getLists', + 'exclusionLists' => 'getExclusionLists' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['lists'] = isset($data['lists']) ? $data['lists'] : null; + $this->container['exclusionLists'] = isset($data['exclusionLists']) ? $data['exclusionLists'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['lists'] === null) { + $invalidProperties[] = "'lists' can't be null"; + } + if ($this->container['exclusionLists'] === null) { + $invalidProperties[] = "'exclusionLists' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['lists'] === null) { + return false; + } + if ($this->container['exclusionLists'] === null) { + return false; + } + return true; + } + + + /** + * Gets lists + * + * @return int[] + */ + public function getLists() + { + return $this->container['lists']; + } + + /** + * Sets lists + * + * @param int[] $lists lists + * + * @return $this + */ + public function setLists($lists) + { + $this->container['lists'] = $lists; + + return $this; + } + + /** + * Gets exclusionLists + * + * @return int[] + */ + public function getExclusionLists() + { + return $this->container['exclusionLists']; + } + + /** + * Sets exclusionLists + * + * @param int[] $exclusionLists exclusionLists + * + * @return $this + */ + public function setExclusionLists($exclusionLists) + { + $this->container['exclusionLists'] = $exclusionLists; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignStats.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignStats.php new file mode 100644 index 0000000..91b23dc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetCampaignStats.php @@ -0,0 +1,692 @@ + 'int', + 'uniqueClicks' => 'int', + 'clickers' => 'int', + 'complaints' => 'int', + 'delivered' => 'int', + 'sent' => 'int', + 'softBounces' => 'int', + 'hardBounces' => 'int', + 'uniqueViews' => 'int', + 'unsubscriptions' => 'int', + 'viewed' => 'int', + 'deferred' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'listId' => 'int64', + 'uniqueClicks' => 'int64', + 'clickers' => 'int64', + 'complaints' => 'int64', + 'delivered' => 'int64', + 'sent' => 'int64', + 'softBounces' => 'int64', + 'hardBounces' => 'int64', + 'uniqueViews' => 'int64', + 'unsubscriptions' => 'int64', + 'viewed' => 'int64', + 'deferred' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'listId' => 'listId', + 'uniqueClicks' => 'uniqueClicks', + 'clickers' => 'clickers', + 'complaints' => 'complaints', + 'delivered' => 'delivered', + 'sent' => 'sent', + 'softBounces' => 'softBounces', + 'hardBounces' => 'hardBounces', + 'uniqueViews' => 'uniqueViews', + 'unsubscriptions' => 'unsubscriptions', + 'viewed' => 'viewed', + 'deferred' => 'deferred' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'listId' => 'setListId', + 'uniqueClicks' => 'setUniqueClicks', + 'clickers' => 'setClickers', + 'complaints' => 'setComplaints', + 'delivered' => 'setDelivered', + 'sent' => 'setSent', + 'softBounces' => 'setSoftBounces', + 'hardBounces' => 'setHardBounces', + 'uniqueViews' => 'setUniqueViews', + 'unsubscriptions' => 'setUnsubscriptions', + 'viewed' => 'setViewed', + 'deferred' => 'setDeferred' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'listId' => 'getListId', + 'uniqueClicks' => 'getUniqueClicks', + 'clickers' => 'getClickers', + 'complaints' => 'getComplaints', + 'delivered' => 'getDelivered', + 'sent' => 'getSent', + 'softBounces' => 'getSoftBounces', + 'hardBounces' => 'getHardBounces', + 'uniqueViews' => 'getUniqueViews', + 'unsubscriptions' => 'getUnsubscriptions', + 'viewed' => 'getViewed', + 'deferred' => 'getDeferred' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['listId'] = isset($data['listId']) ? $data['listId'] : null; + $this->container['uniqueClicks'] = isset($data['uniqueClicks']) ? $data['uniqueClicks'] : null; + $this->container['clickers'] = isset($data['clickers']) ? $data['clickers'] : null; + $this->container['complaints'] = isset($data['complaints']) ? $data['complaints'] : null; + $this->container['delivered'] = isset($data['delivered']) ? $data['delivered'] : null; + $this->container['sent'] = isset($data['sent']) ? $data['sent'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['uniqueViews'] = isset($data['uniqueViews']) ? $data['uniqueViews'] : null; + $this->container['unsubscriptions'] = isset($data['unsubscriptions']) ? $data['unsubscriptions'] : null; + $this->container['viewed'] = isset($data['viewed']) ? $data['viewed'] : null; + $this->container['deferred'] = isset($data['deferred']) ? $data['deferred'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['uniqueClicks'] === null) { + $invalidProperties[] = "'uniqueClicks' can't be null"; + } + if ($this->container['clickers'] === null) { + $invalidProperties[] = "'clickers' can't be null"; + } + if ($this->container['complaints'] === null) { + $invalidProperties[] = "'complaints' can't be null"; + } + if ($this->container['delivered'] === null) { + $invalidProperties[] = "'delivered' can't be null"; + } + if ($this->container['sent'] === null) { + $invalidProperties[] = "'sent' can't be null"; + } + if ($this->container['softBounces'] === null) { + $invalidProperties[] = "'softBounces' can't be null"; + } + if ($this->container['hardBounces'] === null) { + $invalidProperties[] = "'hardBounces' can't be null"; + } + if ($this->container['uniqueViews'] === null) { + $invalidProperties[] = "'uniqueViews' can't be null"; + } + if ($this->container['unsubscriptions'] === null) { + $invalidProperties[] = "'unsubscriptions' can't be null"; + } + if ($this->container['viewed'] === null) { + $invalidProperties[] = "'viewed' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['uniqueClicks'] === null) { + return false; + } + if ($this->container['clickers'] === null) { + return false; + } + if ($this->container['complaints'] === null) { + return false; + } + if ($this->container['delivered'] === null) { + return false; + } + if ($this->container['sent'] === null) { + return false; + } + if ($this->container['softBounces'] === null) { + return false; + } + if ($this->container['hardBounces'] === null) { + return false; + } + if ($this->container['uniqueViews'] === null) { + return false; + } + if ($this->container['unsubscriptions'] === null) { + return false; + } + if ($this->container['viewed'] === null) { + return false; + } + return true; + } + + + /** + * Gets listId + * + * @return int + */ + public function getListId() + { + return $this->container['listId']; + } + + /** + * Sets listId + * + * @param int $listId List Id of email campaign (only in case of get email campaign(s)(not for global stats)) + * + * @return $this + */ + public function setListId($listId) + { + $this->container['listId'] = $listId; + + return $this; + } + + /** + * Gets uniqueClicks + * + * @return int + */ + public function getUniqueClicks() + { + return $this->container['uniqueClicks']; + } + + /** + * Sets uniqueClicks + * + * @param int $uniqueClicks Number of unique clicks for the campaign + * + * @return $this + */ + public function setUniqueClicks($uniqueClicks) + { + $this->container['uniqueClicks'] = $uniqueClicks; + + return $this; + } + + /** + * Gets clickers + * + * @return int + */ + public function getClickers() + { + return $this->container['clickers']; + } + + /** + * Sets clickers + * + * @param int $clickers Number of total clicks for the campaign + * + * @return $this + */ + public function setClickers($clickers) + { + $this->container['clickers'] = $clickers; + + return $this; + } + + /** + * Gets complaints + * + * @return int + */ + public function getComplaints() + { + return $this->container['complaints']; + } + + /** + * Sets complaints + * + * @param int $complaints Number of complaints (Spam reports) for the campaign + * + * @return $this + */ + public function setComplaints($complaints) + { + $this->container['complaints'] = $complaints; + + return $this; + } + + /** + * Gets delivered + * + * @return int + */ + public function getDelivered() + { + return $this->container['delivered']; + } + + /** + * Sets delivered + * + * @param int $delivered Number of delivered emails for the campaign + * + * @return $this + */ + public function setDelivered($delivered) + { + $this->container['delivered'] = $delivered; + + return $this; + } + + /** + * Gets sent + * + * @return int + */ + public function getSent() + { + return $this->container['sent']; + } + + /** + * Sets sent + * + * @param int $sent Number of sent emails for the campaign + * + * @return $this + */ + public function setSent($sent) + { + $this->container['sent'] = $sent; + + return $this; + } + + /** + * Gets softBounces + * + * @return int + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param int $softBounces Number of softbounce for the campaign + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets hardBounces + * + * @return int + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param int $hardBounces Number of harbounce for the campaign + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets uniqueViews + * + * @return int + */ + public function getUniqueViews() + { + return $this->container['uniqueViews']; + } + + /** + * Sets uniqueViews + * + * @param int $uniqueViews Number of unique openings for the campaign + * + * @return $this + */ + public function setUniqueViews($uniqueViews) + { + $this->container['uniqueViews'] = $uniqueViews; + + return $this; + } + + /** + * Gets unsubscriptions + * + * @return int + */ + public function getUnsubscriptions() + { + return $this->container['unsubscriptions']; + } + + /** + * Sets unsubscriptions + * + * @param int $unsubscriptions Number of unsubscription for the campaign + * + * @return $this + */ + public function setUnsubscriptions($unsubscriptions) + { + $this->container['unsubscriptions'] = $unsubscriptions; + + return $this; + } + + /** + * Gets viewed + * + * @return int + */ + public function getViewed() + { + return $this->container['viewed']; + } + + /** + * Sets viewed + * + * @param int $viewed Number of openings for the campaign + * + * @return $this + */ + public function setViewed($viewed) + { + $this->container['viewed'] = $viewed; + + return $this; + } + + /** + * Gets deferred + * + * @return int + */ + public function getDeferred() + { + return $this->container['deferred']; + } + + /** + * Sets deferred + * + * @param int $deferred Number of deferred emails for the campaign + * + * @return $this + */ + public function setDeferred($deferred) + { + $this->container['deferred'] = $deferred; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomain.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomain.php new file mode 100644 index 0000000..5b7db91 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomain.php @@ -0,0 +1,344 @@ + 'string', + 'active' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'domain' => null, + 'active' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'domain' => 'domain', + 'active' => 'active' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'domain' => 'setDomain', + 'active' => 'setActive' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'domain' => 'getDomain', + 'active' => 'getActive' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['domain'] = isset($data['domain']) ? $data['domain'] : null; + $this->container['active'] = isset($data['active']) ? $data['active'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['domain'] === null) { + $invalidProperties[] = "'domain' can't be null"; + } + if ($this->container['active'] === null) { + $invalidProperties[] = "'active' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['domain'] === null) { + return false; + } + if ($this->container['active'] === null) { + return false; + } + return true; + } + + + /** + * Gets domain + * + * @return string + */ + public function getDomain() + { + return $this->container['domain']; + } + + /** + * Sets domain + * + * @param string $domain Sender domain + * + * @return $this + */ + public function setDomain($domain) + { + $this->container['domain'] = $domain; + + return $this; + } + + /** + * Gets active + * + * @return bool + */ + public function getActive() + { + return $this->container['active']; + } + + /** + * Sets active + * + * @param bool $active indicates whether a domain is verified or not + * + * @return $this + */ + public function setActive($active) + { + $this->container['active'] = $active; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomains.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomains.php new file mode 100644 index 0000000..dc0a126 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildDomains.php @@ -0,0 +1,280 @@ +container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfo.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfo.php new file mode 100644 index 0000000..6991820 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfo.php @@ -0,0 +1,572 @@ + 'string', + 'firstName' => 'string', + 'lastName' => 'string', + 'companyName' => 'string', + 'credits' => '\SendinBlue\Client\Model\GetChildInfoCredits', + 'statistics' => '\SendinBlue\Client\Model\GetChildInfoStatistics', + 'password' => 'string', + 'ips' => 'string[]', + 'apiKeys' => '\SendinBlue\Client\Model\GetChildInfoApiKeys' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'firstName' => null, + 'lastName' => null, + 'companyName' => null, + 'credits' => null, + 'statistics' => null, + 'password' => 'password', + 'ips' => null, + 'apiKeys' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'firstName' => 'firstName', + 'lastName' => 'lastName', + 'companyName' => 'companyName', + 'credits' => 'credits', + 'statistics' => 'statistics', + 'password' => 'password', + 'ips' => 'ips', + 'apiKeys' => 'apiKeys' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'firstName' => 'setFirstName', + 'lastName' => 'setLastName', + 'companyName' => 'setCompanyName', + 'credits' => 'setCredits', + 'statistics' => 'setStatistics', + 'password' => 'setPassword', + 'ips' => 'setIps', + 'apiKeys' => 'setApiKeys' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'firstName' => 'getFirstName', + 'lastName' => 'getLastName', + 'companyName' => 'getCompanyName', + 'credits' => 'getCredits', + 'statistics' => 'getStatistics', + 'password' => 'getPassword', + 'ips' => 'getIps', + 'apiKeys' => 'getApiKeys' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['firstName'] = isset($data['firstName']) ? $data['firstName'] : null; + $this->container['lastName'] = isset($data['lastName']) ? $data['lastName'] : null; + $this->container['companyName'] = isset($data['companyName']) ? $data['companyName'] : null; + $this->container['credits'] = isset($data['credits']) ? $data['credits'] : null; + $this->container['statistics'] = isset($data['statistics']) ? $data['statistics'] : null; + $this->container['password'] = isset($data['password']) ? $data['password'] : null; + $this->container['ips'] = isset($data['ips']) ? $data['ips'] : null; + $this->container['apiKeys'] = isset($data['apiKeys']) ? $data['apiKeys'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['firstName'] === null) { + $invalidProperties[] = "'firstName' can't be null"; + } + if ($this->container['lastName'] === null) { + $invalidProperties[] = "'lastName' can't be null"; + } + if ($this->container['companyName'] === null) { + $invalidProperties[] = "'companyName' can't be null"; + } + if ($this->container['password'] === null) { + $invalidProperties[] = "'password' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['firstName'] === null) { + return false; + } + if ($this->container['lastName'] === null) { + return false; + } + if ($this->container['companyName'] === null) { + return false; + } + if ($this->container['password'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Login Email + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets firstName + * + * @return string + */ + public function getFirstName() + { + return $this->container['firstName']; + } + + /** + * Sets firstName + * + * @param string $firstName First Name + * + * @return $this + */ + public function setFirstName($firstName) + { + $this->container['firstName'] = $firstName; + + return $this; + } + + /** + * Gets lastName + * + * @return string + */ + public function getLastName() + { + return $this->container['lastName']; + } + + /** + * Sets lastName + * + * @param string $lastName Last Name + * + * @return $this + */ + public function setLastName($lastName) + { + $this->container['lastName'] = $lastName; + + return $this; + } + + /** + * Gets companyName + * + * @return string + */ + public function getCompanyName() + { + return $this->container['companyName']; + } + + /** + * Sets companyName + * + * @param string $companyName Name of the company + * + * @return $this + */ + public function setCompanyName($companyName) + { + $this->container['companyName'] = $companyName; + + return $this; + } + + /** + * Gets credits + * + * @return \SendinBlue\Client\Model\GetChildInfoCredits + */ + public function getCredits() + { + return $this->container['credits']; + } + + /** + * Sets credits + * + * @param \SendinBlue\Client\Model\GetChildInfoCredits $credits credits + * + * @return $this + */ + public function setCredits($credits) + { + $this->container['credits'] = $credits; + + return $this; + } + + /** + * Gets statistics + * + * @return \SendinBlue\Client\Model\GetChildInfoStatistics + */ + public function getStatistics() + { + return $this->container['statistics']; + } + + /** + * Sets statistics + * + * @param \SendinBlue\Client\Model\GetChildInfoStatistics $statistics statistics + * + * @return $this + */ + public function setStatistics($statistics) + { + $this->container['statistics'] = $statistics; + + return $this; + } + + /** + * Gets password + * + * @return string + */ + public function getPassword() + { + return $this->container['password']; + } + + /** + * Sets password + * + * @param string $password The encrypted password of child account + * + * @return $this + */ + public function setPassword($password) + { + $this->container['password'] = $password; + + return $this; + } + + /** + * Gets ips + * + * @return string[] + */ + public function getIps() + { + return $this->container['ips']; + } + + /** + * Sets ips + * + * @param string[] $ips IP(s) associated to a child account user + * + * @return $this + */ + public function setIps($ips) + { + $this->container['ips'] = $ips; + + return $this; + } + + /** + * Gets apiKeys + * + * @return \SendinBlue\Client\Model\GetChildInfoApiKeys + */ + public function getApiKeys() + { + return $this->container['apiKeys']; + } + + /** + * Sets apiKeys + * + * @param \SendinBlue\Client\Model\GetChildInfoApiKeys $apiKeys apiKeys + * + * @return $this + */ + public function setApiKeys($apiKeys) + { + $this->container['apiKeys'] = $apiKeys; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeys.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeys.php new file mode 100644 index 0000000..cf42dde --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeys.php @@ -0,0 +1,339 @@ + '\SendinBlue\Client\Model\GetChildInfoApiKeysV2[]', + 'v3' => '\SendinBlue\Client\Model\GetChildInfoApiKeysV3[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'v2' => null, + 'v3' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'v2' => 'v2', + 'v3' => 'v3' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'v2' => 'setV2', + 'v3' => 'setV3' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'v2' => 'getV2', + 'v3' => 'getV3' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['v2'] = isset($data['v2']) ? $data['v2'] : null; + $this->container['v3'] = isset($data['v3']) ? $data['v3'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['v2'] === null) { + $invalidProperties[] = "'v2' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['v2'] === null) { + return false; + } + return true; + } + + + /** + * Gets v2 + * + * @return \SendinBlue\Client\Model\GetChildInfoApiKeysV2[] + */ + public function getV2() + { + return $this->container['v2']; + } + + /** + * Sets v2 + * + * @param \SendinBlue\Client\Model\GetChildInfoApiKeysV2[] $v2 v2 + * + * @return $this + */ + public function setV2($v2) + { + $this->container['v2'] = $v2; + + return $this; + } + + /** + * Gets v3 + * + * @return \SendinBlue\Client\Model\GetChildInfoApiKeysV3[] + */ + public function getV3() + { + return $this->container['v3']; + } + + /** + * Sets v3 + * + * @param \SendinBlue\Client\Model\GetChildInfoApiKeysV3[] $v3 v3 + * + * @return $this + */ + public function setV3($v3) + { + $this->container['v3'] = $v3; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV2.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV2.php new file mode 100644 index 0000000..f4d2369 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV2.php @@ -0,0 +1,344 @@ + 'string', + 'key' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'key' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'key' => 'key' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'key' => 'setKey' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'key' => 'getKey' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['key'] = isset($data['key']) ? $data['key'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['key'] === null) { + $invalidProperties[] = "'key' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['name'] === null) { + return false; + } + if ($this->container['key'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the key for version 2 + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets key + * + * @return string + */ + public function getKey() + { + return $this->container['key']; + } + + /** + * Sets key + * + * @param string $key API Key for version 2 + * + * @return $this + */ + public function setKey($key) + { + $this->container['key'] = $key; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV3.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV3.php new file mode 100644 index 0000000..b9d7c9d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoApiKeysV3.php @@ -0,0 +1,344 @@ + 'string', + 'key' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'key' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'key' => 'key' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'key' => 'setKey' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'key' => 'getKey' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['key'] = isset($data['key']) ? $data['key'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['key'] === null) { + $invalidProperties[] = "'key' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['name'] === null) { + return false; + } + if ($this->container['key'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the key for version 3 + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets key + * + * @return string + */ + public function getKey() + { + return $this->container['key']; + } + + /** + * Sets key + * + * @param string $key API Key for version 3 + * + * @return $this + */ + public function setKey($key) + { + $this->container['key'] = $key; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoCredits.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoCredits.php new file mode 100644 index 0000000..3c043c0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoCredits.php @@ -0,0 +1,333 @@ + 'int', + 'smsCredits' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'emailCredits' => 'int64', + 'smsCredits' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'emailCredits' => 'emailCredits', + 'smsCredits' => 'smsCredits' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'emailCredits' => 'setEmailCredits', + 'smsCredits' => 'setSmsCredits' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'emailCredits' => 'getEmailCredits', + 'smsCredits' => 'getSmsCredits' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['emailCredits'] = isset($data['emailCredits']) ? $data['emailCredits'] : null; + $this->container['smsCredits'] = isset($data['smsCredits']) ? $data['smsCredits'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets emailCredits + * + * @return int + */ + public function getEmailCredits() + { + return $this->container['emailCredits']; + } + + /** + * Sets emailCredits + * + * @param int $emailCredits Email credits available for your child + * + * @return $this + */ + public function setEmailCredits($emailCredits) + { + $this->container['emailCredits'] = $emailCredits; + + return $this; + } + + /** + * Gets smsCredits + * + * @return int + */ + public function getSmsCredits() + { + return $this->container['smsCredits']; + } + + /** + * Sets smsCredits + * + * @param int $smsCredits SMS credits available for your child + * + * @return $this + */ + public function setSmsCredits($smsCredits) + { + $this->container['smsCredits'] = $smsCredits; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoStatistics.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoStatistics.php new file mode 100644 index 0000000..0b5dafe --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildInfoStatistics.php @@ -0,0 +1,363 @@ + 'int', + 'currentMonthTotalSent' => 'int', + 'totalSent' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'previousMonthTotalSent' => 'int64', + 'currentMonthTotalSent' => 'int64', + 'totalSent' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'previousMonthTotalSent' => 'previousMonthTotalSent', + 'currentMonthTotalSent' => 'currentMonthTotalSent', + 'totalSent' => 'totalSent' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'previousMonthTotalSent' => 'setPreviousMonthTotalSent', + 'currentMonthTotalSent' => 'setCurrentMonthTotalSent', + 'totalSent' => 'setTotalSent' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'previousMonthTotalSent' => 'getPreviousMonthTotalSent', + 'currentMonthTotalSent' => 'getCurrentMonthTotalSent', + 'totalSent' => 'getTotalSent' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['previousMonthTotalSent'] = isset($data['previousMonthTotalSent']) ? $data['previousMonthTotalSent'] : null; + $this->container['currentMonthTotalSent'] = isset($data['currentMonthTotalSent']) ? $data['currentMonthTotalSent'] : null; + $this->container['totalSent'] = isset($data['totalSent']) ? $data['totalSent'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets previousMonthTotalSent + * + * @return int + */ + public function getPreviousMonthTotalSent() + { + return $this->container['previousMonthTotalSent']; + } + + /** + * Sets previousMonthTotalSent + * + * @param int $previousMonthTotalSent Overall emails sent for the previous month + * + * @return $this + */ + public function setPreviousMonthTotalSent($previousMonthTotalSent) + { + $this->container['previousMonthTotalSent'] = $previousMonthTotalSent; + + return $this; + } + + /** + * Gets currentMonthTotalSent + * + * @return int + */ + public function getCurrentMonthTotalSent() + { + return $this->container['currentMonthTotalSent']; + } + + /** + * Sets currentMonthTotalSent + * + * @param int $currentMonthTotalSent Overall emails sent for current month + * + * @return $this + */ + public function setCurrentMonthTotalSent($currentMonthTotalSent) + { + $this->container['currentMonthTotalSent'] = $currentMonthTotalSent; + + return $this; + } + + /** + * Gets totalSent + * + * @return int + */ + public function getTotalSent() + { + return $this->container['totalSent']; + } + + /** + * Sets totalSent + * + * @param int $totalSent Overall emails sent for since the account exists + * + * @return $this + */ + public function setTotalSent($totalSent) + { + $this->container['totalSent'] = $totalSent; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildrenList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildrenList.php new file mode 100644 index 0000000..7a2fed2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetChildrenList.php @@ -0,0 +1,302 @@ + 'object[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'children' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'children' => 'children' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'children' => 'setChildren' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'children' => 'getChildren' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['children'] = isset($data['children']) ? $data['children'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets children + * + * @return object[] + */ + public function getChildren() + { + return $this->container['children']; + } + + /** + * Sets children + * + * @param object[] $children Your children's account information + * + * @return $this + */ + public function setChildren($children) + { + $this->container['children'] = $children; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetClient.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetClient.php new file mode 100644 index 0000000..a908c1a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetClient.php @@ -0,0 +1,416 @@ + 'string', + 'firstName' => 'string', + 'lastName' => 'string', + 'companyName' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'firstName' => null, + 'lastName' => null, + 'companyName' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'firstName' => 'firstName', + 'lastName' => 'lastName', + 'companyName' => 'companyName' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'firstName' => 'setFirstName', + 'lastName' => 'setLastName', + 'companyName' => 'setCompanyName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'firstName' => 'getFirstName', + 'lastName' => 'getLastName', + 'companyName' => 'getCompanyName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['firstName'] = isset($data['firstName']) ? $data['firstName'] : null; + $this->container['lastName'] = isset($data['lastName']) ? $data['lastName'] : null; + $this->container['companyName'] = isset($data['companyName']) ? $data['companyName'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['firstName'] === null) { + $invalidProperties[] = "'firstName' can't be null"; + } + if ($this->container['lastName'] === null) { + $invalidProperties[] = "'lastName' can't be null"; + } + if ($this->container['companyName'] === null) { + $invalidProperties[] = "'companyName' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['firstName'] === null) { + return false; + } + if ($this->container['lastName'] === null) { + return false; + } + if ($this->container['companyName'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Login Email + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets firstName + * + * @return string + */ + public function getFirstName() + { + return $this->container['firstName']; + } + + /** + * Sets firstName + * + * @param string $firstName First Name + * + * @return $this + */ + public function setFirstName($firstName) + { + $this->container['firstName'] = $firstName; + + return $this; + } + + /** + * Gets lastName + * + * @return string + */ + public function getLastName() + { + return $this->container['lastName']; + } + + /** + * Sets lastName + * + * @param string $lastName Last Name + * + * @return $this + */ + public function setLastName($lastName) + { + $this->container['lastName'] = $lastName; + + return $this; + } + + /** + * Gets companyName + * + * @return string + */ + public function getCompanyName() + { + return $this->container['companyName']; + } + + /** + * Sets companyName + * + * @param string $companyName Name of the company + * + * @return $this + */ + public function setCompanyName($companyName) + { + $this->container['companyName'] = $companyName; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStats.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStats.php new file mode 100644 index 0000000..e917e7e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStats.php @@ -0,0 +1,513 @@ + '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'hardBounces' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'softBounces' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'complaints' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'unsubscriptions' => '\SendinBlue\Client\Model\GetContactCampaignStatsUnsubscriptions', + 'opened' => '\SendinBlue\Client\Model\GetContactCampaignStatsOpened[]', + 'clicked' => '\SendinBlue\Client\Model\GetContactCampaignStatsClicked[]', + 'transacAttributes' => '\SendinBlue\Client\Model\GetContactCampaignStatsTransacAttributes[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'messagesSent' => null, + 'hardBounces' => null, + 'softBounces' => null, + 'complaints' => null, + 'unsubscriptions' => null, + 'opened' => null, + 'clicked' => null, + 'transacAttributes' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'messagesSent' => 'messagesSent', + 'hardBounces' => 'hardBounces', + 'softBounces' => 'softBounces', + 'complaints' => 'complaints', + 'unsubscriptions' => 'unsubscriptions', + 'opened' => 'opened', + 'clicked' => 'clicked', + 'transacAttributes' => 'transacAttributes' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'messagesSent' => 'setMessagesSent', + 'hardBounces' => 'setHardBounces', + 'softBounces' => 'setSoftBounces', + 'complaints' => 'setComplaints', + 'unsubscriptions' => 'setUnsubscriptions', + 'opened' => 'setOpened', + 'clicked' => 'setClicked', + 'transacAttributes' => 'setTransacAttributes' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'messagesSent' => 'getMessagesSent', + 'hardBounces' => 'getHardBounces', + 'softBounces' => 'getSoftBounces', + 'complaints' => 'getComplaints', + 'unsubscriptions' => 'getUnsubscriptions', + 'opened' => 'getOpened', + 'clicked' => 'getClicked', + 'transacAttributes' => 'getTransacAttributes' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['messagesSent'] = isset($data['messagesSent']) ? $data['messagesSent'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['complaints'] = isset($data['complaints']) ? $data['complaints'] : null; + $this->container['unsubscriptions'] = isset($data['unsubscriptions']) ? $data['unsubscriptions'] : null; + $this->container['opened'] = isset($data['opened']) ? $data['opened'] : null; + $this->container['clicked'] = isset($data['clicked']) ? $data['clicked'] : null; + $this->container['transacAttributes'] = isset($data['transacAttributes']) ? $data['transacAttributes'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets messagesSent + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getMessagesSent() + { + return $this->container['messagesSent']; + } + + /** + * Sets messagesSent + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $messagesSent messagesSent + * + * @return $this + */ + public function setMessagesSent($messagesSent) + { + $this->container['messagesSent'] = $messagesSent; + + return $this; + } + + /** + * Gets hardBounces + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $hardBounces hardBounces + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets softBounces + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $softBounces softBounces + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets complaints + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getComplaints() + { + return $this->container['complaints']; + } + + /** + * Sets complaints + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $complaints complaints + * + * @return $this + */ + public function setComplaints($complaints) + { + $this->container['complaints'] = $complaints; + + return $this; + } + + /** + * Gets unsubscriptions + * + * @return \SendinBlue\Client\Model\GetContactCampaignStatsUnsubscriptions + */ + public function getUnsubscriptions() + { + return $this->container['unsubscriptions']; + } + + /** + * Sets unsubscriptions + * + * @param \SendinBlue\Client\Model\GetContactCampaignStatsUnsubscriptions $unsubscriptions unsubscriptions + * + * @return $this + */ + public function setUnsubscriptions($unsubscriptions) + { + $this->container['unsubscriptions'] = $unsubscriptions; + + return $this; + } + + /** + * Gets opened + * + * @return \SendinBlue\Client\Model\GetContactCampaignStatsOpened[] + */ + public function getOpened() + { + return $this->container['opened']; + } + + /** + * Sets opened + * + * @param \SendinBlue\Client\Model\GetContactCampaignStatsOpened[] $opened opened + * + * @return $this + */ + public function setOpened($opened) + { + $this->container['opened'] = $opened; + + return $this; + } + + /** + * Gets clicked + * + * @return \SendinBlue\Client\Model\GetContactCampaignStatsClicked[] + */ + public function getClicked() + { + return $this->container['clicked']; + } + + /** + * Sets clicked + * + * @param \SendinBlue\Client\Model\GetContactCampaignStatsClicked[] $clicked clicked + * + * @return $this + */ + public function setClicked($clicked) + { + $this->container['clicked'] = $clicked; + + return $this; + } + + /** + * Gets transacAttributes + * + * @return \SendinBlue\Client\Model\GetContactCampaignStatsTransacAttributes[] + */ + public function getTransacAttributes() + { + return $this->container['transacAttributes']; + } + + /** + * Sets transacAttributes + * + * @param \SendinBlue\Client\Model\GetContactCampaignStatsTransacAttributes[] $transacAttributes transacAttributes + * + * @return $this + */ + public function setTransacAttributes($transacAttributes) + { + $this->container['transacAttributes'] = $transacAttributes; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsClicked.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsClicked.php new file mode 100644 index 0000000..296e2a9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsClicked.php @@ -0,0 +1,344 @@ + 'int', + 'links' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsLinks[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaignId' => 'int64', + 'links' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaignId' => 'campaignId', + 'links' => 'links' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaignId' => 'setCampaignId', + 'links' => 'setLinks' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaignId' => 'getCampaignId', + 'links' => 'getLinks' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaignId'] = isset($data['campaignId']) ? $data['campaignId'] : null; + $this->container['links'] = isset($data['links']) ? $data['links'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['campaignId'] === null) { + $invalidProperties[] = "'campaignId' can't be null"; + } + if ($this->container['links'] === null) { + $invalidProperties[] = "'links' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['campaignId'] === null) { + return false; + } + if ($this->container['links'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaignId + * + * @return int + */ + public function getCampaignId() + { + return $this->container['campaignId']; + } + + /** + * Sets campaignId + * + * @param int $campaignId ID of the campaign which generated the event + * + * @return $this + */ + public function setCampaignId($campaignId) + { + $this->container['campaignId'] = $campaignId; + + return $this; + } + + /** + * Gets links + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsLinks[] + */ + public function getLinks() + { + return $this->container['links']; + } + + /** + * Sets links + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsLinks[] $links links + * + * @return $this + */ + public function setLinks($links) + { + $this->container['links'] = $links; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsOpened.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsOpened.php new file mode 100644 index 0000000..53cd654 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsOpened.php @@ -0,0 +1,416 @@ + 'int', + 'count' => 'int', + 'eventTime' => '\DateTime', + 'ip' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaignId' => 'int64', + 'count' => 'int64', + 'eventTime' => 'date-time', + 'ip' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaignId' => 'campaignId', + 'count' => 'count', + 'eventTime' => 'eventTime', + 'ip' => 'ip' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaignId' => 'setCampaignId', + 'count' => 'setCount', + 'eventTime' => 'setEventTime', + 'ip' => 'setIp' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaignId' => 'getCampaignId', + 'count' => 'getCount', + 'eventTime' => 'getEventTime', + 'ip' => 'getIp' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaignId'] = isset($data['campaignId']) ? $data['campaignId'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + $this->container['eventTime'] = isset($data['eventTime']) ? $data['eventTime'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['campaignId'] === null) { + $invalidProperties[] = "'campaignId' can't be null"; + } + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + if ($this->container['eventTime'] === null) { + $invalidProperties[] = "'eventTime' can't be null"; + } + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['campaignId'] === null) { + return false; + } + if ($this->container['count'] === null) { + return false; + } + if ($this->container['eventTime'] === null) { + return false; + } + if ($this->container['ip'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaignId + * + * @return int + */ + public function getCampaignId() + { + return $this->container['campaignId']; + } + + /** + * Sets campaignId + * + * @param int $campaignId ID of the campaign which generated the event + * + * @return $this + */ + public function setCampaignId($campaignId) + { + $this->container['campaignId'] = $campaignId; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of openings of the campaign + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + + /** + * Gets eventTime + * + * @return \DateTime + */ + public function getEventTime() + { + return $this->container['eventTime']; + } + + /** + * Sets eventTime + * + * @param \DateTime $eventTime UTC date-time of the event + * + * @return $this + */ + public function setEventTime($eventTime) + { + $this->container['eventTime'] = $eventTime; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip IP from which the user has opened the campaign + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsTransacAttributes.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsTransacAttributes.php new file mode 100644 index 0000000..9d8d736 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsTransacAttributes.php @@ -0,0 +1,380 @@ + '\DateTime', + 'orderPrice' => 'float', + 'orderId' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'orderDate' => 'date', + 'orderPrice' => 'float', + 'orderId' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'orderDate' => 'orderDate', + 'orderPrice' => 'orderPrice', + 'orderId' => 'orderId' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'orderDate' => 'setOrderDate', + 'orderPrice' => 'setOrderPrice', + 'orderId' => 'setOrderId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'orderDate' => 'getOrderDate', + 'orderPrice' => 'getOrderPrice', + 'orderId' => 'getOrderId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['orderDate'] = isset($data['orderDate']) ? $data['orderDate'] : null; + $this->container['orderPrice'] = isset($data['orderPrice']) ? $data['orderPrice'] : null; + $this->container['orderId'] = isset($data['orderId']) ? $data['orderId'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['orderDate'] === null) { + $invalidProperties[] = "'orderDate' can't be null"; + } + if ($this->container['orderPrice'] === null) { + $invalidProperties[] = "'orderPrice' can't be null"; + } + if ($this->container['orderId'] === null) { + $invalidProperties[] = "'orderId' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['orderDate'] === null) { + return false; + } + if ($this->container['orderPrice'] === null) { + return false; + } + if ($this->container['orderId'] === null) { + return false; + } + return true; + } + + + /** + * Gets orderDate + * + * @return \DateTime + */ + public function getOrderDate() + { + return $this->container['orderDate']; + } + + /** + * Sets orderDate + * + * @param \DateTime $orderDate Date of the order + * + * @return $this + */ + public function setOrderDate($orderDate) + { + $this->container['orderDate'] = $orderDate; + + return $this; + } + + /** + * Gets orderPrice + * + * @return float + */ + public function getOrderPrice() + { + return $this->container['orderPrice']; + } + + /** + * Sets orderPrice + * + * @param float $orderPrice Price of the order + * + * @return $this + */ + public function setOrderPrice($orderPrice) + { + $this->container['orderPrice'] = $orderPrice; + + return $this; + } + + /** + * Gets orderId + * + * @return int + */ + public function getOrderId() + { + return $this->container['orderId']; + } + + /** + * Sets orderId + * + * @param int $orderId ID of the order + * + * @return $this + */ + public function setOrderId($orderId) + { + $this->container['orderId'] = $orderId; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsUnsubscriptions.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsUnsubscriptions.php new file mode 100644 index 0000000..87aef87 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactCampaignStatsUnsubscriptions.php @@ -0,0 +1,344 @@ + '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription[]', + 'adminUnsubscription' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'userUnsubscription' => null, + 'adminUnsubscription' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'userUnsubscription' => 'userUnsubscription', + 'adminUnsubscription' => 'adminUnsubscription' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'userUnsubscription' => 'setUserUnsubscription', + 'adminUnsubscription' => 'setAdminUnsubscription' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'userUnsubscription' => 'getUserUnsubscription', + 'adminUnsubscription' => 'getAdminUnsubscription' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['userUnsubscription'] = isset($data['userUnsubscription']) ? $data['userUnsubscription'] : null; + $this->container['adminUnsubscription'] = isset($data['adminUnsubscription']) ? $data['adminUnsubscription'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['userUnsubscription'] === null) { + $invalidProperties[] = "'userUnsubscription' can't be null"; + } + if ($this->container['adminUnsubscription'] === null) { + $invalidProperties[] = "'adminUnsubscription' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['userUnsubscription'] === null) { + return false; + } + if ($this->container['adminUnsubscription'] === null) { + return false; + } + return true; + } + + + /** + * Gets userUnsubscription + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription[] + */ + public function getUserUnsubscription() + { + return $this->container['userUnsubscription']; + } + + /** + * Sets userUnsubscription + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription[] $userUnsubscription Contact has unsubscribed via the unsubscription link in the email + * + * @return $this + */ + public function setUserUnsubscription($userUnsubscription) + { + $this->container['userUnsubscription'] = $userUnsubscription; + + return $this; + } + + /** + * Gets adminUnsubscription + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription[] + */ + public function getAdminUnsubscription() + { + return $this->container['adminUnsubscription']; + } + + /** + * Sets adminUnsubscription + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription[] $adminUnsubscription Contact has been unsubscribed from the administrator + * + * @return $this + */ + public function setAdminUnsubscription($adminUnsubscription) + { + $this->container['adminUnsubscription'] = $adminUnsubscription; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactDetails.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactDetails.php new file mode 100644 index 0000000..318fe79 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContactDetails.php @@ -0,0 +1,590 @@ + 'string', + 'id' => 'int', + 'emailBlacklisted' => 'bool', + 'smsBlacklisted' => 'bool', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime', + 'listIds' => 'int[]', + 'listUnsubscribed' => 'int[]', + 'attributes' => 'object' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'id' => 'int64', + 'emailBlacklisted' => null, + 'smsBlacklisted' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time', + 'listIds' => 'int64', + 'listUnsubscribed' => 'int64', + 'attributes' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'id' => 'id', + 'emailBlacklisted' => 'emailBlacklisted', + 'smsBlacklisted' => 'smsBlacklisted', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt', + 'listIds' => 'listIds', + 'listUnsubscribed' => 'listUnsubscribed', + 'attributes' => 'attributes' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'id' => 'setId', + 'emailBlacklisted' => 'setEmailBlacklisted', + 'smsBlacklisted' => 'setSmsBlacklisted', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt', + 'listIds' => 'setListIds', + 'listUnsubscribed' => 'setListUnsubscribed', + 'attributes' => 'setAttributes' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'id' => 'getId', + 'emailBlacklisted' => 'getEmailBlacklisted', + 'smsBlacklisted' => 'getSmsBlacklisted', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt', + 'listIds' => 'getListIds', + 'listUnsubscribed' => 'getListUnsubscribed', + 'attributes' => 'getAttributes' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['emailBlacklisted'] = isset($data['emailBlacklisted']) ? $data['emailBlacklisted'] : null; + $this->container['smsBlacklisted'] = isset($data['smsBlacklisted']) ? $data['smsBlacklisted'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + $this->container['listUnsubscribed'] = isset($data['listUnsubscribed']) ? $data['listUnsubscribed'] : null; + $this->container['attributes'] = isset($data['attributes']) ? $data['attributes'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['emailBlacklisted'] === null) { + $invalidProperties[] = "'emailBlacklisted' can't be null"; + } + if ($this->container['smsBlacklisted'] === null) { + $invalidProperties[] = "'smsBlacklisted' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + if ($this->container['listIds'] === null) { + $invalidProperties[] = "'listIds' can't be null"; + } + if ($this->container['attributes'] === null) { + $invalidProperties[] = "'attributes' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['id'] === null) { + return false; + } + if ($this->container['emailBlacklisted'] === null) { + return false; + } + if ($this->container['smsBlacklisted'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + if ($this->container['listIds'] === null) { + return false; + } + if ($this->container['attributes'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address of the contact for which you requested the details + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the contact for which you requested the details + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets emailBlacklisted + * + * @return bool + */ + public function getEmailBlacklisted() + { + return $this->container['emailBlacklisted']; + } + + /** + * Sets emailBlacklisted + * + * @param bool $emailBlacklisted Blacklist status for email campaigns (true=blacklisted, false=not blacklisted) + * + * @return $this + */ + public function setEmailBlacklisted($emailBlacklisted) + { + $this->container['emailBlacklisted'] = $emailBlacklisted; + + return $this; + } + + /** + * Gets smsBlacklisted + * + * @return bool + */ + public function getSmsBlacklisted() + { + return $this->container['smsBlacklisted']; + } + + /** + * Sets smsBlacklisted + * + * @param bool $smsBlacklisted Blacklist status for SMS campaigns (true=blacklisted, false=not blacklisted) + * + * @return $this + */ + public function setSmsBlacklisted($smsBlacklisted) + { + $this->container['smsBlacklisted'] = $smsBlacklisted; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the contact (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt Last modification UTC date-time of the contact (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds listIds + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + + /** + * Gets listUnsubscribed + * + * @return int[] + */ + public function getListUnsubscribed() + { + return $this->container['listUnsubscribed']; + } + + /** + * Sets listUnsubscribed + * + * @param int[] $listUnsubscribed listUnsubscribed + * + * @return $this + */ + public function setListUnsubscribed($listUnsubscribed) + { + $this->container['listUnsubscribed'] = $listUnsubscribed; + + return $this; + } + + /** + * Gets attributes + * + * @return object + */ + public function getAttributes() + { + return $this->container['attributes']; + } + + /** + * Sets attributes + * + * @param object $attributes Set of attributes of the contact + * + * @return $this + */ + public function setAttributes($attributes) + { + $this->container['attributes'] = $attributes; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContacts.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContacts.php new file mode 100644 index 0000000..3c6c4e9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetContacts.php @@ -0,0 +1,344 @@ + 'object[]', + 'count' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'contacts' => null, + 'count' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'contacts' => 'contacts', + 'count' => 'count' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'contacts' => 'setContacts', + 'count' => 'setCount' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'contacts' => 'getContacts', + 'count' => 'getCount' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['contacts'] = isset($data['contacts']) ? $data['contacts'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['contacts'] === null) { + $invalidProperties[] = "'contacts' can't be null"; + } + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['contacts'] === null) { + return false; + } + if ($this->container['count'] === null) { + return false; + } + return true; + } + + + /** + * Gets contacts + * + * @return object[] + */ + public function getContacts() + { + return $this->container['contacts']; + } + + /** + * Sets contacts + * + * @param object[] $contacts contacts + * + * @return $this + */ + public function setContacts($contacts) + { + $this->container['contacts'] = $contacts; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of contacts + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaign.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaign.php new file mode 100644 index 0000000..8d2434f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaign.php @@ -0,0 +1,1348 @@ + 'int', + 'name' => 'string', + 'subject' => 'string', + 'type' => 'string', + 'status' => 'string', + 'scheduledAt' => '\DateTime', + 'abTesting' => 'bool', + 'subjectA' => 'string', + 'subjectB' => 'string', + 'splitRule' => 'int', + 'winnerCriteria' => 'string', + 'winnerDelay' => 'int', + 'sendAtBestTime' => 'bool', + 'testSent' => 'bool', + 'header' => 'string', + 'footer' => 'string', + 'sender' => '\SendinBlue\Client\Model\GetExtendedCampaignOverviewSender', + 'replyTo' => 'string', + 'toField' => 'string', + 'htmlContent' => 'string', + 'shareLink' => 'string', + 'tag' => 'string', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime', + 'inlineImageActivation' => 'bool', + 'mirrorActive' => 'bool', + 'recurring' => 'bool', + 'sentDate' => '\DateTime', + 'recipients' => 'object', + 'statistics' => 'object' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'subject' => null, + 'type' => null, + 'status' => null, + 'scheduledAt' => 'date-time', + 'abTesting' => null, + 'subjectA' => null, + 'subjectB' => null, + 'splitRule' => null, + 'winnerCriteria' => null, + 'winnerDelay' => null, + 'sendAtBestTime' => null, + 'testSent' => null, + 'header' => null, + 'footer' => null, + 'sender' => null, + 'replyTo' => 'email', + 'toField' => null, + 'htmlContent' => null, + 'shareLink' => 'url', + 'tag' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time', + 'inlineImageActivation' => null, + 'mirrorActive' => null, + 'recurring' => null, + 'sentDate' => 'date-time', + 'recipients' => null, + 'statistics' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'subject' => 'subject', + 'type' => 'type', + 'status' => 'status', + 'scheduledAt' => 'scheduledAt', + 'abTesting' => 'abTesting', + 'subjectA' => 'subjectA', + 'subjectB' => 'subjectB', + 'splitRule' => 'splitRule', + 'winnerCriteria' => 'winnerCriteria', + 'winnerDelay' => 'winnerDelay', + 'sendAtBestTime' => 'sendAtBestTime', + 'testSent' => 'testSent', + 'header' => 'header', + 'footer' => 'footer', + 'sender' => 'sender', + 'replyTo' => 'replyTo', + 'toField' => 'toField', + 'htmlContent' => 'htmlContent', + 'shareLink' => 'shareLink', + 'tag' => 'tag', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt', + 'inlineImageActivation' => 'inlineImageActivation', + 'mirrorActive' => 'mirrorActive', + 'recurring' => 'recurring', + 'sentDate' => 'sentDate', + 'recipients' => 'recipients', + 'statistics' => 'statistics' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'subject' => 'setSubject', + 'type' => 'setType', + 'status' => 'setStatus', + 'scheduledAt' => 'setScheduledAt', + 'abTesting' => 'setAbTesting', + 'subjectA' => 'setSubjectA', + 'subjectB' => 'setSubjectB', + 'splitRule' => 'setSplitRule', + 'winnerCriteria' => 'setWinnerCriteria', + 'winnerDelay' => 'setWinnerDelay', + 'sendAtBestTime' => 'setSendAtBestTime', + 'testSent' => 'setTestSent', + 'header' => 'setHeader', + 'footer' => 'setFooter', + 'sender' => 'setSender', + 'replyTo' => 'setReplyTo', + 'toField' => 'setToField', + 'htmlContent' => 'setHtmlContent', + 'shareLink' => 'setShareLink', + 'tag' => 'setTag', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt', + 'inlineImageActivation' => 'setInlineImageActivation', + 'mirrorActive' => 'setMirrorActive', + 'recurring' => 'setRecurring', + 'sentDate' => 'setSentDate', + 'recipients' => 'setRecipients', + 'statistics' => 'setStatistics' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'subject' => 'getSubject', + 'type' => 'getType', + 'status' => 'getStatus', + 'scheduledAt' => 'getScheduledAt', + 'abTesting' => 'getAbTesting', + 'subjectA' => 'getSubjectA', + 'subjectB' => 'getSubjectB', + 'splitRule' => 'getSplitRule', + 'winnerCriteria' => 'getWinnerCriteria', + 'winnerDelay' => 'getWinnerDelay', + 'sendAtBestTime' => 'getSendAtBestTime', + 'testSent' => 'getTestSent', + 'header' => 'getHeader', + 'footer' => 'getFooter', + 'sender' => 'getSender', + 'replyTo' => 'getReplyTo', + 'toField' => 'getToField', + 'htmlContent' => 'getHtmlContent', + 'shareLink' => 'getShareLink', + 'tag' => 'getTag', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt', + 'inlineImageActivation' => 'getInlineImageActivation', + 'mirrorActive' => 'getMirrorActive', + 'recurring' => 'getRecurring', + 'sentDate' => 'getSentDate', + 'recipients' => 'getRecipients', + 'statistics' => 'getStatistics' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const TYPE_CLASSIC = 'classic'; + const TYPE_TRIGGER = 'trigger'; + const STATUS_DRAFT = 'draft'; + const STATUS_SENT = 'sent'; + const STATUS_ARCHIVE = 'archive'; + const STATUS_QUEUED = 'queued'; + const STATUS_SUSPENDED = 'suspended'; + const STATUS_IN_PROCESS = 'in_process'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_CLASSIC, + self::TYPE_TRIGGER, + ]; + } + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getStatusAllowableValues() + { + return [ + self::STATUS_DRAFT, + self::STATUS_SENT, + self::STATUS_ARCHIVE, + self::STATUS_QUEUED, + self::STATUS_SUSPENDED, + self::STATUS_IN_PROCESS, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : null; + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + $this->container['abTesting'] = isset($data['abTesting']) ? $data['abTesting'] : null; + $this->container['subjectA'] = isset($data['subjectA']) ? $data['subjectA'] : null; + $this->container['subjectB'] = isset($data['subjectB']) ? $data['subjectB'] : null; + $this->container['splitRule'] = isset($data['splitRule']) ? $data['splitRule'] : null; + $this->container['winnerCriteria'] = isset($data['winnerCriteria']) ? $data['winnerCriteria'] : null; + $this->container['winnerDelay'] = isset($data['winnerDelay']) ? $data['winnerDelay'] : null; + $this->container['sendAtBestTime'] = isset($data['sendAtBestTime']) ? $data['sendAtBestTime'] : null; + $this->container['testSent'] = isset($data['testSent']) ? $data['testSent'] : null; + $this->container['header'] = isset($data['header']) ? $data['header'] : null; + $this->container['footer'] = isset($data['footer']) ? $data['footer'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['toField'] = isset($data['toField']) ? $data['toField'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['shareLink'] = isset($data['shareLink']) ? $data['shareLink'] : null; + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + $this->container['inlineImageActivation'] = isset($data['inlineImageActivation']) ? $data['inlineImageActivation'] : null; + $this->container['mirrorActive'] = isset($data['mirrorActive']) ? $data['mirrorActive'] : null; + $this->container['recurring'] = isset($data['recurring']) ? $data['recurring'] : null; + $this->container['sentDate'] = isset($data['sentDate']) ? $data['sentDate'] : null; + $this->container['recipients'] = isset($data['recipients']) ? $data['recipients'] : null; + $this->container['statistics'] = isset($data['statistics']) ? $data['statistics'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['type'] === null) { + $invalidProperties[] = "'type' can't be null"; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['status'] === null) { + $invalidProperties[] = "'status' can't be null"; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['testSent'] === null) { + $invalidProperties[] = "'testSent' can't be null"; + } + if ($this->container['header'] === null) { + $invalidProperties[] = "'header' can't be null"; + } + if ($this->container['footer'] === null) { + $invalidProperties[] = "'footer' can't be null"; + } + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ($this->container['replyTo'] === null) { + $invalidProperties[] = "'replyTo' can't be null"; + } + if ($this->container['toField'] === null) { + $invalidProperties[] = "'toField' can't be null"; + } + if ($this->container['htmlContent'] === null) { + $invalidProperties[] = "'htmlContent' can't be null"; + } + if ($this->container['tag'] === null) { + $invalidProperties[] = "'tag' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + if ($this->container['recipients'] === null) { + $invalidProperties[] = "'recipients' can't be null"; + } + if ($this->container['statistics'] === null) { + $invalidProperties[] = "'statistics' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['type'] === null) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + if ($this->container['status'] === null) { + return false; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + return false; + } + if ($this->container['testSent'] === null) { + return false; + } + if ($this->container['header'] === null) { + return false; + } + if ($this->container['footer'] === null) { + return false; + } + if ($this->container['sender'] === null) { + return false; + } + if ($this->container['replyTo'] === null) { + return false; + } + if ($this->container['toField'] === null) { + return false; + } + if ($this->container['htmlContent'] === null) { + return false; + } + if ($this->container['tag'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + if ($this->container['recipients'] === null) { + return false; + } + if ($this->container['statistics'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the campaign + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the campaign. Only available if `abTesting` flag of the campaign is `false` + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of campaign + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + + /** + * Gets status + * + * @return string + */ + public function getStatus() + { + return $this->container['status']; + } + + /** + * Sets status + * + * @param string $status Status of the campaign + * + * @return $this + */ + public function setStatus($status) + { + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($status, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['status'] = $status; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which campaign is scheduled (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + + /** + * Gets abTesting + * + * @return bool + */ + public function getAbTesting() + { + return $this->container['abTesting']; + } + + /** + * Sets abTesting + * + * @param bool $abTesting Status of A/B Test for the campaign. abTesting = false means it is disabled, & abTesting = true means it is enabled. + * + * @return $this + */ + public function setAbTesting($abTesting) + { + $this->container['abTesting'] = $abTesting; + + return $this; + } + + /** + * Gets subjectA + * + * @return string + */ + public function getSubjectA() + { + return $this->container['subjectA']; + } + + /** + * Sets subjectA + * + * @param string $subjectA Subject A of the ab-test campaign. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSubjectA($subjectA) + { + $this->container['subjectA'] = $subjectA; + + return $this; + } + + /** + * Gets subjectB + * + * @return string + */ + public function getSubjectB() + { + return $this->container['subjectB']; + } + + /** + * Sets subjectB + * + * @param string $subjectB Subject B of the ab-test campaign. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSubjectB($subjectB) + { + $this->container['subjectB'] = $subjectB; + + return $this; + } + + /** + * Gets splitRule + * + * @return int + */ + public function getSplitRule() + { + return $this->container['splitRule']; + } + + /** + * Sets splitRule + * + * @param int $splitRule The size of your ab-test groups. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSplitRule($splitRule) + { + $this->container['splitRule'] = $splitRule; + + return $this; + } + + /** + * Gets winnerCriteria + * + * @return string + */ + public function getWinnerCriteria() + { + return $this->container['winnerCriteria']; + } + + /** + * Sets winnerCriteria + * + * @param string $winnerCriteria Criteria for the winning version. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setWinnerCriteria($winnerCriteria) + { + $this->container['winnerCriteria'] = $winnerCriteria; + + return $this; + } + + /** + * Gets winnerDelay + * + * @return int + */ + public function getWinnerDelay() + { + return $this->container['winnerDelay']; + } + + /** + * Sets winnerDelay + * + * @param int $winnerDelay The duration of the test in hours at the end of which the winning version will be sent. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setWinnerDelay($winnerDelay) + { + $this->container['winnerDelay'] = $winnerDelay; + + return $this; + } + + /** + * Gets sendAtBestTime + * + * @return bool + */ + public function getSendAtBestTime() + { + return $this->container['sendAtBestTime']; + } + + /** + * Sets sendAtBestTime + * + * @param bool $sendAtBestTime It is true if you have chosen to send your campaign at best time, otherwise it is false + * + * @return $this + */ + public function setSendAtBestTime($sendAtBestTime) + { + $this->container['sendAtBestTime'] = $sendAtBestTime; + + return $this; + } + + /** + * Gets testSent + * + * @return bool + */ + public function getTestSent() + { + return $this->container['testSent']; + } + + /** + * Sets testSent + * + * @param bool $testSent Retrieved the status of test email sending. (true=Test email has been sent false=Test email has not been sent) + * + * @return $this + */ + public function setTestSent($testSent) + { + $this->container['testSent'] = $testSent; + + return $this; + } + + /** + * Gets header + * + * @return string + */ + public function getHeader() + { + return $this->container['header']; + } + + /** + * Sets header + * + * @param string $header Header of the campaign + * + * @return $this + */ + public function setHeader($header) + { + $this->container['header'] = $header; + + return $this; + } + + /** + * Gets footer + * + * @return string + */ + public function getFooter() + { + return $this->container['footer']; + } + + /** + * Sets footer + * + * @param string $footer Footer of the campaign + * + * @return $this + */ + public function setFooter($footer) + { + $this->container['footer'] = $footer; + + return $this; + } + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\GetExtendedCampaignOverviewSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\GetExtendedCampaignOverviewSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email defined as the \"Reply to\" of the campaign + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets toField + * + * @return string + */ + public function getToField() + { + return $this->container['toField']; + } + + /** + * Sets toField + * + * @param string $toField Customisation of the \"to\" field of the campaign + * + * @return $this + */ + public function setToField($toField) + { + $this->container['toField'] = $toField; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent HTML content of the campaign + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets shareLink + * + * @return string + */ + public function getShareLink() + { + return $this->container['shareLink']; + } + + /** + * Sets shareLink + * + * @param string $shareLink Link to share the campaign on social medias + * + * @return $this + */ + public function setShareLink($shareLink) + { + $this->container['shareLink'] = $shareLink; + + return $this; + } + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the campaign + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt UTC date-time of last modification of the campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + + /** + * Gets inlineImageActivation + * + * @return bool + */ + public function getInlineImageActivation() + { + return $this->container['inlineImageActivation']; + } + + /** + * Sets inlineImageActivation + * + * @param bool $inlineImageActivation Status of inline image. inlineImageActivation = false means image can’t be embedded, & inlineImageActivation = true means image can be embedded, in the email. + * + * @return $this + */ + public function setInlineImageActivation($inlineImageActivation) + { + $this->container['inlineImageActivation'] = $inlineImageActivation; + + return $this; + } + + /** + * Gets mirrorActive + * + * @return bool + */ + public function getMirrorActive() + { + return $this->container['mirrorActive']; + } + + /** + * Sets mirrorActive + * + * @param bool $mirrorActive Status of mirror links in campaign. mirrorActive = false means mirror links are deactivated, & mirrorActive = true means mirror links are activated, in the campaign + * + * @return $this + */ + public function setMirrorActive($mirrorActive) + { + $this->container['mirrorActive'] = $mirrorActive; + + return $this; + } + + /** + * Gets recurring + * + * @return bool + */ + public function getRecurring() + { + return $this->container['recurring']; + } + + /** + * Sets recurring + * + * @param bool $recurring FOR TRIGGER ONLY ! Type of trigger campaign.recurring = false means contact can receive the same Trigger campaign only once, & recurring = true means contact can receive the same Trigger campaign several times + * + * @return $this + */ + public function setRecurring($recurring) + { + $this->container['recurring'] = $recurring; + + return $this; + } + + /** + * Gets sentDate + * + * @return \DateTime + */ + public function getSentDate() + { + return $this->container['sentDate']; + } + + /** + * Sets sentDate + * + * @param \DateTime $sentDate Sent UTC date-time of the campaign (YYYY-MM-DDTHH:mm:ss.SSSZ). Only available if 'status' of the campaign is 'sent' + * + * @return $this + */ + public function setSentDate($sentDate) + { + $this->container['sentDate'] = $sentDate; + + return $this; + } + + /** + * Gets recipients + * + * @return object + */ + public function getRecipients() + { + return $this->container['recipients']; + } + + /** + * Sets recipients + * + * @param object $recipients recipients + * + * @return $this + */ + public function setRecipients($recipients) + { + $this->container['recipients'] = $recipients; + + return $this; + } + + /** + * Gets statistics + * + * @return object + */ + public function getStatistics() + { + return $this->container['statistics']; + } + + /** + * Sets statistics + * + * @param object $statistics statistics + * + * @return $this + */ + public function setStatistics($statistics) + { + $this->container['statistics'] = $statistics; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaigns.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaigns.php new file mode 100644 index 0000000..ba26222 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailCampaigns.php @@ -0,0 +1,338 @@ + 'object[]', + 'count' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaigns' => null, + 'count' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaigns' => 'campaigns', + 'count' => 'count' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaigns' => 'setCampaigns', + 'count' => 'setCount' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaigns' => 'getCampaigns', + 'count' => 'getCount' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaigns'] = isset($data['campaigns']) ? $data['campaigns'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['count'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaigns + * + * @return object[] + */ + public function getCampaigns() + { + return $this->container['campaigns']; + } + + /** + * Sets campaigns + * + * @param object[] $campaigns campaigns + * + * @return $this + */ + public function setCampaigns($campaigns) + { + $this->container['campaigns'] = $campaigns; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of Email campaigns retrieved + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReport.php new file mode 100644 index 0000000..4c2c169 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReport.php @@ -0,0 +1,302 @@ + '\SendinBlue\Client\Model\GetEmailEventReportEvents[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'events' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'events' => 'events' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'events' => 'setEvents' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'events' => 'getEvents' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['events'] = isset($data['events']) ? $data['events'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets events + * + * @return \SendinBlue\Client\Model\GetEmailEventReportEvents[] + */ + public function getEvents() + { + return $this->container['events']; + } + + /** + * Sets events + * + * @param \SendinBlue\Client\Model\GetEmailEventReportEvents[] $events events + * + * @return $this + */ + public function setEvents($events) + { + $this->container['events'] = $events; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReportEvents.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReportEvents.php new file mode 100644 index 0000000..bebc48a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetEmailEventReportEvents.php @@ -0,0 +1,652 @@ + 'string', + 'date' => '\DateTime', + 'subject' => 'string', + 'messageId' => 'string', + 'event' => 'string', + 'reason' => 'string', + 'tag' => 'string', + 'ip' => 'string', + 'link' => 'string', + 'from' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'date' => 'date-time', + 'subject' => null, + 'messageId' => null, + 'event' => null, + 'reason' => null, + 'tag' => null, + 'ip' => null, + 'link' => null, + 'from' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'date' => 'date', + 'subject' => 'subject', + 'messageId' => 'messageId', + 'event' => 'event', + 'reason' => 'reason', + 'tag' => 'tag', + 'ip' => 'ip', + 'link' => 'link', + 'from' => 'from' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'date' => 'setDate', + 'subject' => 'setSubject', + 'messageId' => 'setMessageId', + 'event' => 'setEvent', + 'reason' => 'setReason', + 'tag' => 'setTag', + 'ip' => 'setIp', + 'link' => 'setLink', + 'from' => 'setFrom' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'date' => 'getDate', + 'subject' => 'getSubject', + 'messageId' => 'getMessageId', + 'event' => 'getEvent', + 'reason' => 'getReason', + 'tag' => 'getTag', + 'ip' => 'getIp', + 'link' => 'getLink', + 'from' => 'getFrom' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const EVENT_BOUNCES = 'bounces'; + const EVENT_HARD_BOUNCES = 'hardBounces'; + const EVENT_SOFT_BOUNCES = 'softBounces'; + const EVENT_DELIVERED = 'delivered'; + const EVENT_SPAM = 'spam'; + const EVENT_REQUESTS = 'requests'; + const EVENT_OPENED = 'opened'; + const EVENT_CLICKS = 'clicks'; + const EVENT_INVALID = 'invalid'; + const EVENT_DEFERRED = 'deferred'; + const EVENT_BLOCKED = 'blocked'; + const EVENT_UNSUBSCRIBED = 'unsubscribed'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getEventAllowableValues() + { + return [ + self::EVENT_BOUNCES, + self::EVENT_HARD_BOUNCES, + self::EVENT_SOFT_BOUNCES, + self::EVENT_DELIVERED, + self::EVENT_SPAM, + self::EVENT_REQUESTS, + self::EVENT_OPENED, + self::EVENT_CLICKS, + self::EVENT_INVALID, + self::EVENT_DEFERRED, + self::EVENT_BLOCKED, + self::EVENT_UNSUBSCRIBED, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['date'] = isset($data['date']) ? $data['date'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['messageId'] = isset($data['messageId']) ? $data['messageId'] : null; + $this->container['event'] = isset($data['event']) ? $data['event'] : null; + $this->container['reason'] = isset($data['reason']) ? $data['reason'] : null; + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + $this->container['link'] = isset($data['link']) ? $data['link'] : null; + $this->container['from'] = isset($data['from']) ? $data['from'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['date'] === null) { + $invalidProperties[] = "'date' can't be null"; + } + if ($this->container['messageId'] === null) { + $invalidProperties[] = "'messageId' can't be null"; + } + if ($this->container['event'] === null) { + $invalidProperties[] = "'event' can't be null"; + } + $allowedValues = $this->getEventAllowableValues(); + if (!in_array($this->container['event'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'event', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['date'] === null) { + return false; + } + if ($this->container['messageId'] === null) { + return false; + } + if ($this->container['event'] === null) { + return false; + } + $allowedValues = $this->getEventAllowableValues(); + if (!in_array($this->container['event'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address which generates the event + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets date + * + * @return \DateTime + */ + public function getDate() + { + return $this->container['date']; + } + + /** + * Sets date + * + * @param \DateTime $date UTC date-time on which the event has been generated + * + * @return $this + */ + public function setDate($date) + { + $this->container['date'] = $date; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the event + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets messageId + * + * @return string + */ + public function getMessageId() + { + return $this->container['messageId']; + } + + /** + * Sets messageId + * + * @param string $messageId Message ID which generated the event + * + * @return $this + */ + public function setMessageId($messageId) + { + $this->container['messageId'] = $messageId; + + return $this; + } + + /** + * Gets event + * + * @return string + */ + public function getEvent() + { + return $this->container['event']; + } + + /** + * Sets event + * + * @param string $event Event which occurred + * + * @return $this + */ + public function setEvent($event) + { + $allowedValues = $this->getEventAllowableValues(); + if (!in_array($event, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'event', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['event'] = $event; + + return $this; + } + + /** + * Gets reason + * + * @return string + */ + public function getReason() + { + return $this->container['reason']; + } + + /** + * Sets reason + * + * @param string $reason Reason of bounce (only available if the event is hardbounce or softbounce) + * + * @return $this + */ + public function setReason($reason) + { + $this->container['reason'] = $reason; + + return $this; + } + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the email which generated the event + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip IP from which the user has opened the email or clicked on the link (only available if the event is opened or clicks) + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + + /** + * Gets link + * + * @return string + */ + public function getLink() + { + return $this->container['link']; + } + + /** + * Sets link + * + * @param string $link The link which is sent to the user (only available if the event is requests or opened or clicks) + * + * @return $this + */ + public function setLink($link) + { + $this->container['link'] = $link; + + return $this; + } + + /** + * Gets from + * + * @return string + */ + public function getFrom() + { + return $this->container['from']; + } + + /** + * Sets from + * + * @param string $from Sender email from which the emails are sent + * + * @return $this + */ + public function setFrom($from) + { + $this->container['from'] = $from; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverview.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverview.php new file mode 100644 index 0000000..54ccb0c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverview.php @@ -0,0 +1,1276 @@ + 'int', + 'name' => 'string', + 'subject' => 'string', + 'type' => 'string', + 'status' => 'string', + 'scheduledAt' => '\DateTime', + 'abTesting' => 'bool', + 'subjectA' => 'string', + 'subjectB' => 'string', + 'splitRule' => 'int', + 'winnerCriteria' => 'string', + 'winnerDelay' => 'int', + 'sendAtBestTime' => 'bool', + 'testSent' => 'bool', + 'header' => 'string', + 'footer' => 'string', + 'sender' => '\SendinBlue\Client\Model\GetExtendedCampaignOverviewSender', + 'replyTo' => 'string', + 'toField' => 'string', + 'htmlContent' => 'string', + 'shareLink' => 'string', + 'tag' => 'string', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime', + 'inlineImageActivation' => 'bool', + 'mirrorActive' => 'bool', + 'recurring' => 'bool', + 'sentDate' => '\DateTime' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'subject' => null, + 'type' => null, + 'status' => null, + 'scheduledAt' => 'date-time', + 'abTesting' => null, + 'subjectA' => null, + 'subjectB' => null, + 'splitRule' => null, + 'winnerCriteria' => null, + 'winnerDelay' => null, + 'sendAtBestTime' => null, + 'testSent' => null, + 'header' => null, + 'footer' => null, + 'sender' => null, + 'replyTo' => 'email', + 'toField' => null, + 'htmlContent' => null, + 'shareLink' => 'url', + 'tag' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time', + 'inlineImageActivation' => null, + 'mirrorActive' => null, + 'recurring' => null, + 'sentDate' => 'date-time' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'subject' => 'subject', + 'type' => 'type', + 'status' => 'status', + 'scheduledAt' => 'scheduledAt', + 'abTesting' => 'abTesting', + 'subjectA' => 'subjectA', + 'subjectB' => 'subjectB', + 'splitRule' => 'splitRule', + 'winnerCriteria' => 'winnerCriteria', + 'winnerDelay' => 'winnerDelay', + 'sendAtBestTime' => 'sendAtBestTime', + 'testSent' => 'testSent', + 'header' => 'header', + 'footer' => 'footer', + 'sender' => 'sender', + 'replyTo' => 'replyTo', + 'toField' => 'toField', + 'htmlContent' => 'htmlContent', + 'shareLink' => 'shareLink', + 'tag' => 'tag', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt', + 'inlineImageActivation' => 'inlineImageActivation', + 'mirrorActive' => 'mirrorActive', + 'recurring' => 'recurring', + 'sentDate' => 'sentDate' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'subject' => 'setSubject', + 'type' => 'setType', + 'status' => 'setStatus', + 'scheduledAt' => 'setScheduledAt', + 'abTesting' => 'setAbTesting', + 'subjectA' => 'setSubjectA', + 'subjectB' => 'setSubjectB', + 'splitRule' => 'setSplitRule', + 'winnerCriteria' => 'setWinnerCriteria', + 'winnerDelay' => 'setWinnerDelay', + 'sendAtBestTime' => 'setSendAtBestTime', + 'testSent' => 'setTestSent', + 'header' => 'setHeader', + 'footer' => 'setFooter', + 'sender' => 'setSender', + 'replyTo' => 'setReplyTo', + 'toField' => 'setToField', + 'htmlContent' => 'setHtmlContent', + 'shareLink' => 'setShareLink', + 'tag' => 'setTag', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt', + 'inlineImageActivation' => 'setInlineImageActivation', + 'mirrorActive' => 'setMirrorActive', + 'recurring' => 'setRecurring', + 'sentDate' => 'setSentDate' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'subject' => 'getSubject', + 'type' => 'getType', + 'status' => 'getStatus', + 'scheduledAt' => 'getScheduledAt', + 'abTesting' => 'getAbTesting', + 'subjectA' => 'getSubjectA', + 'subjectB' => 'getSubjectB', + 'splitRule' => 'getSplitRule', + 'winnerCriteria' => 'getWinnerCriteria', + 'winnerDelay' => 'getWinnerDelay', + 'sendAtBestTime' => 'getSendAtBestTime', + 'testSent' => 'getTestSent', + 'header' => 'getHeader', + 'footer' => 'getFooter', + 'sender' => 'getSender', + 'replyTo' => 'getReplyTo', + 'toField' => 'getToField', + 'htmlContent' => 'getHtmlContent', + 'shareLink' => 'getShareLink', + 'tag' => 'getTag', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt', + 'inlineImageActivation' => 'getInlineImageActivation', + 'mirrorActive' => 'getMirrorActive', + 'recurring' => 'getRecurring', + 'sentDate' => 'getSentDate' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const TYPE_CLASSIC = 'classic'; + const TYPE_TRIGGER = 'trigger'; + const STATUS_DRAFT = 'draft'; + const STATUS_SENT = 'sent'; + const STATUS_ARCHIVE = 'archive'; + const STATUS_QUEUED = 'queued'; + const STATUS_SUSPENDED = 'suspended'; + const STATUS_IN_PROCESS = 'in_process'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_CLASSIC, + self::TYPE_TRIGGER, + ]; + } + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getStatusAllowableValues() + { + return [ + self::STATUS_DRAFT, + self::STATUS_SENT, + self::STATUS_ARCHIVE, + self::STATUS_QUEUED, + self::STATUS_SUSPENDED, + self::STATUS_IN_PROCESS, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : null; + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + $this->container['abTesting'] = isset($data['abTesting']) ? $data['abTesting'] : null; + $this->container['subjectA'] = isset($data['subjectA']) ? $data['subjectA'] : null; + $this->container['subjectB'] = isset($data['subjectB']) ? $data['subjectB'] : null; + $this->container['splitRule'] = isset($data['splitRule']) ? $data['splitRule'] : null; + $this->container['winnerCriteria'] = isset($data['winnerCriteria']) ? $data['winnerCriteria'] : null; + $this->container['winnerDelay'] = isset($data['winnerDelay']) ? $data['winnerDelay'] : null; + $this->container['sendAtBestTime'] = isset($data['sendAtBestTime']) ? $data['sendAtBestTime'] : null; + $this->container['testSent'] = isset($data['testSent']) ? $data['testSent'] : null; + $this->container['header'] = isset($data['header']) ? $data['header'] : null; + $this->container['footer'] = isset($data['footer']) ? $data['footer'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['toField'] = isset($data['toField']) ? $data['toField'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['shareLink'] = isset($data['shareLink']) ? $data['shareLink'] : null; + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + $this->container['inlineImageActivation'] = isset($data['inlineImageActivation']) ? $data['inlineImageActivation'] : null; + $this->container['mirrorActive'] = isset($data['mirrorActive']) ? $data['mirrorActive'] : null; + $this->container['recurring'] = isset($data['recurring']) ? $data['recurring'] : null; + $this->container['sentDate'] = isset($data['sentDate']) ? $data['sentDate'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['type'] === null) { + $invalidProperties[] = "'type' can't be null"; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['status'] === null) { + $invalidProperties[] = "'status' can't be null"; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['testSent'] === null) { + $invalidProperties[] = "'testSent' can't be null"; + } + if ($this->container['header'] === null) { + $invalidProperties[] = "'header' can't be null"; + } + if ($this->container['footer'] === null) { + $invalidProperties[] = "'footer' can't be null"; + } + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ($this->container['replyTo'] === null) { + $invalidProperties[] = "'replyTo' can't be null"; + } + if ($this->container['toField'] === null) { + $invalidProperties[] = "'toField' can't be null"; + } + if ($this->container['htmlContent'] === null) { + $invalidProperties[] = "'htmlContent' can't be null"; + } + if ($this->container['tag'] === null) { + $invalidProperties[] = "'tag' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['type'] === null) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + if ($this->container['status'] === null) { + return false; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + return false; + } + if ($this->container['testSent'] === null) { + return false; + } + if ($this->container['header'] === null) { + return false; + } + if ($this->container['footer'] === null) { + return false; + } + if ($this->container['sender'] === null) { + return false; + } + if ($this->container['replyTo'] === null) { + return false; + } + if ($this->container['toField'] === null) { + return false; + } + if ($this->container['htmlContent'] === null) { + return false; + } + if ($this->container['tag'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the campaign + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the campaign. Only available if `abTesting` flag of the campaign is `false` + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of campaign + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + + /** + * Gets status + * + * @return string + */ + public function getStatus() + { + return $this->container['status']; + } + + /** + * Sets status + * + * @param string $status Status of the campaign + * + * @return $this + */ + public function setStatus($status) + { + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($status, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['status'] = $status; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which campaign is scheduled (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + + /** + * Gets abTesting + * + * @return bool + */ + public function getAbTesting() + { + return $this->container['abTesting']; + } + + /** + * Sets abTesting + * + * @param bool $abTesting Status of A/B Test for the campaign. abTesting = false means it is disabled, & abTesting = true means it is enabled. + * + * @return $this + */ + public function setAbTesting($abTesting) + { + $this->container['abTesting'] = $abTesting; + + return $this; + } + + /** + * Gets subjectA + * + * @return string + */ + public function getSubjectA() + { + return $this->container['subjectA']; + } + + /** + * Sets subjectA + * + * @param string $subjectA Subject A of the ab-test campaign. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSubjectA($subjectA) + { + $this->container['subjectA'] = $subjectA; + + return $this; + } + + /** + * Gets subjectB + * + * @return string + */ + public function getSubjectB() + { + return $this->container['subjectB']; + } + + /** + * Sets subjectB + * + * @param string $subjectB Subject B of the ab-test campaign. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSubjectB($subjectB) + { + $this->container['subjectB'] = $subjectB; + + return $this; + } + + /** + * Gets splitRule + * + * @return int + */ + public function getSplitRule() + { + return $this->container['splitRule']; + } + + /** + * Sets splitRule + * + * @param int $splitRule The size of your ab-test groups. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setSplitRule($splitRule) + { + $this->container['splitRule'] = $splitRule; + + return $this; + } + + /** + * Gets winnerCriteria + * + * @return string + */ + public function getWinnerCriteria() + { + return $this->container['winnerCriteria']; + } + + /** + * Sets winnerCriteria + * + * @param string $winnerCriteria Criteria for the winning version. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setWinnerCriteria($winnerCriteria) + { + $this->container['winnerCriteria'] = $winnerCriteria; + + return $this; + } + + /** + * Gets winnerDelay + * + * @return int + */ + public function getWinnerDelay() + { + return $this->container['winnerDelay']; + } + + /** + * Sets winnerDelay + * + * @param int $winnerDelay The duration of the test in hours at the end of which the winning version will be sent. Only available if `abTesting` flag of the campaign is `true` + * + * @return $this + */ + public function setWinnerDelay($winnerDelay) + { + $this->container['winnerDelay'] = $winnerDelay; + + return $this; + } + + /** + * Gets sendAtBestTime + * + * @return bool + */ + public function getSendAtBestTime() + { + return $this->container['sendAtBestTime']; + } + + /** + * Sets sendAtBestTime + * + * @param bool $sendAtBestTime It is true if you have chosen to send your campaign at best time, otherwise it is false + * + * @return $this + */ + public function setSendAtBestTime($sendAtBestTime) + { + $this->container['sendAtBestTime'] = $sendAtBestTime; + + return $this; + } + + /** + * Gets testSent + * + * @return bool + */ + public function getTestSent() + { + return $this->container['testSent']; + } + + /** + * Sets testSent + * + * @param bool $testSent Retrieved the status of test email sending. (true=Test email has been sent false=Test email has not been sent) + * + * @return $this + */ + public function setTestSent($testSent) + { + $this->container['testSent'] = $testSent; + + return $this; + } + + /** + * Gets header + * + * @return string + */ + public function getHeader() + { + return $this->container['header']; + } + + /** + * Sets header + * + * @param string $header Header of the campaign + * + * @return $this + */ + public function setHeader($header) + { + $this->container['header'] = $header; + + return $this; + } + + /** + * Gets footer + * + * @return string + */ + public function getFooter() + { + return $this->container['footer']; + } + + /** + * Sets footer + * + * @param string $footer Footer of the campaign + * + * @return $this + */ + public function setFooter($footer) + { + $this->container['footer'] = $footer; + + return $this; + } + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\GetExtendedCampaignOverviewSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\GetExtendedCampaignOverviewSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email defined as the \"Reply to\" of the campaign + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets toField + * + * @return string + */ + public function getToField() + { + return $this->container['toField']; + } + + /** + * Sets toField + * + * @param string $toField Customisation of the \"to\" field of the campaign + * + * @return $this + */ + public function setToField($toField) + { + $this->container['toField'] = $toField; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent HTML content of the campaign + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets shareLink + * + * @return string + */ + public function getShareLink() + { + return $this->container['shareLink']; + } + + /** + * Sets shareLink + * + * @param string $shareLink Link to share the campaign on social medias + * + * @return $this + */ + public function setShareLink($shareLink) + { + $this->container['shareLink'] = $shareLink; + + return $this; + } + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the campaign + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt UTC date-time of last modification of the campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + + /** + * Gets inlineImageActivation + * + * @return bool + */ + public function getInlineImageActivation() + { + return $this->container['inlineImageActivation']; + } + + /** + * Sets inlineImageActivation + * + * @param bool $inlineImageActivation Status of inline image. inlineImageActivation = false means image can’t be embedded, & inlineImageActivation = true means image can be embedded, in the email. + * + * @return $this + */ + public function setInlineImageActivation($inlineImageActivation) + { + $this->container['inlineImageActivation'] = $inlineImageActivation; + + return $this; + } + + /** + * Gets mirrorActive + * + * @return bool + */ + public function getMirrorActive() + { + return $this->container['mirrorActive']; + } + + /** + * Sets mirrorActive + * + * @param bool $mirrorActive Status of mirror links in campaign. mirrorActive = false means mirror links are deactivated, & mirrorActive = true means mirror links are activated, in the campaign + * + * @return $this + */ + public function setMirrorActive($mirrorActive) + { + $this->container['mirrorActive'] = $mirrorActive; + + return $this; + } + + /** + * Gets recurring + * + * @return bool + */ + public function getRecurring() + { + return $this->container['recurring']; + } + + /** + * Sets recurring + * + * @param bool $recurring FOR TRIGGER ONLY ! Type of trigger campaign.recurring = false means contact can receive the same Trigger campaign only once, & recurring = true means contact can receive the same Trigger campaign several times + * + * @return $this + */ + public function setRecurring($recurring) + { + $this->container['recurring'] = $recurring; + + return $this; + } + + /** + * Gets sentDate + * + * @return \DateTime + */ + public function getSentDate() + { + return $this->container['sentDate']; + } + + /** + * Sets sentDate + * + * @param \DateTime $sentDate Sent UTC date-time of the campaign (YYYY-MM-DDTHH:mm:ss.SSSZ). Only available if 'status' of the campaign is 'sent' + * + * @return $this + */ + public function setSentDate($sentDate) + { + $this->container['sentDate'] = $sentDate; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverviewSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverviewSender.php new file mode 100644 index 0000000..e74743c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignOverviewSender.php @@ -0,0 +1,332 @@ + 'string', + 'email' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Sender name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Sender email of the campaign + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignStats.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignStats.php new file mode 100644 index 0000000..8d1d649 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedCampaignStats.php @@ -0,0 +1,488 @@ + 'object', + 'campaignStats' => 'object[]', + 'mirrorClick' => 'int', + 'remaining' => 'int', + 'linksStats' => 'object', + 'statsByDomain' => '\SendinBlue\Client\Model\GetStatsByDomain' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'globalStats' => null, + 'campaignStats' => null, + 'mirrorClick' => 'int64', + 'remaining' => 'int64', + 'linksStats' => null, + 'statsByDomain' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'globalStats' => 'globalStats', + 'campaignStats' => 'campaignStats', + 'mirrorClick' => 'mirrorClick', + 'remaining' => 'remaining', + 'linksStats' => 'linksStats', + 'statsByDomain' => 'statsByDomain' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'globalStats' => 'setGlobalStats', + 'campaignStats' => 'setCampaignStats', + 'mirrorClick' => 'setMirrorClick', + 'remaining' => 'setRemaining', + 'linksStats' => 'setLinksStats', + 'statsByDomain' => 'setStatsByDomain' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'globalStats' => 'getGlobalStats', + 'campaignStats' => 'getCampaignStats', + 'mirrorClick' => 'getMirrorClick', + 'remaining' => 'getRemaining', + 'linksStats' => 'getLinksStats', + 'statsByDomain' => 'getStatsByDomain' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['globalStats'] = isset($data['globalStats']) ? $data['globalStats'] : null; + $this->container['campaignStats'] = isset($data['campaignStats']) ? $data['campaignStats'] : null; + $this->container['mirrorClick'] = isset($data['mirrorClick']) ? $data['mirrorClick'] : null; + $this->container['remaining'] = isset($data['remaining']) ? $data['remaining'] : null; + $this->container['linksStats'] = isset($data['linksStats']) ? $data['linksStats'] : null; + $this->container['statsByDomain'] = isset($data['statsByDomain']) ? $data['statsByDomain'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['globalStats'] === null) { + $invalidProperties[] = "'globalStats' can't be null"; + } + if ($this->container['campaignStats'] === null) { + $invalidProperties[] = "'campaignStats' can't be null"; + } + if ($this->container['mirrorClick'] === null) { + $invalidProperties[] = "'mirrorClick' can't be null"; + } + if ($this->container['remaining'] === null) { + $invalidProperties[] = "'remaining' can't be null"; + } + if ($this->container['linksStats'] === null) { + $invalidProperties[] = "'linksStats' can't be null"; + } + if ($this->container['statsByDomain'] === null) { + $invalidProperties[] = "'statsByDomain' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['globalStats'] === null) { + return false; + } + if ($this->container['campaignStats'] === null) { + return false; + } + if ($this->container['mirrorClick'] === null) { + return false; + } + if ($this->container['remaining'] === null) { + return false; + } + if ($this->container['linksStats'] === null) { + return false; + } + if ($this->container['statsByDomain'] === null) { + return false; + } + return true; + } + + + /** + * Gets globalStats + * + * @return object + */ + public function getGlobalStats() + { + return $this->container['globalStats']; + } + + /** + * Sets globalStats + * + * @param object $globalStats Overall statistics of the campaign + * + * @return $this + */ + public function setGlobalStats($globalStats) + { + $this->container['globalStats'] = $globalStats; + + return $this; + } + + /** + * Gets campaignStats + * + * @return object[] + */ + public function getCampaignStats() + { + return $this->container['campaignStats']; + } + + /** + * Sets campaignStats + * + * @param object[] $campaignStats List-wise statistics of the campaign. + * + * @return $this + */ + public function setCampaignStats($campaignStats) + { + $this->container['campaignStats'] = $campaignStats; + + return $this; + } + + /** + * Gets mirrorClick + * + * @return int + */ + public function getMirrorClick() + { + return $this->container['mirrorClick']; + } + + /** + * Sets mirrorClick + * + * @param int $mirrorClick Number of clicks on mirror link + * + * @return $this + */ + public function setMirrorClick($mirrorClick) + { + $this->container['mirrorClick'] = $mirrorClick; + + return $this; + } + + /** + * Gets remaining + * + * @return int + */ + public function getRemaining() + { + return $this->container['remaining']; + } + + /** + * Sets remaining + * + * @param int $remaining Number of remaning emails to send + * + * @return $this + */ + public function setRemaining($remaining) + { + $this->container['remaining'] = $remaining; + + return $this; + } + + /** + * Gets linksStats + * + * @return object + */ + public function getLinksStats() + { + return $this->container['linksStats']; + } + + /** + * Sets linksStats + * + * @param object $linksStats Statistics about the number of clicks for the links + * + * @return $this + */ + public function setLinksStats($linksStats) + { + $this->container['linksStats'] = $linksStats; + + return $this; + } + + /** + * Gets statsByDomain + * + * @return \SendinBlue\Client\Model\GetStatsByDomain + */ + public function getStatsByDomain() + { + return $this->container['statsByDomain']; + } + + /** + * Sets statsByDomain + * + * @param \SendinBlue\Client\Model\GetStatsByDomain $statsByDomain statsByDomain + * + * @return $this + */ + public function setStatsByDomain($statsByDomain) + { + $this->container['statsByDomain'] = $statsByDomain; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClient.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClient.php new file mode 100644 index 0000000..bb41125 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClient.php @@ -0,0 +1,452 @@ + 'string', + 'firstName' => 'string', + 'lastName' => 'string', + 'companyName' => 'string', + 'address' => '\SendinBlue\Client\Model\GetExtendedClientAddress' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'firstName' => null, + 'lastName' => null, + 'companyName' => null, + 'address' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'firstName' => 'firstName', + 'lastName' => 'lastName', + 'companyName' => 'companyName', + 'address' => 'address' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'firstName' => 'setFirstName', + 'lastName' => 'setLastName', + 'companyName' => 'setCompanyName', + 'address' => 'setAddress' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'firstName' => 'getFirstName', + 'lastName' => 'getLastName', + 'companyName' => 'getCompanyName', + 'address' => 'getAddress' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['firstName'] = isset($data['firstName']) ? $data['firstName'] : null; + $this->container['lastName'] = isset($data['lastName']) ? $data['lastName'] : null; + $this->container['companyName'] = isset($data['companyName']) ? $data['companyName'] : null; + $this->container['address'] = isset($data['address']) ? $data['address'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['firstName'] === null) { + $invalidProperties[] = "'firstName' can't be null"; + } + if ($this->container['lastName'] === null) { + $invalidProperties[] = "'lastName' can't be null"; + } + if ($this->container['companyName'] === null) { + $invalidProperties[] = "'companyName' can't be null"; + } + if ($this->container['address'] === null) { + $invalidProperties[] = "'address' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['firstName'] === null) { + return false; + } + if ($this->container['lastName'] === null) { + return false; + } + if ($this->container['companyName'] === null) { + return false; + } + if ($this->container['address'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Login Email + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets firstName + * + * @return string + */ + public function getFirstName() + { + return $this->container['firstName']; + } + + /** + * Sets firstName + * + * @param string $firstName First Name + * + * @return $this + */ + public function setFirstName($firstName) + { + $this->container['firstName'] = $firstName; + + return $this; + } + + /** + * Gets lastName + * + * @return string + */ + public function getLastName() + { + return $this->container['lastName']; + } + + /** + * Sets lastName + * + * @param string $lastName Last Name + * + * @return $this + */ + public function setLastName($lastName) + { + $this->container['lastName'] = $lastName; + + return $this; + } + + /** + * Gets companyName + * + * @return string + */ + public function getCompanyName() + { + return $this->container['companyName']; + } + + /** + * Sets companyName + * + * @param string $companyName Name of the company + * + * @return $this + */ + public function setCompanyName($companyName) + { + $this->container['companyName'] = $companyName; + + return $this; + } + + /** + * Gets address + * + * @return \SendinBlue\Client\Model\GetExtendedClientAddress + */ + public function getAddress() + { + return $this->container['address']; + } + + /** + * Sets address + * + * @param \SendinBlue\Client\Model\GetExtendedClientAddress $address address + * + * @return $this + */ + public function setAddress($address) + { + $this->container['address'] = $address; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClientAddress.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClientAddress.php new file mode 100644 index 0000000..be07159 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedClientAddress.php @@ -0,0 +1,417 @@ + 'string', + 'city' => 'string', + 'zipCode' => 'string', + 'country' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'street' => null, + 'city' => null, + 'zipCode' => null, + 'country' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'street' => 'street', + 'city' => 'city', + 'zipCode' => 'zipCode', + 'country' => 'country' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'street' => 'setStreet', + 'city' => 'setCity', + 'zipCode' => 'setZipCode', + 'country' => 'setCountry' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'street' => 'getStreet', + 'city' => 'getCity', + 'zipCode' => 'getZipCode', + 'country' => 'getCountry' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['street'] = isset($data['street']) ? $data['street'] : null; + $this->container['city'] = isset($data['city']) ? $data['city'] : null; + $this->container['zipCode'] = isset($data['zipCode']) ? $data['zipCode'] : null; + $this->container['country'] = isset($data['country']) ? $data['country'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['street'] === null) { + $invalidProperties[] = "'street' can't be null"; + } + if ($this->container['city'] === null) { + $invalidProperties[] = "'city' can't be null"; + } + if ($this->container['zipCode'] === null) { + $invalidProperties[] = "'zipCode' can't be null"; + } + if ($this->container['country'] === null) { + $invalidProperties[] = "'country' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['street'] === null) { + return false; + } + if ($this->container['city'] === null) { + return false; + } + if ($this->container['zipCode'] === null) { + return false; + } + if ($this->container['country'] === null) { + return false; + } + return true; + } + + + /** + * Gets street + * + * @return string + */ + public function getStreet() + { + return $this->container['street']; + } + + /** + * Sets street + * + * @param string $street Street information + * + * @return $this + */ + public function setStreet($street) + { + $this->container['street'] = $street; + + return $this; + } + + /** + * Gets city + * + * @return string + */ + public function getCity() + { + return $this->container['city']; + } + + /** + * Sets city + * + * @param string $city City information + * + * @return $this + */ + public function setCity($city) + { + $this->container['city'] = $city; + + return $this; + } + + /** + * Gets zipCode + * + * @return string + */ + public function getZipCode() + { + return $this->container['zipCode']; + } + + /** + * Sets zipCode + * + * @param string $zipCode Zip Code information + * + * @return $this + */ + public function setZipCode($zipCode) + { + $this->container['zipCode'] = $zipCode; + + return $this; + } + + /** + * Gets country + * + * @return string + */ + public function getCountry() + { + return $this->container['country']; + } + + /** + * Sets country + * + * @param string $country Country information + * + * @return $this + */ + public function setCountry($country) + { + $this->container['country'] = $country; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetails.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetails.php new file mode 100644 index 0000000..797e2e6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetails.php @@ -0,0 +1,626 @@ + 'string', + 'id' => 'int', + 'emailBlacklisted' => 'bool', + 'smsBlacklisted' => 'bool', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime', + 'listIds' => 'int[]', + 'listUnsubscribed' => 'int[]', + 'attributes' => 'object', + 'statistics' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatistics' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'id' => 'int64', + 'emailBlacklisted' => null, + 'smsBlacklisted' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time', + 'listIds' => 'int64', + 'listUnsubscribed' => 'int64', + 'attributes' => null, + 'statistics' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'id' => 'id', + 'emailBlacklisted' => 'emailBlacklisted', + 'smsBlacklisted' => 'smsBlacklisted', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt', + 'listIds' => 'listIds', + 'listUnsubscribed' => 'listUnsubscribed', + 'attributes' => 'attributes', + 'statistics' => 'statistics' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'id' => 'setId', + 'emailBlacklisted' => 'setEmailBlacklisted', + 'smsBlacklisted' => 'setSmsBlacklisted', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt', + 'listIds' => 'setListIds', + 'listUnsubscribed' => 'setListUnsubscribed', + 'attributes' => 'setAttributes', + 'statistics' => 'setStatistics' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'id' => 'getId', + 'emailBlacklisted' => 'getEmailBlacklisted', + 'smsBlacklisted' => 'getSmsBlacklisted', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt', + 'listIds' => 'getListIds', + 'listUnsubscribed' => 'getListUnsubscribed', + 'attributes' => 'getAttributes', + 'statistics' => 'getStatistics' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['emailBlacklisted'] = isset($data['emailBlacklisted']) ? $data['emailBlacklisted'] : null; + $this->container['smsBlacklisted'] = isset($data['smsBlacklisted']) ? $data['smsBlacklisted'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + $this->container['listUnsubscribed'] = isset($data['listUnsubscribed']) ? $data['listUnsubscribed'] : null; + $this->container['attributes'] = isset($data['attributes']) ? $data['attributes'] : null; + $this->container['statistics'] = isset($data['statistics']) ? $data['statistics'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['emailBlacklisted'] === null) { + $invalidProperties[] = "'emailBlacklisted' can't be null"; + } + if ($this->container['smsBlacklisted'] === null) { + $invalidProperties[] = "'smsBlacklisted' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + if ($this->container['listIds'] === null) { + $invalidProperties[] = "'listIds' can't be null"; + } + if ($this->container['attributes'] === null) { + $invalidProperties[] = "'attributes' can't be null"; + } + if ($this->container['statistics'] === null) { + $invalidProperties[] = "'statistics' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + if ($this->container['id'] === null) { + return false; + } + if ($this->container['emailBlacklisted'] === null) { + return false; + } + if ($this->container['smsBlacklisted'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + if ($this->container['listIds'] === null) { + return false; + } + if ($this->container['attributes'] === null) { + return false; + } + if ($this->container['statistics'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address of the contact for which you requested the details + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the contact for which you requested the details + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets emailBlacklisted + * + * @return bool + */ + public function getEmailBlacklisted() + { + return $this->container['emailBlacklisted']; + } + + /** + * Sets emailBlacklisted + * + * @param bool $emailBlacklisted Blacklist status for email campaigns (true=blacklisted, false=not blacklisted) + * + * @return $this + */ + public function setEmailBlacklisted($emailBlacklisted) + { + $this->container['emailBlacklisted'] = $emailBlacklisted; + + return $this; + } + + /** + * Gets smsBlacklisted + * + * @return bool + */ + public function getSmsBlacklisted() + { + return $this->container['smsBlacklisted']; + } + + /** + * Sets smsBlacklisted + * + * @param bool $smsBlacklisted Blacklist status for SMS campaigns (true=blacklisted, false=not blacklisted) + * + * @return $this + */ + public function setSmsBlacklisted($smsBlacklisted) + { + $this->container['smsBlacklisted'] = $smsBlacklisted; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the contact (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt Last modification UTC date-time of the contact (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds listIds + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + + /** + * Gets listUnsubscribed + * + * @return int[] + */ + public function getListUnsubscribed() + { + return $this->container['listUnsubscribed']; + } + + /** + * Sets listUnsubscribed + * + * @param int[] $listUnsubscribed listUnsubscribed + * + * @return $this + */ + public function setListUnsubscribed($listUnsubscribed) + { + $this->container['listUnsubscribed'] = $listUnsubscribed; + + return $this; + } + + /** + * Gets attributes + * + * @return object + */ + public function getAttributes() + { + return $this->container['attributes']; + } + + /** + * Sets attributes + * + * @param object $attributes Set of attributes of the contact + * + * @return $this + */ + public function setAttributes($attributes) + { + $this->container['attributes'] = $attributes; + + return $this; + } + + /** + * Gets statistics + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatistics + */ + public function getStatistics() + { + return $this->container['statistics']; + } + + /** + * Sets statistics + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatistics $statistics statistics + * + * @return $this + */ + public function setStatistics($statistics) + { + $this->container['statistics'] = $statistics; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatistics.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatistics.php new file mode 100644 index 0000000..19abe2c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatistics.php @@ -0,0 +1,513 @@ + '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'hardBounces' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'softBounces' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'complaints' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[]', + 'unsubscriptions' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptions', + 'opened' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsOpened[]', + 'clicked' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsClicked[]', + 'transacAttributes' => 'object[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'messagesSent' => null, + 'hardBounces' => null, + 'softBounces' => null, + 'complaints' => null, + 'unsubscriptions' => null, + 'opened' => null, + 'clicked' => null, + 'transacAttributes' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'messagesSent' => 'messagesSent', + 'hardBounces' => 'hardBounces', + 'softBounces' => 'softBounces', + 'complaints' => 'complaints', + 'unsubscriptions' => 'unsubscriptions', + 'opened' => 'opened', + 'clicked' => 'clicked', + 'transacAttributes' => 'transacAttributes' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'messagesSent' => 'setMessagesSent', + 'hardBounces' => 'setHardBounces', + 'softBounces' => 'setSoftBounces', + 'complaints' => 'setComplaints', + 'unsubscriptions' => 'setUnsubscriptions', + 'opened' => 'setOpened', + 'clicked' => 'setClicked', + 'transacAttributes' => 'setTransacAttributes' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'messagesSent' => 'getMessagesSent', + 'hardBounces' => 'getHardBounces', + 'softBounces' => 'getSoftBounces', + 'complaints' => 'getComplaints', + 'unsubscriptions' => 'getUnsubscriptions', + 'opened' => 'getOpened', + 'clicked' => 'getClicked', + 'transacAttributes' => 'getTransacAttributes' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['messagesSent'] = isset($data['messagesSent']) ? $data['messagesSent'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['complaints'] = isset($data['complaints']) ? $data['complaints'] : null; + $this->container['unsubscriptions'] = isset($data['unsubscriptions']) ? $data['unsubscriptions'] : null; + $this->container['opened'] = isset($data['opened']) ? $data['opened'] : null; + $this->container['clicked'] = isset($data['clicked']) ? $data['clicked'] : null; + $this->container['transacAttributes'] = isset($data['transacAttributes']) ? $data['transacAttributes'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets messagesSent + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getMessagesSent() + { + return $this->container['messagesSent']; + } + + /** + * Sets messagesSent + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $messagesSent Listing of the sent campaign for the contact + * + * @return $this + */ + public function setMessagesSent($messagesSent) + { + $this->container['messagesSent'] = $messagesSent; + + return $this; + } + + /** + * Gets hardBounces + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $hardBounces Listing of the hardbounes generated by the contact + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets softBounces + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $softBounces Listing of the softbounes generated by the contact + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets complaints + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] + */ + public function getComplaints() + { + return $this->container['complaints']; + } + + /** + * Sets complaints + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsMessagesSent[] $complaints Listing of the complaints generated by the contact + * + * @return $this + */ + public function setComplaints($complaints) + { + $this->container['complaints'] = $complaints; + + return $this; + } + + /** + * Gets unsubscriptions + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptions + */ + public function getUnsubscriptions() + { + return $this->container['unsubscriptions']; + } + + /** + * Sets unsubscriptions + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptions $unsubscriptions unsubscriptions + * + * @return $this + */ + public function setUnsubscriptions($unsubscriptions) + { + $this->container['unsubscriptions'] = $unsubscriptions; + + return $this; + } + + /** + * Gets opened + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsOpened[] + */ + public function getOpened() + { + return $this->container['opened']; + } + + /** + * Sets opened + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsOpened[] $opened Listing of the openings generated by the contact + * + * @return $this + */ + public function setOpened($opened) + { + $this->container['opened'] = $opened; + + return $this; + } + + /** + * Gets clicked + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsClicked[] + */ + public function getClicked() + { + return $this->container['clicked']; + } + + /** + * Sets clicked + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsClicked[] $clicked Listing of the clicks generated by the contact + * + * @return $this + */ + public function setClicked($clicked) + { + $this->container['clicked'] = $clicked; + + return $this; + } + + /** + * Gets transacAttributes + * + * @return object[] + */ + public function getTransacAttributes() + { + return $this->container['transacAttributes']; + } + + /** + * Sets transacAttributes + * + * @param object[] $transacAttributes Listing of the transactional attributes for the contact + * + * @return $this + */ + public function setTransacAttributes($transacAttributes) + { + $this->container['transacAttributes'] = $transacAttributes; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsClicked.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsClicked.php new file mode 100644 index 0000000..e328d3f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsClicked.php @@ -0,0 +1,344 @@ + 'int', + 'links' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsLinks[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaignId' => 'int64', + 'links' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaignId' => 'campaignId', + 'links' => 'links' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaignId' => 'setCampaignId', + 'links' => 'setLinks' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaignId' => 'getCampaignId', + 'links' => 'getLinks' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaignId'] = isset($data['campaignId']) ? $data['campaignId'] : null; + $this->container['links'] = isset($data['links']) ? $data['links'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['campaignId'] === null) { + $invalidProperties[] = "'campaignId' can't be null"; + } + if ($this->container['links'] === null) { + $invalidProperties[] = "'links' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['campaignId'] === null) { + return false; + } + if ($this->container['links'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaignId + * + * @return int + */ + public function getCampaignId() + { + return $this->container['campaignId']; + } + + /** + * Sets campaignId + * + * @param int $campaignId ID of the campaign which generated the event + * + * @return $this + */ + public function setCampaignId($campaignId) + { + $this->container['campaignId'] = $campaignId; + + return $this; + } + + /** + * Gets links + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsLinks[] + */ + public function getLinks() + { + return $this->container['links']; + } + + /** + * Sets links + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsLinks[] $links Listing of the clicked links for the campaign + * + * @return $this + */ + public function setLinks($links) + { + $this->container['links'] = $links; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsLinks.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsLinks.php new file mode 100644 index 0000000..32fc9e2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsLinks.php @@ -0,0 +1,416 @@ + 'int', + 'eventTime' => '\DateTime', + 'ip' => 'string', + 'url' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'count' => 'int64', + 'eventTime' => 'date-time', + 'ip' => null, + 'url' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'count' => 'count', + 'eventTime' => 'eventTime', + 'ip' => 'ip', + 'url' => 'url' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'count' => 'setCount', + 'eventTime' => 'setEventTime', + 'ip' => 'setIp', + 'url' => 'setUrl' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'count' => 'getCount', + 'eventTime' => 'getEventTime', + 'ip' => 'getIp', + 'url' => 'getUrl' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + $this->container['eventTime'] = isset($data['eventTime']) ? $data['eventTime'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + $this->container['url'] = isset($data['url']) ? $data['url'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + if ($this->container['eventTime'] === null) { + $invalidProperties[] = "'eventTime' can't be null"; + } + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + if ($this->container['url'] === null) { + $invalidProperties[] = "'url' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['count'] === null) { + return false; + } + if ($this->container['eventTime'] === null) { + return false; + } + if ($this->container['ip'] === null) { + return false; + } + if ($this->container['url'] === null) { + return false; + } + return true; + } + + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of clicks on this link for the campaign + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + + /** + * Gets eventTime + * + * @return \DateTime + */ + public function getEventTime() + { + return $this->container['eventTime']; + } + + /** + * Sets eventTime + * + * @param \DateTime $eventTime UTC date-time of the event + * + * @return $this + */ + public function setEventTime($eventTime) + { + $this->container['eventTime'] = $eventTime; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip IP from which the user has clicked on the link + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + + /** + * Gets url + * + * @return string + */ + public function getUrl() + { + return $this->container['url']; + } + + /** + * Sets url + * + * @param string $url URL of the clicked link + * + * @return $this + */ + public function setUrl($url) + { + $this->container['url'] = $url; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsMessagesSent.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsMessagesSent.php new file mode 100644 index 0000000..608fd98 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsMessagesSent.php @@ -0,0 +1,344 @@ + 'int', + 'eventTime' => '\DateTime' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaignId' => 'int64', + 'eventTime' => 'date-time' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaignId' => 'campaignId', + 'eventTime' => 'eventTime' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaignId' => 'setCampaignId', + 'eventTime' => 'setEventTime' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaignId' => 'getCampaignId', + 'eventTime' => 'getEventTime' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaignId'] = isset($data['campaignId']) ? $data['campaignId'] : null; + $this->container['eventTime'] = isset($data['eventTime']) ? $data['eventTime'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['campaignId'] === null) { + $invalidProperties[] = "'campaignId' can't be null"; + } + if ($this->container['eventTime'] === null) { + $invalidProperties[] = "'eventTime' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['campaignId'] === null) { + return false; + } + if ($this->container['eventTime'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaignId + * + * @return int + */ + public function getCampaignId() + { + return $this->container['campaignId']; + } + + /** + * Sets campaignId + * + * @param int $campaignId ID of the campaign which generated the event + * + * @return $this + */ + public function setCampaignId($campaignId) + { + $this->container['campaignId'] = $campaignId; + + return $this; + } + + /** + * Gets eventTime + * + * @return \DateTime + */ + public function getEventTime() + { + return $this->container['eventTime']; + } + + /** + * Sets eventTime + * + * @param \DateTime $eventTime UTC date-time of the event + * + * @return $this + */ + public function setEventTime($eventTime) + { + $this->container['eventTime'] = $eventTime; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsOpened.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsOpened.php new file mode 100644 index 0000000..eedb44d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsOpened.php @@ -0,0 +1,416 @@ + 'int', + 'count' => 'int', + 'eventTime' => '\DateTime', + 'ip' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaignId' => 'int64', + 'count' => 'int64', + 'eventTime' => 'date-time', + 'ip' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaignId' => 'campaignId', + 'count' => 'count', + 'eventTime' => 'eventTime', + 'ip' => 'ip' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaignId' => 'setCampaignId', + 'count' => 'setCount', + 'eventTime' => 'setEventTime', + 'ip' => 'setIp' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaignId' => 'getCampaignId', + 'count' => 'getCount', + 'eventTime' => 'getEventTime', + 'ip' => 'getIp' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaignId'] = isset($data['campaignId']) ? $data['campaignId'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + $this->container['eventTime'] = isset($data['eventTime']) ? $data['eventTime'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['campaignId'] === null) { + $invalidProperties[] = "'campaignId' can't be null"; + } + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + if ($this->container['eventTime'] === null) { + $invalidProperties[] = "'eventTime' can't be null"; + } + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['campaignId'] === null) { + return false; + } + if ($this->container['count'] === null) { + return false; + } + if ($this->container['eventTime'] === null) { + return false; + } + if ($this->container['ip'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaignId + * + * @return int + */ + public function getCampaignId() + { + return $this->container['campaignId']; + } + + /** + * Sets campaignId + * + * @param int $campaignId ID of the campaign which generated the event + * + * @return $this + */ + public function setCampaignId($campaignId) + { + $this->container['campaignId'] = $campaignId; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of openings for the campaign + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + + /** + * Gets eventTime + * + * @return \DateTime + */ + public function getEventTime() + { + return $this->container['eventTime']; + } + + /** + * Sets eventTime + * + * @param \DateTime $eventTime UTC date-time of the event + * + * @return $this + */ + public function setEventTime($eventTime) + { + $this->container['eventTime'] = $eventTime; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip IP from which the user has opened the email + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptions.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptions.php new file mode 100644 index 0000000..7b4d171 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptions.php @@ -0,0 +1,345 @@ + '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription[]', + 'adminUnsubscription' => '\SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'userUnsubscription' => null, + 'adminUnsubscription' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'userUnsubscription' => 'userUnsubscription', + 'adminUnsubscription' => 'adminUnsubscription' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'userUnsubscription' => 'setUserUnsubscription', + 'adminUnsubscription' => 'setAdminUnsubscription' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'userUnsubscription' => 'getUserUnsubscription', + 'adminUnsubscription' => 'getAdminUnsubscription' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['userUnsubscription'] = isset($data['userUnsubscription']) ? $data['userUnsubscription'] : null; + $this->container['adminUnsubscription'] = isset($data['adminUnsubscription']) ? $data['adminUnsubscription'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['userUnsubscription'] === null) { + $invalidProperties[] = "'userUnsubscription' can't be null"; + } + if ($this->container['adminUnsubscription'] === null) { + $invalidProperties[] = "'adminUnsubscription' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['userUnsubscription'] === null) { + return false; + } + if ($this->container['adminUnsubscription'] === null) { + return false; + } + return true; + } + + + /** + * Gets userUnsubscription + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription[] + */ + public function getUserUnsubscription() + { + return $this->container['userUnsubscription']; + } + + /** + * Sets userUnsubscription + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription[] $userUnsubscription Contact unsubscribe via unsubscription link in a campaign + * + * @return $this + */ + public function setUserUnsubscription($userUnsubscription) + { + $this->container['userUnsubscription'] = $userUnsubscription; + + return $this; + } + + /** + * Gets adminUnsubscription + * + * @return \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription[] + */ + public function getAdminUnsubscription() + { + return $this->container['adminUnsubscription']; + } + + /** + * Sets adminUnsubscription + * + * @param \SendinBlue\Client\Model\GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription[] $adminUnsubscription Contact has been unsubscribed from the administrator + * + * @return $this + */ + public function setAdminUnsubscription($adminUnsubscription) + { + $this->container['adminUnsubscription'] = $adminUnsubscription; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription.php new file mode 100644 index 0000000..604fdff --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsAdminUnsubscription.php @@ -0,0 +1,344 @@ + '\DateTime', + 'ip' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'eventTime' => 'date-time', + 'ip' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'eventTime' => 'eventTime', + 'ip' => 'ip' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'eventTime' => 'setEventTime', + 'ip' => 'setIp' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'eventTime' => 'getEventTime', + 'ip' => 'getIp' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['eventTime'] = isset($data['eventTime']) ? $data['eventTime'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['eventTime'] === null) { + $invalidProperties[] = "'eventTime' can't be null"; + } + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['eventTime'] === null) { + return false; + } + if ($this->container['ip'] === null) { + return false; + } + return true; + } + + + /** + * Gets eventTime + * + * @return \DateTime + */ + public function getEventTime() + { + return $this->container['eventTime']; + } + + /** + * Sets eventTime + * + * @param \DateTime $eventTime UTC date-time of the event + * + * @return $this + */ + public function setEventTime($eventTime) + { + $this->container['eventTime'] = $eventTime; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip IP from which the user has been unsubscribed + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription.php new file mode 100644 index 0000000..5bb6af1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedContactDetailsStatisticsUnsubscriptionsUserUnsubscription.php @@ -0,0 +1,380 @@ + 'int', + 'eventTime' => '\DateTime', + 'ip' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaignId' => 'int64', + 'eventTime' => 'date-time', + 'ip' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaignId' => 'campaignId', + 'eventTime' => 'eventTime', + 'ip' => 'ip' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaignId' => 'setCampaignId', + 'eventTime' => 'setEventTime', + 'ip' => 'setIp' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaignId' => 'getCampaignId', + 'eventTime' => 'getEventTime', + 'ip' => 'getIp' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaignId'] = isset($data['campaignId']) ? $data['campaignId'] : null; + $this->container['eventTime'] = isset($data['eventTime']) ? $data['eventTime'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['campaignId'] === null) { + $invalidProperties[] = "'campaignId' can't be null"; + } + if ($this->container['eventTime'] === null) { + $invalidProperties[] = "'eventTime' can't be null"; + } + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['campaignId'] === null) { + return false; + } + if ($this->container['eventTime'] === null) { + return false; + } + if ($this->container['ip'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaignId + * + * @return int + */ + public function getCampaignId() + { + return $this->container['campaignId']; + } + + /** + * Sets campaignId + * + * @param int $campaignId ID of the campaign which generated the event + * + * @return $this + */ + public function setCampaignId($campaignId) + { + $this->container['campaignId'] = $campaignId; + + return $this; + } + + /** + * Gets eventTime + * + * @return \DateTime + */ + public function getEventTime() + { + return $this->container['eventTime']; + } + + /** + * Sets eventTime + * + * @param \DateTime $eventTime UTC date-time of the event + * + * @return $this + */ + public function setEventTime($eventTime) + { + $this->container['eventTime'] = $eventTime; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip IP from which the user has unsubscribed + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedList.php new file mode 100644 index 0000000..75861cb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedList.php @@ -0,0 +1,548 @@ + 'int', + 'name' => 'string', + 'totalBlacklisted' => 'int', + 'totalSubscribers' => 'int', + 'folderId' => 'int', + 'createdAt' => '\DateTime', + 'campaignStats' => '\SendinBlue\Client\Model\GetExtendedListCampaignStats[]', + 'dynamicList' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'totalBlacklisted' => 'int64', + 'totalSubscribers' => 'int64', + 'folderId' => 'int64', + 'createdAt' => 'date-time', + 'campaignStats' => null, + 'dynamicList' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'totalBlacklisted' => 'totalBlacklisted', + 'totalSubscribers' => 'totalSubscribers', + 'folderId' => 'folderId', + 'createdAt' => 'createdAt', + 'campaignStats' => 'campaignStats', + 'dynamicList' => 'dynamicList' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'totalBlacklisted' => 'setTotalBlacklisted', + 'totalSubscribers' => 'setTotalSubscribers', + 'folderId' => 'setFolderId', + 'createdAt' => 'setCreatedAt', + 'campaignStats' => 'setCampaignStats', + 'dynamicList' => 'setDynamicList' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'totalBlacklisted' => 'getTotalBlacklisted', + 'totalSubscribers' => 'getTotalSubscribers', + 'folderId' => 'getFolderId', + 'createdAt' => 'getCreatedAt', + 'campaignStats' => 'getCampaignStats', + 'dynamicList' => 'getDynamicList' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['totalBlacklisted'] = isset($data['totalBlacklisted']) ? $data['totalBlacklisted'] : null; + $this->container['totalSubscribers'] = isset($data['totalSubscribers']) ? $data['totalSubscribers'] : null; + $this->container['folderId'] = isset($data['folderId']) ? $data['folderId'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['campaignStats'] = isset($data['campaignStats']) ? $data['campaignStats'] : null; + $this->container['dynamicList'] = isset($data['dynamicList']) ? $data['dynamicList'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['totalBlacklisted'] === null) { + $invalidProperties[] = "'totalBlacklisted' can't be null"; + } + if ($this->container['totalSubscribers'] === null) { + $invalidProperties[] = "'totalSubscribers' can't be null"; + } + if ($this->container['folderId'] === null) { + $invalidProperties[] = "'folderId' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['totalBlacklisted'] === null) { + return false; + } + if ($this->container['totalSubscribers'] === null) { + return false; + } + if ($this->container['folderId'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the list + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the list + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets totalBlacklisted + * + * @return int + */ + public function getTotalBlacklisted() + { + return $this->container['totalBlacklisted']; + } + + /** + * Sets totalBlacklisted + * + * @param int $totalBlacklisted Number of blacklisted contacts in the list + * + * @return $this + */ + public function setTotalBlacklisted($totalBlacklisted) + { + $this->container['totalBlacklisted'] = $totalBlacklisted; + + return $this; + } + + /** + * Gets totalSubscribers + * + * @return int + */ + public function getTotalSubscribers() + { + return $this->container['totalSubscribers']; + } + + /** + * Sets totalSubscribers + * + * @param int $totalSubscribers Number of contacts in the list + * + * @return $this + */ + public function setTotalSubscribers($totalSubscribers) + { + $this->container['totalSubscribers'] = $totalSubscribers; + + return $this; + } + + /** + * Gets folderId + * + * @return int + */ + public function getFolderId() + { + return $this->container['folderId']; + } + + /** + * Sets folderId + * + * @param int $folderId ID of the folder + * + * @return $this + */ + public function setFolderId($folderId) + { + $this->container['folderId'] = $folderId; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the list (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets campaignStats + * + * @return \SendinBlue\Client\Model\GetExtendedListCampaignStats[] + */ + public function getCampaignStats() + { + return $this->container['campaignStats']; + } + + /** + * Sets campaignStats + * + * @param \SendinBlue\Client\Model\GetExtendedListCampaignStats[] $campaignStats campaignStats + * + * @return $this + */ + public function setCampaignStats($campaignStats) + { + $this->container['campaignStats'] = $campaignStats; + + return $this; + } + + /** + * Gets dynamicList + * + * @return bool + */ + public function getDynamicList() + { + return $this->container['dynamicList']; + } + + /** + * Sets dynamicList + * + * @param bool $dynamicList Status telling if the list is dynamic or not (true=dynamic, false=not dynamic) + * + * @return $this + */ + public function setDynamicList($dynamicList) + { + $this->container['dynamicList'] = $dynamicList; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedListCampaignStats.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedListCampaignStats.php new file mode 100644 index 0000000..90143a2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetExtendedListCampaignStats.php @@ -0,0 +1,344 @@ + 'int', + 'stats' => '\SendinBlue\Client\Model\GetCampaignStats' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaignId' => 'int64', + 'stats' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaignId' => 'campaignId', + 'stats' => 'stats' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaignId' => 'setCampaignId', + 'stats' => 'setStats' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaignId' => 'getCampaignId', + 'stats' => 'getStats' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaignId'] = isset($data['campaignId']) ? $data['campaignId'] : null; + $this->container['stats'] = isset($data['stats']) ? $data['stats'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['campaignId'] === null) { + $invalidProperties[] = "'campaignId' can't be null"; + } + if ($this->container['stats'] === null) { + $invalidProperties[] = "'stats' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['campaignId'] === null) { + return false; + } + if ($this->container['stats'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaignId + * + * @return int + */ + public function getCampaignId() + { + return $this->container['campaignId']; + } + + /** + * Sets campaignId + * + * @param int $campaignId ID of the campaign + * + * @return $this + */ + public function setCampaignId($campaignId) + { + $this->container['campaignId'] = $campaignId; + + return $this; + } + + /** + * Gets stats + * + * @return \SendinBlue\Client\Model\GetCampaignStats + */ + public function getStats() + { + return $this->container['stats']; + } + + /** + * Sets stats + * + * @param \SendinBlue\Client\Model\GetCampaignStats $stats stats + * + * @return $this + */ + public function setStats($stats) + { + $this->container['stats'] = $stats; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolder.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolder.php new file mode 100644 index 0000000..bf3d2a8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolder.php @@ -0,0 +1,452 @@ + 'int', + 'name' => 'string', + 'totalBlacklisted' => 'int', + 'totalSubscribers' => 'int', + 'uniqueSubscribers' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'totalBlacklisted' => 'int64', + 'totalSubscribers' => 'int64', + 'uniqueSubscribers' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'totalBlacklisted' => 'totalBlacklisted', + 'totalSubscribers' => 'totalSubscribers', + 'uniqueSubscribers' => 'uniqueSubscribers' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'totalBlacklisted' => 'setTotalBlacklisted', + 'totalSubscribers' => 'setTotalSubscribers', + 'uniqueSubscribers' => 'setUniqueSubscribers' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'totalBlacklisted' => 'getTotalBlacklisted', + 'totalSubscribers' => 'getTotalSubscribers', + 'uniqueSubscribers' => 'getUniqueSubscribers' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['totalBlacklisted'] = isset($data['totalBlacklisted']) ? $data['totalBlacklisted'] : null; + $this->container['totalSubscribers'] = isset($data['totalSubscribers']) ? $data['totalSubscribers'] : null; + $this->container['uniqueSubscribers'] = isset($data['uniqueSubscribers']) ? $data['uniqueSubscribers'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['totalBlacklisted'] === null) { + $invalidProperties[] = "'totalBlacklisted' can't be null"; + } + if ($this->container['totalSubscribers'] === null) { + $invalidProperties[] = "'totalSubscribers' can't be null"; + } + if ($this->container['uniqueSubscribers'] === null) { + $invalidProperties[] = "'uniqueSubscribers' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['totalBlacklisted'] === null) { + return false; + } + if ($this->container['totalSubscribers'] === null) { + return false; + } + if ($this->container['uniqueSubscribers'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the folder + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the folder + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets totalBlacklisted + * + * @return int + */ + public function getTotalBlacklisted() + { + return $this->container['totalBlacklisted']; + } + + /** + * Sets totalBlacklisted + * + * @param int $totalBlacklisted Number of blacklisted contacts in the folder + * + * @return $this + */ + public function setTotalBlacklisted($totalBlacklisted) + { + $this->container['totalBlacklisted'] = $totalBlacklisted; + + return $this; + } + + /** + * Gets totalSubscribers + * + * @return int + */ + public function getTotalSubscribers() + { + return $this->container['totalSubscribers']; + } + + /** + * Sets totalSubscribers + * + * @param int $totalSubscribers Number of contacts in the folder + * + * @return $this + */ + public function setTotalSubscribers($totalSubscribers) + { + $this->container['totalSubscribers'] = $totalSubscribers; + + return $this; + } + + /** + * Gets uniqueSubscribers + * + * @return int + */ + public function getUniqueSubscribers() + { + return $this->container['uniqueSubscribers']; + } + + /** + * Sets uniqueSubscribers + * + * @param int $uniqueSubscribers Number of unique contacts in the folder + * + * @return $this + */ + public function setUniqueSubscribers($uniqueSubscribers) + { + $this->container['uniqueSubscribers'] = $uniqueSubscribers; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolderLists.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolderLists.php new file mode 100644 index 0000000..b8b6da2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolderLists.php @@ -0,0 +1,344 @@ + 'object[]', + 'count' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'lists' => null, + 'count' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'lists' => 'lists', + 'count' => 'count' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'lists' => 'setLists', + 'count' => 'setCount' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'lists' => 'getLists', + 'count' => 'getCount' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['lists'] = isset($data['lists']) ? $data['lists'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['lists'] === null) { + $invalidProperties[] = "'lists' can't be null"; + } + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['lists'] === null) { + return false; + } + if ($this->container['count'] === null) { + return false; + } + return true; + } + + + /** + * Gets lists + * + * @return object[] + */ + public function getLists() + { + return $this->container['lists']; + } + + /** + * Sets lists + * + * @param object[] $lists lists + * + * @return $this + */ + public function setLists($lists) + { + $this->container['lists'] = $lists; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of lists in the folder + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolders.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolders.php new file mode 100644 index 0000000..095d19a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetFolders.php @@ -0,0 +1,332 @@ + 'object[]', + 'count' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'folders' => null, + 'count' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'folders' => 'folders', + 'count' => 'count' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'folders' => 'setFolders', + 'count' => 'setCount' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'folders' => 'getFolders', + 'count' => 'getCount' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['folders'] = isset($data['folders']) ? $data['folders'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets folders + * + * @return object[] + */ + public function getFolders() + { + return $this->container['folders']; + } + + /** + * Sets folders + * + * @param object[] $folders folders + * + * @return $this + */ + public function setFolders($folders) + { + $this->container['folders'] = $folders; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of folders available in your account + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIp.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIp.php new file mode 100644 index 0000000..027a39e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIp.php @@ -0,0 +1,416 @@ + 'int', + 'ip' => 'string', + 'active' => 'bool', + 'domain' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'ip' => null, + 'active' => null, + 'domain' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'ip' => 'ip', + 'active' => 'active', + 'domain' => 'domain' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'ip' => 'setIp', + 'active' => 'setActive', + 'domain' => 'setDomain' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'ip' => 'getIp', + 'active' => 'getActive', + 'domain' => 'getDomain' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + $this->container['active'] = isset($data['active']) ? $data['active'] : null; + $this->container['domain'] = isset($data['domain']) ? $data['domain'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + if ($this->container['active'] === null) { + $invalidProperties[] = "'active' can't be null"; + } + if ($this->container['domain'] === null) { + $invalidProperties[] = "'domain' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['ip'] === null) { + return false; + } + if ($this->container['active'] === null) { + return false; + } + if ($this->container['domain'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the dedicated IP + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip Dedicated IP + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + + /** + * Gets active + * + * @return bool + */ + public function getActive() + { + return $this->container['active']; + } + + /** + * Sets active + * + * @param bool $active Status of the IP (true=active, false=inactive) + * + * @return $this + */ + public function setActive($active) + { + $this->container['active'] = $active; + + return $this; + } + + /** + * Gets domain + * + * @return string + */ + public function getDomain() + { + return $this->container['domain']; + } + + /** + * Sets domain + * + * @param string $domain Domain associated to the IP + * + * @return $this + */ + public function setDomain($domain) + { + $this->container['domain'] = $domain; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpFromSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpFromSender.php new file mode 100644 index 0000000..3c8e73c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpFromSender.php @@ -0,0 +1,416 @@ + 'int', + 'ip' => 'string', + 'domain' => 'string', + 'weight' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'ip' => null, + 'domain' => null, + 'weight' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'ip' => 'ip', + 'domain' => 'domain', + 'weight' => 'weight' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'ip' => 'setIp', + 'domain' => 'setDomain', + 'weight' => 'setWeight' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'ip' => 'getIp', + 'domain' => 'getDomain', + 'weight' => 'getWeight' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + $this->container['domain'] = isset($data['domain']) ? $data['domain'] : null; + $this->container['weight'] = isset($data['weight']) ? $data['weight'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + if ($this->container['domain'] === null) { + $invalidProperties[] = "'domain' can't be null"; + } + if ($this->container['weight'] === null) { + $invalidProperties[] = "'weight' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['ip'] === null) { + return false; + } + if ($this->container['domain'] === null) { + return false; + } + if ($this->container['weight'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the dedicated IP + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip Dedicated IP + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + + /** + * Gets domain + * + * @return string + */ + public function getDomain() + { + return $this->container['domain']; + } + + /** + * Sets domain + * + * @param string $domain Domain associated to the IP + * + * @return $this + */ + public function setDomain($domain) + { + $this->container['domain'] = $domain; + + return $this; + } + + /** + * Gets weight + * + * @return int + */ + public function getWeight() + { + return $this->container['weight']; + } + + /** + * Sets weight + * + * @param int $weight Weight of the IP + * + * @return $this + */ + public function setWeight($weight) + { + $this->container['weight'] = $weight; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIps.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIps.php new file mode 100644 index 0000000..eb660d2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIps.php @@ -0,0 +1,308 @@ + '\SendinBlue\Client\Model\GetIp[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'ips' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'ips' => 'ips' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'ips' => 'setIps' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'ips' => 'getIps' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['ips'] = isset($data['ips']) ? $data['ips'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['ips'] === null) { + $invalidProperties[] = "'ips' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['ips'] === null) { + return false; + } + return true; + } + + + /** + * Gets ips + * + * @return \SendinBlue\Client\Model\GetIp[] + */ + public function getIps() + { + return $this->container['ips']; + } + + /** + * Sets ips + * + * @param \SendinBlue\Client\Model\GetIp[] $ips Dedicated IP(s) available on your account + * + * @return $this + */ + public function setIps($ips) + { + $this->container['ips'] = $ips; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpsFromSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpsFromSender.php new file mode 100644 index 0000000..c3026ec --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetIpsFromSender.php @@ -0,0 +1,308 @@ + '\SendinBlue\Client\Model\GetIpFromSender[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'ips' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'ips' => 'ips' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'ips' => 'setIps' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'ips' => 'getIps' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['ips'] = isset($data['ips']) ? $data['ips'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['ips'] === null) { + $invalidProperties[] = "'ips' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['ips'] === null) { + return false; + } + return true; + } + + + /** + * Gets ips + * + * @return \SendinBlue\Client\Model\GetIpFromSender[] + */ + public function getIps() + { + return $this->container['ips']; + } + + /** + * Sets ips + * + * @param \SendinBlue\Client\Model\GetIpFromSender[] $ips Dedicated IP(s) linked to a sender + * + * @return $this + */ + public function setIps($ips) + { + $this->container['ips'] = $ips; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetList.php new file mode 100644 index 0000000..74c5183 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetList.php @@ -0,0 +1,416 @@ + 'int', + 'name' => 'string', + 'totalBlacklisted' => 'int', + 'totalSubscribers' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'totalBlacklisted' => 'int64', + 'totalSubscribers' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'totalBlacklisted' => 'totalBlacklisted', + 'totalSubscribers' => 'totalSubscribers' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'totalBlacklisted' => 'setTotalBlacklisted', + 'totalSubscribers' => 'setTotalSubscribers' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'totalBlacklisted' => 'getTotalBlacklisted', + 'totalSubscribers' => 'getTotalSubscribers' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['totalBlacklisted'] = isset($data['totalBlacklisted']) ? $data['totalBlacklisted'] : null; + $this->container['totalSubscribers'] = isset($data['totalSubscribers']) ? $data['totalSubscribers'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['totalBlacklisted'] === null) { + $invalidProperties[] = "'totalBlacklisted' can't be null"; + } + if ($this->container['totalSubscribers'] === null) { + $invalidProperties[] = "'totalSubscribers' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['totalBlacklisted'] === null) { + return false; + } + if ($this->container['totalSubscribers'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the list + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the list + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets totalBlacklisted + * + * @return int + */ + public function getTotalBlacklisted() + { + return $this->container['totalBlacklisted']; + } + + /** + * Sets totalBlacklisted + * + * @param int $totalBlacklisted Number of blacklisted contacts in the list + * + * @return $this + */ + public function setTotalBlacklisted($totalBlacklisted) + { + $this->container['totalBlacklisted'] = $totalBlacklisted; + + return $this; + } + + /** + * Gets totalSubscribers + * + * @return int + */ + public function getTotalSubscribers() + { + return $this->container['totalSubscribers']; + } + + /** + * Sets totalSubscribers + * + * @param int $totalSubscribers Number of contacts in the list + * + * @return $this + */ + public function setTotalSubscribers($totalSubscribers) + { + $this->container['totalSubscribers'] = $totalSubscribers; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetLists.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetLists.php new file mode 100644 index 0000000..b004193 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetLists.php @@ -0,0 +1,344 @@ + 'object[]', + 'count' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'lists' => null, + 'count' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'lists' => 'lists', + 'count' => 'count' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'lists' => 'setLists', + 'count' => 'setCount' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'lists' => 'getLists', + 'count' => 'getCount' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['lists'] = isset($data['lists']) ? $data['lists'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['lists'] === null) { + $invalidProperties[] = "'lists' can't be null"; + } + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['lists'] === null) { + return false; + } + if ($this->container['count'] === null) { + return false; + } + return true; + } + + + /** + * Gets lists + * + * @return object[] + */ + public function getLists() + { + return $this->container['lists']; + } + + /** + * Sets lists + * + * @param object[] $lists Listing of all the lists available in your account + * + * @return $this + */ + public function setLists($lists) + { + $this->container['lists'] = $lists; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of lists in your account + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcess.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcess.php new file mode 100644 index 0000000..4e90a36 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcess.php @@ -0,0 +1,448 @@ + 'int', + 'status' => 'string', + 'name' => 'string', + 'exportUrl' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'status' => null, + 'name' => null, + 'exportUrl' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'status' => 'status', + 'name' => 'name', + 'exportUrl' => 'export_url' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'status' => 'setStatus', + 'name' => 'setName', + 'exportUrl' => 'setExportUrl' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'status' => 'getStatus', + 'name' => 'getName', + 'exportUrl' => 'getExportUrl' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const STATUS_QUEUED = 'queued'; + const STATUS_IN_PROCESS = 'in_process'; + const STATUS_COMPLETED = 'completed'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getStatusAllowableValues() + { + return [ + self::STATUS_QUEUED, + self::STATUS_IN_PROCESS, + self::STATUS_COMPLETED, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['exportUrl'] = isset($data['exportUrl']) ? $data['exportUrl'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['status'] === null) { + $invalidProperties[] = "'status' can't be null"; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['status'] === null) { + return false; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id Id of the process + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets status + * + * @return string + */ + public function getStatus() + { + return $this->container['status']; + } + + /** + * Sets status + * + * @param string $status Status of the process + * + * @return $this + */ + public function setStatus($status) + { + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($status, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['status'] = $status; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Process name + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets exportUrl + * + * @return string + */ + public function getExportUrl() + { + return $this->container['exportUrl']; + } + + /** + * Sets exportUrl + * + * @param string $exportUrl URL on which send export the of contacts once the process is completed + * + * @return $this + */ + public function setExportUrl($exportUrl) + { + $this->container['exportUrl'] = $exportUrl; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcesses.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcesses.php new file mode 100644 index 0000000..7f53639 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetProcesses.php @@ -0,0 +1,338 @@ + '\SendinBlue\Client\Model\GetProcess[]', + 'count' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'processes' => null, + 'count' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'processes' => 'processes', + 'count' => 'count' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'processes' => 'setProcesses', + 'count' => 'setCount' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'processes' => 'getProcesses', + 'count' => 'getCount' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['processes'] = isset($data['processes']) ? $data['processes'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['count'] === null) { + return false; + } + return true; + } + + + /** + * Gets processes + * + * @return \SendinBlue\Client\Model\GetProcess[] + */ + public function getProcesses() + { + return $this->container['processes']; + } + + /** + * Sets processes + * + * @param \SendinBlue\Client\Model\GetProcess[] $processes List of processes available on your account + * + * @return $this + */ + public function setProcesses($processes) + { + $this->container['processes'] = $processes; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of processes available on your account + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReports.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReports.php new file mode 100644 index 0000000..05a6eba --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReports.php @@ -0,0 +1,302 @@ + '\SendinBlue\Client\Model\GetReportsReports[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'reports' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'reports' => 'reports' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'reports' => 'setReports' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'reports' => 'getReports' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['reports'] = isset($data['reports']) ? $data['reports'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets reports + * + * @return \SendinBlue\Client\Model\GetReportsReports[] + */ + public function getReports() + { + return $this->container['reports']; + } + + /** + * Sets reports + * + * @param \SendinBlue\Client\Model\GetReportsReports[] $reports reports + * + * @return $this + */ + public function setReports($reports) + { + $this->container['reports'] = $reports; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReportsReports.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReportsReports.php new file mode 100644 index 0000000..4663499 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetReportsReports.php @@ -0,0 +1,740 @@ + '\DateTime', + 'requests' => 'int', + 'delivered' => 'int', + 'hardBounces' => 'int', + 'softBounces' => 'int', + 'clicks' => 'int', + 'uniqueClicks' => 'int', + 'opens' => 'int', + 'uniqueOpens' => 'int', + 'spamReports' => 'int', + 'blocked' => 'int', + 'invalid' => 'int', + 'unsubscribed' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'date' => 'date', + 'requests' => 'int64', + 'delivered' => 'int64', + 'hardBounces' => 'int64', + 'softBounces' => 'int64', + 'clicks' => 'int64', + 'uniqueClicks' => 'int64', + 'opens' => 'int64', + 'uniqueOpens' => 'int64', + 'spamReports' => 'int64', + 'blocked' => 'int64', + 'invalid' => 'int64', + 'unsubscribed' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'date' => 'date', + 'requests' => 'requests', + 'delivered' => 'delivered', + 'hardBounces' => 'hardBounces', + 'softBounces' => 'softBounces', + 'clicks' => 'clicks', + 'uniqueClicks' => 'uniqueClicks', + 'opens' => 'opens', + 'uniqueOpens' => 'uniqueOpens', + 'spamReports' => 'spamReports', + 'blocked' => 'blocked', + 'invalid' => 'invalid', + 'unsubscribed' => 'unsubscribed' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'date' => 'setDate', + 'requests' => 'setRequests', + 'delivered' => 'setDelivered', + 'hardBounces' => 'setHardBounces', + 'softBounces' => 'setSoftBounces', + 'clicks' => 'setClicks', + 'uniqueClicks' => 'setUniqueClicks', + 'opens' => 'setOpens', + 'uniqueOpens' => 'setUniqueOpens', + 'spamReports' => 'setSpamReports', + 'blocked' => 'setBlocked', + 'invalid' => 'setInvalid', + 'unsubscribed' => 'setUnsubscribed' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'date' => 'getDate', + 'requests' => 'getRequests', + 'delivered' => 'getDelivered', + 'hardBounces' => 'getHardBounces', + 'softBounces' => 'getSoftBounces', + 'clicks' => 'getClicks', + 'uniqueClicks' => 'getUniqueClicks', + 'opens' => 'getOpens', + 'uniqueOpens' => 'getUniqueOpens', + 'spamReports' => 'getSpamReports', + 'blocked' => 'getBlocked', + 'invalid' => 'getInvalid', + 'unsubscribed' => 'getUnsubscribed' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['date'] = isset($data['date']) ? $data['date'] : null; + $this->container['requests'] = isset($data['requests']) ? $data['requests'] : null; + $this->container['delivered'] = isset($data['delivered']) ? $data['delivered'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['clicks'] = isset($data['clicks']) ? $data['clicks'] : null; + $this->container['uniqueClicks'] = isset($data['uniqueClicks']) ? $data['uniqueClicks'] : null; + $this->container['opens'] = isset($data['opens']) ? $data['opens'] : null; + $this->container['uniqueOpens'] = isset($data['uniqueOpens']) ? $data['uniqueOpens'] : null; + $this->container['spamReports'] = isset($data['spamReports']) ? $data['spamReports'] : null; + $this->container['blocked'] = isset($data['blocked']) ? $data['blocked'] : null; + $this->container['invalid'] = isset($data['invalid']) ? $data['invalid'] : null; + $this->container['unsubscribed'] = isset($data['unsubscribed']) ? $data['unsubscribed'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['date'] === null) { + $invalidProperties[] = "'date' can't be null"; + } + if ($this->container['requests'] === null) { + $invalidProperties[] = "'requests' can't be null"; + } + if ($this->container['delivered'] === null) { + $invalidProperties[] = "'delivered' can't be null"; + } + if ($this->container['hardBounces'] === null) { + $invalidProperties[] = "'hardBounces' can't be null"; + } + if ($this->container['softBounces'] === null) { + $invalidProperties[] = "'softBounces' can't be null"; + } + if ($this->container['clicks'] === null) { + $invalidProperties[] = "'clicks' can't be null"; + } + if ($this->container['uniqueClicks'] === null) { + $invalidProperties[] = "'uniqueClicks' can't be null"; + } + if ($this->container['opens'] === null) { + $invalidProperties[] = "'opens' can't be null"; + } + if ($this->container['uniqueOpens'] === null) { + $invalidProperties[] = "'uniqueOpens' can't be null"; + } + if ($this->container['spamReports'] === null) { + $invalidProperties[] = "'spamReports' can't be null"; + } + if ($this->container['blocked'] === null) { + $invalidProperties[] = "'blocked' can't be null"; + } + if ($this->container['invalid'] === null) { + $invalidProperties[] = "'invalid' can't be null"; + } + if ($this->container['unsubscribed'] === null) { + $invalidProperties[] = "'unsubscribed' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['date'] === null) { + return false; + } + if ($this->container['requests'] === null) { + return false; + } + if ($this->container['delivered'] === null) { + return false; + } + if ($this->container['hardBounces'] === null) { + return false; + } + if ($this->container['softBounces'] === null) { + return false; + } + if ($this->container['clicks'] === null) { + return false; + } + if ($this->container['uniqueClicks'] === null) { + return false; + } + if ($this->container['opens'] === null) { + return false; + } + if ($this->container['uniqueOpens'] === null) { + return false; + } + if ($this->container['spamReports'] === null) { + return false; + } + if ($this->container['blocked'] === null) { + return false; + } + if ($this->container['invalid'] === null) { + return false; + } + if ($this->container['unsubscribed'] === null) { + return false; + } + return true; + } + + + /** + * Gets date + * + * @return \DateTime + */ + public function getDate() + { + return $this->container['date']; + } + + /** + * Sets date + * + * @param \DateTime $date Date of the statistics + * + * @return $this + */ + public function setDate($date) + { + $this->container['date'] = $date; + + return $this; + } + + /** + * Gets requests + * + * @return int + */ + public function getRequests() + { + return $this->container['requests']; + } + + /** + * Sets requests + * + * @param int $requests Number of requests for the date + * + * @return $this + */ + public function setRequests($requests) + { + $this->container['requests'] = $requests; + + return $this; + } + + /** + * Gets delivered + * + * @return int + */ + public function getDelivered() + { + return $this->container['delivered']; + } + + /** + * Sets delivered + * + * @param int $delivered Number of delivered emails for the date + * + * @return $this + */ + public function setDelivered($delivered) + { + $this->container['delivered'] = $delivered; + + return $this; + } + + /** + * Gets hardBounces + * + * @return int + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param int $hardBounces Number of hardbounces for the date + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets softBounces + * + * @return int + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param int $softBounces Number of softbounces for the date + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets clicks + * + * @return int + */ + public function getClicks() + { + return $this->container['clicks']; + } + + /** + * Sets clicks + * + * @param int $clicks Number of clicks for the date + * + * @return $this + */ + public function setClicks($clicks) + { + $this->container['clicks'] = $clicks; + + return $this; + } + + /** + * Gets uniqueClicks + * + * @return int + */ + public function getUniqueClicks() + { + return $this->container['uniqueClicks']; + } + + /** + * Sets uniqueClicks + * + * @param int $uniqueClicks Number of unique clicks for the date + * + * @return $this + */ + public function setUniqueClicks($uniqueClicks) + { + $this->container['uniqueClicks'] = $uniqueClicks; + + return $this; + } + + /** + * Gets opens + * + * @return int + */ + public function getOpens() + { + return $this->container['opens']; + } + + /** + * Sets opens + * + * @param int $opens Number of openings for the date + * + * @return $this + */ + public function setOpens($opens) + { + $this->container['opens'] = $opens; + + return $this; + } + + /** + * Gets uniqueOpens + * + * @return int + */ + public function getUniqueOpens() + { + return $this->container['uniqueOpens']; + } + + /** + * Sets uniqueOpens + * + * @param int $uniqueOpens Number of unique openings for the date + * + * @return $this + */ + public function setUniqueOpens($uniqueOpens) + { + $this->container['uniqueOpens'] = $uniqueOpens; + + return $this; + } + + /** + * Gets spamReports + * + * @return int + */ + public function getSpamReports() + { + return $this->container['spamReports']; + } + + /** + * Sets spamReports + * + * @param int $spamReports Number of complaints (spam reports) for the date + * + * @return $this + */ + public function setSpamReports($spamReports) + { + $this->container['spamReports'] = $spamReports; + + return $this; + } + + /** + * Gets blocked + * + * @return int + */ + public function getBlocked() + { + return $this->container['blocked']; + } + + /** + * Sets blocked + * + * @param int $blocked Number of blocked emails for the date + * + * @return $this + */ + public function setBlocked($blocked) + { + $this->container['blocked'] = $blocked; + + return $this; + } + + /** + * Gets invalid + * + * @return int + */ + public function getInvalid() + { + return $this->container['invalid']; + } + + /** + * Sets invalid + * + * @param int $invalid Number of invalid emails for the date + * + * @return $this + */ + public function setInvalid($invalid) + { + $this->container['invalid'] = $invalid; + + return $this; + } + + /** + * Gets unsubscribed + * + * @return int + */ + public function getUnsubscribed() + { + return $this->container['unsubscribed']; + } + + /** + * Sets unsubscribed + * + * @param int $unsubscribed Number of unsubscribed emails for the date + * + * @return $this + */ + public function setUnsubscribed($unsubscribed) + { + $this->container['unsubscribed'] = $unsubscribed; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersList.php new file mode 100644 index 0000000..7efcf13 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersList.php @@ -0,0 +1,302 @@ + '\SendinBlue\Client\Model\GetSendersListSenders[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'senders' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'senders' => 'senders' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'senders' => 'setSenders' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'senders' => 'getSenders' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['senders'] = isset($data['senders']) ? $data['senders'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets senders + * + * @return \SendinBlue\Client\Model\GetSendersListSenders[] + */ + public function getSenders() + { + return $this->container['senders']; + } + + /** + * Sets senders + * + * @param \SendinBlue\Client\Model\GetSendersListSenders[] $senders List of the senders available in your account + * + * @return $this + */ + public function setSenders($senders) + { + $this->container['senders'] = $senders; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListIps.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListIps.php new file mode 100644 index 0000000..89bdbd6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListIps.php @@ -0,0 +1,380 @@ + 'string', + 'domain' => 'string', + 'weight' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'ip' => null, + 'domain' => null, + 'weight' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'ip' => 'ip', + 'domain' => 'domain', + 'weight' => 'weight' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'ip' => 'setIp', + 'domain' => 'setDomain', + 'weight' => 'setWeight' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'ip' => 'getIp', + 'domain' => 'getDomain', + 'weight' => 'getWeight' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + $this->container['domain'] = isset($data['domain']) ? $data['domain'] : null; + $this->container['weight'] = isset($data['weight']) ? $data['weight'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['ip'] === null) { + $invalidProperties[] = "'ip' can't be null"; + } + if ($this->container['domain'] === null) { + $invalidProperties[] = "'domain' can't be null"; + } + if ($this->container['weight'] === null) { + $invalidProperties[] = "'weight' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['ip'] === null) { + return false; + } + if ($this->container['domain'] === null) { + return false; + } + if ($this->container['weight'] === null) { + return false; + } + return true; + } + + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip Dedicated IP available in your account + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + + /** + * Gets domain + * + * @return string + */ + public function getDomain() + { + return $this->container['domain']; + } + + /** + * Sets domain + * + * @param string $domain Domain of the IP + * + * @return $this + */ + public function setDomain($domain) + { + $this->container['domain'] = $domain; + + return $this; + } + + /** + * Gets weight + * + * @return int + */ + public function getWeight() + { + return $this->container['weight']; + } + + /** + * Sets weight + * + * @param int $weight Weight of the IP for this sender + * + * @return $this + */ + public function setWeight($weight) + { + $this->container['weight'] = $weight; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListSenders.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListSenders.php new file mode 100644 index 0000000..8fcd3a1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSendersListSenders.php @@ -0,0 +1,446 @@ + 'int', + 'name' => 'string', + 'email' => 'string', + 'active' => 'bool', + 'ips' => '\SendinBlue\Client\Model\GetSendersListIps[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'email' => null, + 'active' => null, + 'ips' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'email' => 'email', + 'active' => 'active', + 'ips' => 'ips' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'email' => 'setEmail', + 'active' => 'setActive', + 'ips' => 'setIps' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'email' => 'getEmail', + 'active' => 'getActive', + 'ips' => 'getIps' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['active'] = isset($data['active']) ? $data['active'] : null; + $this->container['ips'] = isset($data['ips']) ? $data['ips'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + if ($this->container['active'] === null) { + $invalidProperties[] = "'active' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['email'] === null) { + return false; + } + if ($this->container['active'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id Id of the sender + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name From Name associated to the sender + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email From Email associated to the sender + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets active + * + * @return bool + */ + public function getActive() + { + return $this->container['active']; + } + + /** + * Sets active + * + * @param bool $active Status of sender (true=activated, false=deactivated) + * + * @return $this + */ + public function setActive($active) + { + $this->container['active'] = $active; + + return $this; + } + + /** + * Gets ips + * + * @return \SendinBlue\Client\Model\GetSendersListIps[] + */ + public function getIps() + { + return $this->container['ips']; + } + + /** + * Sets ips + * + * @param \SendinBlue\Client\Model\GetSendersListIps[] $ips List of dedicated IP(s) available in the account. This data is displayed only for dedicated IPs + * + * @return $this + */ + public function setIps($ips) + { + $this->container['ips'] = $ips; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaign.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaign.php new file mode 100644 index 0000000..95c4001 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaign.php @@ -0,0 +1,676 @@ + 'int', + 'name' => 'string', + 'status' => 'string', + 'content' => 'string', + 'scheduledAt' => '\DateTime', + 'sender' => 'string', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime', + 'recipients' => 'object', + 'statistics' => 'object' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'status' => null, + 'content' => null, + 'scheduledAt' => 'date-time', + 'sender' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time', + 'recipients' => null, + 'statistics' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'status' => 'status', + 'content' => 'content', + 'scheduledAt' => 'scheduledAt', + 'sender' => 'sender', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt', + 'recipients' => 'recipients', + 'statistics' => 'statistics' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'status' => 'setStatus', + 'content' => 'setContent', + 'scheduledAt' => 'setScheduledAt', + 'sender' => 'setSender', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt', + 'recipients' => 'setRecipients', + 'statistics' => 'setStatistics' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'status' => 'getStatus', + 'content' => 'getContent', + 'scheduledAt' => 'getScheduledAt', + 'sender' => 'getSender', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt', + 'recipients' => 'getRecipients', + 'statistics' => 'getStatistics' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const STATUS_DRAFT = 'draft'; + const STATUS_SENT = 'sent'; + const STATUS_ARCHIVE = 'archive'; + const STATUS_QUEUED = 'queued'; + const STATUS_SUSPENDED = 'suspended'; + const STATUS_IN_PROCESS = 'inProcess'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getStatusAllowableValues() + { + return [ + self::STATUS_DRAFT, + self::STATUS_SENT, + self::STATUS_ARCHIVE, + self::STATUS_QUEUED, + self::STATUS_SUSPENDED, + self::STATUS_IN_PROCESS, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + $this->container['content'] = isset($data['content']) ? $data['content'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + $this->container['recipients'] = isset($data['recipients']) ? $data['recipients'] : null; + $this->container['statistics'] = isset($data['statistics']) ? $data['statistics'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['status'] === null) { + $invalidProperties[] = "'status' can't be null"; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['content'] === null) { + $invalidProperties[] = "'content' can't be null"; + } + if ($this->container['scheduledAt'] === null) { + $invalidProperties[] = "'scheduledAt' can't be null"; + } + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + if ($this->container['recipients'] === null) { + $invalidProperties[] = "'recipients' can't be null"; + } + if ($this->container['statistics'] === null) { + $invalidProperties[] = "'statistics' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['status'] === null) { + return false; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + return false; + } + if ($this->container['content'] === null) { + return false; + } + if ($this->container['scheduledAt'] === null) { + return false; + } + if ($this->container['sender'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + if ($this->container['recipients'] === null) { + return false; + } + if ($this->container['statistics'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the SMS Campaign + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the SMS Campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets status + * + * @return string + */ + public function getStatus() + { + return $this->container['status']; + } + + /** + * Sets status + * + * @param string $status Status of the SMS Campaign + * + * @return $this + */ + public function setStatus($status) + { + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($status, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['status'] = $status; + + return $this; + } + + /** + * Gets content + * + * @return string + */ + public function getContent() + { + return $this->container['content']; + } + + /** + * Sets content + * + * @param string $content Content of the SMS Campaign + * + * @return $this + */ + public function setContent($content) + { + $this->container['content'] = $content; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which SMS campaign is scheduled. Should be in YYYY-MM-DDTHH:mm:ss.SSSZ format + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + + /** + * Gets sender + * + * @return string + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param string $sender Sender of the SMS Campaign + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the SMS campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt UTC date-time of last modification of the SMS campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + + /** + * Gets recipients + * + * @return object + */ + public function getRecipients() + { + return $this->container['recipients']; + } + + /** + * Sets recipients + * + * @param object $recipients recipients + * + * @return $this + */ + public function setRecipients($recipients) + { + $this->container['recipients'] = $recipients; + + return $this; + } + + /** + * Gets statistics + * + * @return object + */ + public function getStatistics() + { + return $this->container['statistics']; + } + + /** + * Sets statistics + * + * @param object $statistics statistics + * + * @return $this + */ + public function setStatistics($statistics) + { + $this->container['statistics'] = $statistics; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignOverview.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignOverview.php new file mode 100644 index 0000000..308bd53 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignOverview.php @@ -0,0 +1,604 @@ + 'int', + 'name' => 'string', + 'status' => 'string', + 'content' => 'string', + 'scheduledAt' => '\DateTime', + 'sender' => 'string', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'status' => null, + 'content' => null, + 'scheduledAt' => 'date-time', + 'sender' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'status' => 'status', + 'content' => 'content', + 'scheduledAt' => 'scheduledAt', + 'sender' => 'sender', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'status' => 'setStatus', + 'content' => 'setContent', + 'scheduledAt' => 'setScheduledAt', + 'sender' => 'setSender', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'status' => 'getStatus', + 'content' => 'getContent', + 'scheduledAt' => 'getScheduledAt', + 'sender' => 'getSender', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const STATUS_DRAFT = 'draft'; + const STATUS_SENT = 'sent'; + const STATUS_ARCHIVE = 'archive'; + const STATUS_QUEUED = 'queued'; + const STATUS_SUSPENDED = 'suspended'; + const STATUS_IN_PROCESS = 'inProcess'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getStatusAllowableValues() + { + return [ + self::STATUS_DRAFT, + self::STATUS_SENT, + self::STATUS_ARCHIVE, + self::STATUS_QUEUED, + self::STATUS_SUSPENDED, + self::STATUS_IN_PROCESS, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + $this->container['content'] = isset($data['content']) ? $data['content'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['status'] === null) { + $invalidProperties[] = "'status' can't be null"; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['content'] === null) { + $invalidProperties[] = "'content' can't be null"; + } + if ($this->container['scheduledAt'] === null) { + $invalidProperties[] = "'scheduledAt' can't be null"; + } + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['status'] === null) { + return false; + } + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + return false; + } + if ($this->container['content'] === null) { + return false; + } + if ($this->container['scheduledAt'] === null) { + return false; + } + if ($this->container['sender'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the SMS Campaign + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the SMS Campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets status + * + * @return string + */ + public function getStatus() + { + return $this->container['status']; + } + + /** + * Sets status + * + * @param string $status Status of the SMS Campaign + * + * @return $this + */ + public function setStatus($status) + { + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($status, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['status'] = $status; + + return $this; + } + + /** + * Gets content + * + * @return string + */ + public function getContent() + { + return $this->container['content']; + } + + /** + * Sets content + * + * @param string $content Content of the SMS Campaign + * + * @return $this + */ + public function setContent($content) + { + $this->container['content'] = $content; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which SMS campaign is scheduled. Should be in YYYY-MM-DDTHH:mm:ss.SSSZ format + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + + /** + * Gets sender + * + * @return string + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param string $sender Sender of the SMS Campaign + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the SMS campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt UTC date-time of last modification of the SMS campaign (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignStats.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignStats.php new file mode 100644 index 0000000..3b8f81e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaignStats.php @@ -0,0 +1,524 @@ + 'int', + 'sent' => 'int', + 'processing' => 'int', + 'softBounces' => 'int', + 'hardBounces' => 'int', + 'unsubscriptions' => 'int', + 'answered' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'delivered' => 'int64', + 'sent' => 'int64', + 'processing' => 'int64', + 'softBounces' => 'int64', + 'hardBounces' => 'int64', + 'unsubscriptions' => 'int64', + 'answered' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'delivered' => 'delivered', + 'sent' => 'sent', + 'processing' => 'processing', + 'softBounces' => 'softBounces', + 'hardBounces' => 'hardBounces', + 'unsubscriptions' => 'unsubscriptions', + 'answered' => 'answered' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'delivered' => 'setDelivered', + 'sent' => 'setSent', + 'processing' => 'setProcessing', + 'softBounces' => 'setSoftBounces', + 'hardBounces' => 'setHardBounces', + 'unsubscriptions' => 'setUnsubscriptions', + 'answered' => 'setAnswered' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'delivered' => 'getDelivered', + 'sent' => 'getSent', + 'processing' => 'getProcessing', + 'softBounces' => 'getSoftBounces', + 'hardBounces' => 'getHardBounces', + 'unsubscriptions' => 'getUnsubscriptions', + 'answered' => 'getAnswered' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['delivered'] = isset($data['delivered']) ? $data['delivered'] : null; + $this->container['sent'] = isset($data['sent']) ? $data['sent'] : null; + $this->container['processing'] = isset($data['processing']) ? $data['processing'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['unsubscriptions'] = isset($data['unsubscriptions']) ? $data['unsubscriptions'] : null; + $this->container['answered'] = isset($data['answered']) ? $data['answered'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['delivered'] === null) { + $invalidProperties[] = "'delivered' can't be null"; + } + if ($this->container['sent'] === null) { + $invalidProperties[] = "'sent' can't be null"; + } + if ($this->container['processing'] === null) { + $invalidProperties[] = "'processing' can't be null"; + } + if ($this->container['softBounces'] === null) { + $invalidProperties[] = "'softBounces' can't be null"; + } + if ($this->container['hardBounces'] === null) { + $invalidProperties[] = "'hardBounces' can't be null"; + } + if ($this->container['unsubscriptions'] === null) { + $invalidProperties[] = "'unsubscriptions' can't be null"; + } + if ($this->container['answered'] === null) { + $invalidProperties[] = "'answered' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['delivered'] === null) { + return false; + } + if ($this->container['sent'] === null) { + return false; + } + if ($this->container['processing'] === null) { + return false; + } + if ($this->container['softBounces'] === null) { + return false; + } + if ($this->container['hardBounces'] === null) { + return false; + } + if ($this->container['unsubscriptions'] === null) { + return false; + } + if ($this->container['answered'] === null) { + return false; + } + return true; + } + + + /** + * Gets delivered + * + * @return int + */ + public function getDelivered() + { + return $this->container['delivered']; + } + + /** + * Sets delivered + * + * @param int $delivered Number of delivered SMS + * + * @return $this + */ + public function setDelivered($delivered) + { + $this->container['delivered'] = $delivered; + + return $this; + } + + /** + * Gets sent + * + * @return int + */ + public function getSent() + { + return $this->container['sent']; + } + + /** + * Sets sent + * + * @param int $sent Number of sent SMS + * + * @return $this + */ + public function setSent($sent) + { + $this->container['sent'] = $sent; + + return $this; + } + + /** + * Gets processing + * + * @return int + */ + public function getProcessing() + { + return $this->container['processing']; + } + + /** + * Sets processing + * + * @param int $processing Number of processing SMS + * + * @return $this + */ + public function setProcessing($processing) + { + $this->container['processing'] = $processing; + + return $this; + } + + /** + * Gets softBounces + * + * @return int + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param int $softBounces Number of softbounced SMS + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets hardBounces + * + * @return int + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param int $hardBounces Number of hardbounced SMS + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets unsubscriptions + * + * @return int + */ + public function getUnsubscriptions() + { + return $this->container['unsubscriptions']; + } + + /** + * Sets unsubscriptions + * + * @param int $unsubscriptions Number of unsubscription SMS + * + * @return $this + */ + public function setUnsubscriptions($unsubscriptions) + { + $this->container['unsubscriptions'] = $unsubscriptions; + + return $this; + } + + /** + * Gets answered + * + * @return int + */ + public function getAnswered() + { + return $this->container['answered']; + } + + /** + * Sets answered + * + * @param int $answered Number of replies to the SMS + * + * @return $this + */ + public function setAnswered($answered) + { + $this->container['answered'] = $answered; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaigns.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaigns.php new file mode 100644 index 0000000..8e1fb95 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsCampaigns.php @@ -0,0 +1,338 @@ + 'object[]', + 'count' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'campaigns' => null, + 'count' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'campaigns' => 'campaigns', + 'count' => 'count' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'campaigns' => 'setCampaigns', + 'count' => 'setCount' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'campaigns' => 'getCampaigns', + 'count' => 'getCount' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['campaigns'] = isset($data['campaigns']) ? $data['campaigns'] : null; + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['count'] === null) { + $invalidProperties[] = "'count' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['count'] === null) { + return false; + } + return true; + } + + + /** + * Gets campaigns + * + * @return object[] + */ + public function getCampaigns() + { + return $this->container['campaigns']; + } + + /** + * Sets campaigns + * + * @param object[] $campaigns campaigns + * + * @return $this + */ + public function setCampaigns($campaigns) + { + $this->container['campaigns'] = $campaigns; + + return $this; + } + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Number of SMS campaigns retrieved + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReport.php new file mode 100644 index 0000000..4fc3fe4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReport.php @@ -0,0 +1,302 @@ + '\SendinBlue\Client\Model\GetSmsEventReportEvents[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'events' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'events' => 'events' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'events' => 'setEvents' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'events' => 'getEvents' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['events'] = isset($data['events']) ? $data['events'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets events + * + * @return \SendinBlue\Client\Model\GetSmsEventReportEvents[] + */ + public function getEvents() + { + return $this->container['events']; + } + + /** + * Sets events + * + * @param \SendinBlue\Client\Model\GetSmsEventReportEvents[] $events events + * + * @return $this + */ + public function setEvents($events) + { + $this->container['events'] = $events; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReportEvents.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReportEvents.php new file mode 100644 index 0000000..d939e56 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmsEventReportEvents.php @@ -0,0 +1,556 @@ + 'string', + 'date' => '\DateTime', + 'messageId' => 'string', + 'event' => 'string', + 'reason' => 'string', + 'reply' => 'string', + 'tag' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'phoneNumber' => null, + 'date' => 'date-time', + 'messageId' => null, + 'event' => null, + 'reason' => null, + 'reply' => null, + 'tag' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'phoneNumber' => 'phoneNumber', + 'date' => 'date', + 'messageId' => 'messageId', + 'event' => 'event', + 'reason' => 'reason', + 'reply' => 'reply', + 'tag' => 'tag' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'phoneNumber' => 'setPhoneNumber', + 'date' => 'setDate', + 'messageId' => 'setMessageId', + 'event' => 'setEvent', + 'reason' => 'setReason', + 'reply' => 'setReply', + 'tag' => 'setTag' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'phoneNumber' => 'getPhoneNumber', + 'date' => 'getDate', + 'messageId' => 'getMessageId', + 'event' => 'getEvent', + 'reason' => 'getReason', + 'reply' => 'getReply', + 'tag' => 'getTag' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const EVENT_BOUNCES = 'bounces'; + const EVENT_HARD_BOUNCES = 'hardBounces'; + const EVENT_SOFT_BOUNCES = 'softBounces'; + const EVENT_DELIVERED = 'delivered'; + const EVENT_SENT = 'sent'; + const EVENT_ACCEPTED = 'accepted'; + const EVENT_UNSUBSCRIPTION = 'unsubscription'; + const EVENT_REPLIES = 'replies'; + const EVENT_BLOCKED = 'blocked'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getEventAllowableValues() + { + return [ + self::EVENT_BOUNCES, + self::EVENT_HARD_BOUNCES, + self::EVENT_SOFT_BOUNCES, + self::EVENT_DELIVERED, + self::EVENT_SENT, + self::EVENT_ACCEPTED, + self::EVENT_UNSUBSCRIPTION, + self::EVENT_REPLIES, + self::EVENT_BLOCKED, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['phoneNumber'] = isset($data['phoneNumber']) ? $data['phoneNumber'] : null; + $this->container['date'] = isset($data['date']) ? $data['date'] : null; + $this->container['messageId'] = isset($data['messageId']) ? $data['messageId'] : null; + $this->container['event'] = isset($data['event']) ? $data['event'] : null; + $this->container['reason'] = isset($data['reason']) ? $data['reason'] : null; + $this->container['reply'] = isset($data['reply']) ? $data['reply'] : null; + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['phoneNumber'] === null) { + $invalidProperties[] = "'phoneNumber' can't be null"; + } + if ($this->container['date'] === null) { + $invalidProperties[] = "'date' can't be null"; + } + if ($this->container['messageId'] === null) { + $invalidProperties[] = "'messageId' can't be null"; + } + if ($this->container['event'] === null) { + $invalidProperties[] = "'event' can't be null"; + } + $allowedValues = $this->getEventAllowableValues(); + if (!in_array($this->container['event'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'event', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['phoneNumber'] === null) { + return false; + } + if ($this->container['date'] === null) { + return false; + } + if ($this->container['messageId'] === null) { + return false; + } + if ($this->container['event'] === null) { + return false; + } + $allowedValues = $this->getEventAllowableValues(); + if (!in_array($this->container['event'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets phoneNumber + * + * @return string + */ + public function getPhoneNumber() + { + return $this->container['phoneNumber']; + } + + /** + * Sets phoneNumber + * + * @param string $phoneNumber Phone number which has generated the event + * + * @return $this + */ + public function setPhoneNumber($phoneNumber) + { + $this->container['phoneNumber'] = $phoneNumber; + + return $this; + } + + /** + * Gets date + * + * @return \DateTime + */ + public function getDate() + { + return $this->container['date']; + } + + /** + * Sets date + * + * @param \DateTime $date UTC date-time on which the event has been generated + * + * @return $this + */ + public function setDate($date) + { + $this->container['date'] = $date; + + return $this; + } + + /** + * Gets messageId + * + * @return string + */ + public function getMessageId() + { + return $this->container['messageId']; + } + + /** + * Sets messageId + * + * @param string $messageId Message ID which generated the event + * + * @return $this + */ + public function setMessageId($messageId) + { + $this->container['messageId'] = $messageId; + + return $this; + } + + /** + * Gets event + * + * @return string + */ + public function getEvent() + { + return $this->container['event']; + } + + /** + * Sets event + * + * @param string $event Event which occurred + * + * @return $this + */ + public function setEvent($event) + { + $allowedValues = $this->getEventAllowableValues(); + if (!in_array($event, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'event', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['event'] = $event; + + return $this; + } + + /** + * Gets reason + * + * @return string + */ + public function getReason() + { + return $this->container['reason']; + } + + /** + * Sets reason + * + * @param string $reason Reason of bounce (only available if the event is hardbounce or softbounce) + * + * @return $this + */ + public function setReason($reason) + { + $this->container['reason'] = $reason; + + return $this; + } + + /** + * Gets reply + * + * @return string + */ + public function getReply() + { + return $this->container['reply']; + } + + /** + * Sets reply + * + * @param string $reply reply + * + * @return $this + */ + public function setReply($reply) + { + $this->container['reply'] = $reply; + + return $this; + } + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the SMS which generated the event + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverview.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverview.php new file mode 100644 index 0000000..fc119b0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverview.php @@ -0,0 +1,704 @@ + 'int', + 'name' => 'string', + 'subject' => 'string', + 'isActive' => 'bool', + 'testSent' => 'bool', + 'sender' => '\SendinBlue\Client\Model\GetSmtpTemplateOverviewSender', + 'replyTo' => 'string', + 'toField' => 'string', + 'tag' => 'string', + 'htmlContent' => 'string', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'id' => 'int64', + 'name' => null, + 'subject' => null, + 'isActive' => null, + 'testSent' => null, + 'sender' => null, + 'replyTo' => 'email', + 'toField' => null, + 'tag' => null, + 'htmlContent' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'id' => 'id', + 'name' => 'name', + 'subject' => 'subject', + 'isActive' => 'isActive', + 'testSent' => 'testSent', + 'sender' => 'sender', + 'replyTo' => 'replyTo', + 'toField' => 'toField', + 'tag' => 'tag', + 'htmlContent' => 'htmlContent', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'id' => 'setId', + 'name' => 'setName', + 'subject' => 'setSubject', + 'isActive' => 'setIsActive', + 'testSent' => 'setTestSent', + 'sender' => 'setSender', + 'replyTo' => 'setReplyTo', + 'toField' => 'setToField', + 'tag' => 'setTag', + 'htmlContent' => 'setHtmlContent', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'id' => 'getId', + 'name' => 'getName', + 'subject' => 'getSubject', + 'isActive' => 'getIsActive', + 'testSent' => 'getTestSent', + 'sender' => 'getSender', + 'replyTo' => 'getReplyTo', + 'toField' => 'getToField', + 'tag' => 'getTag', + 'htmlContent' => 'getHtmlContent', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['isActive'] = isset($data['isActive']) ? $data['isActive'] : null; + $this->container['testSent'] = isset($data['testSent']) ? $data['testSent'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['toField'] = isset($data['toField']) ? $data['toField'] : null; + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + if ($this->container['subject'] === null) { + $invalidProperties[] = "'subject' can't be null"; + } + if ($this->container['isActive'] === null) { + $invalidProperties[] = "'isActive' can't be null"; + } + if ($this->container['testSent'] === null) { + $invalidProperties[] = "'testSent' can't be null"; + } + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ($this->container['replyTo'] === null) { + $invalidProperties[] = "'replyTo' can't be null"; + } + if ($this->container['toField'] === null) { + $invalidProperties[] = "'toField' can't be null"; + } + if ($this->container['tag'] === null) { + $invalidProperties[] = "'tag' can't be null"; + } + if ($this->container['htmlContent'] === null) { + $invalidProperties[] = "'htmlContent' can't be null"; + } + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['id'] === null) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + if ($this->container['subject'] === null) { + return false; + } + if ($this->container['isActive'] === null) { + return false; + } + if ($this->container['testSent'] === null) { + return false; + } + if ($this->container['sender'] === null) { + return false; + } + if ($this->container['replyTo'] === null) { + return false; + } + if ($this->container['toField'] === null) { + return false; + } + if ($this->container['tag'] === null) { + return false; + } + if ($this->container['htmlContent'] === null) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + return true; + } + + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the template + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the template + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the template + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets isActive + * + * @return bool + */ + public function getIsActive() + { + return $this->container['isActive']; + } + + /** + * Sets isActive + * + * @param bool $isActive Status of template (true=active, false=inactive) + * + * @return $this + */ + public function setIsActive($isActive) + { + $this->container['isActive'] = $isActive; + + return $this; + } + + /** + * Gets testSent + * + * @return bool + */ + public function getTestSent() + { + return $this->container['testSent']; + } + + /** + * Sets testSent + * + * @param bool $testSent Status of test sending for the template (true=test email has been sent, false=test email has not been sent) + * + * @return $this + */ + public function setTestSent($testSent) + { + $this->container['testSent'] = $testSent; + + return $this; + } + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\GetSmtpTemplateOverviewSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\GetSmtpTemplateOverviewSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email defined as the \"Reply to\" for the template + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets toField + * + * @return string + */ + public function getToField() + { + return $this->container['toField']; + } + + /** + * Sets toField + * + * @param string $toField Customisation of the \"to\" field for the template + * + * @return $this + */ + public function setToField($toField) + { + $this->container['toField'] = $toField; + + return $this; + } + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the template + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent HTML content of the template + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the template (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt Last modification UTC date-time of the template (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverviewSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverviewSender.php new file mode 100644 index 0000000..7ae6e3f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplateOverviewSender.php @@ -0,0 +1,332 @@ + 'string', + 'email' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name From email for the template + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email From email for the template + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplates.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplates.php new file mode 100644 index 0000000..98d2324 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSmtpTemplates.php @@ -0,0 +1,332 @@ + 'int', + 'templates' => '\SendinBlue\Client\Model\GetSmtpTemplateOverview[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'count' => 'int64', + 'templates' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'count' => 'count', + 'templates' => 'templates' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'count' => 'setCount', + 'templates' => 'setTemplates' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'count' => 'getCount', + 'templates' => 'getTemplates' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['count'] = isset($data['count']) ? $data['count'] : null; + $this->container['templates'] = isset($data['templates']) ? $data['templates'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets count + * + * @return int + */ + public function getCount() + { + return $this->container['count']; + } + + /** + * Sets count + * + * @param int $count Count of smtp templates + * + * @return $this + */ + public function setCount($count) + { + $this->container['count'] = $count; + + return $this; + } + + /** + * Gets templates + * + * @return \SendinBlue\Client\Model\GetSmtpTemplateOverview[] + */ + public function getTemplates() + { + return $this->container['templates']; + } + + /** + * Sets templates + * + * @param \SendinBlue\Client\Model\GetSmtpTemplateOverview[] $templates templates + * + * @return $this + */ + public function setTemplates($templates) + { + $this->container['templates'] = $templates; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSsoToken.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSsoToken.php new file mode 100644 index 0000000..fccdb85 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetSsoToken.php @@ -0,0 +1,308 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'token' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'token' => 'token' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'token' => 'setToken' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'token' => 'getToken' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['token'] = isset($data['token']) ? $data['token'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['token'] === null) { + $invalidProperties[] = "'token' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['token'] === null) { + return false; + } + return true; + } + + + /** + * Gets token + * + * @return string + */ + public function getToken() + { + return $this->container['token']; + } + + /** + * Sets token + * + * @param string $token Session token. It will remain valid for a short period of time only. + * + * @return $this + */ + public function setToken($token) + { + $this->container['token'] = $token; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetStatsByDomain.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetStatsByDomain.php new file mode 100644 index 0000000..cedf4f0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetStatsByDomain.php @@ -0,0 +1,280 @@ +container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacAggregatedSmsReport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacAggregatedSmsReport.php new file mode 100644 index 0000000..57bb501 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacAggregatedSmsReport.php @@ -0,0 +1,632 @@ + 'string', + 'requests' => 'int', + 'delivered' => 'int', + 'hardBounces' => 'int', + 'softBounces' => 'int', + 'blocked' => 'int', + 'unsubscribed' => 'int', + 'replied' => 'int', + 'accepted' => 'int', + 'rejected' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'range' => null, + 'requests' => 'int64', + 'delivered' => 'int64', + 'hardBounces' => 'int64', + 'softBounces' => 'int64', + 'blocked' => 'int64', + 'unsubscribed' => 'int64', + 'replied' => 'int64', + 'accepted' => 'int64', + 'rejected' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'range' => 'range', + 'requests' => 'requests', + 'delivered' => 'delivered', + 'hardBounces' => 'hardBounces', + 'softBounces' => 'softBounces', + 'blocked' => 'blocked', + 'unsubscribed' => 'unsubscribed', + 'replied' => 'replied', + 'accepted' => 'accepted', + 'rejected' => 'rejected' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'range' => 'setRange', + 'requests' => 'setRequests', + 'delivered' => 'setDelivered', + 'hardBounces' => 'setHardBounces', + 'softBounces' => 'setSoftBounces', + 'blocked' => 'setBlocked', + 'unsubscribed' => 'setUnsubscribed', + 'replied' => 'setReplied', + 'accepted' => 'setAccepted', + 'rejected' => 'setRejected' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'range' => 'getRange', + 'requests' => 'getRequests', + 'delivered' => 'getDelivered', + 'hardBounces' => 'getHardBounces', + 'softBounces' => 'getSoftBounces', + 'blocked' => 'getBlocked', + 'unsubscribed' => 'getUnsubscribed', + 'replied' => 'getReplied', + 'accepted' => 'getAccepted', + 'rejected' => 'getRejected' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['range'] = isset($data['range']) ? $data['range'] : null; + $this->container['requests'] = isset($data['requests']) ? $data['requests'] : null; + $this->container['delivered'] = isset($data['delivered']) ? $data['delivered'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['blocked'] = isset($data['blocked']) ? $data['blocked'] : null; + $this->container['unsubscribed'] = isset($data['unsubscribed']) ? $data['unsubscribed'] : null; + $this->container['replied'] = isset($data['replied']) ? $data['replied'] : null; + $this->container['accepted'] = isset($data['accepted']) ? $data['accepted'] : null; + $this->container['rejected'] = isset($data['rejected']) ? $data['rejected'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['range'] === null) { + $invalidProperties[] = "'range' can't be null"; + } + if ($this->container['requests'] === null) { + $invalidProperties[] = "'requests' can't be null"; + } + if ($this->container['delivered'] === null) { + $invalidProperties[] = "'delivered' can't be null"; + } + if ($this->container['hardBounces'] === null) { + $invalidProperties[] = "'hardBounces' can't be null"; + } + if ($this->container['softBounces'] === null) { + $invalidProperties[] = "'softBounces' can't be null"; + } + if ($this->container['blocked'] === null) { + $invalidProperties[] = "'blocked' can't be null"; + } + if ($this->container['unsubscribed'] === null) { + $invalidProperties[] = "'unsubscribed' can't be null"; + } + if ($this->container['replied'] === null) { + $invalidProperties[] = "'replied' can't be null"; + } + if ($this->container['accepted'] === null) { + $invalidProperties[] = "'accepted' can't be null"; + } + if ($this->container['rejected'] === null) { + $invalidProperties[] = "'rejected' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['range'] === null) { + return false; + } + if ($this->container['requests'] === null) { + return false; + } + if ($this->container['delivered'] === null) { + return false; + } + if ($this->container['hardBounces'] === null) { + return false; + } + if ($this->container['softBounces'] === null) { + return false; + } + if ($this->container['blocked'] === null) { + return false; + } + if ($this->container['unsubscribed'] === null) { + return false; + } + if ($this->container['replied'] === null) { + return false; + } + if ($this->container['accepted'] === null) { + return false; + } + if ($this->container['rejected'] === null) { + return false; + } + return true; + } + + + /** + * Gets range + * + * @return string + */ + public function getRange() + { + return $this->container['range']; + } + + /** + * Sets range + * + * @param string $range Time frame of the report + * + * @return $this + */ + public function setRange($range) + { + $this->container['range'] = $range; + + return $this; + } + + /** + * Gets requests + * + * @return int + */ + public function getRequests() + { + return $this->container['requests']; + } + + /** + * Sets requests + * + * @param int $requests Number of requests for the timeframe + * + * @return $this + */ + public function setRequests($requests) + { + $this->container['requests'] = $requests; + + return $this; + } + + /** + * Gets delivered + * + * @return int + */ + public function getDelivered() + { + return $this->container['delivered']; + } + + /** + * Sets delivered + * + * @param int $delivered Number of delivered SMS for the timeframe + * + * @return $this + */ + public function setDelivered($delivered) + { + $this->container['delivered'] = $delivered; + + return $this; + } + + /** + * Gets hardBounces + * + * @return int + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param int $hardBounces Number of hardbounces for the timeframe + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets softBounces + * + * @return int + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param int $softBounces Number of softbounces for the timeframe + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets blocked + * + * @return int + */ + public function getBlocked() + { + return $this->container['blocked']; + } + + /** + * Sets blocked + * + * @param int $blocked Number of blocked contact for the timeframe + * + * @return $this + */ + public function setBlocked($blocked) + { + $this->container['blocked'] = $blocked; + + return $this; + } + + /** + * Gets unsubscribed + * + * @return int + */ + public function getUnsubscribed() + { + return $this->container['unsubscribed']; + } + + /** + * Sets unsubscribed + * + * @param int $unsubscribed Number of unsubscription for the timeframe + * + * @return $this + */ + public function setUnsubscribed($unsubscribed) + { + $this->container['unsubscribed'] = $unsubscribed; + + return $this; + } + + /** + * Gets replied + * + * @return int + */ + public function getReplied() + { + return $this->container['replied']; + } + + /** + * Sets replied + * + * @param int $replied Number of answered SMS for the timeframe + * + * @return $this + */ + public function setReplied($replied) + { + $this->container['replied'] = $replied; + + return $this; + } + + /** + * Gets accepted + * + * @return int + */ + public function getAccepted() + { + return $this->container['accepted']; + } + + /** + * Sets accepted + * + * @param int $accepted Number of accepted for the timeframe + * + * @return $this + */ + public function setAccepted($accepted) + { + $this->container['accepted'] = $accepted; + + return $this; + } + + /** + * Gets rejected + * + * @return int + */ + public function getRejected() + { + return $this->container['rejected']; + } + + /** + * Sets rejected + * + * @param int $rejected Number of rejected for the timeframe + * + * @return $this + */ + public function setRejected($rejected) + { + $this->container['rejected'] = $rejected; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReport.php new file mode 100644 index 0000000..8de91a6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReport.php @@ -0,0 +1,302 @@ + '\SendinBlue\Client\Model\GetTransacSmsReportReports[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'reports' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'reports' => 'reports' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'reports' => 'setReports' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'reports' => 'getReports' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['reports'] = isset($data['reports']) ? $data['reports'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets reports + * + * @return \SendinBlue\Client\Model\GetTransacSmsReportReports[] + */ + public function getReports() + { + return $this->container['reports']; + } + + /** + * Sets reports + * + * @param \SendinBlue\Client\Model\GetTransacSmsReportReports[] $reports reports + * + * @return $this + */ + public function setReports($reports) + { + $this->container['reports'] = $reports; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReportReports.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReportReports.php new file mode 100644 index 0000000..232e1e8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetTransacSmsReportReports.php @@ -0,0 +1,632 @@ + '\DateTime', + 'requests' => 'int', + 'delivered' => 'int', + 'hardBounces' => 'int', + 'softBounces' => 'int', + 'blocked' => 'int', + 'unsubscribed' => 'int', + 'replied' => 'int', + 'accepted' => 'int', + 'rejected' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'date' => 'date', + 'requests' => 'int64', + 'delivered' => 'int64', + 'hardBounces' => 'int64', + 'softBounces' => 'int64', + 'blocked' => 'int64', + 'unsubscribed' => 'int64', + 'replied' => 'int64', + 'accepted' => 'int64', + 'rejected' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'date' => 'date', + 'requests' => 'requests', + 'delivered' => 'delivered', + 'hardBounces' => 'hardBounces', + 'softBounces' => 'softBounces', + 'blocked' => 'blocked', + 'unsubscribed' => 'unsubscribed', + 'replied' => 'replied', + 'accepted' => 'accepted', + 'rejected' => 'rejected' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'date' => 'setDate', + 'requests' => 'setRequests', + 'delivered' => 'setDelivered', + 'hardBounces' => 'setHardBounces', + 'softBounces' => 'setSoftBounces', + 'blocked' => 'setBlocked', + 'unsubscribed' => 'setUnsubscribed', + 'replied' => 'setReplied', + 'accepted' => 'setAccepted', + 'rejected' => 'setRejected' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'date' => 'getDate', + 'requests' => 'getRequests', + 'delivered' => 'getDelivered', + 'hardBounces' => 'getHardBounces', + 'softBounces' => 'getSoftBounces', + 'blocked' => 'getBlocked', + 'unsubscribed' => 'getUnsubscribed', + 'replied' => 'getReplied', + 'accepted' => 'getAccepted', + 'rejected' => 'getRejected' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['date'] = isset($data['date']) ? $data['date'] : null; + $this->container['requests'] = isset($data['requests']) ? $data['requests'] : null; + $this->container['delivered'] = isset($data['delivered']) ? $data['delivered'] : null; + $this->container['hardBounces'] = isset($data['hardBounces']) ? $data['hardBounces'] : null; + $this->container['softBounces'] = isset($data['softBounces']) ? $data['softBounces'] : null; + $this->container['blocked'] = isset($data['blocked']) ? $data['blocked'] : null; + $this->container['unsubscribed'] = isset($data['unsubscribed']) ? $data['unsubscribed'] : null; + $this->container['replied'] = isset($data['replied']) ? $data['replied'] : null; + $this->container['accepted'] = isset($data['accepted']) ? $data['accepted'] : null; + $this->container['rejected'] = isset($data['rejected']) ? $data['rejected'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['date'] === null) { + $invalidProperties[] = "'date' can't be null"; + } + if ($this->container['requests'] === null) { + $invalidProperties[] = "'requests' can't be null"; + } + if ($this->container['delivered'] === null) { + $invalidProperties[] = "'delivered' can't be null"; + } + if ($this->container['hardBounces'] === null) { + $invalidProperties[] = "'hardBounces' can't be null"; + } + if ($this->container['softBounces'] === null) { + $invalidProperties[] = "'softBounces' can't be null"; + } + if ($this->container['blocked'] === null) { + $invalidProperties[] = "'blocked' can't be null"; + } + if ($this->container['unsubscribed'] === null) { + $invalidProperties[] = "'unsubscribed' can't be null"; + } + if ($this->container['replied'] === null) { + $invalidProperties[] = "'replied' can't be null"; + } + if ($this->container['accepted'] === null) { + $invalidProperties[] = "'accepted' can't be null"; + } + if ($this->container['rejected'] === null) { + $invalidProperties[] = "'rejected' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['date'] === null) { + return false; + } + if ($this->container['requests'] === null) { + return false; + } + if ($this->container['delivered'] === null) { + return false; + } + if ($this->container['hardBounces'] === null) { + return false; + } + if ($this->container['softBounces'] === null) { + return false; + } + if ($this->container['blocked'] === null) { + return false; + } + if ($this->container['unsubscribed'] === null) { + return false; + } + if ($this->container['replied'] === null) { + return false; + } + if ($this->container['accepted'] === null) { + return false; + } + if ($this->container['rejected'] === null) { + return false; + } + return true; + } + + + /** + * Gets date + * + * @return \DateTime + */ + public function getDate() + { + return $this->container['date']; + } + + /** + * Sets date + * + * @param \DateTime $date Date for which statistics are retrieved + * + * @return $this + */ + public function setDate($date) + { + $this->container['date'] = $date; + + return $this; + } + + /** + * Gets requests + * + * @return int + */ + public function getRequests() + { + return $this->container['requests']; + } + + /** + * Sets requests + * + * @param int $requests Number of requests for the date + * + * @return $this + */ + public function setRequests($requests) + { + $this->container['requests'] = $requests; + + return $this; + } + + /** + * Gets delivered + * + * @return int + */ + public function getDelivered() + { + return $this->container['delivered']; + } + + /** + * Sets delivered + * + * @param int $delivered Number of delivered SMS for the date + * + * @return $this + */ + public function setDelivered($delivered) + { + $this->container['delivered'] = $delivered; + + return $this; + } + + /** + * Gets hardBounces + * + * @return int + */ + public function getHardBounces() + { + return $this->container['hardBounces']; + } + + /** + * Sets hardBounces + * + * @param int $hardBounces Number of hardbounces for the date + * + * @return $this + */ + public function setHardBounces($hardBounces) + { + $this->container['hardBounces'] = $hardBounces; + + return $this; + } + + /** + * Gets softBounces + * + * @return int + */ + public function getSoftBounces() + { + return $this->container['softBounces']; + } + + /** + * Sets softBounces + * + * @param int $softBounces Number of softbounces for the date + * + * @return $this + */ + public function setSoftBounces($softBounces) + { + $this->container['softBounces'] = $softBounces; + + return $this; + } + + /** + * Gets blocked + * + * @return int + */ + public function getBlocked() + { + return $this->container['blocked']; + } + + /** + * Sets blocked + * + * @param int $blocked Number of blocked contact for the date + * + * @return $this + */ + public function setBlocked($blocked) + { + $this->container['blocked'] = $blocked; + + return $this; + } + + /** + * Gets unsubscribed + * + * @return int + */ + public function getUnsubscribed() + { + return $this->container['unsubscribed']; + } + + /** + * Sets unsubscribed + * + * @param int $unsubscribed Number of unsubscription for the date + * + * @return $this + */ + public function setUnsubscribed($unsubscribed) + { + $this->container['unsubscribed'] = $unsubscribed; + + return $this; + } + + /** + * Gets replied + * + * @return int + */ + public function getReplied() + { + return $this->container['replied']; + } + + /** + * Sets replied + * + * @param int $replied Number of answered SMS for the date + * + * @return $this + */ + public function setReplied($replied) + { + $this->container['replied'] = $replied; + + return $this; + } + + /** + * Gets accepted + * + * @return int + */ + public function getAccepted() + { + return $this->container['accepted']; + } + + /** + * Sets accepted + * + * @param int $accepted Number of accepted for the date + * + * @return $this + */ + public function setAccepted($accepted) + { + $this->container['accepted'] = $accepted; + + return $this; + } + + /** + * Gets rejected + * + * @return int + */ + public function getRejected() + { + return $this->container['rejected']; + } + + /** + * Sets rejected + * + * @param int $rejected Number of rejected for the date + * + * @return $this + */ + public function setRejected($rejected) + { + $this->container['rejected'] = $rejected; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhook.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhook.php new file mode 100644 index 0000000..be79919 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhook.php @@ -0,0 +1,560 @@ + 'string', + 'id' => 'int', + 'description' => 'string', + 'events' => 'string[]', + 'type' => 'string', + 'createdAt' => '\DateTime', + 'modifiedAt' => '\DateTime' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'url' => 'url', + 'id' => 'int64', + 'description' => null, + 'events' => null, + 'type' => null, + 'createdAt' => 'date-time', + 'modifiedAt' => 'date-time' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'url' => 'url', + 'id' => 'id', + 'description' => 'description', + 'events' => 'events', + 'type' => 'type', + 'createdAt' => 'createdAt', + 'modifiedAt' => 'modifiedAt' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'url' => 'setUrl', + 'id' => 'setId', + 'description' => 'setDescription', + 'events' => 'setEvents', + 'type' => 'setType', + 'createdAt' => 'setCreatedAt', + 'modifiedAt' => 'setModifiedAt' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'url' => 'getUrl', + 'id' => 'getId', + 'description' => 'getDescription', + 'events' => 'getEvents', + 'type' => 'getType', + 'createdAt' => 'getCreatedAt', + 'modifiedAt' => 'getModifiedAt' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const TYPE_MARKETING = 'marketing'; + const TYPE_TRANSAC = 'transac'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_MARKETING, + self::TYPE_TRANSAC, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['url'] = isset($data['url']) ? $data['url'] : null; + $this->container['id'] = isset($data['id']) ? $data['id'] : null; + $this->container['description'] = isset($data['description']) ? $data['description'] : null; + $this->container['events'] = isset($data['events']) ? $data['events'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : null; + $this->container['createdAt'] = isset($data['createdAt']) ? $data['createdAt'] : null; + $this->container['modifiedAt'] = isset($data['modifiedAt']) ? $data['modifiedAt'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['url'] === null) { + $invalidProperties[] = "'url' can't be null"; + } + if ($this->container['id'] === null) { + $invalidProperties[] = "'id' can't be null"; + } + if ($this->container['description'] === null) { + $invalidProperties[] = "'description' can't be null"; + } + if ($this->container['events'] === null) { + $invalidProperties[] = "'events' can't be null"; + } + if ($this->container['type'] === null) { + $invalidProperties[] = "'type' can't be null"; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['createdAt'] === null) { + $invalidProperties[] = "'createdAt' can't be null"; + } + if ($this->container['modifiedAt'] === null) { + $invalidProperties[] = "'modifiedAt' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['url'] === null) { + return false; + } + if ($this->container['id'] === null) { + return false; + } + if ($this->container['description'] === null) { + return false; + } + if ($this->container['events'] === null) { + return false; + } + if ($this->container['type'] === null) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + if ($this->container['createdAt'] === null) { + return false; + } + if ($this->container['modifiedAt'] === null) { + return false; + } + return true; + } + + + /** + * Gets url + * + * @return string + */ + public function getUrl() + { + return $this->container['url']; + } + + /** + * Sets url + * + * @param string $url URL of the webhook + * + * @return $this + */ + public function setUrl($url) + { + $this->container['url'] = $url; + + return $this; + } + + /** + * Gets id + * + * @return int + */ + public function getId() + { + return $this->container['id']; + } + + /** + * Sets id + * + * @param int $id ID of the webhook + * + * @return $this + */ + public function setId($id) + { + $this->container['id'] = $id; + + return $this; + } + + /** + * Gets description + * + * @return string + */ + public function getDescription() + { + return $this->container['description']; + } + + /** + * Sets description + * + * @param string $description Description of the webhook + * + * @return $this + */ + public function setDescription($description) + { + $this->container['description'] = $description; + + return $this; + } + + /** + * Gets events + * + * @return string[] + */ + public function getEvents() + { + return $this->container['events']; + } + + /** + * Sets events + * + * @param string[] $events events + * + * @return $this + */ + public function setEvents($events) + { + $this->container['events'] = $events; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of webhook (marketing or transac) + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + + /** + * Gets createdAt + * + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->container['createdAt']; + } + + /** + * Sets createdAt + * + * @param \DateTime $createdAt Creation UTC date-time of the webhook (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setCreatedAt($createdAt) + { + $this->container['createdAt'] = $createdAt; + + return $this; + } + + /** + * Gets modifiedAt + * + * @return \DateTime + */ + public function getModifiedAt() + { + return $this->container['modifiedAt']; + } + + /** + * Sets modifiedAt + * + * @param \DateTime $modifiedAt Last modification UTC date-time of the webhook (YYYY-MM-DDTHH:mm:ss.SSSZ) + * + * @return $this + */ + public function setModifiedAt($modifiedAt) + { + $this->container['modifiedAt'] = $modifiedAt; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhooks.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhooks.php new file mode 100644 index 0000000..302be51 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/GetWebhooks.php @@ -0,0 +1,308 @@ + 'object[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'webhooks' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'webhooks' => 'webhooks' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'webhooks' => 'setWebhooks' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'webhooks' => 'getWebhooks' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['webhooks'] = isset($data['webhooks']) ? $data['webhooks'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['webhooks'] === null) { + $invalidProperties[] = "'webhooks' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['webhooks'] === null) { + return false; + } + return true; + } + + + /** + * Gets webhooks + * + * @return object[] + */ + public function getWebhooks() + { + return $this->container['webhooks']; + } + + /** + * Sets webhooks + * + * @param object[] $webhooks webhooks + * + * @return $this + */ + public function setWebhooks($webhooks) + { + $this->container['webhooks'] = $webhooks; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ManageIp.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ManageIp.php new file mode 100644 index 0000000..9fc28a7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ManageIp.php @@ -0,0 +1,302 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'ip' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'ip' => 'ip' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'ip' => 'setIp' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'ip' => 'getIp' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['ip'] = isset($data['ip']) ? $data['ip'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets ip + * + * @return string + */ + public function getIp() + { + return $this->container['ip']; + } + + /** + * Sets ip + * + * @param string $ip Dedicated ID + * + * @return $this + */ + public function setIp($ip) + { + $this->container['ip'] = $ip; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ModelInterface.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ModelInterface.php new file mode 100644 index 0000000..79f6796 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/ModelInterface.php @@ -0,0 +1,96 @@ + '\SendinBlue\Client\Model\PostContactInfoContacts' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'contacts' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'contacts' => 'contacts' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'contacts' => 'setContacts' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'contacts' => 'getContacts' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['contacts'] = isset($data['contacts']) ? $data['contacts'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['contacts'] === null) { + $invalidProperties[] = "'contacts' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['contacts'] === null) { + return false; + } + return true; + } + + + /** + * Gets contacts + * + * @return \SendinBlue\Client\Model\PostContactInfoContacts + */ + public function getContacts() + { + return $this->container['contacts']; + } + + /** + * Sets contacts + * + * @param \SendinBlue\Client\Model\PostContactInfoContacts $contacts contacts + * + * @return $this + */ + public function setContacts($contacts) + { + $this->container['contacts'] = $contacts; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostContactInfoContacts.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostContactInfoContacts.php new file mode 100644 index 0000000..b6c9a1c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostContactInfoContacts.php @@ -0,0 +1,362 @@ + 'string[]', + 'failure' => 'string[]', + 'total' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'success' => 'email', + 'failure' => 'email', + 'total' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'success' => 'success', + 'failure' => 'failure', + 'total' => 'total' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'success' => 'setSuccess', + 'failure' => 'setFailure', + 'total' => 'setTotal' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'success' => 'getSuccess', + 'failure' => 'getFailure', + 'total' => 'getTotal' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['success'] = isset($data['success']) ? $data['success'] : null; + $this->container['failure'] = isset($data['failure']) ? $data['failure'] : null; + $this->container['total'] = isset($data['total']) ? $data['total'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets success + * + * @return string[] + */ + public function getSuccess() + { + return $this->container['success']; + } + + /** + * Sets success + * + * @param string[] $success success + * + * @return $this + */ + public function setSuccess($success) + { + $this->container['success'] = $success; + + return $this; + } + + /** + * Gets failure + * + * @return string[] + */ + public function getFailure() + { + return $this->container['failure']; + } + + /** + * Sets failure + * + * @param string[] $failure failure + * + * @return $this + */ + public function setFailure($failure) + { + $this->container['failure'] = $failure; + + return $this; + } + + /** + * Gets total + * + * @return int + */ + public function getTotal() + { + return $this->container['total']; + } + + /** + * Sets total + * + * @param int $total Displays the count of total number of contacts removed from list when user opts for \"all\" option. + * + * @return $this + */ + public function setTotal($total) + { + $this->container['total'] = $total; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendFailed.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendFailed.php new file mode 100644 index 0000000..b0b71f3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendFailed.php @@ -0,0 +1,434 @@ + 'int', + 'message' => 'string', + 'unexistingEmails' => 'string[]', + 'withoutListEmails' => 'string[]', + 'blackListedEmails' => 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'code' => 'int64', + 'message' => null, + 'unexistingEmails' => 'email', + 'withoutListEmails' => 'email', + 'blackListedEmails' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'code' => 'code', + 'message' => 'message', + 'unexistingEmails' => 'unexistingEmails', + 'withoutListEmails' => 'withoutListEmails', + 'blackListedEmails' => 'blackListedEmails' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'code' => 'setCode', + 'message' => 'setMessage', + 'unexistingEmails' => 'setUnexistingEmails', + 'withoutListEmails' => 'setWithoutListEmails', + 'blackListedEmails' => 'setBlackListedEmails' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'code' => 'getCode', + 'message' => 'getMessage', + 'unexistingEmails' => 'getUnexistingEmails', + 'withoutListEmails' => 'getWithoutListEmails', + 'blackListedEmails' => 'getBlackListedEmails' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['code'] = isset($data['code']) ? $data['code'] : null; + $this->container['message'] = isset($data['message']) ? $data['message'] : null; + $this->container['unexistingEmails'] = isset($data['unexistingEmails']) ? $data['unexistingEmails'] : null; + $this->container['withoutListEmails'] = isset($data['withoutListEmails']) ? $data['withoutListEmails'] : null; + $this->container['blackListedEmails'] = isset($data['blackListedEmails']) ? $data['blackListedEmails'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['code'] === null) { + $invalidProperties[] = "'code' can't be null"; + } + if ($this->container['message'] === null) { + $invalidProperties[] = "'message' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['code'] === null) { + return false; + } + if ($this->container['message'] === null) { + return false; + } + return true; + } + + + /** + * Gets code + * + * @return int + */ + public function getCode() + { + return $this->container['code']; + } + + /** + * Sets code + * + * @param int $code Response code + * + * @return $this + */ + public function setCode($code) + { + $this->container['code'] = $code; + + return $this; + } + + /** + * Gets message + * + * @return string + */ + public function getMessage() + { + return $this->container['message']; + } + + /** + * Sets message + * + * @param string $message Response message + * + * @return $this + */ + public function setMessage($message) + { + $this->container['message'] = $message; + + return $this; + } + + /** + * Gets unexistingEmails + * + * @return string[] + */ + public function getUnexistingEmails() + { + return $this->container['unexistingEmails']; + } + + /** + * Sets unexistingEmails + * + * @param string[] $unexistingEmails unexistingEmails + * + * @return $this + */ + public function setUnexistingEmails($unexistingEmails) + { + $this->container['unexistingEmails'] = $unexistingEmails; + + return $this; + } + + /** + * Gets withoutListEmails + * + * @return string[] + */ + public function getWithoutListEmails() + { + return $this->container['withoutListEmails']; + } + + /** + * Sets withoutListEmails + * + * @param string[] $withoutListEmails withoutListEmails + * + * @return $this + */ + public function setWithoutListEmails($withoutListEmails) + { + $this->container['withoutListEmails'] = $withoutListEmails; + + return $this; + } + + /** + * Gets blackListedEmails + * + * @return string[] + */ + public function getBlackListedEmails() + { + return $this->container['blackListedEmails']; + } + + /** + * Sets blackListedEmails + * + * @param string[] $blackListedEmails blackListedEmails + * + * @return $this + */ + public function setBlackListedEmails($blackListedEmails) + { + $this->container['blackListedEmails'] = $blackListedEmails; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendSmsTestFailed.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendSmsTestFailed.php new file mode 100644 index 0000000..07ed3cc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/PostSendSmsTestFailed.php @@ -0,0 +1,404 @@ + 'int', + 'message' => 'string', + 'unexistingSms' => 'string[]', + 'withoutListSms' => 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'code' => 'int64', + 'message' => null, + 'unexistingSms' => 'email', + 'withoutListSms' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'code' => 'code', + 'message' => 'message', + 'unexistingSms' => 'unexistingSms', + 'withoutListSms' => 'withoutListSms' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'code' => 'setCode', + 'message' => 'setMessage', + 'unexistingSms' => 'setUnexistingSms', + 'withoutListSms' => 'setWithoutListSms' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'code' => 'getCode', + 'message' => 'getMessage', + 'unexistingSms' => 'getUnexistingSms', + 'withoutListSms' => 'getWithoutListSms' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['code'] = isset($data['code']) ? $data['code'] : null; + $this->container['message'] = isset($data['message']) ? $data['message'] : null; + $this->container['unexistingSms'] = isset($data['unexistingSms']) ? $data['unexistingSms'] : null; + $this->container['withoutListSms'] = isset($data['withoutListSms']) ? $data['withoutListSms'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['code'] === null) { + $invalidProperties[] = "'code' can't be null"; + } + if ($this->container['message'] === null) { + $invalidProperties[] = "'message' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['code'] === null) { + return false; + } + if ($this->container['message'] === null) { + return false; + } + return true; + } + + + /** + * Gets code + * + * @return int + */ + public function getCode() + { + return $this->container['code']; + } + + /** + * Sets code + * + * @param int $code Response code + * + * @return $this + */ + public function setCode($code) + { + $this->container['code'] = $code; + + return $this; + } + + /** + * Gets message + * + * @return string + */ + public function getMessage() + { + return $this->container['message']; + } + + /** + * Sets message + * + * @param string $message Response message + * + * @return $this + */ + public function setMessage($message) + { + $this->container['message'] = $message; + + return $this; + } + + /** + * Gets unexistingSms + * + * @return string[] + */ + public function getUnexistingSms() + { + return $this->container['unexistingSms']; + } + + /** + * Sets unexistingSms + * + * @param string[] $unexistingSms unexistingSms + * + * @return $this + */ + public function setUnexistingSms($unexistingSms) + { + $this->container['unexistingSms'] = $unexistingSms; + + return $this; + } + + /** + * Gets withoutListSms + * + * @return string[] + */ + public function getWithoutListSms() + { + return $this->container['withoutListSms']; + } + + /** + * Sets withoutListSms + * + * @param string[] $withoutListSms withoutListSms + * + * @return $this + */ + public function setWithoutListSms($withoutListSms) + { + $this->container['withoutListSms'] = $withoutListSms; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModel.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModel.php new file mode 100644 index 0000000..95cad1e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModel.php @@ -0,0 +1,344 @@ + '\SendinBlue\Client\Model\RemainingCreditModelChild', + 'reseller' => '\SendinBlue\Client\Model\RemainingCreditModelReseller' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'child' => null, + 'reseller' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'child' => 'child', + 'reseller' => 'reseller' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'child' => 'setChild', + 'reseller' => 'setReseller' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'child' => 'getChild', + 'reseller' => 'getReseller' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['child'] = isset($data['child']) ? $data['child'] : null; + $this->container['reseller'] = isset($data['reseller']) ? $data['reseller'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['child'] === null) { + $invalidProperties[] = "'child' can't be null"; + } + if ($this->container['reseller'] === null) { + $invalidProperties[] = "'reseller' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['child'] === null) { + return false; + } + if ($this->container['reseller'] === null) { + return false; + } + return true; + } + + + /** + * Gets child + * + * @return \SendinBlue\Client\Model\RemainingCreditModelChild + */ + public function getChild() + { + return $this->container['child']; + } + + /** + * Sets child + * + * @param \SendinBlue\Client\Model\RemainingCreditModelChild $child child + * + * @return $this + */ + public function setChild($child) + { + $this->container['child'] = $child; + + return $this; + } + + /** + * Gets reseller + * + * @return \SendinBlue\Client\Model\RemainingCreditModelReseller + */ + public function getReseller() + { + return $this->container['reseller']; + } + + /** + * Sets reseller + * + * @param \SendinBlue\Client\Model\RemainingCreditModelReseller $reseller reseller + * + * @return $this + */ + public function setReseller($reseller) + { + $this->container['reseller'] = $reseller; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelChild.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelChild.php new file mode 100644 index 0000000..088bd9a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelChild.php @@ -0,0 +1,345 @@ + 'int', + 'email' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'sms' => 'int64', + 'email' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'sms' => 'sms', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'sms' => 'setSms', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'sms' => 'getSms', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['sms'] = isset($data['sms']) ? $data['sms'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['sms'] === null) { + $invalidProperties[] = "'sms' can't be null"; + } + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['sms'] === null) { + return false; + } + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets sms + * + * @return int + */ + public function getSms() + { + return $this->container['sms']; + } + + /** + * Sets sms + * + * @param int $sms SMS Credits remaining for child account + * + * @return $this + */ + public function setSms($sms) + { + $this->container['sms'] = $sms; + + return $this; + } + + /** + * Gets email + * + * @return int + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param int $email Email Credits remaining for child account + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelReseller.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelReseller.php new file mode 100644 index 0000000..c6398f9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemainingCreditModelReseller.php @@ -0,0 +1,344 @@ + 'int', + 'email' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'sms' => 'int64', + 'email' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'sms' => 'sms', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'sms' => 'setSms', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'sms' => 'getSms', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['sms'] = isset($data['sms']) ? $data['sms'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['sms'] === null) { + $invalidProperties[] = "'sms' can't be null"; + } + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['sms'] === null) { + return false; + } + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets sms + * + * @return int + */ + public function getSms() + { + return $this->container['sms']; + } + + /** + * Sets sms + * + * @param int $sms SMS Credits remaining for reseller account + * + * @return $this + */ + public function setSms($sms) + { + $this->container['sms'] = $sms; + + return $this; + } + + /** + * Gets email + * + * @return int + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param int $email Email Credits remaining for reseller account + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveContactFromList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveContactFromList.php new file mode 100644 index 0000000..017371b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveContactFromList.php @@ -0,0 +1,332 @@ + 'string[]', + 'all' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'emails' => 'email', + 'all' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'emails' => 'emails', + 'all' => 'all' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'emails' => 'setEmails', + 'all' => 'setAll' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'emails' => 'getEmails', + 'all' => 'getAll' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['emails'] = isset($data['emails']) ? $data['emails'] : null; + $this->container['all'] = isset($data['all']) ? $data['all'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets emails + * + * @return string[] + */ + public function getEmails() + { + return $this->container['emails']; + } + + /** + * Sets emails + * + * @param string[] $emails Required if 'all' is false. Emails to remove from a list + * + * @return $this + */ + public function setEmails($emails) + { + $this->container['emails'] = $emails; + + return $this; + } + + /** + * Gets all + * + * @return bool + */ + public function getAll() + { + return $this->container['all']; + } + + /** + * Sets all + * + * @param bool $all Required if 'emails' is empty. Remove all existing contacts from a list + * + * @return $this + */ + public function setAll($all) + { + $this->container['all'] = $all; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveCredits.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveCredits.php new file mode 100644 index 0000000..9f9aaf9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RemoveCredits.php @@ -0,0 +1,332 @@ + 'int', + 'email' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'sms' => 'int64', + 'email' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'sms' => 'sms', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'sms' => 'setSms', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'sms' => 'getSms', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['sms'] = isset($data['sms']) ? $data['sms'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets sms + * + * @return int + */ + public function getSms() + { + return $this->container['sms']; + } + + /** + * Sets sms + * + * @param int $sms Required if email credits are empty. SMS credits to be removed from the child account + * + * @return $this + */ + public function setSms($sms) + { + $this->container['sms'] = $sms; + + return $this; + } + + /** + * Gets email + * + * @return int + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param int $email Required if sms credits are empty. Email credits to be removed from the child account + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactExport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactExport.php new file mode 100644 index 0000000..42d86ae --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactExport.php @@ -0,0 +1,368 @@ + 'string[]', + 'contactFilter' => 'object', + 'notifyUrl' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'exportAttributes' => null, + 'contactFilter' => null, + 'notifyUrl' => 'url' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'exportAttributes' => 'exportAttributes', + 'contactFilter' => 'contactFilter', + 'notifyUrl' => 'notifyUrl' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'exportAttributes' => 'setExportAttributes', + 'contactFilter' => 'setContactFilter', + 'notifyUrl' => 'setNotifyUrl' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'exportAttributes' => 'getExportAttributes', + 'contactFilter' => 'getContactFilter', + 'notifyUrl' => 'getNotifyUrl' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['exportAttributes'] = isset($data['exportAttributes']) ? $data['exportAttributes'] : null; + $this->container['contactFilter'] = isset($data['contactFilter']) ? $data['contactFilter'] : null; + $this->container['notifyUrl'] = isset($data['notifyUrl']) ? $data['notifyUrl'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['contactFilter'] === null) { + $invalidProperties[] = "'contactFilter' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['contactFilter'] === null) { + return false; + } + return true; + } + + + /** + * Gets exportAttributes + * + * @return string[] + */ + public function getExportAttributes() + { + return $this->container['exportAttributes']; + } + + /** + * Sets exportAttributes + * + * @param string[] $exportAttributes List of all the attributes that you want to export. These attributes must be present in your contact database. For example, ['fname', 'lname', 'email']. + * + * @return $this + */ + public function setExportAttributes($exportAttributes) + { + $this->container['exportAttributes'] = $exportAttributes; + + return $this; + } + + /** + * Gets contactFilter + * + * @return object + */ + public function getContactFilter() + { + return $this->container['contactFilter']; + } + + /** + * Sets contactFilter + * + * @param object $contactFilter Set the filter for the contacts to be exported. For example, `{\"blacklisted\":true}` will export all the blacklisted contacts. + * + * @return $this + */ + public function setContactFilter($contactFilter) + { + $this->container['contactFilter'] = $contactFilter; + + return $this; + } + + /** + * Gets notifyUrl + * + * @return string + */ + public function getNotifyUrl() + { + return $this->container['notifyUrl']; + } + + /** + * Sets notifyUrl + * + * @param string $notifyUrl Webhook that will be called once the export process is finished + * + * @return $this + */ + public function setNotifyUrl($notifyUrl) + { + $this->container['notifyUrl'] = $notifyUrl; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImport.php new file mode 100644 index 0000000..b545b75 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImport.php @@ -0,0 +1,542 @@ + 'string', + 'fileBody' => 'string', + 'listIds' => 'int[]', + 'notifyUrl' => 'string', + 'newList' => '\SendinBlue\Client\Model\RequestContactImportNewList', + 'emailBlacklist' => 'bool', + 'smsBlacklist' => 'bool', + 'updateExistingContacts' => 'bool', + 'emptyContactsAttributes' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'fileUrl' => 'url', + 'fileBody' => null, + 'listIds' => 'int64', + 'notifyUrl' => 'url', + 'newList' => null, + 'emailBlacklist' => null, + 'smsBlacklist' => null, + 'updateExistingContacts' => null, + 'emptyContactsAttributes' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'fileUrl' => 'fileUrl', + 'fileBody' => 'fileBody', + 'listIds' => 'listIds', + 'notifyUrl' => 'notifyUrl', + 'newList' => 'newList', + 'emailBlacklist' => 'emailBlacklist', + 'smsBlacklist' => 'smsBlacklist', + 'updateExistingContacts' => 'updateExistingContacts', + 'emptyContactsAttributes' => 'emptyContactsAttributes' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'fileUrl' => 'setFileUrl', + 'fileBody' => 'setFileBody', + 'listIds' => 'setListIds', + 'notifyUrl' => 'setNotifyUrl', + 'newList' => 'setNewList', + 'emailBlacklist' => 'setEmailBlacklist', + 'smsBlacklist' => 'setSmsBlacklist', + 'updateExistingContacts' => 'setUpdateExistingContacts', + 'emptyContactsAttributes' => 'setEmptyContactsAttributes' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'fileUrl' => 'getFileUrl', + 'fileBody' => 'getFileBody', + 'listIds' => 'getListIds', + 'notifyUrl' => 'getNotifyUrl', + 'newList' => 'getNewList', + 'emailBlacklist' => 'getEmailBlacklist', + 'smsBlacklist' => 'getSmsBlacklist', + 'updateExistingContacts' => 'getUpdateExistingContacts', + 'emptyContactsAttributes' => 'getEmptyContactsAttributes' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['fileUrl'] = isset($data['fileUrl']) ? $data['fileUrl'] : null; + $this->container['fileBody'] = isset($data['fileBody']) ? $data['fileBody'] : null; + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + $this->container['notifyUrl'] = isset($data['notifyUrl']) ? $data['notifyUrl'] : null; + $this->container['newList'] = isset($data['newList']) ? $data['newList'] : null; + $this->container['emailBlacklist'] = isset($data['emailBlacklist']) ? $data['emailBlacklist'] : false; + $this->container['smsBlacklist'] = isset($data['smsBlacklist']) ? $data['smsBlacklist'] : false; + $this->container['updateExistingContacts'] = isset($data['updateExistingContacts']) ? $data['updateExistingContacts'] : true; + $this->container['emptyContactsAttributes'] = isset($data['emptyContactsAttributes']) ? $data['emptyContactsAttributes'] : false; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets fileUrl + * + * @return string + */ + public function getFileUrl() + { + return $this->container['fileUrl']; + } + + /** + * Sets fileUrl + * + * @param string $fileUrl Mandatory if fileBody is not defined. URL of the file to be imported (no local file). Possible file formats: .txt, .csv + * + * @return $this + */ + public function setFileUrl($fileUrl) + { + $this->container['fileUrl'] = $fileUrl; + + return $this; + } + + /** + * Gets fileBody + * + * @return string + */ + public function getFileBody() + { + return $this->container['fileBody']; + } + + /** + * Sets fileBody + * + * @param string $fileBody Mandatory if fileUrl is not defined. CSV content to be imported. Use semicolon to separate multiple attributes + * + * @return $this + */ + public function setFileBody($fileBody) + { + $this->container['fileBody'] = $fileBody; + + return $this; + } + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds Mandatory if newList is not defined. Ids of the lists in which the contacts shall be imported. For example, [2, 4, 7]. + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + + /** + * Gets notifyUrl + * + * @return string + */ + public function getNotifyUrl() + { + return $this->container['notifyUrl']; + } + + /** + * Sets notifyUrl + * + * @param string $notifyUrl URL that will be called once the export process is finished + * + * @return $this + */ + public function setNotifyUrl($notifyUrl) + { + $this->container['notifyUrl'] = $notifyUrl; + + return $this; + } + + /** + * Gets newList + * + * @return \SendinBlue\Client\Model\RequestContactImportNewList + */ + public function getNewList() + { + return $this->container['newList']; + } + + /** + * Sets newList + * + * @param \SendinBlue\Client\Model\RequestContactImportNewList $newList newList + * + * @return $this + */ + public function setNewList($newList) + { + $this->container['newList'] = $newList; + + return $this; + } + + /** + * Gets emailBlacklist + * + * @return bool + */ + public function getEmailBlacklist() + { + return $this->container['emailBlacklist']; + } + + /** + * Sets emailBlacklist + * + * @param bool $emailBlacklist To blacklist all the contacts for email + * + * @return $this + */ + public function setEmailBlacklist($emailBlacklist) + { + $this->container['emailBlacklist'] = $emailBlacklist; + + return $this; + } + + /** + * Gets smsBlacklist + * + * @return bool + */ + public function getSmsBlacklist() + { + return $this->container['smsBlacklist']; + } + + /** + * Sets smsBlacklist + * + * @param bool $smsBlacklist To blacklist all the contacts for sms + * + * @return $this + */ + public function setSmsBlacklist($smsBlacklist) + { + $this->container['smsBlacklist'] = $smsBlacklist; + + return $this; + } + + /** + * Gets updateExistingContacts + * + * @return bool + */ + public function getUpdateExistingContacts() + { + return $this->container['updateExistingContacts']; + } + + /** + * Sets updateExistingContacts + * + * @param bool $updateExistingContacts To facilitate the choice to update the existing contacts + * + * @return $this + */ + public function setUpdateExistingContacts($updateExistingContacts) + { + $this->container['updateExistingContacts'] = $updateExistingContacts; + + return $this; + } + + /** + * Gets emptyContactsAttributes + * + * @return bool + */ + public function getEmptyContactsAttributes() + { + return $this->container['emptyContactsAttributes']; + } + + /** + * Sets emptyContactsAttributes + * + * @param bool $emptyContactsAttributes To facilitate the choice to erase any attribute of the existing contacts with empty value. emptyContactsAttributes = true means the empty fields in your import will erase any attribute that currently contain data in SendinBlue, & emptyContactsAttributes = false means the empty fields will not affect your existing data ( only available if `updateExistingContacts` set to true ) + * + * @return $this + */ + public function setEmptyContactsAttributes($emptyContactsAttributes) + { + $this->container['emptyContactsAttributes'] = $emptyContactsAttributes; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImportNewList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImportNewList.php new file mode 100644 index 0000000..ec1ebda --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestContactImportNewList.php @@ -0,0 +1,333 @@ + 'string', + 'folderId' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'listName' => null, + 'folderId' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'listName' => 'listName', + 'folderId' => 'folderId' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'listName' => 'setListName', + 'folderId' => 'setFolderId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'listName' => 'getListName', + 'folderId' => 'getFolderId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['listName'] = isset($data['listName']) ? $data['listName'] : null; + $this->container['folderId'] = isset($data['folderId']) ? $data['folderId'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets listName + * + * @return string + */ + public function getListName() + { + return $this->container['listName']; + } + + /** + * Sets listName + * + * @param string $listName List with listName will be created first and users will be imported in it (Mandatory if listIds is empty). + * + * @return $this + */ + public function setListName($listName) + { + $this->container['listName'] = $listName; + + return $this; + } + + /** + * Gets folderId + * + * @return int + */ + public function getFolderId() + { + return $this->container['folderId']; + } + + /** + * Sets folderId + * + * @param int $folderId Id of the folder where this new list shall be created (Mandatory if listName is not empty). + * + * @return $this + */ + public function setFolderId($folderId) + { + $this->container['folderId'] = $folderId; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestSMSRecipientExport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestSMSRecipientExport.php new file mode 100644 index 0000000..d8797ce --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/RequestSMSRecipientExport.php @@ -0,0 +1,382 @@ + 'string', + 'recipientsType' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'notifyURL' => 'url', + 'recipientsType' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'notifyURL' => 'notifyURL', + 'recipientsType' => 'recipientsType' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'notifyURL' => 'setNotifyURL', + 'recipientsType' => 'setRecipientsType' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'notifyURL' => 'getNotifyURL', + 'recipientsType' => 'getRecipientsType' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const RECIPIENTS_TYPE_ALL = 'all'; + const RECIPIENTS_TYPE_DELIVERED = 'delivered'; + const RECIPIENTS_TYPE_ANSWERED = 'answered'; + const RECIPIENTS_TYPE_SOFT_BOUNCES = 'softBounces'; + const RECIPIENTS_TYPE_HARD_BOUNCES = 'hardBounces'; + const RECIPIENTS_TYPE_UNSUBSCRIBED = 'unsubscribed'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getRecipientsTypeAllowableValues() + { + return [ + self::RECIPIENTS_TYPE_ALL, + self::RECIPIENTS_TYPE_DELIVERED, + self::RECIPIENTS_TYPE_ANSWERED, + self::RECIPIENTS_TYPE_SOFT_BOUNCES, + self::RECIPIENTS_TYPE_HARD_BOUNCES, + self::RECIPIENTS_TYPE_UNSUBSCRIBED, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['notifyURL'] = isset($data['notifyURL']) ? $data['notifyURL'] : null; + $this->container['recipientsType'] = isset($data['recipientsType']) ? $data['recipientsType'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['recipientsType'] === null) { + $invalidProperties[] = "'recipientsType' can't be null"; + } + $allowedValues = $this->getRecipientsTypeAllowableValues(); + if (!in_array($this->container['recipientsType'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'recipientsType', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['recipientsType'] === null) { + return false; + } + $allowedValues = $this->getRecipientsTypeAllowableValues(); + if (!in_array($this->container['recipientsType'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets notifyURL + * + * @return string + */ + public function getNotifyURL() + { + return $this->container['notifyURL']; + } + + /** + * Sets notifyURL + * + * @param string $notifyURL URL that will be called once the export process is finished + * + * @return $this + */ + public function setNotifyURL($notifyURL) + { + $this->container['notifyURL'] = $notifyURL; + + return $this; + } + + /** + * Gets recipientsType + * + * @return string + */ + public function getRecipientsType() + { + return $this->container['recipientsType']; + } + + /** + * Sets recipientsType + * + * @param string $recipientsType Filter the recipients based on how they interacted with the campaign + * + * @return $this + */ + public function setRecipientsType($recipientsType) + { + $allowedValues = $this->getRecipientsTypeAllowableValues(); + if (!in_array($recipientsType, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'recipientsType', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['recipientsType'] = $recipientsType; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmail.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmail.php new file mode 100644 index 0000000..93f9ec3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmail.php @@ -0,0 +1,548 @@ + 'string[]', + 'emailBcc' => 'string[]', + 'emailCc' => 'string[]', + 'replyTo' => 'string', + 'attachmentUrl' => 'string', + 'attachment' => '\SendinBlue\Client\Model\SendEmailAttachment[]', + 'headers' => 'object', + 'attributes' => 'object', + 'tags' => 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'emailTo' => 'email', + 'emailBcc' => 'email', + 'emailCc' => 'email', + 'replyTo' => 'email', + 'attachmentUrl' => 'url', + 'attachment' => null, + 'headers' => null, + 'attributes' => null, + 'tags' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'emailTo' => 'emailTo', + 'emailBcc' => 'emailBcc', + 'emailCc' => 'emailCc', + 'replyTo' => 'replyTo', + 'attachmentUrl' => 'attachmentUrl', + 'attachment' => 'attachment', + 'headers' => 'headers', + 'attributes' => 'attributes', + 'tags' => 'tags' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'emailTo' => 'setEmailTo', + 'emailBcc' => 'setEmailBcc', + 'emailCc' => 'setEmailCc', + 'replyTo' => 'setReplyTo', + 'attachmentUrl' => 'setAttachmentUrl', + 'attachment' => 'setAttachment', + 'headers' => 'setHeaders', + 'attributes' => 'setAttributes', + 'tags' => 'setTags' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'emailTo' => 'getEmailTo', + 'emailBcc' => 'getEmailBcc', + 'emailCc' => 'getEmailCc', + 'replyTo' => 'getReplyTo', + 'attachmentUrl' => 'getAttachmentUrl', + 'attachment' => 'getAttachment', + 'headers' => 'getHeaders', + 'attributes' => 'getAttributes', + 'tags' => 'getTags' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['emailTo'] = isset($data['emailTo']) ? $data['emailTo'] : null; + $this->container['emailBcc'] = isset($data['emailBcc']) ? $data['emailBcc'] : null; + $this->container['emailCc'] = isset($data['emailCc']) ? $data['emailCc'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['attachmentUrl'] = isset($data['attachmentUrl']) ? $data['attachmentUrl'] : null; + $this->container['attachment'] = isset($data['attachment']) ? $data['attachment'] : null; + $this->container['headers'] = isset($data['headers']) ? $data['headers'] : null; + $this->container['attributes'] = isset($data['attributes']) ? $data['attributes'] : null; + $this->container['tags'] = isset($data['tags']) ? $data['tags'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['emailTo'] === null) { + $invalidProperties[] = "'emailTo' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['emailTo'] === null) { + return false; + } + return true; + } + + + /** + * Gets emailTo + * + * @return string[] + */ + public function getEmailTo() + { + return $this->container['emailTo']; + } + + /** + * Sets emailTo + * + * @param string[] $emailTo List of the email addresses of the recipients. For example, ['abc@example.com', 'asd@example.com']. + * + * @return $this + */ + public function setEmailTo($emailTo) + { + $this->container['emailTo'] = $emailTo; + + return $this; + } + + /** + * Gets emailBcc + * + * @return string[] + */ + public function getEmailBcc() + { + return $this->container['emailBcc']; + } + + /** + * Sets emailBcc + * + * @param string[] $emailBcc List of the email addresses of the recipients in bcc + * + * @return $this + */ + public function setEmailBcc($emailBcc) + { + $this->container['emailBcc'] = $emailBcc; + + return $this; + } + + /** + * Gets emailCc + * + * @return string[] + */ + public function getEmailCc() + { + return $this->container['emailCc']; + } + + /** + * Sets emailCc + * + * @param string[] $emailCc List of the email addresses of the recipients in cc + * + * @return $this + */ + public function setEmailCc($emailCc) + { + $this->container['emailCc'] = $emailCc; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email address which shall be used by campaign recipients to reply back + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets attachmentUrl + * + * @return string + */ + public function getAttachmentUrl() + { + return $this->container['attachmentUrl']; + } + + /** + * Sets attachmentUrl + * + * @param string $attachmentUrl Absolute url of the attachment (no local file). Extension allowed: xlsx, xls, ods, docx, docm, doc, csv, pdf, txt, gif, jpg, jpeg, png, tif, tiff, rtf, bmp, cgm, css, shtml, html, htm, zip, xml, ppt, pptx, tar, ez, ics, mobi, msg, pub and eps + * + * @return $this + */ + public function setAttachmentUrl($attachmentUrl) + { + $this->container['attachmentUrl'] = $attachmentUrl; + + return $this; + } + + /** + * Gets attachment + * + * @return \SendinBlue\Client\Model\SendEmailAttachment[] + */ + public function getAttachment() + { + return $this->container['attachment']; + } + + /** + * Sets attachment + * + * @param \SendinBlue\Client\Model\SendEmailAttachment[] $attachment Pass the list of content (base64 encoded) and name of the attachment. For example, `[{\"content\":\"base64 encoded content 1\", \"name\":\"attcahment1\"}, {\"content\":\"base64 encoded content 2\", \"name\":\"attcahment2\"}]` + * + * @return $this + */ + public function setAttachment($attachment) + { + $this->container['attachment'] = $attachment; + + return $this; + } + + /** + * Gets headers + * + * @return object + */ + public function getHeaders() + { + return $this->container['headers']; + } + + /** + * Sets headers + * + * @param object $headers Pass the set of headers that shall be sent along the mail headers in the original email. 'sender.ip' header can be set (only for dedicated ip users) to mention the IP to be used for sending transactional emails. For example, `{\"Content-Type\":\"text/html\", \"charset\":\"iso-8859-1\", \"sender.ip\":\"1.2.3.4\"}` + * + * @return $this + */ + public function setHeaders($headers) + { + $this->container['headers'] = $headers; + + return $this; + } + + /** + * Gets attributes + * + * @return object + */ + public function getAttributes() + { + return $this->container['attributes']; + } + + /** + * Sets attributes + * + * @param object $attributes Pass the set of attributes to customize the template. For example, {\"FNAME\":\"Joe\", \"LNAME\":\"Doe\"} + * + * @return $this + */ + public function setAttributes($attributes) + { + $this->container['attributes'] = $attributes; + + return $this; + } + + /** + * Gets tags + * + * @return string[] + */ + public function getTags() + { + return $this->container['tags']; + } + + /** + * Sets tags + * + * @param string[] $tags Tag your emails to find them more easily + * + * @return $this + */ + public function setTags($tags) + { + $this->container['tags'] = $tags; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmailAttachment.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmailAttachment.php new file mode 100644 index 0000000..a36e8ef --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendEmailAttachment.php @@ -0,0 +1,356 @@ + 'string', + 'name' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'content' => 'byte', + 'name' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'content' => 'content', + 'name' => 'name' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'content' => 'setContent', + 'name' => 'setName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'content' => 'getContent', + 'name' => 'getName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['content'] = isset($data['content']) ? $data['content'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['content'] === null) { + $invalidProperties[] = "'content' can't be null"; + } + if (!preg_match("/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/", $this->container['content'])) { + $invalidProperties[] = "invalid value for 'content', must be conform to the pattern /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/."; + } + + if ($this->container['name'] === null) { + $invalidProperties[] = "'name' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['content'] === null) { + return false; + } + if (!preg_match("/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/", $this->container['content'])) { + return false; + } + if ($this->container['name'] === null) { + return false; + } + return true; + } + + + /** + * Gets content + * + * @return string + */ + public function getContent() + { + return $this->container['content']; + } + + /** + * Sets content + * + * @param string $content Base64 encoded chunk data of the attachment generated on the fly + * + * @return $this + */ + public function setContent($content) + { + + if ((!preg_match("/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/", $content))) { + throw new \InvalidArgumentException("invalid value for $content when calling SendEmailAttachment., must conform to the pattern /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/."); + } + + $this->container['content'] = $content; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Required for content. Name of the attachment + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReport.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReport.php new file mode 100644 index 0000000..73f77c2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReport.php @@ -0,0 +1,382 @@ + 'string', + 'email' => '\SendinBlue\Client\Model\SendReportEmail' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'language' => null, + 'email' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'language' => 'language', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'language' => 'setLanguage', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'language' => 'getLanguage', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const LANGUAGE_FR = 'fr'; + const LANGUAGE_ES = 'es'; + const LANGUAGE_PT = 'pt'; + const LANGUAGE_IT = 'it'; + const LANGUAGE_DE = 'de'; + const LANGUAGE_EN = 'en'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getLanguageAllowableValues() + { + return [ + self::LANGUAGE_FR, + self::LANGUAGE_ES, + self::LANGUAGE_PT, + self::LANGUAGE_IT, + self::LANGUAGE_DE, + self::LANGUAGE_EN, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['language'] = isset($data['language']) ? $data['language'] : 'fr'; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + $allowedValues = $this->getLanguageAllowableValues(); + if (!in_array($this->container['language'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'language', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + $allowedValues = $this->getLanguageAllowableValues(); + if (!in_array($this->container['language'], $allowedValues)) { + return false; + } + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets language + * + * @return string + */ + public function getLanguage() + { + return $this->container['language']; + } + + /** + * Sets language + * + * @param string $language Language of email content for campaign report sending. + * + * @return $this + */ + public function setLanguage($language) + { + $allowedValues = $this->getLanguageAllowableValues(); + if (!is_null($language) && !in_array($language, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'language', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['language'] = $language; + + return $this; + } + + /** + * Gets email + * + * @return \SendinBlue\Client\Model\SendReportEmail + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param \SendinBlue\Client\Model\SendReportEmail $email email + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReportEmail.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReportEmail.php new file mode 100644 index 0000000..0f42a2d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendReportEmail.php @@ -0,0 +1,507 @@ + 'string', + 'to' => 'string[]', + 'contentType' => 'string', + 'bcc' => 'string[]', + 'cc' => 'string[]', + 'body' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'subject' => null, + 'to' => 'email', + 'contentType' => null, + 'bcc' => 'email', + 'cc' => 'email', + 'body' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'subject' => 'subject', + 'to' => 'to', + 'contentType' => 'contentType', + 'bcc' => 'bcc', + 'cc' => 'cc', + 'body' => 'body' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'subject' => 'setSubject', + 'to' => 'setTo', + 'contentType' => 'setContentType', + 'bcc' => 'setBcc', + 'cc' => 'setCc', + 'body' => 'setBody' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'subject' => 'getSubject', + 'to' => 'getTo', + 'contentType' => 'getContentType', + 'bcc' => 'getBcc', + 'cc' => 'getCc', + 'body' => 'getBody' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const CONTENT_TYPE_TEXT = 'text'; + const CONTENT_TYPE_HTML = 'html'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getContentTypeAllowableValues() + { + return [ + self::CONTENT_TYPE_TEXT, + self::CONTENT_TYPE_HTML, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['to'] = isset($data['to']) ? $data['to'] : null; + $this->container['contentType'] = isset($data['contentType']) ? $data['contentType'] : 'html'; + $this->container['bcc'] = isset($data['bcc']) ? $data['bcc'] : null; + $this->container['cc'] = isset($data['cc']) ? $data['cc'] : null; + $this->container['body'] = isset($data['body']) ? $data['body'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['subject'] === null) { + $invalidProperties[] = "'subject' can't be null"; + } + if ($this->container['to'] === null) { + $invalidProperties[] = "'to' can't be null"; + } + $allowedValues = $this->getContentTypeAllowableValues(); + if (!in_array($this->container['contentType'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'contentType', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if ($this->container['body'] === null) { + $invalidProperties[] = "'body' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['subject'] === null) { + return false; + } + if ($this->container['to'] === null) { + return false; + } + $allowedValues = $this->getContentTypeAllowableValues(); + if (!in_array($this->container['contentType'], $allowedValues)) { + return false; + } + if ($this->container['body'] === null) { + return false; + } + return true; + } + + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the email message + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets to + * + * @return string[] + */ + public function getTo() + { + return $this->container['to']; + } + + /** + * Sets to + * + * @param string[] $to Email addresses of the recipients + * + * @return $this + */ + public function setTo($to) + { + $this->container['to'] = $to; + + return $this; + } + + /** + * Gets contentType + * + * @return string + */ + public function getContentType() + { + return $this->container['contentType']; + } + + /** + * Sets contentType + * + * @param string $contentType Type of the message body + * + * @return $this + */ + public function setContentType($contentType) + { + $allowedValues = $this->getContentTypeAllowableValues(); + if (!is_null($contentType) && !in_array($contentType, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'contentType', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['contentType'] = $contentType; + + return $this; + } + + /** + * Gets bcc + * + * @return string[] + */ + public function getBcc() + { + return $this->container['bcc']; + } + + /** + * Sets bcc + * + * @param string[] $bcc Email addresses of the recipients in bcc + * + * @return $this + */ + public function setBcc($bcc) + { + $this->container['bcc'] = $bcc; + + return $this; + } + + /** + * Gets cc + * + * @return string[] + */ + public function getCc() + { + return $this->container['cc']; + } + + /** + * Sets cc + * + * @param string[] $cc Email addresses of the recipients in cc + * + * @return $this + */ + public function setCc($cc) + { + $this->container['cc'] = $cc; + + return $this; + } + + /** + * Gets body + * + * @return string + */ + public function getBody() + { + return $this->container['body']; + } + + /** + * Sets body + * + * @param string $body Body of the email message + * + * @return $this + */ + public function setBody($body) + { + $this->container['body'] = $body; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSms.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSms.php new file mode 100644 index 0000000..f6c3e71 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSms.php @@ -0,0 +1,434 @@ + 'string', + 'messageId' => 'int', + 'smsCount' => 'int', + 'usedCredits' => 'float', + 'remainingCredits' => 'float' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'reference' => null, + 'messageId' => 'int64', + 'smsCount' => 'int64', + 'usedCredits' => 'float', + 'remainingCredits' => 'float' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'reference' => 'reference', + 'messageId' => 'messageId', + 'smsCount' => 'smsCount', + 'usedCredits' => 'usedCredits', + 'remainingCredits' => 'remainingCredits' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'reference' => 'setReference', + 'messageId' => 'setMessageId', + 'smsCount' => 'setSmsCount', + 'usedCredits' => 'setUsedCredits', + 'remainingCredits' => 'setRemainingCredits' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'reference' => 'getReference', + 'messageId' => 'getMessageId', + 'smsCount' => 'getSmsCount', + 'usedCredits' => 'getUsedCredits', + 'remainingCredits' => 'getRemainingCredits' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['reference'] = isset($data['reference']) ? $data['reference'] : null; + $this->container['messageId'] = isset($data['messageId']) ? $data['messageId'] : null; + $this->container['smsCount'] = isset($data['smsCount']) ? $data['smsCount'] : null; + $this->container['usedCredits'] = isset($data['usedCredits']) ? $data['usedCredits'] : null; + $this->container['remainingCredits'] = isset($data['remainingCredits']) ? $data['remainingCredits'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['reference'] === null) { + $invalidProperties[] = "'reference' can't be null"; + } + if ($this->container['messageId'] === null) { + $invalidProperties[] = "'messageId' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['reference'] === null) { + return false; + } + if ($this->container['messageId'] === null) { + return false; + } + return true; + } + + + /** + * Gets reference + * + * @return string + */ + public function getReference() + { + return $this->container['reference']; + } + + /** + * Sets reference + * + * @param string $reference reference + * + * @return $this + */ + public function setReference($reference) + { + $this->container['reference'] = $reference; + + return $this; + } + + /** + * Gets messageId + * + * @return int + */ + public function getMessageId() + { + return $this->container['messageId']; + } + + /** + * Sets messageId + * + * @param int $messageId messageId + * + * @return $this + */ + public function setMessageId($messageId) + { + $this->container['messageId'] = $messageId; + + return $this; + } + + /** + * Gets smsCount + * + * @return int + */ + public function getSmsCount() + { + return $this->container['smsCount']; + } + + /** + * Sets smsCount + * + * @param int $smsCount Count of SMS's to send multiple text messages + * + * @return $this + */ + public function setSmsCount($smsCount) + { + $this->container['smsCount'] = $smsCount; + + return $this; + } + + /** + * Gets usedCredits + * + * @return float + */ + public function getUsedCredits() + { + return $this->container['usedCredits']; + } + + /** + * Sets usedCredits + * + * @param float $usedCredits SMS credits used per text message + * + * @return $this + */ + public function setUsedCredits($usedCredits) + { + $this->container['usedCredits'] = $usedCredits; + + return $this; + } + + /** + * Gets remainingCredits + * + * @return float + */ + public function getRemainingCredits() + { + return $this->container['remainingCredits']; + } + + /** + * Sets remainingCredits + * + * @param float $remainingCredits Remaining SMS credits of the user + * + * @return $this + */ + public function setRemainingCredits($remainingCredits) + { + $this->container['remainingCredits'] = $remainingCredits; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmail.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmail.php new file mode 100644 index 0000000..c9c6c9c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmail.php @@ -0,0 +1,668 @@ + '\SendinBlue\Client\Model\SendSmtpEmailSender', + 'to' => '\SendinBlue\Client\Model\SendSmtpEmailTo[]', + 'bcc' => '\SendinBlue\Client\Model\SendSmtpEmailBcc[]', + 'cc' => '\SendinBlue\Client\Model\SendSmtpEmailCc[]', + 'htmlContent' => 'string', + 'textContent' => 'string', + 'subject' => 'string', + 'replyTo' => '\SendinBlue\Client\Model\SendSmtpEmailReplyTo', + 'attachment' => '\SendinBlue\Client\Model\SendSmtpEmailAttachment[]', + 'headers' => 'object', + 'templateId' => 'int', + 'params' => 'object', + 'tags' => 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'sender' => null, + 'to' => null, + 'bcc' => null, + 'cc' => null, + 'htmlContent' => null, + 'textContent' => null, + 'subject' => null, + 'replyTo' => null, + 'attachment' => null, + 'headers' => null, + 'templateId' => 'int64', + 'params' => null, + 'tags' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'sender' => 'sender', + 'to' => 'to', + 'bcc' => 'bcc', + 'cc' => 'cc', + 'htmlContent' => 'htmlContent', + 'textContent' => 'textContent', + 'subject' => 'subject', + 'replyTo' => 'replyTo', + 'attachment' => 'attachment', + 'headers' => 'headers', + 'templateId' => 'templateId', + 'params' => 'params', + 'tags' => 'tags' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'sender' => 'setSender', + 'to' => 'setTo', + 'bcc' => 'setBcc', + 'cc' => 'setCc', + 'htmlContent' => 'setHtmlContent', + 'textContent' => 'setTextContent', + 'subject' => 'setSubject', + 'replyTo' => 'setReplyTo', + 'attachment' => 'setAttachment', + 'headers' => 'setHeaders', + 'templateId' => 'setTemplateId', + 'params' => 'setParams', + 'tags' => 'setTags' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'sender' => 'getSender', + 'to' => 'getTo', + 'bcc' => 'getBcc', + 'cc' => 'getCc', + 'htmlContent' => 'getHtmlContent', + 'textContent' => 'getTextContent', + 'subject' => 'getSubject', + 'replyTo' => 'getReplyTo', + 'attachment' => 'getAttachment', + 'headers' => 'getHeaders', + 'templateId' => 'getTemplateId', + 'params' => 'getParams', + 'tags' => 'getTags' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['to'] = isset($data['to']) ? $data['to'] : null; + $this->container['bcc'] = isset($data['bcc']) ? $data['bcc'] : null; + $this->container['cc'] = isset($data['cc']) ? $data['cc'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['textContent'] = isset($data['textContent']) ? $data['textContent'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['attachment'] = isset($data['attachment']) ? $data['attachment'] : null; + $this->container['headers'] = isset($data['headers']) ? $data['headers'] : null; + $this->container['templateId'] = isset($data['templateId']) ? $data['templateId'] : null; + $this->container['params'] = isset($data['params']) ? $data['params'] : null; + $this->container['tags'] = isset($data['tags']) ? $data['tags'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['to'] === null) { + $invalidProperties[] = "'to' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['to'] === null) { + return false; + } + return true; + } + + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\SendSmtpEmailSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\SendSmtpEmailSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets to + * + * @return \SendinBlue\Client\Model\SendSmtpEmailTo[] + */ + public function getTo() + { + return $this->container['to']; + } + + /** + * Sets to + * + * @param \SendinBlue\Client\Model\SendSmtpEmailTo[] $to List of email addresses and names (optional) of the recipients. For example, `[{\"name\":\"Jimmy\", \"email\":\"jimmy98@example.com\"}, {\"name\":\"Joe\", \"email\":\"joe@example.com\"}]` + * + * @return $this + */ + public function setTo($to) + { + $this->container['to'] = $to; + + return $this; + } + + /** + * Gets bcc + * + * @return \SendinBlue\Client\Model\SendSmtpEmailBcc[] + */ + public function getBcc() + { + return $this->container['bcc']; + } + + /** + * Sets bcc + * + * @param \SendinBlue\Client\Model\SendSmtpEmailBcc[] $bcc List of email addresses and names (optional) of the recipients in bcc + * + * @return $this + */ + public function setBcc($bcc) + { + $this->container['bcc'] = $bcc; + + return $this; + } + + /** + * Gets cc + * + * @return \SendinBlue\Client\Model\SendSmtpEmailCc[] + */ + public function getCc() + { + return $this->container['cc']; + } + + /** + * Sets cc + * + * @param \SendinBlue\Client\Model\SendSmtpEmailCc[] $cc List of email addresses and names (optional) of the recipients in cc + * + * @return $this + */ + public function setCc($cc) + { + $this->container['cc'] = $cc; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent HTML body of the message ( Mandatory if 'templateId' is not passed, ignored if 'templateId' is passed ) + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets textContent + * + * @return string + */ + public function getTextContent() + { + return $this->container['textContent']; + } + + /** + * Sets textContent + * + * @param string $textContent Plain Text body of the message ( Ignored if 'templateId' is passed ) + * + * @return $this + */ + public function setTextContent($textContent) + { + $this->container['textContent'] = $textContent; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the message. Mandatory if 'templateId' is not passed + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets replyTo + * + * @return \SendinBlue\Client\Model\SendSmtpEmailReplyTo + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param \SendinBlue\Client\Model\SendSmtpEmailReplyTo $replyTo replyTo + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets attachment + * + * @return \SendinBlue\Client\Model\SendSmtpEmailAttachment[] + */ + public function getAttachment() + { + return $this->container['attachment']; + } + + /** + * Sets attachment + * + * @param \SendinBlue\Client\Model\SendSmtpEmailAttachment[] $attachment Pass the absolute URL (no local file) or the base64 content of the attachment along with the attachment name (Mandatory if attachment content is passed). For example, `[{\"url\":\"https://attachment.domain.com/myAttachmentFromUrl.jpg\", \"name\":\"My attachment 1\"}, {\"content\":\"base64 exmaple content\", \"name\":\"My attachment 2\"}]`. Allowed extensions for attachment file: xlsx, xls, ods, docx, docm, doc, csv, pdf, txt, gif, jpg, jpeg, png, tif, tiff, rtf, bmp, cgm, css, shtml, html, htm, zip, xml, ppt, pptx, tar, ez, ics, mobi, msg, pub, eps and odt ( If 'templateId' is passed and is in New Template Language format then only attachment url is accepted. If template is in Old template Language format, then 'attachment' is ignored ) + * + * @return $this + */ + public function setAttachment($attachment) + { + $this->container['attachment'] = $attachment; + + return $this; + } + + /** + * Gets headers + * + * @return object + */ + public function getHeaders() + { + return $this->container['headers']; + } + + /** + * Sets headers + * + * @param object $headers Pass the set of headers that shall be sent along the mail headers in the original email. 'sender.ip' header can be set (only for dedicated ip users) to mention the IP to be used for sending transactional emails. For example, `{\"Content-Type\":\"text/html\", \"charset\":\"iso-8859-1\", \"sender.ip\":\"1.2.3.4\"}` + * + * @return $this + */ + public function setHeaders($headers) + { + $this->container['headers'] = $headers; + + return $this; + } + + /** + * Gets templateId + * + * @return int + */ + public function getTemplateId() + { + return $this->container['templateId']; + } + + /** + * Sets templateId + * + * @param int $templateId Id of the template + * + * @return $this + */ + public function setTemplateId($templateId) + { + $this->container['templateId'] = $templateId; + + return $this; + } + + /** + * Gets params + * + * @return object + */ + public function getParams() + { + return $this->container['params']; + } + + /** + * Sets params + * + * @param object $params Pass the set of attributes to customize the template. For example, `{\"FNAME\":\"Joe\", \"LNAME\":\"Doe\"}`. It's considered only if template is in New Template Language format. + * + * @return $this + */ + public function setParams($params) + { + $this->container['params'] = $params; + + return $this; + } + + /** + * Gets tags + * + * @return string[] + */ + public function getTags() + { + return $this->container['tags']; + } + + /** + * Sets tags + * + * @param string[] $tags Tag your emails to find them more easily + * + * @return $this + */ + public function setTags($tags) + { + $this->container['tags'] = $tags; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailAttachment.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailAttachment.php new file mode 100644 index 0000000..48909d1 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailAttachment.php @@ -0,0 +1,374 @@ + 'string', + 'content' => 'string', + 'name' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'url' => 'url', + 'content' => 'byte', + 'name' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'url' => 'url', + 'content' => 'content', + 'name' => 'name' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'url' => 'setUrl', + 'content' => 'setContent', + 'name' => 'setName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'url' => 'getUrl', + 'content' => 'getContent', + 'name' => 'getName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['url'] = isset($data['url']) ? $data['url'] : null; + $this->container['content'] = isset($data['content']) ? $data['content'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if (!is_null($this->container['content']) && !preg_match("/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/", $this->container['content'])) { + $invalidProperties[] = "invalid value for 'content', must be conform to the pattern /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/."; + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if (!preg_match("/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/", $this->container['content'])) { + return false; + } + return true; + } + + + /** + * Gets url + * + * @return string + */ + public function getUrl() + { + return $this->container['url']; + } + + /** + * Sets url + * + * @param string $url Absolute url of the attachment (no local file). + * + * @return $this + */ + public function setUrl($url) + { + $this->container['url'] = $url; + + return $this; + } + + /** + * Gets content + * + * @return string + */ + public function getContent() + { + return $this->container['content']; + } + + /** + * Sets content + * + * @param string $content Base64 encoded chunk data of the attachment generated on the fly + * + * @return $this + */ + public function setContent($content) + { + + if (!is_null($content) && (!preg_match("/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/", $content))) { + throw new \InvalidArgumentException("invalid value for $content when calling SendSmtpEmailAttachment., must conform to the pattern /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/."); + } + + $this->container['content'] = $content; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Required if content is passed. Name of the attachment + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailBcc.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailBcc.php new file mode 100644 index 0000000..50d5a20 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailBcc.php @@ -0,0 +1,338 @@ + 'string', + 'name' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'name' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'name' => 'name' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'name' => 'setName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'name' => 'getName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address of the recipient in bcc + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the recipient in bcc + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailCc.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailCc.php new file mode 100644 index 0000000..c73cc01 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailCc.php @@ -0,0 +1,338 @@ + 'string', + 'name' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'name' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'name' => 'name' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'name' => 'setName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'name' => 'getName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address of the recipient in cc + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the recipient in cc + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailReplyTo.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailReplyTo.php new file mode 100644 index 0000000..ded04bc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailReplyTo.php @@ -0,0 +1,339 @@ + 'string', + 'name' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'name' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'name' => 'name' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'name' => 'setName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'name' => 'getName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address in reply to + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name in reply to + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailSender.php new file mode 100644 index 0000000..ce50e46 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailSender.php @@ -0,0 +1,339 @@ + 'string', + 'email' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the sender from which the emails will be sent + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email of the sender from which the emails will be sent + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailTo.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailTo.php new file mode 100644 index 0000000..eec8a18 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendSmtpEmailTo.php @@ -0,0 +1,338 @@ + 'string', + 'name' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'name' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'name' => 'name' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'name' => 'setName' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'name' => 'getName' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['email'] === null) { + $invalidProperties[] = "'email' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['email'] === null) { + return false; + } + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email address of the recipient + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the recipient + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTemplateEmail.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTemplateEmail.php new file mode 100644 index 0000000..7dac243 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTemplateEmail.php @@ -0,0 +1,308 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'messageId' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'messageId' => 'messageId' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'messageId' => 'setMessageId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'messageId' => 'getMessageId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['messageId'] = isset($data['messageId']) ? $data['messageId'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['messageId'] === null) { + $invalidProperties[] = "'messageId' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['messageId'] === null) { + return false; + } + return true; + } + + + /** + * Gets messageId + * + * @return string + */ + public function getMessageId() + { + return $this->container['messageId']; + } + + /** + * Sets messageId + * + * @param string $messageId Message ID of the template Email sent + * + * @return $this + */ + public function setMessageId($messageId) + { + $this->container['messageId'] = $messageId; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestEmail.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestEmail.php new file mode 100644 index 0000000..4131759 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestEmail.php @@ -0,0 +1,302 @@ + 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'emailTo' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'emailTo' => 'emailTo' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'emailTo' => 'setEmailTo' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'emailTo' => 'getEmailTo' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['emailTo'] = isset($data['emailTo']) ? $data['emailTo'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets emailTo + * + * @return string[] + */ + public function getEmailTo() + { + return $this->container['emailTo']; + } + + /** + * Sets emailTo + * + * @param string[] $emailTo List of the email addresses of the recipients whom you wish to send the test mail. If left empty, the test mail will be sent to your entire test list. + * + * @return $this + */ + public function setEmailTo($emailTo) + { + $this->container['emailTo'] = $emailTo; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestSms.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestSms.php new file mode 100644 index 0000000..f2576d3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTestSms.php @@ -0,0 +1,302 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'phoneNumber' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'phoneNumber' => 'phoneNumber' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'phoneNumber' => 'setPhoneNumber' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'phoneNumber' => 'getPhoneNumber' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['phoneNumber'] = isset($data['phoneNumber']) ? $data['phoneNumber'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets phoneNumber + * + * @return string + */ + public function getPhoneNumber() + { + return $this->container['phoneNumber']; + } + + /** + * Sets phoneNumber + * + * @param string $phoneNumber Mobile number of the recipient with the country code. This number must belong to one of your contacts in SendinBlue account and must not be blacklisted + * + * @return $this + */ + public function setPhoneNumber($phoneNumber) + { + $this->container['phoneNumber'] = $phoneNumber; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTransacSms.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTransacSms.php new file mode 100644 index 0000000..44b9201 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/SendTransacSms.php @@ -0,0 +1,517 @@ + 'string', + 'recipient' => 'string', + 'content' => 'string', + 'type' => 'string', + 'tag' => 'string', + 'webUrl' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'sender' => null, + 'recipient' => null, + 'content' => null, + 'type' => null, + 'tag' => null, + 'webUrl' => 'url' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'sender' => 'sender', + 'recipient' => 'recipient', + 'content' => 'content', + 'type' => 'type', + 'tag' => 'tag', + 'webUrl' => 'webUrl' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'sender' => 'setSender', + 'recipient' => 'setRecipient', + 'content' => 'setContent', + 'type' => 'setType', + 'tag' => 'setTag', + 'webUrl' => 'setWebUrl' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'sender' => 'getSender', + 'recipient' => 'getRecipient', + 'content' => 'getContent', + 'type' => 'getType', + 'tag' => 'getTag', + 'webUrl' => 'getWebUrl' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const TYPE_TRANSACTIONAL = 'transactional'; + const TYPE_MARKETING = 'marketing'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getTypeAllowableValues() + { + return [ + self::TYPE_TRANSACTIONAL, + self::TYPE_MARKETING, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['recipient'] = isset($data['recipient']) ? $data['recipient'] : null; + $this->container['content'] = isset($data['content']) ? $data['content'] : null; + $this->container['type'] = isset($data['type']) ? $data['type'] : 'transactional'; + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['webUrl'] = isset($data['webUrl']) ? $data['webUrl'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['sender'] === null) { + $invalidProperties[] = "'sender' can't be null"; + } + if ((strlen($this->container['sender']) > 11)) { + $invalidProperties[] = "invalid value for 'sender', the character length must be smaller than or equal to 11."; + } + + if ($this->container['recipient'] === null) { + $invalidProperties[] = "'recipient' can't be null"; + } + if ($this->container['content'] === null) { + $invalidProperties[] = "'content' can't be null"; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['sender'] === null) { + return false; + } + if (strlen($this->container['sender']) > 11) { + return false; + } + if ($this->container['recipient'] === null) { + return false; + } + if ($this->container['content'] === null) { + return false; + } + $allowedValues = $this->getTypeAllowableValues(); + if (!in_array($this->container['type'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets sender + * + * @return string + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param string $sender Name of the sender. Only alphanumeric characters. No more than 11 characters + * + * @return $this + */ + public function setSender($sender) + { + if ((strlen($sender) > 11)) { + throw new \InvalidArgumentException('invalid length for $sender when calling SendTransacSms., must be smaller than or equal to 11.'); + } + + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets recipient + * + * @return string + */ + public function getRecipient() + { + return $this->container['recipient']; + } + + /** + * Sets recipient + * + * @param string $recipient Mobile number to send SMS with the country code + * + * @return $this + */ + public function setRecipient($recipient) + { + $this->container['recipient'] = $recipient; + + return $this; + } + + /** + * Gets content + * + * @return string + */ + public function getContent() + { + return $this->container['content']; + } + + /** + * Sets content + * + * @param string $content Content of the message. If more than 160 characters long, will be sent as multiple text messages + * + * @return $this + */ + public function setContent($content) + { + $this->container['content'] = $content; + + return $this; + } + + /** + * Gets type + * + * @return string + */ + public function getType() + { + return $this->container['type']; + } + + /** + * Sets type + * + * @param string $type Type of the SMS. Marketing SMS messages are those sent typically with marketing content. Transactional SMS messages are sent to individuals and are triggered in response to some action, such as a sign-up, purchase, etc. + * + * @return $this + */ + public function setType($type) + { + $allowedValues = $this->getTypeAllowableValues(); + if (!is_null($type) && !in_array($type, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'type', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['type'] = $type; + + return $this; + } + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the message + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets webUrl + * + * @return string + */ + public function getWebUrl() + { + return $this->container['webUrl']; + } + + /** + * Sets webUrl + * + * @param string $webUrl Webhook to call for each event triggered by the message (delivered etc.) + * + * @return $this + */ + public function setWebUrl($webUrl) + { + $this->container['webUrl'] = $webUrl; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttribute.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttribute.php new file mode 100644 index 0000000..7228a81 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttribute.php @@ -0,0 +1,332 @@ + 'string', + 'enumeration' => '\SendinBlue\Client\Model\UpdateAttributeEnumeration[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'value' => null, + 'enumeration' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'value' => 'value', + 'enumeration' => 'enumeration' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'value' => 'setValue', + 'enumeration' => 'setEnumeration' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'value' => 'getValue', + 'enumeration' => 'getEnumeration' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['value'] = isset($data['value']) ? $data['value'] : null; + $this->container['enumeration'] = isset($data['enumeration']) ? $data['enumeration'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets value + * + * @return string + */ + public function getValue() + { + return $this->container['value']; + } + + /** + * Sets value + * + * @param string $value Value of the attribute to update. Use only if the attribute's category is 'calculated' or 'global' + * + * @return $this + */ + public function setValue($value) + { + $this->container['value'] = $value; + + return $this; + } + + /** + * Gets enumeration + * + * @return \SendinBlue\Client\Model\UpdateAttributeEnumeration[] + */ + public function getEnumeration() + { + return $this->container['enumeration']; + } + + /** + * Sets enumeration + * + * @param \SendinBlue\Client\Model\UpdateAttributeEnumeration[] $enumeration List of the values and labels that the attribute can take. Use only if the attribute's category is \"category\". For example, `[{\"value\":1, \"label\":\"male\"}, {\"value\":2, \"label\":\"female\"}]` + * + * @return $this + */ + public function setEnumeration($enumeration) + { + $this->container['enumeration'] = $enumeration; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttributeEnumeration.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttributeEnumeration.php new file mode 100644 index 0000000..7c67fbc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateAttributeEnumeration.php @@ -0,0 +1,344 @@ + 'int', + 'label' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'value' => null, + 'label' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'value' => 'value', + 'label' => 'label' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'value' => 'setValue', + 'label' => 'setLabel' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'value' => 'getValue', + 'label' => 'getLabel' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['value'] = isset($data['value']) ? $data['value'] : null; + $this->container['label'] = isset($data['label']) ? $data['label'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if ($this->container['value'] === null) { + $invalidProperties[] = "'value' can't be null"; + } + if ($this->container['label'] === null) { + $invalidProperties[] = "'label' can't be null"; + } + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['value'] === null) { + return false; + } + if ($this->container['label'] === null) { + return false; + } + return true; + } + + + /** + * Gets value + * + * @return int + */ + public function getValue() + { + return $this->container['value']; + } + + /** + * Sets value + * + * @param int $value Id of the value + * + * @return $this + */ + public function setValue($value) + { + $this->container['value'] = $value; + + return $this; + } + + /** + * Gets label + * + * @return string + */ + public function getLabel() + { + return $this->container['label']; + } + + /** + * Sets label + * + * @param string $label Label of the value + * + * @return $this + */ + public function setLabel($label) + { + $this->container['label'] = $label; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateCampaignStatus.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateCampaignStatus.php new file mode 100644 index 0000000..4dcac9a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateCampaignStatus.php @@ -0,0 +1,351 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'status' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'status' => 'status' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'status' => 'setStatus' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'status' => 'getStatus' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const STATUS_SUSPENDED = 'suspended'; + const STATUS_ARCHIVE = 'archive'; + const STATUS_DARCHIVE = 'darchive'; + const STATUS_SENT = 'sent'; + const STATUS_QUEUED = 'queued'; + const STATUS_REPLICATE = 'replicate'; + const STATUS_REPLICATE_TEMPLATE = 'replicateTemplate'; + const STATUS_DRAFT = 'draft'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getStatusAllowableValues() + { + return [ + self::STATUS_SUSPENDED, + self::STATUS_ARCHIVE, + self::STATUS_DARCHIVE, + self::STATUS_SENT, + self::STATUS_QUEUED, + self::STATUS_REPLICATE, + self::STATUS_REPLICATE_TEMPLATE, + self::STATUS_DRAFT, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + $allowedValues = $this->getStatusAllowableValues(); + if (!in_array($this->container['status'], $allowedValues)) { + return false; + } + return true; + } + + + /** + * Gets status + * + * @return string + */ + public function getStatus() + { + return $this->container['status']; + } + + /** + * Sets status + * + * @param string $status Note:- replicateTemplate status will be available only for template type campaigns. + * + * @return $this + */ + public function setStatus($status) + { + $allowedValues = $this->getStatusAllowableValues(); + if (!is_null($status) && !in_array($status, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'status', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['status'] = $status; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChild.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChild.php new file mode 100644 index 0000000..2af8482 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChild.php @@ -0,0 +1,422 @@ + 'string', + 'firstName' => 'string', + 'lastName' => 'string', + 'companyName' => 'string', + 'password' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'email' => 'email', + 'firstName' => null, + 'lastName' => null, + 'companyName' => null, + 'password' => 'password' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'email' => 'email', + 'firstName' => 'firstName', + 'lastName' => 'lastName', + 'companyName' => 'companyName', + 'password' => 'password' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'email' => 'setEmail', + 'firstName' => 'setFirstName', + 'lastName' => 'setLastName', + 'companyName' => 'setCompanyName', + 'password' => 'setPassword' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'email' => 'getEmail', + 'firstName' => 'getFirstName', + 'lastName' => 'getLastName', + 'companyName' => 'getCompanyName', + 'password' => 'getPassword' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['firstName'] = isset($data['firstName']) ? $data['firstName'] : null; + $this->container['lastName'] = isset($data['lastName']) ? $data['lastName'] : null; + $this->container['companyName'] = isset($data['companyName']) ? $data['companyName'] : null; + $this->container['password'] = isset($data['password']) ? $data['password'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email New Email address to update the child account + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets firstName + * + * @return string + */ + public function getFirstName() + { + return $this->container['firstName']; + } + + /** + * Sets firstName + * + * @param string $firstName New First name to use to update the child account + * + * @return $this + */ + public function setFirstName($firstName) + { + $this->container['firstName'] = $firstName; + + return $this; + } + + /** + * Gets lastName + * + * @return string + */ + public function getLastName() + { + return $this->container['lastName']; + } + + /** + * Sets lastName + * + * @param string $lastName New Last name to use to update the child account + * + * @return $this + */ + public function setLastName($lastName) + { + $this->container['lastName'] = $lastName; + + return $this; + } + + /** + * Gets companyName + * + * @return string + */ + public function getCompanyName() + { + return $this->container['companyName']; + } + + /** + * Sets companyName + * + * @param string $companyName New Company name to use to update the child account + * + * @return $this + */ + public function setCompanyName($companyName) + { + $this->container['companyName'] = $companyName; + + return $this; + } + + /** + * Gets password + * + * @return string + */ + public function getPassword() + { + return $this->container['password']; + } + + /** + * Sets password + * + * @param string $password New password for the child account to login + * + * @return $this + */ + public function setPassword($password) + { + $this->container['password'] = $password; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildAccountStatus.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildAccountStatus.php new file mode 100644 index 0000000..c5153ef --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildAccountStatus.php @@ -0,0 +1,362 @@ + 'bool', + 'transactionalSms' => 'bool', + 'marketingAutomation' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'transactionalEmail' => null, + 'transactionalSms' => null, + 'marketingAutomation' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'transactionalEmail' => 'transactionalEmail', + 'transactionalSms' => 'transactionalSms', + 'marketingAutomation' => 'marketingAutomation' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'transactionalEmail' => 'setTransactionalEmail', + 'transactionalSms' => 'setTransactionalSms', + 'marketingAutomation' => 'setMarketingAutomation' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'transactionalEmail' => 'getTransactionalEmail', + 'transactionalSms' => 'getTransactionalSms', + 'marketingAutomation' => 'getMarketingAutomation' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['transactionalEmail'] = isset($data['transactionalEmail']) ? $data['transactionalEmail'] : null; + $this->container['transactionalSms'] = isset($data['transactionalSms']) ? $data['transactionalSms'] : null; + $this->container['marketingAutomation'] = isset($data['marketingAutomation']) ? $data['marketingAutomation'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets transactionalEmail + * + * @return bool + */ + public function getTransactionalEmail() + { + return $this->container['transactionalEmail']; + } + + /** + * Sets transactionalEmail + * + * @param bool $transactionalEmail Status of Transactional Email (SMTP) Platform activation for your account (true=enabled, false=disabled) + * + * @return $this + */ + public function setTransactionalEmail($transactionalEmail) + { + $this->container['transactionalEmail'] = $transactionalEmail; + + return $this; + } + + /** + * Gets transactionalSms + * + * @return bool + */ + public function getTransactionalSms() + { + return $this->container['transactionalSms']; + } + + /** + * Sets transactionalSms + * + * @param bool $transactionalSms Status of Transactional SMS Platform activation for your account (true=enabled, false=disabled) + * + * @return $this + */ + public function setTransactionalSms($transactionalSms) + { + $this->container['transactionalSms'] = $transactionalSms; + + return $this; + } + + /** + * Gets marketingAutomation + * + * @return bool + */ + public function getMarketingAutomation() + { + return $this->container['marketingAutomation']; + } + + /** + * Sets marketingAutomation + * + * @param bool $marketingAutomation Status of Marketing Automation Platform activation for your account (true=enabled, false=disabled) + * + * @return $this + */ + public function setMarketingAutomation($marketingAutomation) + { + $this->container['marketingAutomation'] = $marketingAutomation; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildDomain.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildDomain.php new file mode 100644 index 0000000..36d4fae --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateChildDomain.php @@ -0,0 +1,302 @@ + 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'domain' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'domain' => 'domain' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'domain' => 'setDomain' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'domain' => 'getDomain' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['domain'] = isset($data['domain']) ? $data['domain'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets domain + * + * @return string + */ + public function getDomain() + { + return $this->container['domain']; + } + + /** + * Sets domain + * + * @param string $domain Value for the sender domain that will replace the existing domain + * + * @return $this + */ + public function setDomain($domain) + { + $this->container['domain'] = $domain; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateContact.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateContact.php new file mode 100644 index 0000000..c59691d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateContact.php @@ -0,0 +1,452 @@ + 'object', + 'emailBlacklisted' => 'bool', + 'smsBlacklisted' => 'bool', + 'listIds' => 'int[]', + 'unlinkListIds' => 'int[]', + 'smtpBlacklistSender' => 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'attributes' => null, + 'emailBlacklisted' => null, + 'smsBlacklisted' => null, + 'listIds' => 'int64', + 'unlinkListIds' => 'int64', + 'smtpBlacklistSender' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'attributes' => 'attributes', + 'emailBlacklisted' => 'emailBlacklisted', + 'smsBlacklisted' => 'smsBlacklisted', + 'listIds' => 'listIds', + 'unlinkListIds' => 'unlinkListIds', + 'smtpBlacklistSender' => 'smtpBlacklistSender' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'attributes' => 'setAttributes', + 'emailBlacklisted' => 'setEmailBlacklisted', + 'smsBlacklisted' => 'setSmsBlacklisted', + 'listIds' => 'setListIds', + 'unlinkListIds' => 'setUnlinkListIds', + 'smtpBlacklistSender' => 'setSmtpBlacklistSender' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'attributes' => 'getAttributes', + 'emailBlacklisted' => 'getEmailBlacklisted', + 'smsBlacklisted' => 'getSmsBlacklisted', + 'listIds' => 'getListIds', + 'unlinkListIds' => 'getUnlinkListIds', + 'smtpBlacklistSender' => 'getSmtpBlacklistSender' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['attributes'] = isset($data['attributes']) ? $data['attributes'] : null; + $this->container['emailBlacklisted'] = isset($data['emailBlacklisted']) ? $data['emailBlacklisted'] : null; + $this->container['smsBlacklisted'] = isset($data['smsBlacklisted']) ? $data['smsBlacklisted'] : null; + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + $this->container['unlinkListIds'] = isset($data['unlinkListIds']) ? $data['unlinkListIds'] : null; + $this->container['smtpBlacklistSender'] = isset($data['smtpBlacklistSender']) ? $data['smtpBlacklistSender'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets attributes + * + * @return object + */ + public function getAttributes() + { + return $this->container['attributes']; + } + + /** + * Sets attributes + * + * @param object $attributes Pass the set of attributes to be updated. These attributes must be present in your account. To update existing email address of a contact with the new one please pass EMAIL in attribtes. For example, `{\"EMAIL\":\"newemail@domain.com\", \"FNAME\":\"Ellie\", \"LNAME\":\"Roger\"}` + * + * @return $this + */ + public function setAttributes($attributes) + { + $this->container['attributes'] = $attributes; + + return $this; + } + + /** + * Gets emailBlacklisted + * + * @return bool + */ + public function getEmailBlacklisted() + { + return $this->container['emailBlacklisted']; + } + + /** + * Sets emailBlacklisted + * + * @param bool $emailBlacklisted Set/unset this field to blacklist/allow the contact for emails (emailBlacklisted = true) + * + * @return $this + */ + public function setEmailBlacklisted($emailBlacklisted) + { + $this->container['emailBlacklisted'] = $emailBlacklisted; + + return $this; + } + + /** + * Gets smsBlacklisted + * + * @return bool + */ + public function getSmsBlacklisted() + { + return $this->container['smsBlacklisted']; + } + + /** + * Sets smsBlacklisted + * + * @param bool $smsBlacklisted Set/unset this field to blacklist/allow the contact for SMS (smsBlacklisted = true) + * + * @return $this + */ + public function setSmsBlacklisted($smsBlacklisted) + { + $this->container['smsBlacklisted'] = $smsBlacklisted; + + return $this; + } + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds Ids of the lists to add the contact to + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + + /** + * Gets unlinkListIds + * + * @return int[] + */ + public function getUnlinkListIds() + { + return $this->container['unlinkListIds']; + } + + /** + * Sets unlinkListIds + * + * @param int[] $unlinkListIds Ids of the lists to remove the contact from + * + * @return $this + */ + public function setUnlinkListIds($unlinkListIds) + { + $this->container['unlinkListIds'] = $unlinkListIds; + + return $this; + } + + /** + * Gets smtpBlacklistSender + * + * @return string[] + */ + public function getSmtpBlacklistSender() + { + return $this->container['smtpBlacklistSender']; + } + + /** + * Sets smtpBlacklistSender + * + * @param string[] $smtpBlacklistSender SMTP forbidden sender for contact. Use only for email Contact + * + * @return $this + */ + public function setSmtpBlacklistSender($smtpBlacklistSender) + { + $this->container['smtpBlacklistSender'] = $smtpBlacklistSender; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaign.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaign.php new file mode 100644 index 0000000..d1683bb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaign.php @@ -0,0 +1,1102 @@ + 'string', + 'sender' => '\SendinBlue\Client\Model\UpdateEmailCampaignSender', + 'name' => 'string', + 'htmlContent' => 'string', + 'htmlUrl' => 'string', + 'scheduledAt' => '\DateTime', + 'subject' => 'string', + 'replyTo' => 'string', + 'toField' => 'string', + 'recipients' => '\SendinBlue\Client\Model\UpdateEmailCampaignRecipients', + 'attachmentUrl' => 'string', + 'inlineImageActivation' => 'bool', + 'mirrorActive' => 'bool', + 'recurring' => 'bool', + 'footer' => 'string', + 'header' => 'string', + 'utmCampaign' => 'string', + 'params' => 'object', + 'sendAtBestTime' => 'bool', + 'abTesting' => 'bool', + 'subjectA' => 'string', + 'subjectB' => 'string', + 'splitRule' => 'int', + 'winnerCriteria' => 'string', + 'winnerDelay' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'tag' => null, + 'sender' => null, + 'name' => null, + 'htmlContent' => null, + 'htmlUrl' => 'url', + 'scheduledAt' => 'date-time', + 'subject' => null, + 'replyTo' => 'email', + 'toField' => null, + 'recipients' => null, + 'attachmentUrl' => 'url', + 'inlineImageActivation' => null, + 'mirrorActive' => null, + 'recurring' => null, + 'footer' => null, + 'header' => null, + 'utmCampaign' => null, + 'params' => null, + 'sendAtBestTime' => null, + 'abTesting' => null, + 'subjectA' => null, + 'subjectB' => null, + 'splitRule' => 'int64', + 'winnerCriteria' => null, + 'winnerDelay' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'tag' => 'tag', + 'sender' => 'sender', + 'name' => 'name', + 'htmlContent' => 'htmlContent', + 'htmlUrl' => 'htmlUrl', + 'scheduledAt' => 'scheduledAt', + 'subject' => 'subject', + 'replyTo' => 'replyTo', + 'toField' => 'toField', + 'recipients' => 'recipients', + 'attachmentUrl' => 'attachmentUrl', + 'inlineImageActivation' => 'inlineImageActivation', + 'mirrorActive' => 'mirrorActive', + 'recurring' => 'recurring', + 'footer' => 'footer', + 'header' => 'header', + 'utmCampaign' => 'utmCampaign', + 'params' => 'params', + 'sendAtBestTime' => 'sendAtBestTime', + 'abTesting' => 'abTesting', + 'subjectA' => 'subjectA', + 'subjectB' => 'subjectB', + 'splitRule' => 'splitRule', + 'winnerCriteria' => 'winnerCriteria', + 'winnerDelay' => 'winnerDelay' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'tag' => 'setTag', + 'sender' => 'setSender', + 'name' => 'setName', + 'htmlContent' => 'setHtmlContent', + 'htmlUrl' => 'setHtmlUrl', + 'scheduledAt' => 'setScheduledAt', + 'subject' => 'setSubject', + 'replyTo' => 'setReplyTo', + 'toField' => 'setToField', + 'recipients' => 'setRecipients', + 'attachmentUrl' => 'setAttachmentUrl', + 'inlineImageActivation' => 'setInlineImageActivation', + 'mirrorActive' => 'setMirrorActive', + 'recurring' => 'setRecurring', + 'footer' => 'setFooter', + 'header' => 'setHeader', + 'utmCampaign' => 'setUtmCampaign', + 'params' => 'setParams', + 'sendAtBestTime' => 'setSendAtBestTime', + 'abTesting' => 'setAbTesting', + 'subjectA' => 'setSubjectA', + 'subjectB' => 'setSubjectB', + 'splitRule' => 'setSplitRule', + 'winnerCriteria' => 'setWinnerCriteria', + 'winnerDelay' => 'setWinnerDelay' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'tag' => 'getTag', + 'sender' => 'getSender', + 'name' => 'getName', + 'htmlContent' => 'getHtmlContent', + 'htmlUrl' => 'getHtmlUrl', + 'scheduledAt' => 'getScheduledAt', + 'subject' => 'getSubject', + 'replyTo' => 'getReplyTo', + 'toField' => 'getToField', + 'recipients' => 'getRecipients', + 'attachmentUrl' => 'getAttachmentUrl', + 'inlineImageActivation' => 'getInlineImageActivation', + 'mirrorActive' => 'getMirrorActive', + 'recurring' => 'getRecurring', + 'footer' => 'getFooter', + 'header' => 'getHeader', + 'utmCampaign' => 'getUtmCampaign', + 'params' => 'getParams', + 'sendAtBestTime' => 'getSendAtBestTime', + 'abTesting' => 'getAbTesting', + 'subjectA' => 'getSubjectA', + 'subjectB' => 'getSubjectB', + 'splitRule' => 'getSplitRule', + 'winnerCriteria' => 'getWinnerCriteria', + 'winnerDelay' => 'getWinnerDelay' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const WINNER_CRITERIA_OPEN = 'open'; + const WINNER_CRITERIA_CLICK = 'click'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getWinnerCriteriaAllowableValues() + { + return [ + self::WINNER_CRITERIA_OPEN, + self::WINNER_CRITERIA_CLICK, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['htmlUrl'] = isset($data['htmlUrl']) ? $data['htmlUrl'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['toField'] = isset($data['toField']) ? $data['toField'] : null; + $this->container['recipients'] = isset($data['recipients']) ? $data['recipients'] : null; + $this->container['attachmentUrl'] = isset($data['attachmentUrl']) ? $data['attachmentUrl'] : null; + $this->container['inlineImageActivation'] = isset($data['inlineImageActivation']) ? $data['inlineImageActivation'] : false; + $this->container['mirrorActive'] = isset($data['mirrorActive']) ? $data['mirrorActive'] : null; + $this->container['recurring'] = isset($data['recurring']) ? $data['recurring'] : false; + $this->container['footer'] = isset($data['footer']) ? $data['footer'] : null; + $this->container['header'] = isset($data['header']) ? $data['header'] : null; + $this->container['utmCampaign'] = isset($data['utmCampaign']) ? $data['utmCampaign'] : null; + $this->container['params'] = isset($data['params']) ? $data['params'] : null; + $this->container['sendAtBestTime'] = isset($data['sendAtBestTime']) ? $data['sendAtBestTime'] : null; + $this->container['abTesting'] = isset($data['abTesting']) ? $data['abTesting'] : false; + $this->container['subjectA'] = isset($data['subjectA']) ? $data['subjectA'] : null; + $this->container['subjectB'] = isset($data['subjectB']) ? $data['subjectB'] : null; + $this->container['splitRule'] = isset($data['splitRule']) ? $data['splitRule'] : null; + $this->container['winnerCriteria'] = isset($data['winnerCriteria']) ? $data['winnerCriteria'] : null; + $this->container['winnerDelay'] = isset($data['winnerDelay']) ? $data['winnerDelay'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if (!is_null($this->container['splitRule']) && ($this->container['splitRule'] > 50)) { + $invalidProperties[] = "invalid value for 'splitRule', must be smaller than or equal to 50."; + } + + if (!is_null($this->container['splitRule']) && ($this->container['splitRule'] < 1)) { + $invalidProperties[] = "invalid value for 'splitRule', must be bigger than or equal to 1."; + } + + $allowedValues = $this->getWinnerCriteriaAllowableValues(); + if (!in_array($this->container['winnerCriteria'], $allowedValues)) { + $invalidProperties[] = sprintf( + "invalid value for 'winnerCriteria', must be one of '%s'", + implode("', '", $allowedValues) + ); + } + + if (!is_null($this->container['winnerDelay']) && ($this->container['winnerDelay'] > 168)) { + $invalidProperties[] = "invalid value for 'winnerDelay', must be smaller than or equal to 168."; + } + + if (!is_null($this->container['winnerDelay']) && ($this->container['winnerDelay'] < 1)) { + $invalidProperties[] = "invalid value for 'winnerDelay', must be bigger than or equal to 1."; + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if ($this->container['splitRule'] > 50) { + return false; + } + if ($this->container['splitRule'] < 1) { + return false; + } + $allowedValues = $this->getWinnerCriteriaAllowableValues(); + if (!in_array($this->container['winnerCriteria'], $allowedValues)) { + return false; + } + if ($this->container['winnerDelay'] > 168) { + return false; + } + if ($this->container['winnerDelay'] < 1) { + return false; + } + return true; + } + + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the campaign + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\UpdateEmailCampaignSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\UpdateEmailCampaignSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent Body of the message (HTML version). REQUIRED if htmlUrl is empty + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets htmlUrl + * + * @return string + */ + public function getHtmlUrl() + { + return $this->container['htmlUrl']; + } + + /** + * Sets htmlUrl + * + * @param string $htmlUrl Url which contents the body of the email message. REQUIRED if htmlContent is empty + * + * @return $this + */ + public function setHtmlUrl($htmlUrl) + { + $this->container['htmlUrl'] = $htmlUrl; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which the campaign has to run (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. If sendAtBestTime is set to true, your campaign will be sent according to the date passed (ignoring the time part). + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the campaign + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email on which campaign recipients will be able to reply to + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets toField + * + * @return string + */ + public function getToField() + { + return $this->container['toField']; + } + + /** + * Sets toField + * + * @param string $toField To personalize the «To» Field. If you want to include the first name and last name of your recipient, add `{FNAME} {LNAME}`. These contact attributes must already exist in your SendinBlue account. If input parameter 'params' used please use `{{contact.FNAME}} {{contact.LNAME}}` for personalization + * + * @return $this + */ + public function setToField($toField) + { + $this->container['toField'] = $toField; + + return $this; + } + + /** + * Gets recipients + * + * @return \SendinBlue\Client\Model\UpdateEmailCampaignRecipients + */ + public function getRecipients() + { + return $this->container['recipients']; + } + + /** + * Sets recipients + * + * @param \SendinBlue\Client\Model\UpdateEmailCampaignRecipients $recipients recipients + * + * @return $this + */ + public function setRecipients($recipients) + { + $this->container['recipients'] = $recipients; + + return $this; + } + + /** + * Gets attachmentUrl + * + * @return string + */ + public function getAttachmentUrl() + { + return $this->container['attachmentUrl']; + } + + /** + * Sets attachmentUrl + * + * @param string $attachmentUrl Absolute url of the attachment (no local file). Extension allowed: xlsx, xls, ods, docx, docm, doc, csv, pdf, txt, gif, jpg, jpeg, png, tif, tiff, rtf, bmp, cgm, css, shtml, html, htm, zip, xml, ppt, pptx, tar, ez, ics, mobi, msg, pub and eps + * + * @return $this + */ + public function setAttachmentUrl($attachmentUrl) + { + $this->container['attachmentUrl'] = $attachmentUrl; + + return $this; + } + + /** + * Gets inlineImageActivation + * + * @return bool + */ + public function getInlineImageActivation() + { + return $this->container['inlineImageActivation']; + } + + /** + * Sets inlineImageActivation + * + * @param bool $inlineImageActivation Status of inline image. inlineImageActivation = false means image can’t be embedded, & inlineImageActivation = true means image can be embedded, in the email. You cannot send a campaign of more than 4MB with images embedded in the email. Campaigns with the images embedded in the email must be sent to less than 5000 contacts. + * + * @return $this + */ + public function setInlineImageActivation($inlineImageActivation) + { + $this->container['inlineImageActivation'] = $inlineImageActivation; + + return $this; + } + + /** + * Gets mirrorActive + * + * @return bool + */ + public function getMirrorActive() + { + return $this->container['mirrorActive']; + } + + /** + * Sets mirrorActive + * + * @param bool $mirrorActive Status of mirror links in campaign. mirrorActive = false means mirror links are deactivated, & mirrorActive = true means mirror links are activated, in the campaign + * + * @return $this + */ + public function setMirrorActive($mirrorActive) + { + $this->container['mirrorActive'] = $mirrorActive; + + return $this; + } + + /** + * Gets recurring + * + * @return bool + */ + public function getRecurring() + { + return $this->container['recurring']; + } + + /** + * Sets recurring + * + * @param bool $recurring FOR TRIGGER ONLY ! Type of trigger campaign.recurring = false means contact can receive the same Trigger campaign only once, & recurring = true means contact can receive the same Trigger campaign several times + * + * @return $this + */ + public function setRecurring($recurring) + { + $this->container['recurring'] = $recurring; + + return $this; + } + + /** + * Gets footer + * + * @return string + */ + public function getFooter() + { + return $this->container['footer']; + } + + /** + * Sets footer + * + * @param string $footer Footer of the email campaign + * + * @return $this + */ + public function setFooter($footer) + { + $this->container['footer'] = $footer; + + return $this; + } + + /** + * Gets header + * + * @return string + */ + public function getHeader() + { + return $this->container['header']; + } + + /** + * Sets header + * + * @param string $header Header of the email campaign + * + * @return $this + */ + public function setHeader($header) + { + $this->container['header'] = $header; + + return $this; + } + + /** + * Gets utmCampaign + * + * @return string + */ + public function getUtmCampaign() + { + return $this->container['utmCampaign']; + } + + /** + * Sets utmCampaign + * + * @param string $utmCampaign Customize the utm_campaign value. If this field is empty, the campaign name will be used. Only alphanumeric characters and spaces are allowed + * + * @return $this + */ + public function setUtmCampaign($utmCampaign) + { + $this->container['utmCampaign'] = $utmCampaign; + + return $this; + } + + /** + * Gets params + * + * @return object + */ + public function getParams() + { + return $this->container['params']; + } + + /** + * Sets params + * + * @param object $params Pass the set of attributes to customize the type 'classic' campaign. For example, `{\"FNAME\":\"Joe\", \"LNAME\":\"Doe\"}`. The 'params' field will get updated, only if the campaign is in New Template Language, else ignored. The New Template Language is dependent on the values of 'subject', 'htmlContent/htmlUrl', 'sender.name' & 'toField' + * + * @return $this + */ + public function setParams($params) + { + $this->container['params'] = $params; + + return $this; + } + + /** + * Gets sendAtBestTime + * + * @return bool + */ + public function getSendAtBestTime() + { + return $this->container['sendAtBestTime']; + } + + /** + * Sets sendAtBestTime + * + * @param bool $sendAtBestTime Set this to true if you want to send your campaign at best time. Note:- if true, warmup ip will be disabled. + * + * @return $this + */ + public function setSendAtBestTime($sendAtBestTime) + { + $this->container['sendAtBestTime'] = $sendAtBestTime; + + return $this; + } + + /** + * Gets abTesting + * + * @return bool + */ + public function getAbTesting() + { + return $this->container['abTesting']; + } + + /** + * Sets abTesting + * + * @param bool $abTesting Status of A/B Test. abTesting = false means it is disabled, & abTesting = true means it is enabled. 'subjectA', 'subjectB', 'splitRule', 'winnerCriteria' & 'winnerDelay' will be considered if abTesting is set to true. 'subject' if passed is ignored. Can be set to true only if 'sendAtBestTime' is 'false'. You will be able to set up two subject lines for your campaign and send them to a random sample of your total recipients. Half of the test group will receive version A, and the other half will receive version B + * + * @return $this + */ + public function setAbTesting($abTesting) + { + $this->container['abTesting'] = $abTesting; + + return $this; + } + + /** + * Gets subjectA + * + * @return string + */ + public function getSubjectA() + { + return $this->container['subjectA']; + } + + /** + * Sets subjectA + * + * @param string $subjectA Subject A of the campaign. Considered if abTesting = true. subjectA & subjectB should have unique value + * + * @return $this + */ + public function setSubjectA($subjectA) + { + $this->container['subjectA'] = $subjectA; + + return $this; + } + + /** + * Gets subjectB + * + * @return string + */ + public function getSubjectB() + { + return $this->container['subjectB']; + } + + /** + * Sets subjectB + * + * @param string $subjectB Subject B of the campaign. Considered if abTesting = true. subjectA & subjectB should have unique value + * + * @return $this + */ + public function setSubjectB($subjectB) + { + $this->container['subjectB'] = $subjectB; + + return $this; + } + + /** + * Gets splitRule + * + * @return int + */ + public function getSplitRule() + { + return $this->container['splitRule']; + } + + /** + * Sets splitRule + * + * @param int $splitRule Add the size of your test groups. Considered if abTesting = true. We'll send version A and B to a random sample of recipients, and then the winning version to everyone else + * + * @return $this + */ + public function setSplitRule($splitRule) + { + + if (!is_null($splitRule) && ($splitRule > 50)) { + throw new \InvalidArgumentException('invalid value for $splitRule when calling UpdateEmailCampaign., must be smaller than or equal to 50.'); + } + if (!is_null($splitRule) && ($splitRule < 1)) { + throw new \InvalidArgumentException('invalid value for $splitRule when calling UpdateEmailCampaign., must be bigger than or equal to 1.'); + } + + $this->container['splitRule'] = $splitRule; + + return $this; + } + + /** + * Gets winnerCriteria + * + * @return string + */ + public function getWinnerCriteria() + { + return $this->container['winnerCriteria']; + } + + /** + * Sets winnerCriteria + * + * @param string $winnerCriteria Choose the metrics that will determinate the winning version. Considered if 'splitRule' >= 1 and < 50. If splitRule = 50, 'winnerCriteria' is ignored if passed or alreday exist in record + * + * @return $this + */ + public function setWinnerCriteria($winnerCriteria) + { + $allowedValues = $this->getWinnerCriteriaAllowableValues(); + if (!is_null($winnerCriteria) && !in_array($winnerCriteria, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'winnerCriteria', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['winnerCriteria'] = $winnerCriteria; + + return $this; + } + + /** + * Gets winnerDelay + * + * @return int + */ + public function getWinnerDelay() + { + return $this->container['winnerDelay']; + } + + /** + * Sets winnerDelay + * + * @param int $winnerDelay Choose the duration of the test in hours. Maximum is 7 days, pass 24*7 = 168 hours. The winning version will be sent at the end of the test. Considered if 'splitRule' >= 1 and < 50. If splitRule = 50, 'winnerDelay' is ignored if passed or alreday exist in record + * + * @return $this + */ + public function setWinnerDelay($winnerDelay) + { + + if (!is_null($winnerDelay) && ($winnerDelay > 168)) { + throw new \InvalidArgumentException('invalid value for $winnerDelay when calling UpdateEmailCampaign., must be smaller than or equal to 168.'); + } + if (!is_null($winnerDelay) && ($winnerDelay < 1)) { + throw new \InvalidArgumentException('invalid value for $winnerDelay when calling UpdateEmailCampaign., must be bigger than or equal to 1.'); + } + + $this->container['winnerDelay'] = $winnerDelay; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignRecipients.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignRecipients.php new file mode 100644 index 0000000..d933339 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignRecipients.php @@ -0,0 +1,333 @@ + 'int[]', + 'listIds' => 'int[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'exclusionListIds' => 'int64', + 'listIds' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'exclusionListIds' => 'exclusionListIds', + 'listIds' => 'listIds' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'exclusionListIds' => 'setExclusionListIds', + 'listIds' => 'setListIds' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'exclusionListIds' => 'getExclusionListIds', + 'listIds' => 'getListIds' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['exclusionListIds'] = isset($data['exclusionListIds']) ? $data['exclusionListIds'] : null; + $this->container['listIds'] = isset($data['listIds']) ? $data['listIds'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets exclusionListIds + * + * @return int[] + */ + public function getExclusionListIds() + { + return $this->container['exclusionListIds']; + } + + /** + * Sets exclusionListIds + * + * @param int[] $exclusionListIds List ids which have to be excluded from a campaign + * + * @return $this + */ + public function setExclusionListIds($exclusionListIds) + { + $this->container['exclusionListIds'] = $exclusionListIds; + + return $this; + } + + /** + * Gets listIds + * + * @return int[] + */ + public function getListIds() + { + return $this->container['listIds']; + } + + /** + * Sets listIds + * + * @param int[] $listIds Lists Ids to send the campaign to. REQUIRED if already not present in campaign and scheduledAt is not empty + * + * @return $this + */ + public function setListIds($listIds) + { + $this->container['listIds'] = $listIds; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignSender.php new file mode 100644 index 0000000..6c40fd8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateEmailCampaignSender.php @@ -0,0 +1,333 @@ + 'string', + 'email' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Sender Name from which the campaign emails are sent + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Sender email from which the campaign emails are sent + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateList.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateList.php new file mode 100644 index 0000000..1055fa9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateList.php @@ -0,0 +1,332 @@ + 'string', + 'folderId' => 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'folderId' => 'int64' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'folderId' => 'folderId' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'folderId' => 'setFolderId' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'folderId' => 'getFolderId' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['folderId'] = isset($data['folderId']) ? $data['folderId'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the list. Either of the two parameters (name, folderId) can be updated at a time. + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets folderId + * + * @return int + */ + public function getFolderId() + { + return $this->container['folderId']; + } + + /** + * Sets folderId + * + * @param int $folderId Id of the folder in which the list is to be moved. Either of the two parameters (name, folderId) can be updated at a time. + * + * @return $this + */ + public function setFolderId($folderId) + { + $this->container['folderId'] = $folderId; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSender.php new file mode 100644 index 0000000..0a3b855 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSender.php @@ -0,0 +1,362 @@ + 'string', + 'email' => 'string', + 'ips' => '\SendinBlue\Client\Model\CreateSenderIps[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email', + 'ips' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email', + 'ips' => 'ips' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail', + 'ips' => 'setIps' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail', + 'ips' => 'getIps' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['ips'] = isset($data['ips']) ? $data['ips'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name From Name to update the sender + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email From Email to update the sender + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + + /** + * Gets ips + * + * @return \SendinBlue\Client\Model\CreateSenderIps[] + */ + public function getIps() + { + return $this->container['ips']; + } + + /** + * Sets ips + * + * @param \SendinBlue\Client\Model\CreateSenderIps[] $ips Only in case of dedicated IP, IPs to associate to the sender. If passed, will replace all the existing IPs. + * + * @return $this + */ + public function setIps($ips) + { + $this->container['ips'] = $ips; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmsCampaign.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmsCampaign.php new file mode 100644 index 0000000..4a8322f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmsCampaign.php @@ -0,0 +1,433 @@ + 'string', + 'sender' => 'string', + 'content' => 'string', + 'recipients' => '\SendinBlue\Client\Model\CreateSmsCampaignRecipients', + 'scheduledAt' => '\DateTime' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'sender' => null, + 'content' => null, + 'recipients' => null, + 'scheduledAt' => 'date-time' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'sender' => 'sender', + 'content' => 'content', + 'recipients' => 'recipients', + 'scheduledAt' => 'scheduledAt' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'sender' => 'setSender', + 'content' => 'setContent', + 'recipients' => 'setRecipients', + 'scheduledAt' => 'setScheduledAt' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'sender' => 'getSender', + 'content' => 'getContent', + 'recipients' => 'getRecipients', + 'scheduledAt' => 'getScheduledAt' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['content'] = isset($data['content']) ? $data['content'] : null; + $this->container['recipients'] = isset($data['recipients']) ? $data['recipients'] : null; + $this->container['scheduledAt'] = isset($data['scheduledAt']) ? $data['scheduledAt'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + if (!is_null($this->container['sender']) && (strlen($this->container['sender']) > 11)) { + $invalidProperties[] = "invalid value for 'sender', the character length must be smaller than or equal to 11."; + } + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + if (strlen($this->container['sender']) > 11) { + return false; + } + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the campaign + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets sender + * + * @return string + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param string $sender Name of the sender. The number of characters is limited to 11 + * + * @return $this + */ + public function setSender($sender) + { + if (!is_null($sender) && (strlen($sender) > 11)) { + throw new \InvalidArgumentException('invalid length for $sender when calling UpdateSmsCampaign., must be smaller than or equal to 11.'); + } + + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets content + * + * @return string + */ + public function getContent() + { + return $this->container['content']; + } + + /** + * Sets content + * + * @param string $content Content of the message. The maximum characters used per SMS is 160, if used more than that, it will be counted as more than one SMS + * + * @return $this + */ + public function setContent($content) + { + $this->container['content'] = $content; + + return $this; + } + + /** + * Gets recipients + * + * @return \SendinBlue\Client\Model\CreateSmsCampaignRecipients + */ + public function getRecipients() + { + return $this->container['recipients']; + } + + /** + * Sets recipients + * + * @param \SendinBlue\Client\Model\CreateSmsCampaignRecipients $recipients recipients + * + * @return $this + */ + public function setRecipients($recipients) + { + $this->container['recipients'] = $recipients; + + return $this; + } + + /** + * Gets scheduledAt + * + * @return \DateTime + */ + public function getScheduledAt() + { + return $this->container['scheduledAt']; + } + + /** + * Sets scheduledAt + * + * @param \DateTime $scheduledAt UTC date-time on which the campaign has to run (YYYY-MM-DDTHH:mm:ss.SSSZ). Prefer to pass your timezone in date-time format for accurate result. + * + * @return $this + */ + public function setScheduledAt($scheduledAt) + { + $this->container['scheduledAt'] = $scheduledAt; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplate.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplate.php new file mode 100644 index 0000000..ebebe21 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplate.php @@ -0,0 +1,572 @@ + 'string', + 'sender' => '\SendinBlue\Client\Model\UpdateSmtpTemplateSender', + 'templateName' => 'string', + 'htmlContent' => 'string', + 'htmlUrl' => 'string', + 'subject' => 'string', + 'replyTo' => 'string', + 'toField' => 'string', + 'attachmentUrl' => 'string', + 'isActive' => 'bool' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'tag' => null, + 'sender' => null, + 'templateName' => null, + 'htmlContent' => null, + 'htmlUrl' => 'url', + 'subject' => null, + 'replyTo' => 'email', + 'toField' => null, + 'attachmentUrl' => 'url', + 'isActive' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'tag' => 'tag', + 'sender' => 'sender', + 'templateName' => 'templateName', + 'htmlContent' => 'htmlContent', + 'htmlUrl' => 'htmlUrl', + 'subject' => 'subject', + 'replyTo' => 'replyTo', + 'toField' => 'toField', + 'attachmentUrl' => 'attachmentUrl', + 'isActive' => 'isActive' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'tag' => 'setTag', + 'sender' => 'setSender', + 'templateName' => 'setTemplateName', + 'htmlContent' => 'setHtmlContent', + 'htmlUrl' => 'setHtmlUrl', + 'subject' => 'setSubject', + 'replyTo' => 'setReplyTo', + 'toField' => 'setToField', + 'attachmentUrl' => 'setAttachmentUrl', + 'isActive' => 'setIsActive' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'tag' => 'getTag', + 'sender' => 'getSender', + 'templateName' => 'getTemplateName', + 'htmlContent' => 'getHtmlContent', + 'htmlUrl' => 'getHtmlUrl', + 'subject' => 'getSubject', + 'replyTo' => 'getReplyTo', + 'toField' => 'getToField', + 'attachmentUrl' => 'getAttachmentUrl', + 'isActive' => 'getIsActive' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['tag'] = isset($data['tag']) ? $data['tag'] : null; + $this->container['sender'] = isset($data['sender']) ? $data['sender'] : null; + $this->container['templateName'] = isset($data['templateName']) ? $data['templateName'] : null; + $this->container['htmlContent'] = isset($data['htmlContent']) ? $data['htmlContent'] : null; + $this->container['htmlUrl'] = isset($data['htmlUrl']) ? $data['htmlUrl'] : null; + $this->container['subject'] = isset($data['subject']) ? $data['subject'] : null; + $this->container['replyTo'] = isset($data['replyTo']) ? $data['replyTo'] : null; + $this->container['toField'] = isset($data['toField']) ? $data['toField'] : null; + $this->container['attachmentUrl'] = isset($data['attachmentUrl']) ? $data['attachmentUrl'] : null; + $this->container['isActive'] = isset($data['isActive']) ? $data['isActive'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets tag + * + * @return string + */ + public function getTag() + { + return $this->container['tag']; + } + + /** + * Sets tag + * + * @param string $tag Tag of the template + * + * @return $this + */ + public function setTag($tag) + { + $this->container['tag'] = $tag; + + return $this; + } + + /** + * Gets sender + * + * @return \SendinBlue\Client\Model\UpdateSmtpTemplateSender + */ + public function getSender() + { + return $this->container['sender']; + } + + /** + * Sets sender + * + * @param \SendinBlue\Client\Model\UpdateSmtpTemplateSender $sender sender + * + * @return $this + */ + public function setSender($sender) + { + $this->container['sender'] = $sender; + + return $this; + } + + /** + * Gets templateName + * + * @return string + */ + public function getTemplateName() + { + return $this->container['templateName']; + } + + /** + * Sets templateName + * + * @param string $templateName Name of the template + * + * @return $this + */ + public function setTemplateName($templateName) + { + $this->container['templateName'] = $templateName; + + return $this; + } + + /** + * Gets htmlContent + * + * @return string + */ + public function getHtmlContent() + { + return $this->container['htmlContent']; + } + + /** + * Sets htmlContent + * + * @param string $htmlContent Required if htmlUrl is empty. Body of the message (HTML must have more than 10 characters) + * + * @return $this + */ + public function setHtmlContent($htmlContent) + { + $this->container['htmlContent'] = $htmlContent; + + return $this; + } + + /** + * Gets htmlUrl + * + * @return string + */ + public function getHtmlUrl() + { + return $this->container['htmlUrl']; + } + + /** + * Sets htmlUrl + * + * @param string $htmlUrl Required if htmlContent is empty. URL to the body of the email (HTML) + * + * @return $this + */ + public function setHtmlUrl($htmlUrl) + { + $this->container['htmlUrl'] = $htmlUrl; + + return $this; + } + + /** + * Gets subject + * + * @return string + */ + public function getSubject() + { + return $this->container['subject']; + } + + /** + * Sets subject + * + * @param string $subject Subject of the email + * + * @return $this + */ + public function setSubject($subject) + { + $this->container['subject'] = $subject; + + return $this; + } + + /** + * Gets replyTo + * + * @return string + */ + public function getReplyTo() + { + return $this->container['replyTo']; + } + + /** + * Sets replyTo + * + * @param string $replyTo Email on which campaign recipients will be able to reply to + * + * @return $this + */ + public function setReplyTo($replyTo) + { + $this->container['replyTo'] = $replyTo; + + return $this; + } + + /** + * Gets toField + * + * @return string + */ + public function getToField() + { + return $this->container['toField']; + } + + /** + * Sets toField + * + * @param string $toField To personalize the «To» Field. If you want to include the first name and last name of your recipient, add `{FNAME} {LNAME}`. These contact attributes must already exist in your SendinBlue account. If input parameter 'params' used please use `{{contact.FNAME}} {{contact.LNAME}}` for personalization + * + * @return $this + */ + public function setToField($toField) + { + $this->container['toField'] = $toField; + + return $this; + } + + /** + * Gets attachmentUrl + * + * @return string + */ + public function getAttachmentUrl() + { + return $this->container['attachmentUrl']; + } + + /** + * Sets attachmentUrl + * + * @param string $attachmentUrl Absolute url of the attachment (no local file). Extension allowed: xlsx, xls, ods, docx, docm, doc, csv, pdf, txt, gif, jpg, jpeg, png, tif, tiff, rtf, bmp, cgm, css, shtml, html, htm, zip, xml, ppt, pptx, tar, ez, ics, mobi, msg, pub and eps + * + * @return $this + */ + public function setAttachmentUrl($attachmentUrl) + { + $this->container['attachmentUrl'] = $attachmentUrl; + + return $this; + } + + /** + * Gets isActive + * + * @return bool + */ + public function getIsActive() + { + return $this->container['isActive']; + } + + /** + * Sets isActive + * + * @param bool $isActive Status of the template. isActive = false means template is inactive, isActive = true means template is active + * + * @return $this + */ + public function setIsActive($isActive) + { + $this->container['isActive'] = $isActive; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplateSender.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplateSender.php new file mode 100644 index 0000000..f675d27 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateSmtpTemplateSender.php @@ -0,0 +1,333 @@ + 'string', + 'email' => 'string' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'name' => null, + 'email' => 'email' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'name' => 'name', + 'email' => 'email' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'name' => 'setName', + 'email' => 'setEmail' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'name' => 'getName', + 'email' => 'getEmail' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['name'] = isset($data['name']) ? $data['name'] : null; + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets name + * + * @return string + */ + public function getName() + { + return $this->container['name']; + } + + /** + * Sets name + * + * @param string $name Name of the sender + * + * @return $this + */ + public function setName($name) + { + $this->container['name'] = $name; + + return $this; + } + + /** + * Gets email + * + * @return string + */ + public function getEmail() + { + return $this->container['email']; + } + + /** + * Sets email + * + * @param string $email Email of the sender + * + * @return $this + */ + public function setEmail($email) + { + $this->container['email'] = $email; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateWebhook.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateWebhook.php new file mode 100644 index 0000000..9e2012e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/Model/UpdateWebhook.php @@ -0,0 +1,408 @@ + 'string', + 'description' => 'string', + 'events' => 'string[]' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $swaggerFormats = [ + 'url' => 'url', + 'description' => null, + 'events' => null + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerTypes() + { + return self::$swaggerTypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function swaggerFormats() + { + return self::$swaggerFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'url' => 'url', + 'description' => 'description', + 'events' => 'events' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'url' => 'setUrl', + 'description' => 'setDescription', + 'events' => 'setEvents' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'url' => 'getUrl', + 'description' => 'getDescription', + 'events' => 'getEvents' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$swaggerModelName; + } + + const EVENTS_HARD_BOUNCE = 'hardBounce'; + const EVENTS_SOFT_BOUNCE = 'softBounce'; + const EVENTS_BLOCKED = 'blocked'; + const EVENTS_SPAM = 'spam'; + const EVENTS_DELIVERED = 'delivered'; + const EVENTS_REQUEST = 'request'; + const EVENTS_CLICK = 'click'; + const EVENTS_INVALID = 'invalid'; + const EVENTS_DEFERRED = 'deferred'; + const EVENTS_OPENED = 'opened'; + const EVENTS_UNIQUE_OPENED = 'uniqueOpened'; + const EVENTS_UNSUBSCRIBED = 'unsubscribed'; + const EVENTS_LIST_ADDITION = 'listAddition'; + + + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getEventsAllowableValues() + { + return [ + self::EVENTS_HARD_BOUNCE, + self::EVENTS_SOFT_BOUNCE, + self::EVENTS_BLOCKED, + self::EVENTS_SPAM, + self::EVENTS_DELIVERED, + self::EVENTS_REQUEST, + self::EVENTS_CLICK, + self::EVENTS_INVALID, + self::EVENTS_DEFERRED, + self::EVENTS_OPENED, + self::EVENTS_UNIQUE_OPENED, + self::EVENTS_UNSUBSCRIBED, + self::EVENTS_LIST_ADDITION, + ]; + } + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['url'] = isset($data['url']) ? $data['url'] : null; + $this->container['description'] = isset($data['description']) ? $data['description'] : null; + $this->container['events'] = isset($data['events']) ? $data['events'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + + return true; + } + + + /** + * Gets url + * + * @return string + */ + public function getUrl() + { + return $this->container['url']; + } + + /** + * Sets url + * + * @param string $url URL of the webhook + * + * @return $this + */ + public function setUrl($url) + { + $this->container['url'] = $url; + + return $this; + } + + /** + * Gets description + * + * @return string + */ + public function getDescription() + { + return $this->container['description']; + } + + /** + * Sets description + * + * @param string $description Description of the webhook + * + * @return $this + */ + public function setDescription($description) + { + $this->container['description'] = $description; + + return $this; + } + + /** + * Gets events + * + * @return string[] + */ + public function getEvents() + { + return $this->container['events']; + } + + /** + * Sets events + * + * @param string[] $events Events triggering the webhook. Possible values for Transactional type webhook – request, delivered, hardBounce, softBounce, blocked, spam, invalid, deferred, click, opened, uniqueOpened and unsubscribed and possible values for Marketing type webhook – spam, opened, click, hardBounce, softBounce, unsubscribed, listAddition and delivered + * + * @return $this + */ + public function setEvents($events) + { + $allowedValues = $this->getEventsAllowableValues(); + if (!is_null($events) && array_diff($events, $allowedValues)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'events', must be one of '%s'", + implode("', '", $allowedValues) + ) + ); + } + $this->container['events'] = $events; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } + + return json_encode(ObjectSerializer::sanitizeForSerialization($this)); + } +} + + diff --git a/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ObjectSerializer.php b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ObjectSerializer.php new file mode 100644 index 0000000..3068625 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/vendor/sendinblue/api-v3-sdk/lib/ObjectSerializer.php @@ -0,0 +1,317 @@ +format('Y-m-d') : $data->format(\DateTime::ATOM); + } elseif (is_array($data)) { + foreach ($data as $property => $value) { + $data[$property] = self::sanitizeForSerialization($value); + } + return $data; + } elseif (is_object($data)) { + $values = []; + $formats = $data::swaggerFormats(); + foreach ($data::swaggerTypes() as $property => $swaggerType) { + $getter = $data::getters()[$property]; + $value = $data->$getter(); + if ($value !== null + && !in_array($swaggerType, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true) + && method_exists($swaggerType, 'getAllowableEnumValues') + && !in_array($value, $swaggerType::getAllowableEnumValues())) { + $imploded = implode("', '", $swaggerType::getAllowableEnumValues()); + throw new \InvalidArgumentException("Invalid value for enum '$swaggerType', must be one of: '$imploded'"); + } + if ($value !== null) { + $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $swaggerType, $formats[$property]); + } + } + return (object)$values; + } else { + return (string)$data; + } + } + + /** + * Sanitize filename by removing path. + * e.g. ../../sun.gif becomes sun.gif + * + * @param string $filename filename to be sanitized + * + * @return string the sanitized filename + */ + public static function sanitizeFilename($filename) + { + if (preg_match("/.*[\/\\\\](.*)$/", $filename, $match)) { + return $match[1]; + } else { + return $filename; + } + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the path, by url-encoding. + * + * @param string $value a string which will be part of the path + * + * @return string the serialized object + */ + public static function toPathValue($value) + { + return rawurlencode(self::toString($value)); + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the query, by imploding comma-separated if it's an object. + * If it's a string, pass through unchanged. It will be url-encoded + * later. + * + * @param string[]|string|\DateTime $object an object to be serialized to a string + * + * @return string the serialized object + */ + public static function toQueryValue($object) + { + if (is_array($object)) { + return implode(',', $object); + } else { + return self::toString($object); + } + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the header. If it's a string, pass through unchanged + * If it's a datetime object, format it in ISO8601 + * + * @param string $value a string which will be part of the header + * + * @return string the header string + */ + public static function toHeaderValue($value) + { + return self::toString($value); + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the http body (form parameter). If it's a string, pass through unchanged + * If it's a datetime object, format it in ISO8601 + * + * @param string|\SplFileObject $value the value of the form parameter + * + * @return string the form string + */ + public static function toFormValue($value) + { + if ($value instanceof \SplFileObject) { + return $value->getRealPath(); + } else { + return self::toString($value); + } + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the parameter. If it's a string, pass through unchanged + * If it's a datetime object, format it in ISO8601 + * + * @param string|\DateTime $value the value of the parameter + * + * @return string the header string + */ + public static function toString($value) + { + if ($value instanceof \DateTime) { // datetime in ISO8601 format + return $value->format(\DateTime::ATOM); + } else { + return $value; + } + } + + /** + * Serialize an array to a string. + * + * @param array $collection collection to serialize to a string + * @param string $collectionFormat the format use for serialization (csv, + * ssv, tsv, pipes, multi) + * @param bool $allowCollectionFormatMulti allow collection format to be a multidimensional array + * + * @return string + */ + public static function serializeCollection(array $collection, $collectionFormat, $allowCollectionFormatMulti = false) + { + if ($allowCollectionFormatMulti && ('multi' === $collectionFormat)) { + // http_build_query() almost does the job for us. We just + // need to fix the result of multidimensional arrays. + return preg_replace('/%5B[0-9]+%5D=/', '=', http_build_query($collection, '', '&')); + } + switch ($collectionFormat) { + case 'pipes': + return implode('|', $collection); + + case 'tsv': + return implode("\t", $collection); + + case 'ssv': + return implode(' ', $collection); + + case 'csv': + // Deliberate fall through. CSV is default format. + default: + return implode(',', $collection); + } + } + + /** + * Deserialize a JSON string into an object + * + * @param mixed $data object or primitive to be deserialized + * @param string $class class name is passed as a string + * @param string[] $httpHeaders HTTP headers + * @param string $discriminator discriminator if polymorphism is used + * + * @return object|array|null an single or an array of $class instances + */ + public static function deserialize($data, $class, $httpHeaders = null) + { + if (null === $data) { + return null; + } elseif (substr($class, 0, 4) === 'map[') { // for associative array e.g. map[string,int] + $inner = substr($class, 4, -1); + $deserialized = []; + if (strrpos($inner, ",") !== false) { + $subClass_array = explode(',', $inner, 2); + $subClass = $subClass_array[1]; + foreach ($data as $key => $value) { + $deserialized[$key] = self::deserialize($value, $subClass, null); + } + } + return $deserialized; + } elseif (strcasecmp(substr($class, -2), '[]') === 0) { + $subClass = substr($class, 0, -2); + $values = []; + foreach ($data as $key => $value) { + $values[] = self::deserialize($value, $subClass, null); + } + return $values; + } elseif ($class === 'object') { + settype($data, 'array'); + return $data; + } elseif ($class === '\DateTime') { + // Some API's return an invalid, empty string as a + // date-time property. DateTime::__construct() will return + // the current time for empty input which is probably not + // what is meant. The invalid empty string is probably to + // be interpreted as a missing field/value. Let's handle + // this graceful. + if (!empty($data)) { + return new \DateTime($data); + } else { + return null; + } + } elseif (in_array($class, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true)) { + settype($data, $class); + return $data; + } elseif ($class === '\SplFileObject') { + /** @var \Psr\Http\Message\StreamInterface $data */ + + // determine file name + if (array_key_exists('Content-Disposition', $httpHeaders) && + preg_match('/inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeaders['Content-Disposition'], $match)) { + $filename = Configuration::getDefaultConfiguration()->getTempFolderPath() . self::sanitizeFilename($match[1]); + } else { + $filename = tempnam(Configuration::getDefaultConfiguration()->getTempFolderPath(), ''); + } + + $file = fopen($filename, 'w'); + while ($chunk = $data->read(200)) { + fwrite($file, $chunk); + } + fclose($file); + + return new \SplFileObject($filename, 'r'); + } elseif (method_exists($class, 'getAllowableEnumValues')) { + if (!in_array($data, $class::getAllowableEnumValues())) { + $imploded = implode("', '", $class::getAllowableEnumValues()); + throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'"); + } + return $data; + } else { + // If a discriminator is defined and points to a valid subclass, use it. + $discriminator = $class::DISCRIMINATOR; + if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) { + $subclass = '\SendinBlue\Client\Model\\' . $data->{$discriminator}; + if (is_subclass_of($subclass, $class)) { + $class = $subclass; + } + } + $instance = new $class(); + foreach ($instance::swaggerTypes() as $property => $type) { + $propertySetter = $instance::setters()[$property]; + + if (!isset($propertySetter) || !isset($data->{$instance::attributeMap()[$property]})) { + continue; + } + + $propertyValue = $data->{$instance::attributeMap()[$property]}; + if (isset($propertyValue)) { + $instance->$propertySetter(self::deserialize($propertyValue, $type, null)); + } + } + return $instance; + } + } +} diff --git a/wp-content/plugins/wp-mail-smtp/wp-mail-smtp-0.11.2.php b/wp-content/plugins/wp-mail-smtp/wp-mail-smtp-0.11.2.php new file mode 100644 index 0000000..21b2511 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/wp-mail-smtp-0.11.2.php @@ -0,0 +1,759 @@ + '', + 'mail_from_name' => '', + 'mailer' => 'smtp', + 'mail_set_return_path' => 'false', + 'smtp_host' => 'localhost', + 'smtp_port' => '25', + 'smtp_ssl' => 'none', + 'smtp_auth' => false, + 'smtp_user' => '', + 'smtp_pass' => '', + 'pepipost_user' => '', + 'pepipost_pass' => '', + 'pepipost_port' => '2525', + 'pepipost_ssl' => 'none', +); + +/** + * Activation function. This function creates the required options and defaults. + */ +if ( ! function_exists( 'wp_mail_smtp_activate' ) ) : + /** + * What to do on plugin activation. + */ + function wp_mail_smtp_activate() { + + global $wpms_options; + + // Create the required options... + foreach ( $wpms_options as $name => $val ) { + add_option( $name, $val ); + } + } +endif; + +if ( ! function_exists( 'wp_mail_smtp_whitelist_options' ) ) : + /** + * Whitelist plugin options. + * + * @param array $whitelist_options + * + * @return mixed + */ + function wp_mail_smtp_whitelist_options( $whitelist_options ) { + + global $wpms_options; + + // Add our options to the array. + $whitelist_options['email'] = array_keys( $wpms_options ); + + return $whitelist_options; + } +endif; + +/** + * To avoid any (very unlikely) clashes, check if the function already exists. + */ +if ( ! function_exists( 'phpmailer_init_smtp' ) ) : + /** + * This code is copied, from wp-includes/pluggable.php as at version 2.2.2. + * + * @param PHPMailer $phpmailer It's passed by reference, so no need to return anything. + */ + function phpmailer_init_smtp( $phpmailer ) { + /* + * If constants are defined, apply them. + * We should have defined all required constants before using them. + */ + if ( + defined( 'WPMS_ON' ) && WPMS_ON && + defined( 'WPMS_MAILER' ) + ) { + $phpmailer->Mailer = WPMS_MAILER; + + if ( defined( 'WPMS_SET_RETURN_PATH' ) && WPMS_SET_RETURN_PATH ) { + $phpmailer->Sender = $phpmailer->From; + } + + if ( + WPMS_MAILER === 'smtp' && + defined( 'WPMS_SSL' ) && + defined( 'WPMS_SMTP_HOST' ) && + defined( 'WPMS_SMTP_PORT' ) + ) { + $phpmailer->SMTPSecure = WPMS_SSL; + $phpmailer->Host = WPMS_SMTP_HOST; + $phpmailer->Port = WPMS_SMTP_PORT; + + if ( + defined( 'WPMS_SMTP_AUTH' ) && WPMS_SMTP_AUTH && + defined( 'WPMS_SMTP_USER' ) && + defined( 'WPMS_SMTP_PASS' ) + ) { + $phpmailer->SMTPAuth = true; + $phpmailer->Username = WPMS_SMTP_USER; + $phpmailer->Password = WPMS_SMTP_PASS; + } + } + } else { + $option_mailer = get_option( 'mailer' ); + $option_smtp_host = get_option( 'smtp_host' ); + $option_smtp_ssl = get_option( 'smtp_ssl' ); + + // Check that mailer is not blank, and if mailer=smtp, host is not blank. + if ( + ! $option_mailer || + ( 'smtp' === $option_mailer && ! $option_smtp_host ) + ) { + return; + } + + // If the mailer is pepipost, make sure we have a username and password. + if ( 'pepipost' === $option_mailer && ( ! get_option( 'pepipost_user' ) && ! get_option( 'pepipost_pass' ) ) ) { + return; + } + + // Set the mailer type as per config above, this overrides the already called isMail method. + $phpmailer->Mailer = $option_mailer; + + // Set the Sender (return-path) if required. + if ( get_option( 'mail_set_return_path' ) ) { + $phpmailer->Sender = $phpmailer->From; + } + + // Set the SMTPSecure value, if set to none, leave this blank. + $phpmailer->SMTPSecure = $option_smtp_ssl; + if ( 'none' === $option_smtp_ssl ) { + $phpmailer->SMTPSecure = ''; + $phpmailer->SMTPAutoTLS = false; + } + + // If we're sending via SMTP, set the host. + if ( 'smtp' === $option_mailer ) { + // Set the other options. + $phpmailer->Host = $option_smtp_host; + $phpmailer->Port = get_option( 'smtp_port' ); + + // If we're using smtp auth, set the username & password. + if ( get_option( 'smtp_auth' ) === 'true' ) { + $phpmailer->SMTPAuth = true; + $phpmailer->Username = get_option( 'smtp_user' ); + $phpmailer->Password = get_option( 'smtp_pass' ); + } + } elseif ( 'pepipost' === $option_mailer ) { + // Set the Pepipost settings. + $phpmailer->Mailer = 'smtp'; + $phpmailer->Host = 'smtp.pepipost.com'; + $phpmailer->Port = get_option( 'pepipost_port' ); + $phpmailer->SMTPSecure = get_option( 'pepipost_ssl' ) === 'none' ? '' : get_option( 'pepipost_ssl' ); + $phpmailer->SMTPAuth = true; + $phpmailer->Username = get_option( 'pepipost_user' ); + $phpmailer->Password = get_option( 'pepipost_pass' ); + } + } + + // You can add your own options here, see the phpmailer documentation for more info: http://phpmailer.sourceforge.net/docs/. + /** @noinspection PhpUnusedLocalVariableInspection It's passed by reference. */ + $phpmailer = apply_filters( 'wp_mail_smtp_custom_options', $phpmailer ); + } +endif; + +if ( ! function_exists( 'wp_mail_smtp_options_page' ) ) : + /** + * This function outputs the plugin options page. + */ + function wp_mail_smtp_options_page() { + + global $phpmailer; + + // Make sure the PHPMailer class has been instantiated + // (copied verbatim from wp-includes/pluggable.php) + // (Re)create it, if it's gone missing. + if ( ! is_object( $phpmailer ) || ! is_a( $phpmailer, 'PHPMailer' ) ) { + require_once ABSPATH . WPINC . '/class-phpmailer.php'; + $phpmailer = new PHPMailer( true ); + } + + // Send a test mail if necessary. + if ( + isset( $_POST['wpms_action'] ) && + esc_html__( 'Send Test', 'wp-mail-smtp' ) === sanitize_text_field( $_POST['wpms_action'] ) && + is_email( $_POST['to'] ) + ) { + + check_admin_referer( 'test-email' ); + + // Set up the mail variables. + $to = sanitize_text_field( $_POST['to'] ); + /* translators: %s - email address where test mail will be sent to. */ + $subject = 'WP Mail SMTP: ' . sprintf( esc_html__( 'Test mail to %s', 'wp-mail-smtp' ), $to ); + $message = esc_html__( 'This is a test email generated by the WP Mail SMTP WordPress plugin.', 'wp-mail-smtp' ); + + // Set SMTPDebug level, default is 2 (commands + data + connection status). + $phpmailer->SMTPDebug = apply_filters( 'wp_mail_smtp_admin_test_email_smtp_debug', 2 ); + + // Start output buffering to grab smtp debugging output. + ob_start(); + + // Send the test mail. + $result = wp_mail( $to, $subject, $message ); + + // Grab the smtp debugging output. + $smtp_debug = ob_get_clean(); + + // Output the response. + ?> +

            +

            +
            + +

            +
            + +

            +
            +
            + +
            +

            + +

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

            + ' ); + _e( 'Please Note: You appear to be using a version of WordPress prior to 2.3. Please ignore the From Name field and instead enter Name<email@domain.com> in this field.', 'wp-mail-smtp' ); + print( '' ); + } + ?> +

            +
            + + + + +

            + +

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

            + /> + +

            +

            + /> + +

            + + +

            + /> + +

            +

            + ', + '' + ); + ?> +

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

            + +

            +
            +
            + +

            + +

            + +
            +

            + +

            +

            + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            + + + +
            +
            + + + + + /> +
            + + /> +
            + + /> + + +

            +
            +
            +
            + + + + + /> +
            + + /> +
            + +

            + +

            +
            +
            + + + +
            + + + + +

            + +

            +
            + +

            + +

            +
            + + +
            +

            + +

            +

            + Pepipost', + '' + ); + ?> +

            + + + + + + + + + + + + + + + + + +
            + + + +
            + + + +
            + + + +
            + + +
            + + + + + + + /> +
            + + /> +
            + + /> + +
            +
            + +

            + +

            +
            + + + + +
            + +

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

            +
            + +

            + +

            +
            + + + +
            + ' . esc_html__( 'Settings', 'wp-mail-smtp' ) . ''; + + array_unshift( $links, $settings_link ); + + return $links; +} + +/** + * Check whether the site is using Pepipost or not. + * + * @since 0.11 + * + * @return bool + */ +function wp_mail_smtp_is_pepipost_active() { + return apply_filters( 'wp_mail_smtp_options_is_pepipost_active', 'pepipost' === get_option( 'mailer' ) ); +} + +/** + * Check the current PHP version and display a notice if on unsupported PHP. + * + * @since 0.11 + */ +function wp_mail_smtp_check_php_version() { + + // Display for admins only. + if ( ! is_super_admin() ) { + return; + } + + // Display on Dashboard page only. + if ( isset( $GLOBALS['pagenow'] ) && 'index.php' !== $GLOBALS['pagenow'] ) { + return; + } + + echo '
            ' . + '

            ' . + sprintf( + /* translators: %1$s - WP Mail SMTP plugin name; %2$s - opening a link tag; %3$s - closing a link tag. */ + esc_html__( + 'Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. %2$sRead more%3$s for additional information.', + 'wp-mail-smtp' + ), + 'WP Mail SMTP', + '', + '' + ) . + '

            ' . + '
            '; +} + +add_action( 'admin_notices', 'wp_mail_smtp_check_php_version' ); + +// Add an action on phpmailer_init. +add_action( 'phpmailer_init', 'phpmailer_init_smtp' ); + +if ( ! defined( 'WPMS_ON' ) || ! WPMS_ON ) { + // Whitelist our options. + add_filter( 'whitelist_options', 'wp_mail_smtp_whitelist_options' ); + // Add the create pages options. + add_action( 'admin_menu', 'wp_mail_smtp_menus' ); + // Add an activation hook for this plugin. + register_activation_hook( __FILE__, 'wp_mail_smtp_activate' ); + // Adds "Settings" link to the Plugins page. + add_filter( 'plugin_action_links', 'wp_mail_plugin_action_links', 10, 2 ); +} + +// Add filters to replace the mail from name and email address. +add_filter( 'wp_mail_from', 'wp_mail_smtp_mail_from' ); +add_filter( 'wp_mail_from_name', 'wp_mail_smtp_mail_from_name' ); + +load_plugin_textdomain( 'wp-mail-smtp', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); diff --git a/wp-content/plugins/wp-mail-smtp/wp-mail-smtp.php b/wp-content/plugins/wp-mail-smtp/wp-mail-smtp.php new file mode 100644 index 0000000..d28cd25 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/wp-mail-smtp.php @@ -0,0 +1,83 @@ +wp_mail() function to use Gmail/Mailgun/SendGrid/SMTP instead of the default mail() and creates an options page to manage the settings. + * Author: WPForms + * Author URI: https://wpforms.com/ + * Network: false + * Text Domain: wp-mail-smtp + * Domain Path: /assets/languages + */ + +/** + * @author WPForms + * @copyright WPForms, 2007-20, All Rights Reserved + * This code is released under the GPL licence version 3 or later, available here + * https://www.gnu.org/licenses/gpl.txt + */ + +/** + * Setting options in wp-config.php + * + * Specifically aimed at WP Multisite users, you can set the options for this plugin as + * constants in wp-config.php. Copy the code below into wp-config.php and tweak settings. + * Values from constants are NOT stripslash()'ed. + * + * When enabled, make sure to comment out (at the beginning of the line using //) those constants that you do not need, + * or remove them completely, so they won't interfere with plugin settings. + */ + +/* +define( 'WPMS_ON', true ); // True turns on the whole constants support and usage, false turns it off. + +define( 'WPMS_DO_NOT_SEND', true ); // Or false, in that case constant is ignored. + +define( 'WPMS_MAIL_FROM', 'mail@example.com' ); +define( 'WPMS_MAIL_FROM_FORCE', true ); // True turns it on, false turns it off. +define( 'WPMS_MAIL_FROM_NAME', 'From Name' ); +define( 'WPMS_MAIL_FROM_NAME_FORCE', true ); // True turns it on, false turns it off. +define( 'WPMS_MAILER', 'sendinblue' ); // Possible values: 'mail', 'sendinblue', 'mailgun', 'sendgrid', 'gmail', 'smtp'. +define( 'WPMS_SET_RETURN_PATH', true ); // Sets $phpmailer->Sender if true, relevant only for Other SMTP mailer. + +// Recommended mailers. +define( 'WPMS_PEPIPOST_API_KEY', '' ); +define( 'WPMS_SENDINBLUE_API_KEY', '' ); + +define( 'WPMS_MAILGUN_API_KEY', '' ); +define( 'WPMS_MAILGUN_DOMAIN', '' ); +define( 'WPMS_MAILGUN_REGION', 'US' ); // or 'EU' for Europe. + +define( 'WPMS_SENDGRID_API_KEY', '' ); + +define( 'WPMS_GMAIL_CLIENT_ID', '' ); +define( 'WPMS_GMAIL_CLIENT_SECRET', '' ); + +define( 'WPMS_SMTP_HOST', 'localhost' ); // The SMTP mail host. +define( 'WPMS_SMTP_PORT', 25 ); // The SMTP server port number. +define( 'WPMS_SSL', '' ); // Possible values '', 'ssl', 'tls' - note TLS is not STARTTLS. +define( 'WPMS_SMTP_AUTH', true ); // True turns it on, false turns it off. +define( 'WPMS_SMTP_USER', 'username' ); // SMTP authentication username, only used if WPMS_SMTP_AUTH is true. +define( 'WPMS_SMTP_PASS', 'password' ); // SMTP authentication password, only used if WPMS_SMTP_AUTH is true. +define( 'WPMS_SMTP_AUTOTLS', true ); // True turns it on, false turns it off. +*/ + +/** + * Don't allow multiple versions of 1.5.x (Lite and Pro) and above to be active. + * + * @since 1.5.0 + */ +if ( function_exists( 'wp_mail_smtp' ) ) { + + if ( ! function_exists( 'wp_mail_smtp_deactivate' ) ) { + /** + * Deactivate if plugin already activated. + * Needed when transitioning from 1.5+ Lite to Pro. + * + * @since 1.5.0 + */ + function wp_mail_smtp_deactivate() { + + deactivate_plugins( plugin_basename( __FILE__ ) ); + } + } + add_action( 'admin_init', 'wp_mail_smtp_deactivate' ); + + // Do not process the plugin code further. + return; +} + +if ( ! function_exists( 'wp_mail_smtp_check_pro_loading_allowed' ) ) { + /** + * Don't allow 1.4.x and below to break when 1.5+ Pro is activated. + * This will stop the current plugin from loading and display a message in admin area. + * + * @since 1.5.0 + */ + function wp_mail_smtp_check_pro_loading_allowed() { + + // Check for pro without using wp_mail_smtp()->is_pro(), because at this point it's too early. + if ( ! is_readable( rtrim( plugin_dir_path( __FILE__ ), '/\\' ) . '/src/Pro/Pro.php' ) ) { + // Currently, not a pro version of the plugin is loaded. + return false; + } + + if ( ! function_exists( 'is_plugin_active' ) ) { + require_once ABSPATH . '/wp-admin/includes/plugin.php'; + } + + // Search for old plugin name. + if ( is_plugin_active( 'wp-mail-smtp/wp_mail_smtp.php' ) ) { + // As Pro is loaded and Lite too - deactivate *silently* itself not to break older SMTP plugin. + deactivate_plugins( plugin_basename( __FILE__ ) ); + + add_action( 'admin_notices', 'wp_mail_smtp_lite_deactivation_notice' ); + + return true; + } + + return false; + } + + if ( ! function_exists( 'wp_mail_smtp_lite_deactivation_notice' ) ) { + /** + * Display the notice after deactivation. + * + * @since 1.5.0 + */ + function wp_mail_smtp_lite_deactivation_notice() { + + echo '

            ' . esc_html__( 'Please deactivate the free version of the WP Mail SMTP plugin before activating WP Mail SMTP Pro.', 'wp-mail-smtp' ) . '

            '; + + if ( isset( $_GET['activate'] ) ) { // phpcs:ignore + unset( $_GET['activate'] ); // phpcs:ignore + } + } + } + + // Stop the plugin loading. + if ( wp_mail_smtp_check_pro_loading_allowed() === true ) { + return; + } +} + +if ( ! defined( 'WPMS_PLUGIN_VER' ) ) { + define( 'WPMS_PLUGIN_VER', '1.9.0' ); +} +if ( ! defined( 'WPMS_PHP_VER' ) ) { + define( 'WPMS_PHP_VER', '5.3.6' ); +} + +/** + * Newer PHP version 5.3+ will be handled a lot differently, + * with better code and newer logic. + * + * @since 1.0.0 + */ +if ( version_compare( phpversion(), WPMS_PHP_VER, '>=' ) ) { + require_once dirname( __FILE__ ) . '/wp-mail-smtp.php'; + + return; +} + +/** + * PHP 5.2 only. + */ +require_once dirname( __FILE__ ) . '/wp-mail-smtp-0.11.2.php'; diff --git a/wp-content/plugins/wp-piwik/LICENSE b/wp-content/plugins/wp-piwik/LICENSE new file mode 100644 index 0000000..733c072 --- /dev/null +++ b/wp-content/plugins/wp-piwik/LICENSE @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/wp-content/plugins/wp-piwik/README.md b/wp-content/plugins/wp-piwik/README.md new file mode 100644 index 0000000..6fdc77b --- /dev/null +++ b/wp-content/plugins/wp-piwik/README.md @@ -0,0 +1,9 @@ +# WP-Matomo (former WP-Piwik) + +This [WordPress](https://wordpress.org) plugin adds a [Matomo](http://matomo.org) stats site to your blog's dashboard. It's also able to add the Matomo tracking code to your blog. + +## How to use this plugin + +To use this plugin you will need your own Matomo instance. If you do not already have a Matomo setup, you have two simple options: use either [self-hosted](http://matomo.org/) or [cloud-hosted](http://matomo.org/hosting/). + +This repository was created to develop and maintain WP-Matomo (WP-Piwik). Please see the WordPress plugin directory if you like to use this plugin: https://wordpress.org/plugins/wp-piwik/ diff --git a/wp-content/plugins/wp-piwik/bitcoin.png b/wp-content/plugins/wp-piwik/bitcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..e565fabb08a97a2f30e82db9b8919fd77dc13480 GIT binary patch literal 2020 zcmaJ?dpr|*8`nn~#fa*aX-02(3#m@A*350SMAMl|Dc5c;3!69@rqGct*vYBnmXO)z zQld?<$fcCYYO~W~W5zCWNn6;Av-k79=X3sg-#?z;_n+VId4AvL@_lX`N283^TCCO4 z(J}Hmg2ZU?+`mnKjrPQe?)qzC)g=tdL#MvqQl_H=DDy(P`zNoODsDS^G05cC{7(HW z^9L$@W)>wp{GW)d5oAyGnV8)ppqvb-RM))Fu)3#u-oOVLVL9KTQ4Y7kxoSxXV#>{+ zF(sgm+Ll^M9ZYqkM=!nKf&&b#y4?OhA!98daA%B1FY4Ivn>QaC@811qXk1_bfcuW?SG5=0Gi*5)~)5;N>IIk@s#w z(s>3#(x-i&*qES{Cf*^qb_D=X08?^a@{W(>rd_BR(4Dc5IYpr$%)w~Rp6GXV^YOA~ zM7OL#lY?#R8NH=-afrdMjO1qT4sz*_^?radE{Lz9YDYVCgToLAFd835;gLfRfWP*917LyR4}hf-V~!bCWi zSNrOf+lKy=%K%V?nVy8{vjIo?v}GK(fQP`%L5OedQ1`Q#)(3Xw z)=>B)js|1q0p|1`RiYYTs`V%`ehvZ~=ln*8CKcI+W-_g}#pRaQ@lCL2YSnUaRNKU8 ziv|N@eR`N071|;nrGhfm*@mN{t1eWhYX(oZ--gfomrk%BlVGYHyp+T)_UT~dI|>h~ z$<}7jI@t0F>YK3Hr@w6RWi4|)LR8q!)YR~p@7Uuu%6p+RD-_2cbotizF9uo{Cc}z< zlDRG~?di0ZNF*$chUh&rJ+1#?L?8&ggvYZl#`XUwS+9gVy0XyNKf{IvomyJ$`R0RH zlyjHG)ntsqU7D-tsOp1Qsq9}rxwAZ|&KI10`f8nK^PLp)QPF`SsgV;Fi**=}Sgm{3 z>})IxtIFK(qT=`y&&kd`S#Oc=xGCO4=9!}o4hiYrx2RI7UVIh`S1M8ogy=yYuekmo z4`G-#@}yoMwzm(ZcvU`JaW=A932+FmeXp23?qPY`v0Hbt=*J(BIqRNDhVd!8$ZnZC zf@>?~&gKCyU*ox`Kqz#1g4O3~2zc34xIV$$G}H{>X}=7E!D1GG-%kERH6#!`*Pzkp z>hmEQa&Pag*>!8eLQ>#vy4iro#{4V*+PFmx|5E$UEWbb zCX=6EV?u}`zR4%ykLPsyZ@Ua>>Df4t;9o-?&uvCtxh^l-Y+c#L-dcX)ep6$N6&TES zdinCD!`!m6axI!E{`za|k&6kf8{@CcM8I8G1wkaigzLoH&Fe;Ni;RZ z+Ic#vRh}Uh=s$BHo>%TgOy?tP#+vE~_6Ql4cuF-Y4b_k+)ByTdf3 zFYE&BxKd(*wJC(o4XvstKx$a6ZI%NP}d(cpR*BPnk}ri%ffjAOtdKvlMw zv9IF7fKkNW!VQA!33h0g#b6F>60Ul5qBKDPA!t7^shx4+&}p|R2z4oWz#Hg)`)OF{Us@Ar3?Y|(106{}O05AMsQHbz3pXT|ZzTH)TgyDdM7T*yZpTIn zFCE8~;DjX0`-eG(jn>2&nwefhshgZ}Vh1@dwOv+;p9`-C5^poDpMr!VN{lnomQ`dg zTF@hhwrnJa{yaGfQ4KNwt`o4)8s_zQzFMHYbT1DssmQWBMGz^TCC9mP$Nw8g!8h3+ zU89yGKZcEMl7KlK?9PpB8hQ*@XLUy_bF%9Bg#W)ES6vPd0xkhOY>|4#Pdco$Yg@ + * @package WP_Piwik + */ +class WP_Piwik { + + /** + * + * @var Runtime environment variables + */ + private static $revisionId = 2019072901, $version = '1.0.22', $blog_id, $pluginBasename = NULL, $logger, $settings, $request, $optionsPageId; + + /** + * Constructor class to configure and register all WP-Piwik components + */ + public function __construct() { + global $blog_id; + self::$blog_id = (isset ( $blog_id ) ? $blog_id : 'n/a'); + $this->openLogger (); + $this->openSettings (); + $this->setup (); + $this->addFilters (); + $this->addActions (); + $this->addShortcodes (); + } + + /** + * Destructor class to finish logging + */ + public function __destruct() { + $this->closeLogger (); + } + + /** + * Setup class to prepare settings and check for installation and update + */ + private function setup() { + self::$pluginBasename = plugin_basename ( __FILE__ ); + if (! $this->isInstalled ()) + $this->installPlugin (); + elseif ($this->isUpdated ()) + $this->updatePlugin (); + if ($this->isConfigSubmitted ()) + $this->applySettings (); + self::$settings->save (); + } + + /** + * Register WordPress actions + */ + private function addActions() { + if ( is_admin () ) { + add_action ( 'admin_menu', array ( + $this, + 'buildAdminMenu' + ) ); + add_action ( 'admin_post_save_wp-piwik_stats', array ( + $this, + 'onStatsPageSaveChanges' + ) ); + add_action ( 'load-post.php', array ( + $this, + 'addPostMetaboxes' + ) ); + add_action ( 'load-post-new.php', array ( + $this, + 'addPostMetaboxes' + ) ); + if ($this->isNetworkMode ()) { + add_action ( 'network_admin_notices', array ( + $this, + 'showNotices' + ) ); + add_action ( 'network_admin_menu', array ( + $this, + 'buildNetworkAdminMenu' + ) ); + add_action ( 'update_site_option_blogname', array ( + $this, + 'onBlogNameChange' + ) ); + add_action ( 'update_site_option_siteurl', array ( + $this, + 'onSiteUrlChange' + ) ); + } else { + add_action ( 'admin_notices', array ( + $this, + 'showNotices' + ) ); + add_action ( 'update_option_blogname', array ( + $this, + 'onBlogNameChange' + ) ); + add_action ( 'update_option_siteurl', array ( + $this, + 'onSiteUrlChange' + ) ); + } + if ($this->isDashboardActive ()) + add_action ( 'wp_dashboard_setup', array ( + $this, + 'extendWordPressDashboard' + ) ); + } + if ($this->isToolbarActive ()) { + add_action ( is_admin () ? 'admin_head' : 'wp_head', array ( + $this, + 'loadToolbarRequirements' + ) ); + add_action ( 'admin_bar_menu', array ( + $this, + 'extendWordPressToolbar' + ), 1000 ); + } + if ($this->isTrackingActive ()) { + if ( !is_admin () || $this->isAdminTrackingActive ()) { + $prefix = is_admin ()?'admin':'wp'; + add_action ( self::$settings->getGlobalOption ( 'track_codeposition' ) == 'footer' ? $prefix.'_footer' : $prefix.'_head', array ( + $this, + 'addJavascriptCode' + ) ); + if (self::$settings->getGlobalOption ( 'dnsprefetch' )) + add_action ( $prefix.'_head', array ( + $this, + 'addDNSPrefetchTag' + ) ); + if ($this->isAddNoScriptCode ()) + add_action ( $prefix.'_footer', array ( + $this, + 'addNoscriptCode' + ) ); + } + if (self::$settings->getGlobalOption ( 'add_post_annotations' )) + add_action ( 'transition_post_status', array ( + $this, + 'addPiwikAnnotation' + ), 10, 3 ); + } + + } + + /** + * Register WordPress filters + */ + private function addFilters() { + if (is_admin()) { + add_filter ( 'plugin_row_meta', array ( + $this, + 'setPluginMeta' + ), 10, 2 ); + add_filter ( 'screen_layout_columns', array ( + $this, + 'onScreenLayoutColumns' + ), 10, 2 ); + } elseif ($this->isTrackingActive ()) { + if ($this->isTrackFeed ()) { + add_filter ( 'the_excerpt_rss', array ( + $this, + 'addFeedTracking' + ) ); + add_filter ( 'the_content', array ( + $this, + 'addFeedTracking' + ) ); + } + if ($this->isAddFeedCampaign ()) { + add_filter ( 'post_link', array ( + $this, + 'addFeedCampaign' + ) ); + } + if ($this->isCrossDomainLinkingEnabled ()) { + add_filter ( 'wp_redirect', array ( + $this, + 'forwardCrossDomainVisitorId' + ) ); + } + } + } + + /** + * Register WordPress shortcodes + */ + private function addShortcodes() { + if ($this->isAddShortcode ()) + add_shortcode ( 'wp-piwik', array ( + $this, + 'shortcode' + ) ); + } + + /** + * Install WP-Piwik for the first time + */ + private function installPlugin($isUpdate = false) { + self::$logger->log ( 'Running WP-Piwik installation' ); + if (! $isUpdate) + $this->addNotice ( 'install', sprintf ( __ ( '%s %s installed.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'plugin_display_name' ), self::$version ), __ ( 'Next you should connect to Piwik', 'wp-piwik' ) ); + self::$settings->setGlobalOption ( 'revision', self::$revisionId ); + self::$settings->setGlobalOption ( 'last_settings_update', time () ); + } + + /** + * Uninstall WP-Piwik + */ + public function uninstallPlugin() { + self::$logger->log ( 'Running WP-Piwik uninstallation' ); + if (! defined ( 'WP_UNINSTALL_PLUGIN' )) + exit (); + self::deleteWordPressOption ( 'wp-piwik-notices' ); + self::$settings->resetSettings ( true ); + } + + /** + * Update WP-Piwik + */ + private function updatePlugin() { + self::$logger->log ( 'Upgrade WP-Piwik to ' . self::$version ); + $patches = glob ( dirname ( __FILE__ ) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'update' . DIRECTORY_SEPARATOR . '*.php' ); + $isPatched = false; + if (is_array ( $patches )) { + sort ( $patches ); + foreach ( $patches as $patch ) { + $patchVersion = ( int ) pathinfo ( $patch, PATHINFO_FILENAME ); + if ($patchVersion && self::$settings->getGlobalOption ( 'revision' ) < $patchVersion) { + self::includeFile ( 'update' . DIRECTORY_SEPARATOR . $patchVersion ); + $isPatched = true; + } + } + } + if ((self::$settings->getGlobalOption('update_notice') == 'enabled') || ((self::$settings->getGlobalOption('update_notice') == 'script') && $isPatched)) + $this->addNotice ( 'update', sprintf ( __ ( '%s updated to %s.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'plugin_display_name' ), self::$version ), __ ( 'Please validate your configuration', 'wp-piwik' ) ); + $this->installPlugin ( true ); + } + + /** + * Define a notice + * + * @param string $type + * identifier + * @param string $subject + * notice headline + * @param string $text + * notice content + * @param boolean $stay + * set to true if the message should persist (default: false) + */ + private function addNotice($type, $subject, $text, $stay = false) { + $notices = $this->getWordPressOption ( 'wp-piwik-notices', array () ); + $notices [$type] = array ( + 'subject' => $subject, + 'text' => $text, + 'stay' => $stay + ); + $this->updateWordPressOption ( 'wp-piwik-notices', $notices ); + } + + /** + * Show all notices defined previously + * + * @see addNotice() + */ + public function showNotices() { + $link = sprintf ( '%s', __ ( 'Settings', 'wp-piwik' ) ); + if ($notices = $this->getWordPressOption ( 'wp-piwik-notices' )) { + foreach ( $notices as $type => $notice ) { + printf ( '

            %s %s: %s: %s

            ', $notice ['subject'], __ ( 'Important', 'wp-piwik' ), $notice ['text'], $link ); + if (! $notice ['stay']) + unset ( $notices [$type] ); + } + } + $this->updateWordPressOption ( 'wp-piwik-notices', $notices ); + } + + /** + * Get the settings page URL + * + * @return string settings page URL + */ + private function getSettingsURL() { + return (self::$settings->checkNetworkActivation () ? 'settings' : 'options-general') . '.php?page=' . self::$pluginBasename; + } + + /** + * Echo javascript tracking code + */ + public function addJavascriptCode() { + if ($this->isHiddenUser ()) { + self::$logger->log ( 'Do not add tracking code to site (user should not be tracked) Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->getOption ( 'site_id' ) ); + return; + } + $trackingCode = new WP_Piwik\TrackingCode ( $this ); + $trackingCode->is404 = (is_404 () && self::$settings->getGlobalOption ( 'track_404' )); + $trackingCode->isUsertracking = self::$settings->getGlobalOption ( 'track_user_id' ) != 'disabled'; + $trackingCode->isSearch = (is_search () && self::$settings->getGlobalOption ( 'track_search' )); + self::$logger->log ( 'Add tracking code. Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->getOption ( 'site_id' ) ); + if ($this->isNetworkMode () && self::$settings->getGlobalOption ( 'track_mode' ) == 'manually') { + $siteId = $this->getPiwikSiteId (); + if ($siteId != 'n/a') + echo str_replace ( '{ID}', $siteId, $trackingCode->getTrackingCode () ); + else + echo ''; + } else + echo $trackingCode->getTrackingCode (); + } + + /** + * Echo DNS prefetch tag + */ + public function addDNSPrefetchTag() { + echo ''; + } + + /** + * Get Piwik Domain + */ + public function getPiwikDomain() { + switch (self::$settings->getGlobalOption ( 'piwik_mode' )) { + case 'php' : + return '//' . parse_url(self::$settings->getGlobalOption ( 'proxy_url' ), PHP_URL_HOST); + case 'cloud' : + return '//' . self::$settings->getGlobalOption ( 'piwik_user' ) . '.innocraft.cloud'; + case 'cloud-matomo' : + return '//' . self::$settings->getGlobalOption ( 'matomo_user' ) . '.matomo.cloud'; + default : + return '//' . parse_url(self::$settings->getGlobalOption ( 'piwik_url' ), PHP_URL_HOST); + } + } + + /** + * Echo noscript tracking code + */ + public function addNoscriptCode() { + if (self::$settings->getGlobalOption ( 'track_mode' ) == 'proxy') + return; + if ($this->isHiddenUser ()) { + self::$logger->log ( 'Do not add noscript code to site (user should not be tracked) Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->getOption ( 'site_id' ) ); + return; + } + self::$logger->log ( 'Add noscript code. Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->getOption ( 'site_id' ) ); + echo self::$settings->getOption ( 'noscript_code' ) . "\n"; + } + + /** + * Register post view meta boxes + */ + public function addPostMetaboxes() { + if (self::$settings->getGlobalOption ( 'add_customvars_box' )) { + add_action ( 'add_meta_boxes', array ( + new WP_Piwik\Template\MetaBoxCustomVars ( $this, self::$settings ), + 'addMetabox' + ) ); + add_action ( 'save_post', array ( + new WP_Piwik\Template\MetaBoxCustomVars ( $this, self::$settings ), + 'saveCustomVars' + ), 10, 2 ); + } + if (self::$settings->getGlobalOption ( 'perpost_stats' )) { + add_action ( 'add_meta_boxes', array ( + $this, + 'onloadPostPage' + ) ); + } + } + + /** + * Register admin menu components + */ + public function buildAdminMenu() { + if (self::isConfigured ()) { + $cap = 'wp-piwik_read_stats'; + if (self::$settings->checkNetworkActivation ()) { + global $current_user; + $userRoles = $current_user->roles; + $allowed = self::$settings->getGlobalOption ( 'capability_read_stats' ); + if (is_array($userRoles) && is_array($allowed)) + foreach ($userRoles as $userRole) + if (isset( $allowed[$userRole] ) && $allowed[$userRole]) { + $cap = 'read'; + break; + } + } + $statsPage = new WP_Piwik\Admin\Statistics ( $this, self::$settings ); + $this->statsPageId = add_dashboard_page ( __ ( 'Piwik Statistics', 'wp-piwik' ), self::$settings->getGlobalOption ( 'plugin_display_name' ), $cap, 'wp-piwik_stats', array ( + $statsPage, + 'show' + ) ); + $this->loadAdminStatsHeader ( $this->statsPageId, $statsPage ); + } + if (! self::$settings->checkNetworkActivation ()) { + $optionsPage = new WP_Piwik\Admin\Settings ( $this, self::$settings ); + self::$optionsPageId = add_options_page ( self::$settings->getGlobalOption ( 'plugin_display_name' ), self::$settings->getGlobalOption ( 'plugin_display_name' ), 'activate_plugins', __FILE__, array ( + $optionsPage, + 'show' + ) ); + $this->loadAdminSettingsHeader ( self::$optionsPageId, $optionsPage ); + } + } + + /** + * Register network admin menu components + */ + public function buildNetworkAdminMenu() { + if (self::isConfigured ()) { + $statsPage = new WP_Piwik\Admin\Network ( $this, self::$settings ); + $this->statsPageId = add_dashboard_page ( __ ( 'Piwik Statistics', 'wp-piwik' ), self::$settings->getGlobalOption ( 'plugin_display_name' ), 'manage_sites', 'wp-piwik_stats', array ( + $statsPage, + 'show' + ) ); + $this->loadAdminStatsHeader ( $this->statsPageId, $statsPage ); + } + $optionsPage = new WP_Piwik\Admin\Settings ( $this, self::$settings ); + self::$optionsPageId = add_submenu_page ( 'settings.php', self::$settings->getGlobalOption ( 'plugin_display_name' ), self::$settings->getGlobalOption ( 'plugin_display_name' ), 'manage_sites', __FILE__, array ( + $optionsPage, + 'show' + ) ); + $this->loadAdminSettingsHeader ( self::$optionsPageId, $optionsPage ); + } + + /** + * Register admin header extensions for stats page + * + * @param $optionsPageId options + * page id + * @param $optionsPage options + * page object + */ + public function loadAdminStatsHeader($statsPageId, $statsPage) { + add_action ( 'admin_print_scripts-' . $statsPageId, array ( + $statsPage, + 'printAdminScripts' + ) ); + add_action ( 'admin_print_styles-' . $statsPageId, array ( + $statsPage, + 'printAdminStyles' + ) ); + add_action ( 'admin_head-' . $statsPageId, array ( + $statsPage, + 'extendAdminHeader' + ) ); + add_action ( 'load-' . $statsPageId, array ( + $this, + 'onloadStatsPage' + ) ); + } + + /** + * Register admin header extensions for settings page + * + * @param $optionsPageId options + * page id + * @param $optionsPage options + * page object + */ + public function loadAdminSettingsHeader($optionsPageId, $optionsPage) { + add_action ( 'admin_head-' . $optionsPageId, array ( + $optionsPage, + 'extendAdminHeader' + ) ); + add_action ( 'admin_print_styles-' . $optionsPageId, array ( + $optionsPage, + 'printAdminStyles' + ) ); + } + + /** + * Register WordPress dashboard widgets + */ + public function extendWordPressDashboard() { + if (current_user_can ( 'wp-piwik_read_stats' )) { + if (self::$settings->getGlobalOption ( 'dashboard_widget' ) != 'disabled') + new WP_Piwik\Widget\Overview ( $this, self::$settings, 'dashboard', 'side', 'default', array ( + 'date' => self::$settings->getGlobalOption ( 'dashboard_widget' ), + 'period' => 'day' + ) ); + if (self::$settings->getGlobalOption ( 'dashboard_chart' )) + new WP_Piwik\Widget\Chart ( $this, self::$settings ); + if (self::$settings->getGlobalOption ( 'dashboard_ecommerce' )) + new WP_Piwik\Widget\Ecommerce ( $this, self::$settings ); + if (self::$settings->getGlobalOption ( 'dashboard_seo' )) + new WP_Piwik\Widget\Seo ( $this, self::$settings ); + } + } + + /** + * Register WordPress toolbar components + */ + public function extendWordPressToolbar($toolbar) { + if (current_user_can ( 'wp-piwik_read_stats' ) && is_admin_bar_showing ()) { + $id = WP_Piwik\Request::register ( 'VisitsSummary.getUniqueVisitors', array ( + 'period' => 'day', + 'date' => 'last30' + ) ); + $unique = $this->request ( $id ); + $url = is_network_admin () ? $this->getSettingsURL () : false; + $content = is_network_admin () ? __('Configure WP-Piwik', 'wp-piwik') : ''; + // Leave if result array does contain a message instead of valid data + if (isset($unique['result'])) + $content .= ''; + elseif (is_array ( $unique ) ) { + $content = "Loading..."; + $url = $this->getStatsURL (); + } + $toolbar->add_menu ( array ( + 'id' => 'wp-piwik_stats', + 'title' => $content, + 'href' => $url + ) ); + } + } + + /** + * Add plugin meta data + * + * @param array $links + * list of already defined plugin meta data + * @param string $file + * handled file + * @return array complete list of plugin meta data + */ + public function setPluginMeta($links, $file) { + if ($file == 'wp-piwik/wp-piwik.php' && (!$this->isNetworkMode () || is_network_admin()) ) + return array_merge ( $links, array ( + sprintf ( '%s', self::getSettingsURL (), __ ( 'Settings', 'wp-piwik' ) ) + ) ); + return $links; + } + + /** + * Prepare toolbar widget requirements + */ + public function loadToolbarRequirements() { + if (is_admin_bar_showing ()) { + wp_enqueue_script ( 'wp-piwik-sparkline', $this->getPluginURL () . 'js/sparkline/jquery.sparkline.min.js', array ( + 'jquery' + ), self::$version ); + wp_enqueue_style ( 'wp-piwik', $this->getPluginURL () . 'css/wp-piwik-spark.css', array (), $this->getPluginVersion () ); + } + } + + /** + * Add tracking pixels to feed content + * + * @param string $content + * post content + * @return string post content extended by tracking pixel + */ + public function addFeedTracking($content) { + global $post; + if (is_feed ()) { + self::$logger->log ( 'Add tracking image to feed entry.' ); + if (! self::$settings->getOption ( 'site_id' )) { + $siteId = $this->requestPiwikSiteId (); + if ($siteId != 'n/a') + self::$settings->setOption ( 'site_id', $siteId ); + else + return false; + } + $title = the_title ( null, null, false ); + $posturl = get_permalink ( $post->ID ); + $urlref = get_bloginfo ( 'rss2_url' ); + if (self::$settings->getGlobalOption ( 'track_mode' ) == 'proxy') + $url = plugins_url ( 'wp-piwik' ) . '/proxy/piwik.php'; + else { + $url = self::$settings->getGlobalOption ( 'piwik_url' ); + if (substr($url, -10, 10) == '/index.php') + $url = str_replace('/index.php', '/piwik.php', $url); + else + $url .= 'piwik.php'; + } + $trackingImage = $url . '?idsite=' . self::$settings->getOption ( 'site_id' ) . '&rec=1&url=' . urlencode ( $posturl ) . '&action_name=' . urlencode ( $title ) . '&urlref=' . urlencode ( $urlref ); + $content .= ''; + } + return $content; + } + + /** + * Add a campaign parameter to feed permalink + * + * @param string $permalink + * permalink + * @return string permalink extended by campaign parameter + */ + public function addFeedCampaign($permalink) { + global $post; + if (is_feed ()) { + self::$logger->log ( 'Add campaign to feed permalink.' ); + $sep = (strpos ( $permalink, '?' ) === false ? '?' : '&'); + $permalink .= $sep . 'pk_campaign=' . urlencode ( self::$settings->getGlobalOption ( 'track_feed_campaign' ) ) . '&pk_kwd=' . urlencode ( $post->post_name ); + } + return $permalink; + } + + /** + * Forwards the cross domain parameter pk_vid if the URL parameter is set and a user is about to be redirected. + * When another website links to WooCommerce with a pk_vid parameter, and WooCommerce redirects the user to another + * URL, the pk_vid parameter would get lost and the visitorId would later not be applied by the tracking code + * due to the lost pk_vid URL parameter. If the URL parameter is set, we make sure to forward this parameter. + * + * @param string $location + * + * @return string location extended by pk_vid URL parameter if the URL parameter is set + */ + public function forwardCrossDomainVisitorId($location) { + + if (!empty($_GET['pk_vid']) + && preg_match('/^[a-zA-Z0-9]{24,48}$/', $_GET['pk_vid'])) { + // currently, the pk_vid parameter is 32 characters long, but it may vary over time. + $location = add_query_arg( 'pk_vid', $_GET['pk_vid'], $location ); + } + + return $location; + } + + /** + * Apply settings update + * + * @return boolean settings update applied + */ + private function applySettings() { + self::$settings->applyChanges ( $_POST ['wp-piwik'] ); + if (self::$settings->getGlobalOption ( 'auto_site_config' ) && self::isConfigured ()) { + if ($this->isPHPMode () && ! defined ( 'PIWIK_INCLUDE_PATH' )) + self::definePiwikConstants (); + $siteId = $this->getPiwikSiteId (); + $trackingCode = $this->updateTrackingCode ( $siteId ); + self::$settings->setOption ( 'site_id', $siteId ); + } + self::$settings->setGlobalOption ( 'revision', self::$revisionId ); + self::$settings->setGlobalOption ( 'last_settings_update', time () ); + return true; + } + + /** + * Check if WP-Piwik is configured + * + * @return boolean Is WP-Piwik configured? + */ + public static function isConfigured() { + return (self::$settings->getGlobalOption ( 'piwik_token' ) && (self::$settings->getGlobalOption ( 'piwik_mode' ) != 'disabled') && (((self::$settings->getGlobalOption ( 'piwik_mode' ) == 'http') && (self::$settings->getGlobalOption ( 'piwik_url' ))) || ((self::$settings->getGlobalOption ( 'piwik_mode' ) == 'php') && (self::$settings->getGlobalOption ( 'piwik_path' ))) || ((self::$settings->getGlobalOption ( 'piwik_mode' ) == 'cloud') && (self::$settings->getGlobalOption ( 'piwik_user' ))) || ((self::$settings->getGlobalOption ( 'piwik_mode' ) == 'cloud-matomo') && (self::$settings->getGlobalOption ( 'matomo_user' ))))); + } + + /** + * Check if WP-Piwik was updated + * + * @return boolean Was WP-Piwik updated? + */ + private function isUpdated() { + return self::$settings->getGlobalOption ( 'revision' ) && self::$settings->getGlobalOption ( 'revision' ) < self::$revisionId; + } + + /** + * Check if WP-Piwik is already installed + * + * @return boolean Is WP-Piwik installed? + */ + private function isInstalled() { + $oldSettings = $this->getWordPressOption ( 'wp-piwik_global-settings', false ); + if ($oldSettings && isset( $oldSettings['revision'] )) { + self::log('Save old settings'); + self::$settings->setGlobalOption ( 'revision', $oldSettings['revision'] ); + } else self::log( 'Current revision '.self::$settings->getGlobalOption ( 'revision' ) ); + return self::$settings->getGlobalOption ( 'revision' ) > 0; + } + + /** + * Check if new settings were submitted + * + * @return boolean Are new settings submitted? + */ + public static function isConfigSubmitted() { + return isset ( $_POST ) && isset ( $_POST ['wp-piwik'] ) && self::isValidOptionsPost(); + } + + /** + * Check if PHP mode is chosen + * + * @return Is PHP mode chosen? + */ + public function isPHPMode() { + return self::$settings->getGlobalOption ( 'piwik_mode' ) && self::$settings->getGlobalOption ( 'piwik_mode' ) == 'php'; + } + + /** + * Check if WordPress is running in network mode + * + * @return boolean Is WordPress running in network mode? + */ + public function isNetworkMode() { + return self::$settings->checkNetworkActivation (); + } + + /** + * Check if a WP-Piwik dashboard widget is enabled + * + * @return boolean Is a dashboard widget enabled? + */ + private function isDashboardActive() { + return self::$settings->getGlobalOption ( 'dashboard_widget' ) || self::$settings->getGlobalOption ( 'dashboard_chart' ) || self::$settings->getGlobalOption ( 'dashboard_seo' ); + } + + /** + * Check if a WP-Piwik toolbar widget is enabled + * + * @return boolean Is a toolbar widget enabled? + */ + private function isToolbarActive() { + return self::$settings->getGlobalOption ( 'toolbar' ); + } + + /** + * Check if WP-Piwik tracking code insertion is enabled + * + * @return boolean Insert tracking code? + */ + private function isTrackingActive() { + return self::$settings->getGlobalOption ( 'track_mode' ) != 'disabled'; + } + + /** + * Check if admin tracking is enabled + * + * @return boolean Is admin tracking enabled? + */ + private function isAdminTrackingActive() { + return self::$settings->getGlobalOption ( 'track_admin' ) && is_admin (); + } + + /** + * Check if WP-Piwik noscript code insertion is enabled + * + * @return boolean Insert noscript code? + */ + private function isAddNoScriptCode() { + return self::$settings->getGlobalOption ( 'track_noscript' ); + } + + /** + * Check if feed tracking is enabled + * + * @return boolean Is feed tracking enabled? + */ + private function isTrackFeed() { + return self::$settings->getGlobalOption ( 'track_feed' ); + } + + /** + * Check if feed permalinks get a campaign parameter + * + * @return boolean Add campaign parameter to feed permalinks? + */ + private function isAddFeedCampaign() { + return self::$settings->getGlobalOption ( 'track_feed_addcampaign' ); + } + + /** + * Check if feed permalinks get a campaign parameter + * + * @return boolean Add campaign parameter to feed permalinks? + */ + private function isCrossDomainLinkingEnabled() { + return self::$settings->getGlobalOption ( 'track_crossdomain_linking' ); + } + + /** + * Check if WP-Piwik shortcodes are enabled + * + * @return boolean Are shortcodes enabled? + */ + private function isAddShortcode() { + return self::$settings->getGlobalOption ( 'shortcodes' ); + } + + /** + * Define Piwik constants for PHP reporting API + */ + public static function definePiwikConstants() { + if (! defined ( 'PIWIK_INCLUDE_PATH' )) { + //@header('Content-type: text/html'); + define ( 'PIWIK_INCLUDE_PATH', self::$settings->getGlobalOption ( 'piwik_path' ) ); + define ( 'PIWIK_USER_PATH', self::$settings->getGlobalOption ( 'piwik_path' ) ); + define ( 'PIWIK_ENABLE_DISPATCH', false ); + define ( 'PIWIK_ENABLE_ERROR_HANDLER', false ); + define ( 'PIWIK_ENABLE_SESSION_START', false ); + } + } + + /** + * Start chosen logging method + */ + private function openLogger() { + switch (WP_PIWIK_ACTIVATE_LOGGER) { + case 1 : + self::$logger = new WP_Piwik\Logger\Screen ( __CLASS__ ); + break; + case 2 : + self::$logger = new WP_Piwik\Logger\File ( __CLASS__ ); + break; + default : + self::$logger = new WP_Piwik\Logger\Dummy ( __CLASS__ ); + } + } + + /** + * Log a message + * + * @param string $message + * logger message + */ + public static function log($message) { + self::$logger->log ( $message ); + } + + /** + * End logging + */ + private function closeLogger() { + self::$logger = null; + } + + /** + * Load WP-Piwik settings + */ + private function openSettings() { + self::$settings = new WP_Piwik\Settings ( $this, self::$logger ); + if (! $this->isConfigSubmitted () && $this->isPHPMode () && ! defined ( 'PIWIK_INCLUDE_PATH' )) + self::definePiwikConstants (); + } + + /** + * Include a WP-Piwik file + */ + private function includeFile($strFile) { + self::$logger->log ( 'Include ' . $strFile . '.php' ); + if (WP_PIWIK_PATH . $strFile . '.php') + include (WP_PIWIK_PATH . $strFile . '.php'); + } + + /** + * Check if user should not be tracked + * + * @return boolean Do not track user? + */ + private function isHiddenUser() { + if (is_multisite ()) + foreach ( self::$settings->getGlobalOption ( 'capability_stealth' ) as $key => $val ) + if ($val && current_user_can ( $key )) + return true; + return current_user_can ( 'wp-piwik_stealth' ); + } + + /** + * Check if tracking code is up to date + * + * @return boolean Is tracking code up to date? + */ + public function isCurrentTrackingCode() { + return (self::$settings->getOption ( 'last_tracking_code_update' ) && self::$settings->getOption ( 'last_tracking_code_update' ) > self::$settings->getGlobalOption ( 'last_settings_update' )); + } + + /** + * DEPRECTAED Add javascript code to site header + * + * @deprecated + * + */ + public function site_header() { + self::$logger->log ( 'Using deprecated function site_header' ); + $this->addJavascriptCode (); + } + + /** + * DEPRECTAED Add javascript code to site footer + * + * @deprecated + * + */ + public function site_footer() { + self::$logger->log ( 'Using deprecated function site_footer' ); + $this->addNoscriptCode (); + } + + /** + * Identify new posts if an annotation is required + * and create Piwik annotation + * + * @param string $newStatus + * new post status + * @param strint $oldStatus + * new post status + * @param object $post + * current post object + */ + public function addPiwikAnnotation($newStatus, $oldStatus, $post) { + $enabledPostTypes = self::$settings->getGlobalOption ( 'add_post_annotations' ); + if (isset($enabledPostTypes[$post->post_type]) && $enabledPostTypes[$post->post_type] && $newStatus == 'publish' && $oldStatus != 'publish') { + $note = 'Published: ' . $post->post_title . ' - URL: ' . get_permalink ( $post->ID ); + $id = WP_Piwik\Request::register ( 'Annotations.add', array ( + 'idSite' => $this->getPiwikSiteId (), + 'date' => date ( 'Y-m-d' ), + 'note' => $note + ) ); + $result = $this->request ( $id ); + self::$logger->log ( 'Add post annotation. ' . $note . ' - ' . serialize ( $result ) ); + } + } + + /** + * Get WP-Piwik's URL + */ + public function getPluginURL() { + return trailingslashit ( plugins_url () . '/wp-piwik/' ); + } + + /** + * Get WP-Piwik's version + */ + public function getPluginVersion() { + return self::$version; + } + + /** + * Enable three columns for WP-Piwik stats screen + * + * @param + * array full list of column settings + * @param + * mixed current screen id + * @return array updated list of column settings + */ + public function onScreenLayoutColumns($columns, $screen) { + if (isset( $this->statsPageId ) && $screen == $this->statsPageId) + $columns [$this->statsPageId] = 3; + return $columns; + } + + /** + * Add tracking code to admin header + */ + function addAdminHeaderTracking() { + $this->addJavascriptCode (); + } + + /** + * Get option value + * + * @param string $key + * option key + * @return mixed option value + */ + public function getOption($key) { + return self::$settings->getOption ( $key ); + } + + /** + * Get global option value + * + * @param string $key + * global option key + * @return mixed global option value + */ + public function getGlobalOption($key) { + return self::$settings->getGlobalOption ( $key ); + } + + /** + * Get stats page URL + * + * @return string stats page URL + */ + public function getStatsURL() { + return admin_url () . '?page=wp-piwik_stats'; + } + + /** + * Execute WP-Piwik test script + */ + private function loadTestscript() { + $this->includeFile ( 'debug' . DIRECTORY_SEPARATOR . 'testscript' ); + } + + /** + * Echo an error message + * + * @param string $message + * message content + */ + private static function showErrorMessage($message) { + echo '' . __ ( 'An error occured', 'wp-piwik' ) . ': ' . $message . ' [' . __ ( 'Support', 'wp-piwik' ) . ']'; + } + + /** + * Perform a Piwik request + * + * @param string $id + * request ID + * @return mixed request result + */ + public function request($id, $debug = false) { + if ( self::$settings->getGlobalOption ( 'piwik_mode' ) == 'disabled' ) + return 'n/a'; + if (! isset ( self::$request ) || empty ( self::$request )) + self::$request = (self::$settings->getGlobalOption ( 'piwik_mode' ) == 'http' || self::$settings->getGlobalOption ( 'piwik_mode' ) == 'cloud' || self::$settings->getGlobalOption ( 'piwik_mode' ) == 'cloud-matomo' ? new WP_Piwik\Request\Rest ( $this, self::$settings ) : new WP_Piwik\Request\Php ( $this, self::$settings )); + if ($debug) + return self::$request->getDebug ( $id ); + return self::$request->perform ( $id ); + } + + /** + * Reset request object + */ + public function resetRequest() { + if (is_object(self::$request)) + self::$request->reset(); + self::$request = NULL; + } + + /** + * Execute WP-Piwik shortcode + * + * @param array $attributes + * attribute list + */ + public function shortcode($attributes) { + shortcode_atts ( array ( + 'title' => '', + 'module' => 'overview', + 'period' => 'day', + 'date' => 'yesterday', + 'limit' => 10, + 'width' => '100%', + 'height' => '200px', + 'idsite' => '', + 'language' => 'en', + 'range' => false, + 'key' => 'sum_daily_nb_uniq_visitors' + ), $attributes ); + $shortcodeObject = new \WP_Piwik\Shortcode ( $attributes, $this, self::$settings ); + return $shortcodeObject->get(); + } + + /** + * Get Piwik site ID by blog ID + * + * @param int $blogId + * which blog's Piwik site ID to get, default is the current blog + * @return mixed Piwik site ID or n/a + */ + public function getPiwikSiteId($blogId = null) { + if (! $blogId && $this->isNetworkMode ()) + $blogId = get_current_blog_id (); + $result = self::$settings->getOption ( 'site_id', $blogId ); + self::$logger->log ( 'Database result: ' . $result ); + return (! empty ( $result ) ? $result : $this->requestPiwikSiteId ( $blogId )); + } + + /** + * Get a detailed list of all Piwik sites + * + * @return array Piwik sites + */ + public function getPiwikSiteDetails() { + $id = WP_Piwik\Request::register ( 'SitesManager.getSitesWithAtLeastViewAccess', array () ); + $piwikSiteDetails = $this->request ( $id ); + return $piwikSiteDetails; + } + + /** + * Estimate a Piwik site ID by blog ID + * + * @param int $blogId + * which blog's Piwik site ID to estimate, default is the current blog + * @return mixed Piwik site ID or n/a + */ + private function requestPiwikSiteId($blogId = null) { + $isCurrent = ! self::$settings->checkNetworkActivation () || empty ( $blogId ); + if (self::$settings->getGlobalOption ( 'auto_site_config' )) { + $id = WP_Piwik\Request::register ( 'SitesManager.getSitesIdFromSiteUrl', array ( + 'url' => $isCurrent ? get_bloginfo ( 'url' ) : get_blog_details ( $blogId )->siteurl + ) ); + $result = $this->request ( $id ); + $this->log ( 'Tried to identify current site, result: ' . serialize ( $result ) ); + if (is_array( $result ) && empty( $result )) + $result = $this->addPiwikSite ( $blogId ); + elseif ( $result != 'n/a' && isset($result [0]) ) + $result = $result [0] ['idsite']; + else $result = null; + } else $result = null; + self::$logger->log ( 'Get Piwik ID: WordPress site ' . ($isCurrent ? get_bloginfo ( 'url' ) : get_blog_details ( $blogId )->siteurl) . ' = Piwik ID ' . $result ); + if ($result !== null) { + self::$settings->setOption ( 'site_id', $result, $blogId ); + if (self::$settings->getGlobalOption ( 'track_mode' ) != 'disabled' && self::$settings->getGlobalOption ( 'track_mode' ) != 'manually') { + $code = $this->updateTrackingCode ( $result, $blogId ); + } + $this::$settings->save (); + return $result; + } + return 'n/a'; + } + + /** + * Add a new Piwik + * + * @param int $blogId + * which blog's Piwik site to create, default is the current blog + * @return int Piwik site ID + */ + public function addPiwikSite($blogId = null) { + $isCurrent = ! self::$settings->checkNetworkActivation () || empty ( $blogId ); + // Do not add site if Piwik connection is unreliable + if (! $this->request ( 'global.getPiwikVersion' )) + return null; + $id = WP_Piwik\Request::register ( 'SitesManager.addSite', array ( + 'urls' => $isCurrent ? get_bloginfo ( 'url' ) : get_blog_details ( $blogId )->siteurl, + 'siteName' => urlencode( $isCurrent ? get_bloginfo ( 'name' ) : get_blog_details ( $blogId )->blogname ) + ) ); + $result = (int) $this->request ( $id ); + self::$logger->log ( 'Create Piwik ID: WordPress site ' . ($isCurrent ? get_bloginfo ( 'url' ) : get_blog_details ( $blogId )->siteurl) . ' = Piwik ID ' . $result ); + if (empty ( $result )) + return null; + else { + do_action('wp-piwik_site_created', $result); + return $result; + } + } + + /** + * Update a Piwik site's detail information + * + * @param int $siteId + * which Piwik site to updated + * @param int $blogId + * which blog's Piwik site ID to get, default is the current blog + */ + private function updatePiwikSite($siteId, $blogId = null) { + $isCurrent = ! self::$settings->checkNetworkActivation () || empty ( $blogId ); + $id = WP_Piwik\Request::register ( 'SitesManager.updateSite', array ( + 'idSite' => $siteId, + 'urls' => $isCurrent ? get_bloginfo ( 'url' ) : get_blog_details ( $blogId )->siteurl, + 'siteName' => $isCurrent ? get_bloginfo ( 'name' ) : get_blog_details ( $blogId )->blogname + ) ); + $this->request ( $id ); + self::$logger->log ( 'Update Piwik site: WordPress site ' . ($isCurrent ? get_bloginfo ( 'url' ) : get_blog_details ( $blogId )->siteurl) ); + } + + /** + * Update a site's tracking code + * + * @param int $siteId + * which Piwik site to updated + * @param int $blogId + * which blog's Piwik site ID to get, default is the current blog + * @return string tracking code + */ + public function updateTrackingCode($siteId = false, $blogId = null) { + if (!$siteId) + $siteId = $this->getPiwikSiteId (); + if (self::$settings->getGlobalOption ( 'track_mode' ) == 'disabled' || self::$settings->getGlobalOption ( 'track_mode' ) == 'manually') + return false; + $id = WP_Piwik\Request::register ( 'SitesManager.getJavascriptTag', array ( + 'idSite' => $siteId, + 'mergeSubdomains' => self::$settings->getGlobalOption ( 'track_across' ) ? 1 : 0, + 'mergeAliasUrls' => self::$settings->getGlobalOption ( 'track_across_alias' ) ? 1 : 0, + 'disableCookies' => self::$settings->getGlobalOption ( 'disable_cookies' ) ? 1 : 0, + 'crossDomain' => self::$settings->getGlobalOption ( 'track_crossdomain_linking' ) ? 1 : 0, + 'trackNoScript' => 1 + ) ); + $code = $this->request ( $id ); + if (is_array($code) && isset($code['value'])) + $code = $code['value']; + $result = !is_array ( $code ) ? html_entity_decode ( $code ) : ''; + self::$logger->log ( 'Delivered tracking code: ' . $result ); + $result = WP_Piwik\TrackingCode::prepareTrackingCode ( $result, self::$settings, self::$logger, true ); + if (isset ( $result ['script'] ) && ! empty ( $result ['script'] )) { + self::$settings->setOption ( 'tracking_code', $result ['script'], $blogId ); + self::$settings->setOption ( 'noscript_code', $result ['noscript'], $blogId ); + self::$settings->setGlobalOption ( 'proxy_url', $result ['proxy'], $blogId ); + } + return $result; + } + + /** + * Update Piwik site if blog name changes + * + * @param string $oldValue + * old blog name + * @param string $newValue + * new blog name + */ + public function onBlogNameChange($oldValue, $newValue = null) { + $this->updatePiwikSite ( self::$settings->getOption ( 'site_id' ) ); + } + + /** + * Update Piwik site if blog URL changes + * + * @param string $oldValue + * old blog URL + * @param string $newValue + * new blog URL + */ + public function onSiteUrlChange($oldValue, $newValue = null) { + $this->updatePiwikSite ( self::$settings->getOption ( 'site_id' ) ); + } + + /** + * Register stats page meta boxes + * + * @param mixed $statsPageId + * WordPress stats page ID + */ + public function onloadStatsPage($statsPageId) { + if (self::$settings->getGlobalOption ( 'disable_timelimit' )) + set_time_limit ( 0 ); + wp_enqueue_script ( 'common' ); + wp_enqueue_script ( 'wp-lists' ); + wp_enqueue_script ( 'postbox' ); + wp_enqueue_script ( 'wp-piwik', $this->getPluginURL () . 'js/wp-piwik.js', array (), self::$version, true ); + wp_enqueue_script ( 'wp-piwik-jqplot', $this->getPluginURL () . 'js/jqplot/wp-piwik.jqplot.js', array ( + 'jquery' + ), self::$version ); + new \WP_Piwik\Widget\Chart ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Visitors ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Overview ( $this, self::$settings, $this->statsPageId ); + if (self::$settings->getGlobalOption ( 'stats_ecommerce' )) { + new \WP_Piwik\Widget\Ecommerce ($this, self::$settings, $this->statsPageId); + new \WP_Piwik\Widget\Items ($this, self::$settings, $this->statsPageId); + new \WP_Piwik\Widget\ItemsCategory ($this, self::$settings, $this->statsPageId); + } + if (self::$settings->getGlobalOption ( 'stats_seo' )) + new \WP_Piwik\Widget\Seo ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Pages ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Keywords ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Referrers ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Plugins ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Search ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Noresult ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Browsers ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\BrowserDetails ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Screens ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Types ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Models ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Systems ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\SystemDetails ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\City ( $this, self::$settings, $this->statsPageId ); + new \WP_Piwik\Widget\Country ( $this, self::$settings, $this->statsPageId ); + } + + /** + * Add per post statistics to a post's page + * + * @param mixed $postPageId + * WordPress post page ID + */ + public function onloadPostPage($postPageId) { + global $post; + $postUrl = get_permalink ( $post->ID ); + $this->log ( 'Load per post statistics: ' . $postUrl ); + array ( + new \WP_Piwik\Widget\Post ( $this, self::$settings, array('post', 'page', 'custom_post_type'), 'side', 'default', array ( + 'url' => $postUrl + ) ), + 'show' + ); + } + + /** + * Stats page changes by POST submit + * + * @see http://tinyurl.com/5r5vnzs + */ + function onStatsPageSaveChanges() { + if (! current_user_can ( 'manage_options' )) + wp_die ( __ ( 'Cheatin’ uh?' ) ); + check_admin_referer ( 'wp-piwik_stats' ); + wp_redirect ( $_POST ['_wp_http_referer'] ); + } + + /** + * Get option value, choose method depending on network mode + * + * @param string $option option key + * @return string option value + */ + private function getWordPressOption($option, $default = null) { + return ($this->isNetworkMode () ? get_site_option ( $option, $default ) : get_option ( $option, $default )); + } + + /** + * Delete option, choose method depending on network mode + * + * @param string $option option key + */ + private function deleteWordPressOption($option) { + if ( $this->isNetworkMode () ) + delete_site_option ( $option ); + else + delete_option ( $option ); + } + + /** + * Set option value, choose method depending on network mode + * + * @param string $option option key + * @param mixed $value option value + */ + private function updateWordPressOption($option, $value) { + if ( $this->isNetworkMode () ) + update_site_option ( $option, $value ); + else + update_option ( $option, $value ); + } + + /** + * Check if WP-Piwik options page + * + * @return boolean True if current page is WP-Piwik's option page + */ + public static function isValidOptionsPost() { + return is_admin() && check_admin_referer( 'wp-piwik_settings' ) && current_user_can( 'manage_options' ) ; + } +} diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin.php new file mode 100644 index 0000000..23d83db --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin.php @@ -0,0 +1,26 @@ +getPluginURL().'css/wp-piwik.css', array(), self::$wpPiwik->getPluginVersion()); + } + + public function onLoad() {} + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php new file mode 100644 index 0000000..b60575e --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php @@ -0,0 +1,25 @@ +getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot', self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery'), self::$wpPiwik->getPluginVersion()); + } + + public function extendAdminHeader() { + echo ''; + echo ''; + echo ''; + } + + public function onLoad() { + self::$wpPiwik->onloadStatsPage(self::$pageID); + } + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php new file mode 100644 index 0000000..06b8a15 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php @@ -0,0 +1,720 @@ + + */ +class Settings extends \WP_Piwik\Admin { + + /** + * Builds and displays the settings page + */ + public function show() { + if (isset($_GET['sitebrowser']) && $_GET['sitebrowser']) { + new \WP_Piwik\Admin\Sitebrowser(self::$wpPiwik); + return; + } + if (isset($_GET['clear']) && $_GET['clear']) { + $this->clear($_GET['clear'] == 2); + self::$wpPiwik->resetRequest(); + echo '
            '; + return; + } elseif (self::$wpPiwik->isConfigSubmitted()) { + $this->showBox ( 'updated', 'yes', __ ( 'Changes saved.' ) ); + self::$wpPiwik->resetRequest(); + self::$wpPiwik->updateTrackingCode(); + } + global $wp_roles; + ?> +
            + getHeadline ( 1, 'admin-generic', 'Settings', true ); + if (isset($_GET['testscript']) && $_GET['testscript']) + $this->runTestscript(); + ?> + isConfigured ()) { + $piwikVersion = self::$wpPiwik->request ( 'global.getPiwikVersion' ); + if (is_array ( $piwikVersion ) && isset( $piwikVersion['value'] )) + $piwikVersion = $piwikVersion['value']; + if (! empty ( $piwikVersion ) && !is_array( $piwikVersion )) + $this->showDonation(); + } + ?> +
            + + + + + '; + printf ( '', __ ( 'Thanks for using WP-Matomo!', 'wp-piwik' ) ); + if (self::$wpPiwik->isConfigured ()) { + if (! empty ( $piwikVersion ) && !is_array( $piwikVersion )) { + $this->showText ( sprintf ( __ ( 'WP-Matomo %s is successfully connected to Matomo %s.', 'wp-piwik' ), self::$wpPiwik->getPluginVersion (), $piwikVersion ) . ' ' . (! self::$wpPiwik->isNetworkMode () ? sprintf ( __ ( 'You are running WordPress %s.', 'wp-piwik' ), get_bloginfo ( 'version' ) ) : sprintf ( __ ( 'You are running a WordPress %s blog network (WPMU). WP-Matomo will handle your sites as different websites.', 'wp-piwik' ), get_bloginfo ( 'version' ) )) ); + } else { + $errorMessage = \WP_Piwik\Request::getLastError(); + if ( empty( $errorMessage ) ) + $this->showBox ( 'error', 'no', sprintf ( __ ( 'WP-Matomo %s was not able to connect to Matomo using your configuration. Check the »Connect to Matomo« section below.', 'wp-piwik' ), self::$wpPiwik->getPluginVersion () ) ); + else + $this->showBox ( 'error', 'no', sprintf ( __ ( 'WP-Matomo %s was not able to connect to Matomo using your configuration. During connection the following error occured:
            %s', 'wp-piwik' ), self::$wpPiwik->getPluginVersion (), $errorMessage ) ); + } + } else + $this->showBox ( 'error', 'no', sprintf ( __ ( 'WP-Matomo %s has to be connected to Matomo first. Check the »Connect to Matomo« section below.', 'wp-piwik' ), self::$wpPiwik->getPluginVersion () ) ); + + $tabs ['connect'] = array ( + 'icon' => 'admin-plugins', + 'name' => __('Connect to Matomo', 'wp-piwik') + ); + if (self::$wpPiwik->isConfigured ()) { + $tabs ['statistics'] = array ( + 'icon' => 'chart-pie', + 'name' => __('Show Statistics', 'wp-piwik') + ); + $tabs ['tracking'] = array ( + 'icon' => 'location-alt', + 'name' => __('Enable Tracking', 'wp-piwik') + ); + } + $tabs ['expert'] = array ( + 'icon' => 'shield', + 'name' => __('Expert Settings', 'wp-piwik') + ); + $tabs ['support'] = array ( + 'icon' => 'lightbulb', + 'name' => __('Support', 'wp-piwik') + ); + $tabs ['credits'] = array ( + 'icon' => 'groups', + 'name' => __('Credits', 'wp-piwik') + ); + + echo '

            %s
            '; + + if (! self::$wpPiwik->isConfigured ()) + $this->showBox ( 'updated', 'info', sprintf ( '%s %s %s %s.', __ ( 'WP-Matomo is a WordPress plugin to show a selection of Matomo stats in your WordPress admin dashboard and to add and configure your Matomo tracking code. To use this you will need your own Matomo instance. If you do not already have a Matomo setup, you have two simple options: use either', 'wp-piwik' ), 'http://piwik.org/', __ ( 'a self-hosted Matomo', 'wp-piwik' ), __ ( 'or', 'wp-piwik' ), 'https://www.innocraft.cloud/?pk_campaign=WP-Matomo', __ ( 'a cloud-hosted Matomo by InnoCraft', 'wp-piwik' ) ) ); + + if (! function_exists ( 'curl_init' ) && ! ini_get ( 'allow_url_fopen' )) + $this->showBox ( 'error', 'no', __ ( 'Neither cURL nor fopen are available. So WP-Matomo can not use the HTTP API and not connect to InnoCraft Cloud.' ) . ' ' . sprintf ( '%s.', 'https://wordpress.org/plugins/wp-piwik/faq/', __ ( 'More information', 'wp-piwik' ) ) ); + + $description = sprintf ( '%s
            %s: %s
            %s: %s
            %s: %s', __ ( 'You can choose between three connection methods:', 'wp-piwik' ), __ ( 'Self-hosted (HTTP API, default)', 'wp-piwik' ), __ ( 'This is the default option for a self-hosted Matomo and should work for most configurations. WP-Matomo will connect to Matomo using http(s).', 'wp-piwik' ), __ ( 'Self-hosted (PHP API)', 'wp-piwik' ), __ ( 'Choose this, if your self-hosted Matomo and WordPress are running on the same machine and you know the full server path to your Matomo instance.', 'wp-piwik' ), __ ( 'Cloud-hosted', 'wp-piwik' ), __ ( 'If you are using a cloud-hosted Matomo by InnoCraft, you can simply use this option. Be carefull to choose the option which fits to your cloud domain (matomo.cloud or innocraft.cloud).', 'wp-piwik' ) ); + $this->showSelect ( 'piwik_mode', __ ( 'Matomo Mode', 'wp-piwik' ), array ( + 'disabled' => __ ( 'Disabled (WP-Matomo will not connect to Matomo)', 'wp-piwik' ), + 'http' => __ ( 'Self-hosted (HTTP API, default)', 'wp-piwik' ), + 'php' => __ ( 'Self-hosted (PHP API)', 'wp-piwik' ), + 'cloud-matomo' => __('Cloud-hosted (Innocraft Cloud, *.matomo.cloud)', 'wp-piwik'), + 'cloud' => __ ( 'Cloud-hosted (InnoCraft Cloud, *.innocraft.cloud)', 'wp-piwik' ) + ), $description, '$j(\'tr.wp-piwik-mode-option\').addClass(\'hidden\'); $j(\'#wp-piwik-mode-option-\' + $j(\'#piwik_mode\').val()).removeClass(\'hidden\');', false, '', self::$wpPiwik->isConfigured () ); + + $this->showInput ( 'piwik_url', __ ( 'Matomo URL', 'wp-piwik' ), __( 'Enter your Matomo URL. This is the same URL you use to access your Matomo instance, e.g. http://www.example.com/matomo/.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'piwik_mode' ) != 'http', 'wp-piwik-mode-option', 'http', self::$wpPiwik->isConfigured (), true ); + $this->showInput ( 'piwik_path', __ ( 'Matomo path', 'wp-piwik' ), __( 'Enter the file path to your Matomo instance, e.g. /var/www/matomo/.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'piwik_mode' ) != 'php', 'wp-piwik-mode-option', 'php', self::$wpPiwik->isConfigured (), true ); + $this->showInput ( 'piwik_user', __ ( 'Innocraft subdomain', 'wp-piwik' ), __( 'Enter your InnoCraft Cloud subdomain. It is also part of your URL: https://SUBDOMAIN.innocraft.cloud.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'piwik_mode' ) != 'cloud', 'wp-piwik-mode-option', 'cloud', self::$wpPiwik->isConfigured () ); + $this->showInput ( 'matomo_user', __ ( 'Matomo subdomain', 'wp-piwik' ), __( 'Enter your Matomo Cloud subdomain. It is also part of your URL: https://SUBDOMAIN.matomo.cloud.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'piwik_mode' ) != 'cloud-matomo', 'wp-piwik-mode-option', 'cloud-matomo', self::$wpPiwik->isConfigured () ); + $this->showInput ( 'piwik_token', __ ( 'Auth token', 'wp-piwik' ), __( 'Enter your Matomo auth token here. It is an alphanumerical code like 0a1b2c34d56e78901fa2bc3d45678efa.', 'wp-piwik' ).' '.sprintf ( __ ( 'See %sWP-Matomo FAQ%s.', 'wp-piwik' ), '', '' ), false, '', '', self::$wpPiwik->isConfigured (), true ); + + // Site configuration + $piwikSiteId = self::$wpPiwik->isConfigured () ? self::$wpPiwik->getPiwikSiteId () : false; + if (! self::$wpPiwik->isNetworkMode() ) { + $this->showCheckbox ( 'auto_site_config', __ ( 'Auto config', 'wp-piwik' ), __ ( 'Check this to automatically choose your blog from your Matomo sites by URL. If your blog is not added to Matomo yet, WP-Matomo will add a new site.', 'wp-piwik' ), false, '$j(\'tr.wp-piwik-auto-option\').toggle(\'hidden\');' . ($piwikSiteId ? '$j(\'#site_id\').val(' . $piwikSiteId . ');' : '') ); + if (self::$wpPiwik->isConfigured ()) { + $piwikSiteList = self::$wpPiwik->getPiwikSiteDetails (); + if (isset($piwikSiteList['result']) && $piwikSiteList['result'] == 'error') { + $this->showBox ( 'error', 'no', sprintf ( __ ( 'WP-Matomo %s was not able to get sites with at least view access:
            %s', 'wp-piwik' ), self::$wpPiwik->getPluginVersion (), $errorMessage ) ); + } else { + if (is_array($piwikSiteList)) + foreach ($piwikSiteList as $details) + $piwikSiteDetails[$details['idsite']] = $details; + unset($piwikSiteList); + if ($piwikSiteId != 'n/a' && isset($piwikSiteDetails) && is_array($piwikSiteDetails)) + $piwikSiteDescription = $piwikSiteDetails [$piwikSiteId] ['name'] . ' (' . $piwikSiteDetails [$piwikSiteId] ['main_url'] . ')'; + else + $piwikSiteDescription = 'n/a'; + echo ''; + if (isset ($piwikSiteDetails) && is_array($piwikSiteDetails)) + foreach ($piwikSiteDetails as $key => $siteData) + $siteList [$siteData['idsite']] = $siteData ['name'] . ' (' . $siteData ['main_url'] . ')'; + if (isset($siteList)) + $this->showSelect('site_id', __('Select site', 'wp-piwik'), $siteList, 'Choose the Matomo site corresponding to this blog.', '', self::$settings->getGlobalOption('auto_site_config'), 'wp-piwik-auto-option', true, false); + } + } + } else echo ''; + + echo $submitButton; + + echo '
            ' . __('Determined site', 'wp-piwik') . ':' . $piwikSiteDescription . '
            '; + // Stats configuration + $this->showSelect ( 'default_date', __ ( 'Matomo default date', 'wp-piwik' ), array ( + 'today' => __ ( 'Today', 'wp-piwik' ), + 'yesterday' => __ ( 'Yesterday', 'wp-piwik' ), + 'current_month' => __ ( 'Current month', 'wp-piwik' ), + 'last_month' => __ ( 'Last month', 'wp-piwik' ), + 'current_week' => __ ( 'Current week', 'wp-piwik' ), + 'last_week' => __ ( 'Last week', 'wp-piwik' ) + ), __ ( 'Default date shown on statistics page.', 'wp-piwik' ) ); + + $this->showCheckbox ( 'stats_seo', __ ( 'Show SEO data', 'wp-piwik' ), __ ( 'Display SEO ranking data on statistics page.', 'wp-piwik' ) . ' (' . __ ( 'Slow!', 'wp-piwik' ) . ')' ); + $this->showCheckbox ( 'stats_ecommerce', __ ( 'Show e-commerce data', 'wp-piwik' ), __ ( 'Display e-commerce data on statistics page.', 'wp-piwik' ) ); + + $this->showSelect ( 'dashboard_widget', __ ( 'Dashboard overview', 'wp-piwik' ), array ( + 'disabled' => __ ( 'Disabled', 'wp-piwik' ), + 'yesterday' => __ ( 'Yesterday', 'wp-piwik' ), + 'today' => __ ( 'Today', 'wp-piwik' ), + 'last30' => __ ( 'Last 30 days', 'wp-piwik' ) + ), __ ( 'Enable WP-Matomo dashboard widget "Overview".', 'wp-piwik' ) ); + + $this->showCheckbox ( 'dashboard_chart', __ ( 'Dashboard graph', 'wp-piwik' ), __ ( 'Enable WP-Matomo dashboard widget "Graph".', 'wp-piwik' ) ); + + $this->showCheckbox ( 'dashboard_seo', __ ( 'Dashboard SEO', 'wp-piwik' ), __ ( 'Enable WP-Matomo dashboard widget "SEO".', 'wp-piwik' ) . ' (' . __ ( 'Slow!', 'wp-piwik' ) . ')' ); + + $this->showCheckbox ( 'dashboard_ecommerce', __ ( 'Dashboard e-commerce', 'wp-piwik' ), __ ( 'Enable WP-Matomo dashboard widget "E-commerce".', 'wp-piwik' ) ); + + $this->showCheckbox ( 'toolbar', __ ( 'Show graph on WordPress Toolbar', 'wp-piwik' ), __ ( 'Display a last 30 days visitor graph on WordPress\' toolbar.', 'wp-piwik' ) ); + + echo ''; + + $this->showCheckbox ( 'perpost_stats', __ ( 'Show per post stats', 'wp-piwik' ), __ ( 'Show stats about single posts at the post edit admin page.', 'wp-piwik' ) ); + + $this->showCheckbox ( 'piwik_shortcut', __ ( 'Matomo shortcut', 'wp-piwik' ), __ ( 'Display a shortcut to Matomo itself.', 'wp-piwik' ) ); + + $this->showInput ( 'plugin_display_name', __ ( 'WP-Matomo display name', 'wp-piwik' ), __ ( 'Plugin name shown in WordPress.', 'wp-piwik' ) ); + + $this->showCheckbox ( 'shortcodes', __ ( 'Enable shortcodes', 'wp-piwik' ), __ ( 'Enable shortcodes in post or page content.', 'wp-piwik' ) ); + + echo $submitButton; + + echo ''; + + // Tracking Configuration + $isNotTracking = self::$settings->getGlobalOption ( 'track_mode' ) == 'disabled'; + $isNotGeneratedTracking = $isNotTracking || self::$settings->getGlobalOption ( 'track_mode' ) == 'manually'; + $fullGeneratedTrackingGroup = 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-proxy'; + + $description = sprintf ( '%s
            %s: %s
            %s: %s
            %s: %s
            %s: %s
            %s: %s', __ ( 'You can choose between four tracking code modes:', 'wp-piwik' ), __ ( 'Disabled', 'wp-piwik' ), __ ( 'WP-Matomo will not add the tracking code. Use this, if you want to add the tracking code to your template files or you use another plugin to add the tracking code.', 'wp-piwik' ), __ ( 'Default tracking', 'wp-piwik' ), __ ( 'WP-Matomo will use Matomo\'s standard tracking code.', 'wp-piwik' ), __ ( 'Use js/index.php', 'wp-piwik' ), __ ( 'You can choose this tracking code, to deliver a minified proxy code and to avoid using the files called piwik.js or piwik.php.', 'wp-piwik' ).' '.sprintf( __( 'See %sreadme file%s.', 'wp-piwik' ), '', ''), __ ( 'Use proxy script', 'wp-piwik' ), __ ( 'Use this tracking code to not reveal the Matomo server URL.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo FAQ%s.', 'wp-piwik' ), '', '' ) , __ ( 'Enter manually', 'wp-piwik' ), __ ( 'Enter your own tracking code manually. You can choose one of the prior options, pre-configure your tracking code and switch to manually editing at last.', 'wp-piwik' ).( self::$wpPiwik->isNetworkMode() ? ' '.__ ( 'Use the placeholder {ID} to add the Matomo site ID.', 'wp-piwik' ) : '' ) ); + $this->showSelect ( 'track_mode', __ ( 'Add tracking code', 'wp-piwik' ), array ( + 'disabled' => __ ( 'Disabled', 'wp-piwik' ), + 'default' => __ ( 'Default tracking', 'wp-piwik' ), + 'js' => __ ( 'Use js/index.php', 'wp-piwik' ), + 'proxy' => __ ( 'Use proxy script', 'wp-piwik' ), + 'manually' => __ ( 'Enter manually', 'wp-piwik' ) + ), $description, '$j(\'tr.wp-piwik-track-option\').addClass(\'hidden\'); $j(\'tr.wp-piwik-track-option-\' + $j(\'#track_mode\').val()).removeClass(\'hidden\'); $j(\'#tracking_code, #noscript_code\').prop(\'readonly\', $j(\'#track_mode\').val() != \'manually\');' ); + + $this->showTextarea ( 'tracking_code', __ ( 'Tracking code', 'wp-piwik' ), 15, 'This is a preview of your current tracking code. If you choose to enter your tracking code manually, you can change it here.', $isNotTracking, 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-proxy wp-piwik-track-option-manually', true, '', (self::$settings->getGlobalOption ( 'track_mode' ) != 'manually'), false ); + + $this->showSelect ( 'track_codeposition', __ ( 'JavaScript code position', 'wp-piwik' ), array ( + 'footer' => __ ( 'Footer', 'wp-piwik' ), + 'header' => __ ( 'Header', 'wp-piwik' ) + ), __ ( 'Choose whether the JavaScript code is added to the footer or the header.', 'wp-piwik' ), '', $isNotTracking, 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-proxy wp-piwik-track-option-manually' ); + + $this->showTextarea ( 'noscript_code', __ ( 'Noscript code', 'wp-piwik' ), 2, 'This is a preview of your <noscript> code which is part of your tracking code.', self::$settings->getGlobalOption ( 'track_mode' ) == 'proxy', 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually', true, '', (self::$settings->getGlobalOption ( 'track_mode' ) != 'manually'), false ); + + $this->showCheckbox ( 'track_noscript', __ ( 'Add <noscript>', 'wp-piwik' ), __ ( 'Adds the <noscript> code to your footer.', 'wp-piwik' ) . ' ' . __ ( 'Disabled in proxy mode.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'track_mode' ) == 'proxy', 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually' ); + + $this->showCheckbox ( 'track_nojavascript', __ ( 'Add rec parameter to noscript code', 'wp-piwik' ), __ ( 'Enable tracking for visitors without JavaScript (not recommended).', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo FAQ%s.', 'wp-piwik' ), '', '' ) . ' ' . __ ( 'Disabled in proxy mode.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'track_mode' ) == 'proxy', 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually' ); + + $this->showSelect ( 'track_content', __ ( 'Enable content tracking', 'wp-piwik' ), array ( + 'disabled' => __ ( 'Disabled', 'wp-piwik' ), + 'all' => __ ( 'Track all content blocks', 'wp-piwik' ), + 'visible' => __ ( 'Track only visible content blocks', 'wp-piwik' ) + ), __ ( 'Content tracking allows you to track interaction with the content of a web page or application.' ) . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ), '', $isNotTracking, $fullGeneratedTrackingGroup . ' wp-piwik-track-option-manually' ); + + $this->showCheckbox ( 'track_search', __ ( 'Track search', 'wp-piwik' ), __ ( 'Use Matomo\'s advanced Site Search Analytics feature.' ) . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ), $isNotTracking, $fullGeneratedTrackingGroup . ' wp-piwik-track-option-manually' ); + + $this->showCheckbox ( 'track_404', __ ( 'Track 404', 'wp-piwik' ), __ ( 'WP-Matomo can automatically add a 404-category to track 404-page-visits.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo FAQ%s.', 'wp-piwik' ), '', '' ), $isNotTracking, $fullGeneratedTrackingGroup . ' wp-piwik-track-option-manually' ); + + echo ''; + echo ''; + + $this->showCheckbox ( 'add_customvars_box', __ ( 'Show custom variables box', 'wp-piwik' ), __ ( ' Show a "custom variables" edit box on post edit page.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ), $isNotGeneratedTracking, $fullGeneratedTrackingGroup . ' wp-piwik-track-option-manually' ); + + $this->showInput ( 'add_download_extensions', __ ( 'Add new file types for download tracking', 'wp-piwik' ), __ ( 'Add file extensions for download tracking, divided by a vertical bar (|).', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ), $isNotGeneratedTracking, $fullGeneratedTrackingGroup ); + + $this->showCheckbox ( 'disable_cookies', __ ( 'Disable cookies', 'wp-piwik' ), __ ( 'Disable all tracking cookies for a visitor.', 'wp-piwik' ), $isNotGeneratedTracking, $fullGeneratedTrackingGroup ); + + $this->showCheckbox ( 'limit_cookies', __ ( 'Limit cookie lifetime', 'wp-piwik' ), __ ( 'You can limit the cookie lifetime to avoid tracking your users over a longer period as necessary.', 'wp-piwik' ), $isNotGeneratedTracking, $fullGeneratedTrackingGroup, true, '$j(\'tr.wp-piwik-cookielifetime-option\').toggleClass(\'wp-piwik-hidden\');' ); + + $this->showInput ( 'limit_cookies_visitor', __ ( 'Visitor timeout (seconds)', 'wp-piwik' ), false, $isNotGeneratedTracking || ! self::$settings->getGlobalOption ( 'limit_cookies' ), $fullGeneratedTrackingGroup.' wp-piwik-cookielifetime-option'. (self::$settings->getGlobalOption ( 'limit_cookies' )? '': ' wp-piwik-hidden') ); + + $this->showInput ( 'limit_cookies_session', __ ( 'Session timeout (seconds)', 'wp-piwik' ), false, $isNotGeneratedTracking || ! self::$settings->getGlobalOption ( 'limit_cookies' ), $fullGeneratedTrackingGroup .' wp-piwik-cookielifetime-option'. (self::$settings->getGlobalOption ( 'limit_cookies' )? '': ' wp-piwik-hidden') ); + + $this->showInput ( 'limit_cookies_referral', __ ( 'Referral timeout (seconds)', 'wp-piwik' ), false, $isNotGeneratedTracking || ! self::$settings->getGlobalOption ( 'limit_cookies' ), $fullGeneratedTrackingGroup .' wp-piwik-cookielifetime-option'. (self::$settings->getGlobalOption ( 'limit_cookies' )? '': ' wp-piwik-hidden') ); + + $this->showCheckbox ( 'track_admin', __ ( 'Track admin pages', 'wp-piwik' ), __ ( 'Enable to track users on admin pages (remember to configure the tracking filter appropriately).', 'wp-piwik' ), $isNotTracking, $fullGeneratedTrackingGroup . ' wp-piwik-track-option-manually' ); + + echo ''; + echo ''; + + $this->showCheckbox ( 'track_across', __ ( 'Track subdomains in the same website', 'wp-piwik' ), __ ( 'Adds *.-prefix to cookie domain.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ), $isNotGeneratedTracking, $fullGeneratedTrackingGroup ); + + $this->showCheckbox ( 'track_across_alias', __ ( 'Do not count subdomains as outlink', 'wp-piwik' ), __ ( 'Adds *.-prefix to tracked domain.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ), $isNotGeneratedTracking, $fullGeneratedTrackingGroup ); + + $this->showCheckbox ( 'track_crossdomain_linking', __ ( 'Enable cross domain linking', 'wp-piwik' ), __ ( 'When enabled, it will make sure to use the same visitor ID for the same visitor across several domains. This works only when this feature is enabled because the visitor ID is stored in a cookie and cannot be read on the other domain by default. When this feature is enabled, it will append a URL parameter "pk_vid" that contains the visitor ID when a user clicks on a URL that belongs to one of your domains. For this feature to work, you also have to configure which domains should be treated as local in your Matomo website settings. This feature requires Matomo 3.0.2.', 'wp-piwik' ), self::$settings->getGlobalOption ( 'track_mode' ) == 'proxy', 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually'); + + $this->showCheckbox ( 'track_feed', __ ( 'Track RSS feeds', 'wp-piwik' ), __ ( 'Enable to track posts in feeds via tracking pixel.', 'wp-piwik' ), $isNotTracking, $fullGeneratedTrackingGroup . ' wp-piwik-track-option-manually' ); + + $this->showCheckbox ( 'track_feed_addcampaign', __ ( 'Track RSS feed links as campaign', 'wp-piwik' ), __ ( 'This will add Matomo campaign parameters to the RSS feed links.' . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ), 'wp-piwik' ), $isNotTracking, $fullGeneratedTrackingGroup . ' wp-piwik-track-option-manually', true, '$j(\'tr.wp-piwik-feed_campaign-option\').toggle(\'hidden\');' ); + + $this->showInput ( 'track_feed_campaign', __ ( 'RSS feed campaign', 'wp-piwik' ), __ ( 'Keyword: post name.', 'wp-piwik' ), $isNotGeneratedTracking || ! self::$settings->getGlobalOption ( 'track_feed_addcampaign' ), $fullGeneratedTrackingGroup . ' wp-piwik-feed_campaign-option' ); + + $this->showInput ( 'track_heartbeat', __ ( 'Enable heartbeat timer', 'wp-piwik' ), __ ( 'Enable a heartbeat timer to get more accurate visit lengths by sending periodical HTTP ping requests as long as the site is opened. Enter the time between the pings in seconds (Matomo default: 15) to enable or 0 to disable this feature. Note: This will cause a lot of additional HTTP requests on your site.', 'wp-piwik' ), $isNotGeneratedTracking, $fullGeneratedTrackingGroup ); + + $this->showSelect ( 'track_user_id', __ ( 'User ID Tracking', 'wp-piwik' ), array ( + 'disabled' => __ ( 'Disabled', 'wp-piwik' ), + 'uid' => __ ( 'WP User ID', 'wp-piwik' ), + 'email' => __ ( 'Email Address', 'wp-piwik' ), + 'username' => __ ( 'Username', 'wp-piwik' ), + 'displayname' => __ ( 'Display Name (Not Recommended!)', 'wp-piwik' ) + ), __ ( 'When a user is logged in to WordPress, track their "User ID". You can select which field from the User\'s profile is tracked as the "User ID". When enabled, Tracking based on Email Address is recommended.', 'wp-piwik' ), '', $isNotTracking, $fullGeneratedTrackingGroup ); + + echo $submitButton; + echo ''; + + $this->showText ( __ ( 'Usually, you do not need to change these settings. If you want to do so, you should know what you do or you got an expert\'s advice.', 'wp-piwik' ) ); + + $this->showCheckbox ( 'cache', __ ( 'Enable cache', 'wp-piwik' ), __ ( 'Cache API calls, which not contain today\'s values, for a week.', 'wp-piwik' ) ); + + if (function_exists('curl_init') && ini_get('allow_url_fopen')) + $this->showSelect ( 'http_connection', __ ( 'HTTP connection via', 'wp-piwik' ), array ( + 'curl' => __ ( 'cURL', 'wp-piwik' ), + 'fopen' => __ ( 'fopen', 'wp-piwik' ) + ), __('Choose whether WP-Matomo should use cURL or fopen to connect to Matomo in HTTP or Cloud mode.', 'wp-piwik' ) ); + + $this->showSelect ( 'http_method', __ ( 'HTTP method', 'wp-piwik' ), array ( + 'post' => __ ( 'POST', 'wp-piwik' ), + 'get' => __ ( 'GET', 'wp-piwik' ) + ), __('Choose whether WP-Matomo should use POST or GET in HTTP or Cloud mode.', 'wp-piwik' ) ); + + $this->showCheckbox ( 'disable_timelimit', __ ( 'Disable time limit', 'wp-piwik' ), __ ( 'Use set_time_limit(0) if stats page causes a time out.', 'wp-piwik' ) ); + + $this->showInput ( 'filter_limit', __ ( 'Filter limit', 'wp-piwik' ), __ ( 'Use filter_limit if you need to get more than 100 results per page.', 'wp-piwik' ) ); + + $this->showInput ( 'connection_timeout', __ ( 'Connection timeout', 'wp-piwik' ), 'Define a connection timeout for all HTTP requests done by WP-Matomo in seconds.' ); + + $this->showCheckbox ( 'disable_ssl_verify', __ ( 'Disable SSL peer verification', 'wp-piwik' ), '(' . __ ( 'not recommended', 'wp-piwik' ) . ')' ); + $this->showCheckbox ( 'disable_ssl_verify_host', __ ( 'Disable SSL host verification', 'wp-piwik' ), '(' . __ ( 'not recommended', 'wp-piwik' ) . ')' ); + + $this->showSelect ( 'piwik_useragent', __ ( 'User agent', 'wp-piwik' ), array ( + 'php' => __ ( 'Use the PHP default user agent', 'wp-piwik' ) . (ini_get ( 'user_agent' ) ? '(' . ini_get ( 'user_agent' ) . ')' : ' (' . __ ( 'empty', 'wp-piwik' ) . ')'), + 'own' => __ ( 'Define a specific user agent', 'wp-piwik' ) + ), 'WP-Matomo can send the default user agent defined by your PHP settings or use a specific user agent below. The user agent is send by WP-Matomo if HTTP requests are performed.', '$j(\'tr.wp-piwik-useragent-option\').toggleClass(\'hidden\');' ); + $this->showInput ( 'piwik_useragent_string', __ ( 'Specific user agent', 'wp-piwik' ), 'Define a user agent description which is send by WP-Matomo if HTTP requests are performed.', self::$settings->getGlobalOption ( 'piwik_useragent' ) != 'own', 'wp-piwik-useragent-option' ); + + $this->showCheckbox ( 'dnsprefetch', __ ( 'Enable DNS prefetch', 'wp-piwik' ), __ ( 'Add a DNS prefetch tag.' . ' ' . sprintf ( __ ( 'See %sMatomo Blog%s.', 'wp-piwik' ), '', '' ), 'wp-piwik' ) ); + + $this->showCheckbox ( 'track_datacfasync', __ ( 'Add data-cfasync=false', 'wp-piwik' ), __ ( 'Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to ignore the script.' . ' ' . sprintf ( __ ( 'See %sCloudFlare Knowledge Base%s.', 'wp-piwik' ), '', '' ), 'wp-piwik' ) ); + + $this->showInput ( 'track_cdnurl', __ ( 'CDN URL', 'wp-piwik' ).' http://', 'Enter URL if you want to load the tracking code via CDN.' ); + + $this->showInput ( 'track_cdnurlssl', __ ( 'CDN URL (SSL)', 'wp-piwik' ).' https://', 'Enter URL if you want to load the tracking code via a separate SSL CDN.' ); + + $this->showSelect ( 'force_protocol', __ ( 'Force Matomo to use a specific protocol', 'wp-piwik' ), array ( + 'disabled' => __ ( 'Disabled (default)', 'wp-piwik' ), + 'http' => __ ( 'http', 'wp-piwik' ), + 'https' => __ ( 'https (SSL)', 'wp-piwik' ) + ), __ ( 'Choose if you want to explicitly force Matomo to use HTTP or HTTPS. Does not work with a CDN URL.', 'wp-piwik' ) ); + + $this->showSelect ( 'update_notice', __ ( 'Update notice', 'wp-piwik' ), array ( + 'enabled' => __ ( 'Show always if WP-Matomo is updated', 'wp-piwik' ), + 'script' => __ ( 'Show only if WP-Matomo is updated and settings were changed', 'wp-piwik' ), + 'disabled' => __ ( 'Disabled', 'wp-piwik' ) + ), __ ( 'Choose if you want to get an update notice if WP-Matomo is updated.', 'wp-piwik' ) ); + + $this->showInput ( 'set_download_extensions', __ ( 'Define all file types for download tracking', 'wp-piwik' ), __ ( 'Replace Matomo\'s default file extensions for download tracking, divided by a vertical bar (|). Leave blank to keep Matomo\'s default settings.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo documentation%s.', 'wp-piwik' ), '', '' ) ); + + $this->showInput ( 'set_download_classes', __ ( 'Set classes to be treated as downloads', 'wp-piwik' ), __ ( 'Set classes to be treated as downloads (in addition to piwik_download), divided by a vertical bar (|). Leave blank to keep Matomo\'s default settings.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo JavaScript Tracking Client reference%s.', 'wp-piwik' ), '', '' ) ); + + $this->showInput ( 'set_link_classes', __ ( 'Set classes to be treated as outlinks', 'wp-piwik' ), __ ( 'Set classes to be treated as outlinks (in addition to piwik_link), divided by a vertical bar (|). Leave blank to keep Matomo\'s default settings.', 'wp-piwik' ) . ' ' . sprintf ( __ ( 'See %sMatomo JavaScript Tracking Client reference%s.', 'wp-piwik' ), '', '' ) ); + + echo $submitButton; + ?> + + + + + + + + + + + + + +
            +
            +

            %s

            ', $id, $description ); + } + + /** + * Show a checkbox option + * + * @param string $id option id + * @param string $name descriptive option name + * @param string $description option description + * @param boolean $isHidden set to true to initially hide the option (default: false) + * @param string $groupName define a class name to access a group of option rows by javascript (default: empty) + * @param boolean $hideDescription $hideDescription set to false to show description initially (default: true) + * @param string $onChange javascript for onchange event (default: empty) + */ + private function showCheckbox($id, $name, $description, $isHidden = false, $groupName = '', $hideDescription = true, $onChange = '') { + printf ( ':getGlobalOption ( $id ) ? ' checked="checked"' : '') . ' onchange="$j(\'#%s\').val(this.checked?1:0);%s" /> %s', $name, $id, $onChange, $this->getDescription ( $id, $description, $hideDescription ) ); + } + + /** + * Show a textarea option + * + * @param string $id option id + * @param string $name descriptive option name + * @param int $rows number of rows to show + * @param string $description option description + * @param boolean $isHidden set to true to initially hide the option (default: false) + * @param string $groupName define a class name to access a group of option rows by javascript (default: empty) + * @param boolean $hideDescription $hideDescription set to false to show description initially (default: true) + * @param string $onChange javascript for onchange event (default: empty) + * @param boolean $isReadonly set textarea to read only (default: false) + * @param boolean $global set to false if the textarea shows a site-specific option (default: true) + */ + private function showTextarea($id, $name, $rows, $description, $isHidden, $groupName, $hideDescription = true, $onChange = '', $isReadonly = false, $global = true) { + printf ( + ': %s', $name, $id, $onChange, ($global ? self::$settings->getGlobalOption ( $id ) : self::$settings->getOption ( $id )), $this->getDescription ( $id, $description, $hideDescription ) ); + } + + /** + * Show a simple text + * + * @param string $text Text to show + */ + private function showText($text) { + printf ( '

            %s

            ', $text ); + } + + /** + * Show an input option + * + * @param string $id option id + * @param string $name descriptive option name + * @param string $description option description + * @param boolean $isHidden set to true to initially hide the option (default: false) + * @param string $groupName define a class name to access a group of option rows by javascript (default: empty) + * @param string $rowName define a class name to access the specific option row by javascript (default: empty) + * @param boolean $hideDescription $hideDescription set to false to show description initially (default: true) + * @param boolean $wide Create a wide box (default: false) + */ + private function showInput($id, $name, $description, $isHidden = false, $groupName = '', $rowName = false, $hideDescription = true, $wide = false) { + printf ( ' %s', $isHidden ? 'hidden ' : '', $groupName ? $groupName : '', $rowName ? ' id="' . $groupName . '-' . $rowName . '"' : '', $name, $id, htmlentities(self::$settings->getGlobalOption( $id ), ENT_QUOTES, 'UTF-8', false), !empty($description) ? $this->getDescription ( $id, $description, $hideDescription ) : '' ); + } + + /** + * Show a select box option + * + * @param string $id option id + * @param string $name descriptive option name + * @param array $options list of options to show array[](option id => descriptive name) + * @param string $description option description + * @param string $onChange javascript for onchange event (default: empty) + * @param boolean $isHidden set to true to initially hide the option (default: false) + * @param string $groupName define a class name to access a group of option rows by javascript (default: empty) + * @param boolean $hideDescription $hideDescription set to false to show description initially (default: true) + * @param boolean $global set to false if the textarea shows a site-specific option (default: true) + */ + private function showSelect($id, $name, $options = array(), $description = '', $onChange = '', $isHidden = false, $groupName = '', $hideDescription = true, $global = true) { + $optionList = ''; + $default = $global ? self::$settings->getGlobalOption ( $id ) : self::$settings->getOption ( $id ); + if (is_array ( $options )) + foreach ( $options as $key => $value ) + $optionList .= sprintf ( '', $key, $value ); + printf ( ' %s', $name, $id, $onChange, $optionList, $this->getDescription ( $id, $description, $hideDescription ) ); + } + + /** + * Show an info box + * + * @param string $type box style (e.g., updated, error) + * @param string $icon box icon, see https://developer.wordpress.org/resource/dashicons/ + * @param string $content box message + */ + private function showBox($type, $icon, $content) { + printf ( '

            %s

            ', $type, $icon, $content ); + } + + /** + * Show headline + * @param int $order headline order (h?-tag), set to 0 to avoid headline-tagging + * @param string $icon headline icon, see https://developer.wordpress.org/resource/dashicons/ + * @param string $headline headline text + * @param string $addPluginName set to true to add the plugin name to the headline (default: false) + */ + private function showHeadline($order, $icon, $headline, $addPluginName = false) { + echo $this->getHeadline ( $order, $icon, $headline, $addPluginName = false ); + } + + /** + * Get headline HTML + * + * @param int $order headline order (h?-tag), set to 0 to avoid headline-tagging + * @param string $icon headline icon, see https://developer.wordpress.org/resource/dashicons/ + * @param string $headline headline text + * @param string $addPluginName set to true to add the plugin name to the headline (default: false) + */ + private function getHeadline($order, $icon, $headline, $addPluginName = false) { + echo ($order > 0 ? "" : '') . sprintf ( ' %s%s', $icon, ($addPluginName ? self::$settings->getGlobalOption ( 'plugin_display_name' ) . ' ' : ''), __ ( $headline, 'wp-piwik' ) ) . ($order > 0 ? "" : ''); + } + + /** + * Show donation info + */ + private function showDonation() { + ?> +
            +

            + +

            +

            + +

            +
            + +
            +
            + Paypal +
            + + + + +
            +
            + +
            + +
            + +
            var $j = jQuery.noConflict();'; + } + + /** + * Show credits + */ + public function showCredits() { + ?> +

            : Marco L., Rolf W., Tobias U., Lars K., Donna F., Kevin D., Ramos S., Thomas M., John C., Andreas G., Ben M., Myra R. I., Carlos U. R.-S., Oleg I., M. N., Daniel K., James L., Jochen K., Cyril P., Thomas K., Patrik K., Zach, Sebastian W., Peakkom, Patrik K., Kati K., Helmut O., Valerie S., Jochen D., Atlas R., Harald W., Jan M., Addy K., Hans-Georg E.-B., Yvonne K., Andrew D., Nicolas, J., Andre M., Steve J., Jakub P., ditho.berlin, Robert R., Simon B., Grzegorz O., Bjarne O., !

            +

            jqPlot (License: GPL 2.0 and MIT) and jQuery Sparklines (License: New BSD License).','wp-piwik'); ?>

            +

            , !

            +

            +

            you for using my plugin. It is the best commendation if my piece of code is really used!','wp-piwik'); ?>

            + +

            +

            or cURL has to be available:', 'wp-piwik'); ?>

            +
              +
            1. '.(function_exists('curl_init')?'':__('not','wp-piwik')).' '; + _e('available','wp-piwik'); + ?>.
            2. +
            3. '.(ini_get('allow_url_fopen')?'':__('not','wp-piwik')).' '; + _e('enabled','wp-piwik'); + ?>.
            4. +
            5. getGlobalOption('http_connection') == 'curl') || (function_exists('curl_init') && !ini_get('allow_url_fopen')))?__('cURL', 'wp-piwik'):__('fopen', 'wp-piwik')).' ('.(self::$settings->getGlobalOption('http_method')=='post'?__('POST','wp-piwik'):__('GET','wp-piwik')).') '.__('is used.', 'wp-piwik'); ?>
            6. + getGlobalOption('piwik_mode') == 'php') { ?>
            7. '.(self::$settings->getGlobalOption('proxy_url')).''; + ?>
            8. +
            +

            :

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

            readRSSFeed('http://wordpress.org/support/rss/plugin/wp-piwik'); + if (!empty($supportThreads)) { + echo '
              '; + foreach ($supportThreads as $supportThread) + echo '
            1. '.$supportThread['title'].'
            2. '; + echo '
            '; + } + } + + /** + * Read RSS feed + * + * @param string $feed + * feed URL + * @param int $cnt + * item limit + * @return array feed items array[](title, url) + * + */ + private function readRSSFeed($feed, $cnt = 5) { + $result = array (); + if (function_exists ( 'simplexml_load_file' ) && ! empty ( $feed )) { + $xml = @simplexml_load_file ( $feed ); + if (! $xml || ! isset ( $xml->channel [0]->item )) + return array ( + array ( + 'title' => 'Can\'t read RSS feed.', + 'url' => $xml + ) + ); + foreach ( $xml->channel [0]->item as $item ) { + if ($cnt -- == 0) + break; + $result [] = array ( + 'title' => $item->title [0], + 'url' => $item->link [0] + ); + } + } + return $result; + } + + /** + * Clear cache and reset settings + * + * @param boolean $clearSettings set to true to reset settings (default: false) + */ + private function clear($clearSettings = false) { + if ($clearSettings) { + self::$settings->resetSettings(); + $this->showBox ( 'updated', 'yes', __ ( 'Settings cleared (except connection settings).' ) ); + } + global $wpdb; + if (self::$settings->checkNetworkActivation()) { + $aryBlogs = \WP_Piwik\Settings::getBlogList(); + if (is_array($aryBlogs)) + foreach ($aryBlogs as $aryBlog) { + switch_to_blog($aryBlog['blog_id']); + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_wp-piwik_%'"); + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_wp-piwik_%'"); + restore_current_blog(); + } + } else { + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_wp-piwik_%'"); + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_wp-piwik_%'"); + } + $this->showBox ( 'updated', 'yes', __ ( 'Cache cleared.' ) ); + } + + /** + * Execute test script and display results + */ + private function runTestscript() { ?> +
            +

            Testscript Result

            + isConfigured()) { + if (isset($_GET['testscript_id']) && $_GET['testscript_id']) + switch_to_blog((int) $_GET['testscript_id']); + ?> + + Please configure WP-Matomo first.

            '; + ?> +
            + wpPiwik = $wpPiwik; + if( isset($_POST['s']) ){ + $cnt = $this->prepare_items ($_POST['s']); + } else { + $cnt = $this->prepare_items (); + } + global $status, $page; + $this->showSearchForm(); + parent::__construct ( array ( + 'singular' => __ ( 'site', 'wp-piwik' ), + 'plural' => __ ( 'sites', 'wp-piwik' ), + 'ajax' => false + ) ); + if ($cnt > 0) + $this->display (); + else + echo '

            ' . __ ( 'No site configured yet.', 'wp-piwik' ) . '

            '; + } + + public function get_columns() { + $columns = array ( + 'id' => __ ( 'Blog ID', 'wp-piwik' ), + 'name' => __ ( 'Title', 'wp-piwik' ), + 'siteurl' => __ ( 'URL', 'wp-piwik' ), + 'piwikid' => __ ( 'Site ID (Piwik)', 'wp-piwik' ) + ); + return $columns; + } + + public function prepare_items($search = '') { + $current_page = $this->get_pagenum (); + $per_page = 10; + global $blog_id; + global $wpdb; + global $pagenow; + if (is_plugin_active_for_network ( 'wp-piwik/wp-piwik.php' )) { + $total_items = $wpdb->get_var ( $wpdb->prepare('SELECT COUNT(*) FROM ' . $wpdb->blogs . ' WHERE CONCAT(domain, path) LIKE "%%%s%%" AND spam = 0 AND deleted = 0', $search)); + $blogs = \WP_Piwik\Settings::getBlogList($per_page, $current_page, $search); + foreach ( $blogs as $blog ) { + $blogDetails = get_blog_details ( $blog['blog_id'], true ); + $this->data [] = array ( + 'name' => $blogDetails->blogname, + 'id' => $blogDetails->blog_id, + 'siteurl' => $blogDetails->siteurl, + 'piwikid' => $this->wpPiwik->getPiwikSiteId ( $blogDetails->blog_id ) + ); + } + } else { + $blogDetails = get_bloginfo (); + $this->data [] = array ( + 'name' => get_bloginfo ( 'name' ), + 'id' => '-', + 'siteurl' => get_bloginfo ( 'url' ), + 'piwikid' => $this->wpPiwik->getPiwikSiteId () + ); + $total_items = 1; + } + $columns = $this->get_columns (); + $hidden = array (); + $sortable = array (); + $this->_column_headers = array ( + $columns, + $hidden, + $sortable + ); + $this->set_pagination_args ( array ( + 'total_items' => $total_items, + 'per_page' => $per_page + ) ); + foreach ( $this->data as $key => $dataset ) { + if (empty ( $dataset ['piwikid'] ) || $dataset ['piwikid'] == 'n/a') + $this->data [$key] ['piwikid'] = __ ( 'Site not created yet.', 'wp-piwik' ); + if ($this->wpPiwik->isNetworkMode ()) + $this->data [$key] ['name'] = '' . $dataset ['name'] . ''; + } + $this->items = $this->data; + return count ( $this->items ); + } + + public function column_default($item, $column_name) { + switch ($column_name) { + case 'id' : + case 'name' : + case 'siteurl' : + case 'piwikid' : + return $item [$column_name]; + default : + return print_r ( $item, true ); + } + } + + private function showSearchForm() { + ?> +
            + + search_box('Search domain and path', 'wpPiwikSiteSearch'); ?> +
            + getGlobalOption('disable_timelimit')) set_time_limit(0); + echo '
            '; + echo '

            '.(self::$settings->getGlobalOption('plugin_display_name') == 'WP-Piwik'?'Piwik '.__('Statistics', 'wp-piwik'):self::$settings->getGlobalOption('plugin_display_name')).'

            '; + if (self::$settings->checkNetworkActivation() && function_exists('is_super_admin') && is_super_admin()) { + + if (isset($_GET['wpmu_show_stats'])) { + switch_to_blog((int) $_GET['wpmu_show_stats']); + } elseif ((isset($_GET['overview']) && $_GET['overview']) || (function_exists('is_network_admin') && is_network_admin())) { + new \WP_Piwik\Admin\Sitebrowser(self::$wpPiwik); + return; + } + echo '

            '.__('Currently shown stats:').' '.get_bloginfo('name').'.'.' Show site overview.

            '; + echo ''."\n"; + } + echo '
            '; + wp_nonce_field('wp-piwik_stats-general'); + wp_nonce_field('closedpostboxes', 'closedpostboxesnonce', false); + wp_nonce_field('meta-box-order', 'meta-box-order-nonce', false); + $columns = array('normal', 'side', 'column3'); + for ($i = 0; $i < 3; $i++) { + echo '
            '; + do_meta_boxes(self::$wpPiwik->statsPageId, $columns[$i], null); + echo '
            '; + } + echo '
            '; + echo ''."\n"; + if (self::$settings->checkNetworkActivation() && function_exists('is_super_admin') && is_super_admin()) { + restore_current_blog(); + } + } + + public function printAdminScripts() { + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot', self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery'), self::$wpPiwik->getPluginVersion()); + } + + public function extendAdminHeader() { + echo ''; + echo ''; + echo ''; + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger.php new file mode 100644 index 0000000..d016661 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger.php @@ -0,0 +1,47 @@ +setName($loggerName); + $this->setStartMicrotime(microtime(true)); + $this->log('Logging started -------------------------------'); + } + + public function __destruct() { + $this->log('Logging finished ------------------------------'); + } + + public function log($loggerMessage) { + $this->loggerOutput($this->getElapsedMicrotime(), $loggerMessage); + } + + private function setName($loggerName) { + $this->loggerName = $loggerName; + } + + public function getName() { + return $this->loggerName; + } + + private function setStartMicrotime($startMicrotime) { + $this->startMicrotime = $startMicrotime; + } + + public function getStartMicrotime() { + return $this->startMicrotime; + } + + public function getElapsedMicrotime() { + return microtime(true) - $this->getStartMicrotime(); + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php new file mode 100644 index 0000000..211c871 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php @@ -0,0 +1,9 @@ +loggerFile = WP_PIWIK_PATH.'logs'.DIRECTORY_SEPARATOR. + date('Ymd').'_'.$this->encodeFilename($this->getName()).'.log'; + } + + private function getFilename() { + return $this->loggerFile; + } + + private function openFile() { + if (!$this->loggerFile) + $this->setFilename(); + return fopen($this->getFilename(), 'a'); + } + + private function closeFile($fileHandle) { + fclose($fileHandle); + } + + private function writeFile($fileHandle, $fileContent) { + fwrite($fileHandle, $fileContent."\n"); + } + + private function formatMicrotime($loggerTime) { + return sprintf('[%6s sec]',number_format($loggerTime,3)); + } + + public function loggerOutput($loggerTime, $loggerMessage) { + if ($fileHandle = $this->openFile()) { + $this->writeFile($fileHandle, $this->formatMicrotime($loggerTime).' '.$loggerMessage); + $this->closeFile($fileHandle); + } + } + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php new file mode 100644 index 0000000..88afa23 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php @@ -0,0 +1,27 @@ +logs[] = $this->formatMicrotime($loggerTime).' '.$loggerMessage; + } + + public function echoResults() { + echo '
            ';
            +			print_r($this->logs);
            +			echo '
            '; + } + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php new file mode 100644 index 0000000..c26e229 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php @@ -0,0 +1,95 @@ + $method, 'parameter' => $parameter); + return $id; + } + + private static function parameterToString($parameter) { + $return = ''; + if (is_array($parameter)) + foreach ($parameter as $key => $value) + $return .= '&'.$key.'='.$value; + return $return; + } + + public function perform($id) { + if ( self::$settings->getGlobalOption('cache') && false !== ( $cached = get_transient( 'wp-piwik_c_'.md5(self::$isCacheable[$id] ) ) ) ) { + if (!empty ( $cached ) && !(! empty ( $cached['result'] ) && $cached['result'] == 'error') ) { + self::$wpPiwik->log("Deliver cached data: ".$id); + return $cached; + } + } + self::$wpPiwik->log("Perform request: ".$id); + if (!isset(self::$requests[$id])) + return array('result' => 'error', 'message' => 'Request '.$id.' was not registered.'); + elseif (!isset(self::$results[$id])) { + $this->request($id); + } + if ( isset ( self::$results[$id] ) ) { + if ( self::$settings->getGlobalOption('cache') && self::$isCacheable[$id] ) { + set_transient( 'wp-piwik_c_'.md5(self::$isCacheable[$id]) , self::$results[$id], WEEK_IN_SECONDS ); + } + return self::$results[$id]; + } else return false; + } + + public function getDebug($id) { + return isset( self::$debug[$id] )? self::$debug[$id] : false; + } + + protected function buildURL($config, $urlDecode = false) { + $url = 'method='.($config['method']).'&idSite='.self::$settings->getOption('site_id'); + foreach ($config['parameter'] as $key => $value) + $url .= '&'.$key.'='.($urlDecode?urldecode($value):$value); + return $url; + } + + protected function unserialize($str) { + self::$wpPiwik->log("Result string: ".$str); + return ($str == json_decode(false, true) || @json_decode($str, true) !== false)?json_decode($str, true):array(); + } + + public static function getLastError() { + return self::$lastError; + } + + abstract protected function request($id); + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php new file mode 100644 index 0000000..bbd4d38 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php @@ -0,0 +1,55 @@ +getGlobalOption('piwik_url'); + foreach (self::$requests as $requestID => $config) { + if (!isset(self::$results[$requestID])) { + if (self::$settings->getGlobalOption('filter_limit') != "" && self::$settings->getGlobalOption('filter_limit') == (int) self::$settings->getGlobalOption('filter_limit')) + $config['parameter']['filter_limit'] = self::$settings->getGlobalOption('filter_limit'); + $params = 'module=API&format=json&'.$this->buildURL($config, true); + $map[$count] = $requestID; + $result = $this->call($id, $url, $params); + self::$results[$map[$count]] = $result; + $count++; + } + } + } + + private function call($id, $url, $params) { + if (!defined('PIWIK_INCLUDE_PATH')) + return false; + if (PIWIK_INCLUDE_PATH === FALSE) + return array('result' => 'error', 'message' => __('Could not resolve','wp-piwik').' "'.htmlentities(self::$settings->getGlobalOption('piwik_path')).'": '.__('realpath() returns false','wp-piwik').'.'); + if (file_exists(PIWIK_INCLUDE_PATH . "/index.php")) + require_once PIWIK_INCLUDE_PATH . "/index.php"; + if (file_exists(PIWIK_INCLUDE_PATH . "/core/API/Request.php")) + require_once PIWIK_INCLUDE_PATH . "/core/API/Request.php"; + if (class_exists('\Piwik\Application\Environment') && !self::$piwikEnvironment) { + // Piwik 2.14.* compatibility fix + self::$piwikEnvironment = new \Piwik\Application\Environment(null); + self::$piwikEnvironment->init(); + } + if (class_exists('Piwik\FrontController')) + \Piwik\FrontController::getInstance()->init(); + else return array('result' => 'error', 'message' => __('Class Piwik\FrontController does not exists.','wp-piwik')); + if (class_exists('Piwik\API\Request')) + $request = new \Piwik\API\Request($params.'&token_auth='.self::$settings->getGlobalOption('piwik_token')); + else return array('result' => 'error', 'message' => __('Class Piwik\API\Request does not exists.','wp-piwik')); + if (isset($request)) + $result = $request->process(); + else $result = null; + if (!headers_sent()) + header("Content-Type: text/html", true); + $result = $this->unserialize($result); + if ($GLOBALS ['wp-piwik_debug']) + self::$debug[$id] = array ( $params.'&token_auth=...' ); + return $result; + } + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php new file mode 100644 index 0000000..198ad84 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php @@ -0,0 +1,81 @@ +getGlobalOption('piwik_mode') == 'http') + $url = self::$settings->getGlobalOption('piwik_url'); + else if (self::$settings->getGlobalOption('piwik_mode') == 'cloud') + $url = 'https://'.self::$settings->getGlobalOption('piwik_user').'.innocraft.cloud/'; + else $url = 'https://'.self::$settings->getGlobalOption('matomo_user').'.matomo.cloud/'; + $params = 'module=API&method=API.getBulkRequest&format=json'; + if (self::$settings->getGlobalOption('filter_limit') != "" && self::$settings->getGlobalOption('filter_limit') == (int) self::$settings->getGlobalOption('filter_limit')) + $params .= '&filter_limit='.self::$settings->getGlobalOption('filter_limit'); + foreach (self::$requests as $requestID => $config) { + if (!isset(self::$results[$requestID])) { + $params .= '&urls['.$count.']='.urlencode($this->buildURL($config)); + $map[$count] = $requestID; + $count++; + } + } + $results = ((function_exists('curl_init') && ini_get('allow_url_fopen') && self::$settings->getGlobalOption('http_connection') == 'curl') || (function_exists('curl_init') && !ini_get('allow_url_fopen')))?$this->curl($id, $url, $params):$this->fopen($id, $url, $params); + if (is_array($results)) + foreach ($results as $num => $result) + if (isset($map[$num])) + self::$results[$map[$num]] = $result; + } + + private function curl($id, $url, $params) { + if (self::$settings->getGlobalOption('http_method')=='post') { + $c = curl_init($url); + curl_setopt($c, CURLOPT_POST, 1); + curl_setopt($c, CURLOPT_POSTFIELDS, $params.'&token_auth='.self::$settings->getGlobalOption('piwik_token')); + } else $c = curl_init($url.'?'.$params.'&token_auth='.self::$settings->getGlobalOption('piwik_token')); + curl_setopt($c, CURLOPT_SSL_VERIFYPEER, !self::$settings->getGlobalOption('disable_ssl_verify')); + curl_setopt($c, CURLOPT_SSL_VERIFYHOST, !self::$settings->getGlobalOption('disable_ssl_verify_host')?2:0); + curl_setopt($c, CURLOPT_USERAGENT, self::$settings->getGlobalOption('piwik_useragent')=='php'?ini_get('user_agent'):self::$settings->getGlobalOption('piwik_useragent_string')); + curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($c, CURLOPT_HEADER, $GLOBALS ['wp-piwik_debug'] ); + curl_setopt($c, CURLOPT_TIMEOUT, self::$settings->getGlobalOption('connection_timeout')); + $httpProxyClass = new \WP_HTTP_Proxy(); + if ($httpProxyClass->is_enabled() && $httpProxyClass->send_through_proxy($url)) { + curl_setopt($c, CURLOPT_PROXY, $httpProxyClass->host()); + curl_setopt($c, CURLOPT_PROXYPORT, $httpProxyClass->port()); + if ($httpProxyClass->use_authentication()) + curl_setopt($c, CURLOPT_PROXYUSERPWD, $httpProxyClass->username().':'.$httpProxyClass->password()); + } + $result = curl_exec($c); + self::$lastError = curl_error($c); + if ($GLOBALS ['wp-piwik_debug']) { + $header_size = curl_getinfo($c, CURLINFO_HEADER_SIZE); + $header = substr($result, 0, $header_size); + $body = substr($result, $header_size); + $result = $this->unserialize($body); + self::$debug[$id] = array ( $header, $url.'?'.$params.'&token_auth=...' ); + } else $result = $this->unserialize($result); + curl_close($c); + return $result; + } + + private function fopen($id, $url, $params) { + $contextDefinition = array('http'=>array('timeout' => self::$settings->getGlobalOption('connection_timeout'), 'header' => "Content-type: application/x-www-form-urlencoded\r\n") ); + $contextDefinition['ssl'] = array(); + if (self::$settings->getGlobalOption('disable_ssl_verify')) + $contextDefinition['ssl'] = array('allow_self_signed' => true, 'verify_peer' => false ); + if (self::$settings->getGlobalOption('disable_ssl_verify_host')) + $contextDefinition['ssl']['verify_peer_name'] = false; + if (self::$settings->getGlobalOption('http_method')=='post') { + $fullUrl = $url; + $contextDefinition['http']['method'] = 'POST'; + $contextDefinition['http']['content'] = $params.'&token_auth='.self::$settings->getGlobalOption('piwik_token'); + } else $fullUrl = $url.'?'.$params.'&token_auth='.self::$settings->getGlobalOption('piwik_token'); + $context = stream_context_create($contextDefinition); + $result = $this->unserialize(@file_get_contents($fullUrl, false, $context)); + if ($GLOBALS ['wp-piwik_debug']) + self::$debug[$id] = array ( get_headers($fullUrl, 1), $url.'?'.$params.'&token_auth=...' ); + return $result; + } + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Settings.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Settings.php new file mode 100644 index 0000000..7c6060f --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Settings.php @@ -0,0 +1,408 @@ + 'checkPiwikUrl', + 'piwik_token' => 'checkPiwikToken', + 'site_id' => 'requestPiwikSiteID', + 'tracking_code' => 'prepareTrackingCode', + 'noscript_code' => 'prepareNocscriptCode' + ); + + /** + * + * @var Register default configuration set + */ + private $globalSettings = array ( + // Plugin settings + 'revision' => 0, + 'last_settings_update' => 0, + // User settings: Piwik configuration + 'piwik_mode' => 'http', + 'piwik_url' => '', + 'piwik_path' => '', + 'piwik_user' => '', + 'matomo_user' => '', + 'piwik_token' => '', + 'auto_site_config' => true, + // User settings: Stats configuration + 'default_date' => 'yesterday', + 'stats_seo' => false, + 'stats_ecommerce' => false, + 'dashboard_widget' => false, + 'dashboard_ecommerce' => false, + 'dashboard_chart' => false, + 'dashboard_seo' => false, + 'toolbar' => false, + 'capability_read_stats' => array ( + 'administrator' => true + ), + 'perpost_stats' => false, + 'plugin_display_name' => 'WP-Piwik', + 'piwik_shortcut' => false, + 'shortcodes' => false, + // User settings: Tracking configuration + 'track_mode' => 'disabled', + 'track_codeposition' => 'footer', + 'track_noscript' => false, + 'track_nojavascript' => false, + 'proxy_url' => '', + 'track_content' => 'disabled', + 'track_search' => false, + 'track_404' => false, + 'add_post_annotations' => array(), + 'add_customvars_box' => false, + 'add_download_extensions' => '', + 'set_download_extensions' => '', + 'set_link_classes' => '', + 'set_download_classes' => '', + 'disable_cookies' => false, + 'limit_cookies' => false, + 'limit_cookies_visitor' => 34186669, // Piwik default 13 months + 'limit_cookies_session' => 1800, // Piwik default 30 minutes + 'limit_cookies_referral' => 15778463, // Piwik default 6 months + 'track_admin' => false, + 'capability_stealth' => array (), + 'track_across' => false, + 'track_across_alias' => false, + 'track_crossdomain_linking' => false, + 'track_feed' => false, + 'track_feed_addcampaign' => false, + 'track_feed_campaign' => 'feed', + 'track_heartbeat' => 0, + 'track_user_id' => 'disabled', + // User settings: Expert configuration + 'cache' => true, + 'http_connection' => 'curl', + 'http_method' => 'post', + 'disable_timelimit' => false, + 'filter_limit' => '', + 'connection_timeout' => 5, + 'disable_ssl_verify' => false, + 'disable_ssl_verify_host' => false, + 'piwik_useragent' => 'php', + 'piwik_useragent_string' => 'WP-Piwik', + 'dnsprefetch' => false, + 'track_datacfasync' => false, + 'track_cdnurl' => '', + 'track_cdnurlssl' => '', + 'force_protocol' => 'disabled', + 'update_notice' => 'enabled' + ), $settings = array ( + 'name' => '', + 'site_id' => NULL, + 'noscript_code' => '', + 'tracking_code' => '', + 'last_tracking_code_update' => 0, + 'dashboard_revision' => 0 + ), $settingsChanged = false; + + /** + * Constructor class to prepare settings manager + * + * @param WP_Piwik $wpPiwik + * active WP-Piwik instance + */ + public function __construct($wpPiwik) { + self::$wpPiwik = $wpPiwik; + self::$wpPiwik->log ( 'Store default settings' ); + self::$defaultSettings = array ( + 'globalSettings' => $this->globalSettings, + 'settings' => $this->settings + ); + self::$wpPiwik->log ( 'Load settings' ); + foreach ( $this->globalSettings as $key => $default ) { + $this->globalSettings [$key] = ($this->checkNetworkActivation () ? get_site_option ( 'wp-piwik_global-' . $key, $default ) : get_option ( 'wp-piwik_global-' . $key, $default )); + } + foreach ( $this->settings as $key => $default ) + $this->settings [$key] = get_option ( 'wp-piwik-' . $key, $default ); + } + + /** + * Save all settings as WordPress options + */ + public function save() { + if (! $this->settingsChanged) { + self::$wpPiwik->log ( 'No settings changed yet' ); + return; + } + self::$wpPiwik->log ( 'Save settings' ); + foreach ( $this->globalSettings as $key => $value ) { + if ( $this->checkNetworkActivation() ) + update_site_option ( 'wp-piwik_global-' . $key, $value ); + else + update_option ( 'wp-piwik_global-' . $key, $value ); + } + foreach ( $this->settings as $key => $value ) { + update_option ( 'wp-piwik-' . $key, $value ); + } + global $wp_roles; + if (! is_object ( $wp_roles )) + $wp_roles = new \WP_Roles (); + if (! is_object ( $wp_roles )) + die ( "STILL NO OBJECT" ); + foreach ( $wp_roles->role_names as $strKey => $strName ) { + $objRole = get_role ( $strKey ); + foreach ( array ( + 'stealth', + 'read_stats' + ) as $strCap ) { + $aryCaps = $this->getGlobalOption ( 'capability_' . $strCap ); + if (isset ( $aryCaps [$strKey] ) && $aryCaps [$strKey]) + $wp_roles->add_cap ( $strKey, 'wp-piwik_' . $strCap ); + else $wp_roles->remove_cap ( $strKey, 'wp-piwik_' . $strCap ); + } + } + $this->settingsChanged = false; + } + + /** + * Get a global option's value + * + * @param string $key + * option key + * @return string option value + */ + public function getGlobalOption($key) { + return isset ( $this->globalSettings [$key] ) ? $this->globalSettings [$key] : self::$defaultSettings ['globalSettings'] [$key]; + } + + /** + * Get an option's value related to a specific blog + * + * @param string $key + * option key + * @param int $blogID + * blog ID (default: current blog) + * @return \WP_Piwik\Register + */ + public function getOption($key, $blogID = null) { + if ($this->checkNetworkActivation () && ! empty ( $blogID )) { + return get_blog_option ( $blogID, 'wp-piwik-'.$key ); + } + return isset ( $this->settings [$key] ) ? $this->settings [$key] : self::$defaultSettings ['settings'] [$key]; + } + + /** + * Set a global option's value + * + * @param string $key + * option key + * @param string $value + * new option value + */ + public function setGlobalOption($key, $value) { + $this->settingsChanged = true; + self::$wpPiwik->log ( 'Changed global option ' . $key . ': ' . (is_array ( $value ) ? serialize ( $value ) : $value) ); + $this->globalSettings [$key] = $value; + } + + /** + * Set an option's value related to a specific blog + * + * @param string $key + * option key + * @param int $blogID + * blog ID (default: current blog) + * @param string $value + * new option value + */ + public function setOption($key, $value, $blogID = null) { + $this->settingsChanged = true; + self::$wpPiwik->log ( 'Changed option ' . $key . ': ' . $value ); + if ($this->checkNetworkActivation () && ! empty ( $blogID )) { + add_blog_option ( $blogID, 'wp-piwik-'.$key, $value ); + } else + $this->settings [$key] = $value; + } + + /** + * Reset settings to default + */ + public function resetSettings() { + self::$wpPiwik->log ( 'Reset WP-Piwik settings' ); + global $wpdb; + if ( $this->checkNetworkActivation() ) { + $aryBlogs = self::getBlogList(); + if (is_array($aryBlogs)) + foreach ($aryBlogs as $aryBlog) { + switch_to_blog($aryBlog['blog_id']); + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE 'wp-piwik-%'"); + restore_current_blog(); + } + $wpdb->query("DELETE FROM $wpdb->sitemeta WHERE meta_key LIKE 'wp-piwik_global-%'"); + } + else $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE 'wp-piwik_global-%'"); + } + + /** + * Get blog list + */ + public static function getBlogList($limit = null, $page = null, $search = '') { + if ($limit && $page) + $queryLimit = ' LIMIT '.(int) (($page - 1) * $limit).','.(int) $limit; + global $wpdb; + return $wpdb->get_results($wpdb->prepare('SELECT blog_id FROM '.$wpdb->blogs.' WHERE CONCAT(domain, path) LIKE "%%%s%%" AND spam = 0 AND deleted = 0 ORDER BY blog_id'.$queryLimit, $search), ARRAY_A); + } + + /** + * Check if plugin is network activated + * + * @return boolean Is network activated? + */ + public function checkNetworkActivation() { + if (! function_exists ( "is_plugin_active_for_network" )) + require_once (ABSPATH . 'wp-admin/includes/plugin.php'); + return is_plugin_active_for_network ( 'wp-piwik/wp-piwik.php' ); + } + + /** + * Apply new configuration + * + * @param array $in + * new configuration set + */ + public function applyChanges($in) { + if (!self::$wpPiwik->isValidOptionsPost()) + die("Invalid config changes."); + $in = $this->checkSettings ( $in ); + self::$wpPiwik->log ( 'Apply changed settings:' ); + foreach ( self::$defaultSettings ['globalSettings'] as $key => $val ) + $this->setGlobalOption ( $key, isset ( $in [$key] ) ? $in [$key] : $val ); + foreach ( self::$defaultSettings ['settings'] as $key => $val ) + $this->setOption ( $key, isset ( $in [$key] ) ? $in [$key] : $val ); + $this->setGlobalOption ( 'last_settings_update', time () ); + $this->save (); + } + + /** + * Apply callback function on new settings + * + * @param array $in + * new configuration set + * @return array configuration set after callback functions were applied + */ + private function checkSettings($in) { + foreach ( $this->checkSettings as $key => $value ) + if (isset ( $in [$key] )) + $in [$key] = call_user_func_array ( array ( + $this, + $value + ), array ( + $in [$key], + $in + ) ); + return $in; + } + + /** + * Add slash to Piwik URL if necessary + * + * @param string $value + * Piwik URL + * @param array $in + * configuration set + * @return string Piwik URL + */ + private function checkPiwikUrl($value, $in) { + return substr ( $value, - 1, 1 ) != '/' ? $value . '/' : $value; + } + + /** + * Remove &token_auth= from auth token + * + * @param string $value + * Piwik auth token + * @param array $in + * configuration set + * @return string Piwik auth token + */ + private function checkPiwikToken($value, $in) { + return str_replace ( '&token_auth=', '', $value ); + } + + /** + * Request the site ID (if not set before) + * + * @param string $value + * tracking code + * @param array $in + * configuration set + * @return int Piwik site ID + */ + private function requestPiwikSiteID($value, $in) { + if ($in ['auto_site_config'] && ! $value) + return self::$wpPiwik->getPiwikSiteId(); + return $value; + } + + /** + * Prepare the tracking code + * + * @param string $value + * tracking code + * @param array $in + * configuration set + * @return string tracking code + */ + private function prepareTrackingCode($value, $in) { + if ($in ['track_mode'] == 'manually' || $in ['track_mode'] == 'disabled') { + $value = stripslashes ( $value ); + if ($this->checkNetworkActivation ()) + add_site_option ( 'wp-piwik-manually', $value ); + return $value; + } + /*$result = self::$wpPiwik->updateTrackingCode (); + echo '
            '; print_r($result); echo '
            '; + $this->setOption ( 'noscript_code', $result ['noscript'] );*/ + return; // $result ['script']; + } + + /** + * Prepare the nocscript code + * + * @param string $value + * noscript code + * @param array $in + * configuration set + * @return string noscript code + */ + private function prepareNocscriptCode($value, $in) { + if ($in ['track_mode'] == 'manually') + return stripslashes ( $value ); + return $this->getOption ( 'noscript_code' ); + } + + /** + * Get debug data + * + * @return array WP-Piwik settings for debug output + */ + public function getDebugData() { + $debug = array( + 'global_settings' => $this->globalSettings, + 'settings' => $this->settings + ); + $debug['global_settings']['piwik_token'] = !empty($debug['global_settings']['piwik_token'])?'set':'not set'; + return $debug; + } +} diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php new file mode 100644 index 0000000..c2c9ee5 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php @@ -0,0 +1,28 @@ + 'OptOut', + 'post' => 'Post', + 'overview' => 'Overview' + ), $content; + + public function __construct($attributes, $wpPiwik, $settings) { + $wpPiwik->log('Check requested shortcode widget '.$attributes['module']); + if (isset($attributes['module']) && isset($this->available[$attributes['module']])) { + $wpPiwik->log('Add shortcode widget '.$this->available[$attributes['module']]); + $class = '\\WP_Piwik\\Widget\\'.$this->available[$attributes['module']]; + $widget = new $class($wpPiwik, $settings, null, null, null, $attributes, true); + $widget->show(); + $this->content = $widget->get(); + } + } + + public function get() { + return $this->content; + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Template.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Template.php new file mode 100644 index 0000000..8342a10 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Template.php @@ -0,0 +1,31 @@ +'.$name.''.$value.''; + } + + public function getRangeLast30() { + $diff = (self::$settings->getGlobalOption('default_date') == 'yesterday') ? -86400 : 0; + $end = time() + $diff; + $start = time() - 2592000 + $diff; + return date('Y-m-d', $start).','.date('Y-m-d', $end); + } + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php new file mode 100644 index 0000000..9f8b5ce --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php @@ -0,0 +1,63 @@ + + + + + + + + + + +
            +

            . (.)

            + post_type); + // Check if the current user has permission to edit the post. + if (!current_user_can($objPostType->cap->edit_post, $intID)) + return $intID; + $aryNames = array('cat', 'val'); + for ($i = 1; $i <= 5; $i++) + for ($j = 0; $j <= 1; $j++) { + // Get data + $strMetaVal = (isset($_POST['wp-piwik_custom_'.$aryNames[$j].$i])?htmlentities($_POST['wp-piwik_custom_'.$aryNames[$j].$i]):''); + // Create key + $strMetaKey = 'wp-piwik_custom_'.$aryNames[$j].$i; + // Get the meta value of the custom field key + $strCurVal = get_post_meta($intID, $strMetaKey, true); + // Add meta val: + if ($strMetaVal && '' == $strCurVal) + add_post_meta($intID, $strMetaKey, $strMetaVal, true); + // Update meta val: + elseif ($strMetaVal && $strMetaVal != $strCurVal) + update_post_meta($intID, $strMetaKey, $strMetaVal); + // Delete meta val: + elseif (''==$strMetaVal && $strCurVal) + delete_post_meta($intID, $strMetaKey, $strCurVal); + } + } + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php new file mode 100644 index 0000000..de80b8d --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php @@ -0,0 +1,150 @@ +isCurrentTrackingCode () || ! self::$wpPiwik->getOption ( 'tracking_code' ) || strpos( self::$wpPiwik->getOption ( 'tracking_code' ), '{"result":"error",' ) !== false ) + self::$wpPiwik->updateTrackingCode (); + $this->trackingCode = (self::$wpPiwik->isNetworkMode () && self::$wpPiwik->getGlobalOption ( 'track_mode' ) == 'manually') ? get_site_option ( 'wp-piwik-manually' ) : self::$wpPiwik->getOption ( 'tracking_code' ); + } + + public function getTrackingCode() { + if ($this->isUsertracking) + $this->applyUserTracking (); + if ($this->is404) + $this->apply404Changes (); + if ($this->isSearch) + $this->applySearchChanges (); + if (is_single () || is_page()) + $this->addCustomValues (); + $this->trackingCode = apply_filters('wp-piwik_tracking_code', $this->trackingCode); + return $this->trackingCode; + } + + public static function prepareTrackingCode($code, $settings, $logger) { + global $current_user; + $logger->log ( 'Apply tracking code changes:' ); + $settings->setOption ( 'last_tracking_code_update', time () ); + if (preg_match ( '/var u="([^"]*)";/', $code, $hits )) { + $fetchedProxyUrl = $hits [1]; + } else $fetchedProxyUrl = ''; + if ($settings->getGlobalOption ( 'track_mode' ) == 'js') + $code = str_replace ( array ( + 'piwik.js', + 'piwik.php' + ), 'js/index.php', $code ); + elseif ($settings->getGlobalOption ( 'track_mode' ) == 'proxy') { + $code = str_replace ( 'piwik.js', 'piwik.php', $code ); + $proxy = str_replace ( array ( + 'https://', + 'http://' + ), '//', plugins_url ( 'wp-piwik' ) . '/proxy' ) . '/'; + $code = preg_replace ( '/var u="([^"]*)";/', 'var u="' . $proxy . '"', $code ); + $code = preg_replace ( '/img src="([^"]*)piwik.php/', 'img src="' . $proxy . 'piwik.php', $code ); + } + if ($settings->getGlobalOption ( 'track_cdnurl' ) || $settings->getGlobalOption ( 'track_cdnurlssl' )) + $code = str_replace ( array ( + "var d=doc", + "g.src=u+" + ), array ( + "var ucdn=(('https:' == document.location.protocol) ? 'https://" . ($settings->getGlobalOption ( 'track_cdnurlssl' ) ? $settings->getGlobalOption ( 'track_cdnurlssl' ) : $settings->getGlobalOption ( 'track_cdnurl' )) . "/' : 'http://" . ($settings->getGlobalOption ( 'track_cdnurl' ) ? $settings->getGlobalOption ( 'track_cdnurl' ) : $settings->getGlobalOption ( 'track_cdnurlssl' )) . "/');\nvar d=doc", + "g.src=ucdn+" + ), $code ); + + if ($settings->getGlobalOption ( 'track_datacfasync' )) + $code = str_replace ( '' ); + } + + /** + * Return an array value by key, return '-' if not set + * + * @param array $array + * array to get a value from + * @param string $key + * key of the value to get from array + * @return string found value or '-' as a placeholder + */ + protected function value($array, $key) { + return (isset ( $array [$key] ) ? $array [$key] : '-'); + } +} \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/BrowserDetails.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/BrowserDetails.php new file mode 100644 index 0000000..a065e1c --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/BrowserDetails.php @@ -0,0 +1,77 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Browser Details', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'DevicesDetection.getBrowserVersions'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Browser', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php new file mode 100644 index 0000000..f974685 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php @@ -0,0 +1,80 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Browsers', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'DevicesDetection.getBrowsers'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Browser', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + elseif ($count == $this->limit) { + $class['Others'] = $js['Others'] = ''; + } + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php new file mode 100644 index 0000000..62d4c70 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php @@ -0,0 +1,78 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => isset($params['period'])?$params['period']:$timeSettings['period'], + 'date' => 'last'.($timeSettings['period']=='day'?'30':'12'), + 'limit' => null + ); + $this->title = $prefix.__('Visitors', 'wp-piwik').' ('.__($this->rangeName(),'wp-piwik').')'; + $this->method = array('VisitsSummary.getVisits', 'VisitsSummary.getUniqueVisitors', 'VisitsSummary.getBounceCount', 'VisitsSummary.getActions'); + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = array(); + $success = true; + foreach ($this->method as $method) { + $response[$method] = self::$wpPiwik->request($this->apiID[$method]); + if (!empty($response[$method]['result']) && $response[$method]['result'] ='error') + $success = false; + } + if (!$success) + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response[$method]['message'], ENT_QUOTES, 'utf-8'); + else { + $values = $labels = $bounced = $unique = ''; + $count = $uniqueSum = 0; + if (is_array($response['VisitsSummary.getVisits'])) + foreach ($response['VisitsSummary.getVisits'] as $date => $value) { + $count++; + $values .= $value.','; + $unique .= $response['VisitsSummary.getUniqueVisitors'][$date].','; + $bounced .= $response['VisitsSummary.getBounceCount'][$date].','; + if ($this->parameter['period'] == 'week') { + preg_match("/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/", $date, $dateList); + $textKey = $this->dateFormat($dateList[0], 'short_week'); + } else $textKey = substr($date, -2); + $labels .= '['.$count.',"'.$textKey.'"],'; + $uniqueSum += $response['VisitsSummary.getActions'][$date]; + } + else { + $values = '0,'; + $labels = '[0,"-"],'; + $unique = '0,'; + $bounced = '0,'; + } + $average = round($uniqueSum/30,0); + $values = substr($values, 0, -1); + $unique = substr($unique, 0, -1); + $labels = substr($labels, 0, -1); + $bounced = substr($bounced, 0, -1); + echo '
            '; + echo ''; + } + } + + } diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/City.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/City.php new file mode 100644 index 0000000..d041ed8 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/City.php @@ -0,0 +1,80 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Countries', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'UserCountry.getCity'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('City', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + elseif ($count == $this->limit) { + $class['Others'] = $js['Others'] = ''; + } + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php new file mode 100644 index 0000000..90108f5 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php @@ -0,0 +1,80 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Countries', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'UserCountry.getCountry '; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Country', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + elseif ($count == $this->limit) { + $class['Others'] = $js['Others'] = ''; + } + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php new file mode 100644 index 0000000..af0dafa --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php @@ -0,0 +1,45 @@ +getTimeSettings(); + $this->title = $prefix.__('E-Commerce', 'wp-piwik'); + $this->method = 'Goals.get'; + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = null; + $tableBody = array( + array(__('Conversions', 'wp-piwik').':', $this->value($response, 'nb_conversions')), + array(__('Visits converted', 'wp-piwik').':', $this->value($response, 'nb_visits_converted')), + array(__('Revenue', 'wp-piwik').':', number_format($this->value($response, 'revenue'),2)), + array(__('Conversion rate', 'wp-piwik').':', $this->value($response, 'conversion_rate')), + array(__('Conversions (new visitor)', 'wp-piwik').':', $this->value($response, 'nb_conversions_new_visit')), + array(__('Visits converted (new visitor)', 'wp-piwik').':', $this->value($response, 'nb_visits_converted_new_visit')), + array(__('Revenue (new visitor)', 'wp-piwik').':', number_format($this->value($response, 'revenue_new_visit'),2)), + array(__('Conversion rate (new visitor)', 'wp-piwik').':', $this->value($response, 'conversion_rate_new_visit')), + array(__('Conversions (returning visitor)', 'wp-piwik').':', $this->value($response, 'nb_conversions_returning_visit')), + array(__('Visits converted (returning visitor)', 'wp-piwik').':', $this->value($response, 'nb_visits_converted_returning_visit')), + array(__('Revenue (returning visitor)', 'wp-piwik').':', number_format($this->value($response, 'revenue_returning_visit'),2)), + array(__('Conversion rate (returning visitor)', 'wp-piwik').':', $this->value($response, 'conversion_rate_returning_visit')), + ); + $tableFoot = (self::$settings->getGlobalOption('piwik_shortcut')?array(__('Shortcut', 'wp-piwik').':', 'Piwik'.(isset($aryConf['inline']) && $aryConf['inline']?' - WP-Piwik':'')):null); + $this->table($tableHead, $tableBody, $tableFoot); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php new file mode 100644 index 0000000..e339cac --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php @@ -0,0 +1,52 @@ +getTimeSettings(); + $this->title = $prefix.__('E-Commerce Items', 'wp-piwik'); + $this->method = 'Goals.getItemsName'; + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array( + __('Label', 'wp-piwik'), + __('Revenue', 'wp-piwik'), + __('Quantity', 'wp-piwik'), + __('Orders', 'wp-piwik'), + __('Avg. price', 'wp-piwik'), + __('Avg. quantity', 'wp-piwik'), + __('Conversion rate', 'wp-piwik'), + ); + $tableBody = array(); + if (is_array($response)) + foreach ($response as $data) { + array_push($tableBody, array( + $data['label'], + number_format($data['revenue'],2), + $data['quantity'], + $data['orders'], + number_format($data['avg_price'],2), + $data['avg_quantity'], + $data['conversion_rate'] + )); + } + $tableFoot = array(); + $this->table($tableHead, $tableBody, $tableFoot); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php new file mode 100644 index 0000000..2ed58ae --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php @@ -0,0 +1,52 @@ +getTimeSettings(); + $this->title = $prefix.__('E-Commerce Item Categories', 'wp-piwik'); + $this->method = 'Goals.getItemsCategory'; + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array( + __('Label', 'wp-piwik'), + __('Revenue', 'wp-piwik'), + __('Quantity', 'wp-piwik'), + __('Orders', 'wp-piwik'), + __('Avg. price', 'wp-piwik'), + __('Avg. quantity', 'wp-piwik'), + __('Conversion rate', 'wp-piwik'), + ); + $tableBody = array(); + if (is_array($response)) + foreach ($response as $data) { + array_push($tableBody, array( + $data['label'], + isset($data['revenue'])?number_format($data['revenue'],2):"-.--", + isset($data['quantity'])?$data['quantity']:'-', + isset($data['orders'])?$data['orders']:'-', + number_format($data['avg_price'],2), + $data['avg_quantity'], + $data['conversion_rate'] + )); + } + $tableFoot = array(); + $this->table($tableHead, $tableBody, $tableFoot); + } + } + +} \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php new file mode 100644 index 0000000..bb50c0c --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php @@ -0,0 +1,21 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Keywords', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'Referrers.getKeywords'; + $this->name = 'Keyword'; + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php new file mode 100644 index 0000000..089b506 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php @@ -0,0 +1,80 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Models', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'DevicesDetection.getModel'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Model', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + elseif ($count == $this->limit) { + $class['Others'] = $js['Others'] = ''; + } + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php new file mode 100644 index 0000000..11b7c31 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php @@ -0,0 +1,38 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Site Search', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'Actions.getSiteSearchNoResultKeywords'; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Keyword', 'wp-piwik'), __('Requests', 'wp-piwik'), __('Bounced', 'wp-piwik')); + $tableBody = array(); + $count = 0; + if (is_array($response)) + foreach ($response as $row) { + $count++; + $tableBody[] = array($row['label'], $row['nb_visits'], $row['bounce_rate']); + if ($count == 10) break; + } + $this->table($tableHead, $tableBody, null); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php new file mode 100644 index 0000000..deaf018 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php @@ -0,0 +1,31 @@ +parameter = $params; + } + + public function show() { + $protocol = (isset ( $_SERVER ['HTTPS'] ) && $_SERVER ['HTTPS'] != 'off') ? 'https' : 'http'; + switch (self::$settings->getGlobalOption ( 'piwik_mode' )) { + case 'php' : + $PIWIK_URL = $protocol . ':' . self::$settings->getGlobalOption ( 'proxy_url' ); + break; + case 'cloud' : + $PIWIK_URL = 'https://' . self::$settings->getGlobalOption ( 'piwik_user' ) . '.innocraft.cloud/'; + break; + case 'cloud-matomo': + $PIWIK_URL = 'https://' . self::$settings->getGlobalOption ( 'matomo_user' ) . '.matomo.cloud/'; + break; + default : + $PIWIK_URL = self::$settings->getGlobalOption ( 'piwik_url' ); + } + $this->out ( '' ); + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php new file mode 100644 index 0000000..e47e9f3 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php @@ -0,0 +1,63 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => isset($params['period'])?$params['period']:$timeSettings['period'], + 'date' => isset($params['date'])?$params['date']: $timeSettings['date'], + 'description' => $timeSettings['description'] + ); + $this->title = !$this->isShortcode?$prefix.__('Overview', 'wp-piwik').' ('.__($this->pageId == 'dashboard'?$this->rangeName():$timeSettings['description'],'wp-piwik').')':($params['title']?$params['title']:''); + $this->method = 'VisitsSummary.get'; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + if ($this->parameter['date'] == 'last30') { + $result = array(); + if (is_array($response)) { + foreach ($response as $data) + foreach ($data as $key => $value) + if (isset($result[$key]) && is_numeric($value)) + $result[$key] += $value; + elseif (is_numeric($value)) + $result[$key] = $value; + else + $result[$key] = 0; + if (isset($result['nb_visits']) && $result['nb_visits'] > 0) { + $result['nb_actions_per_visit'] = round($result['nb_actions'] / $result['nb_visits'], 1); + $result['bounce_rate'] = round($result['bounce_count'] / $result['nb_visits'] * 100, 1) . '%'; + $result['avg_time_on_site'] = round($result['sum_visit_length'] / $result['nb_visits'], 0); + } else $result['nb_actions_per_visit'] = $result['bounce_rate'] = $result['avg_time_on_site'] = 0; + } + $response = $result; + } + $time = isset($response['sum_visit_length'])?$this->timeFormat($response['sum_visit_length']):'-'; + $avgTime = isset($response['avg_time_on_site'])?$this->timeFormat($response['avg_time_on_site']):'-'; + $tableHead = null; + $tableBody = array(array(__('Visitors', 'wp-piwik').':', $this->value($response, 'nb_visits'))); + if ($this->value($response, 'nb_uniq_visitors') != '-') + array_push($tableBody, array(__('Unique visitors', 'wp-piwik').':', $this->value($response, 'nb_uniq_visitors'))); + array_push($tableBody, + array(__('Page views', 'wp-piwik').':', $this->value($response, 'nb_actions').' (Ø '.$this->value($response, 'nb_actions_per_visit').')'), + array(__('Total time spent', 'wp-piwik').':', $time.' (Ø '.$avgTime.')'), + array(__('Bounce count', 'wp-piwik').':', $this->value($response, 'bounce_count').' ('.$this->value($response, 'bounce_rate').')') + ); + if ($this->parameter['date'] != 'last30') + array_push($tableBody, array(__('Time/visit', 'wp-piwik').':', $avgTime), array(__('Max. page views in one visit', 'wp-piwik').':', $this->value($response, 'max_actions'))); + $tableFoot = (self::$settings->getGlobalOption('piwik_shortcut')?array(__('Shortcut', 'wp-piwik').':', 'Piwik'.(isset($aryConf['inline']) && $aryConf['inline']?' - WP-Piwik':'')):null); + $this->table($tableHead, $tableBody, $tableFoot); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php new file mode 100644 index 0000000..0b16ea5 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php @@ -0,0 +1,21 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Pages', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'Actions.getPageTitles'; + $this->name = __('Page', 'wp-piwik' ); + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php new file mode 100644 index 0000000..a5c7b92 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php @@ -0,0 +1,38 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Plugins', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'DevicePlugins.getPlugin'; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Plugin', 'wp-piwik'), __('Visits', 'wp-piwik'), __('Percent', 'wp-piwik')); + $tableBody = array(); + $count = 0; + if (is_array($response)) + foreach ($response as $row) { + $count++; + $tableBody[] = array($row['label'], $row['nb_visits'], $row['nb_visits_percentage']); + if ($count == 10) break; + } + $this->table($tableHead, $tableBody, null); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php new file mode 100644 index 0000000..1ec86a2 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php @@ -0,0 +1,51 @@ +parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => 'range', + 'date' => isset($params['range'])?$params['range']:'last30', + 'key' => isset($params['key'])?$params['key']:null, + 'pageUrl' => isset($params['url'])?$params['url']:urlencode(get_permalink($post->ID)), + ); + $this->title = $prefix.__('Overview', 'wp-piwik').' ('.__($this->parameter['date'],'wp-piwik').')'; + $this->method = 'Actions.getPageUrl'; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + if (isset($response[0])) + $response = $response[0]; + if ($this->parameter['key']) { + $this->out(isset($response[$this->parameter['key']])?$response[$this->parameter['key']]:'not defined'); + return; + } + $time = isset($response['entry_sum_visit_length'])?$this->timeFormat($response['entry_sum_visit_length']):'-'; + $avgTime = isset($response['avg_time_on_page'])?$this->timeFormat($response['avg_time_on_page']):'-'; + $tableHead = null; + $tableBody = array( + array(__('Visitors', 'wp-piwik').':', $this->value($response, 'nb_visits')), + array(__('Unique visitors', 'wp-piwik').':', $this->value($response, 'sum_daily_nb_uniq_visitors')), + array(__('Page views', 'wp-piwik').':', $this->value($response, 'nb_hits').' (Ø '.$this->value($response, 'entry_nb_actions').')'), + array(__('Total time spent', 'wp-piwik').':', $time), + array(__('Time/visit', 'wp-piwik').':', $avgTime), + array(__('Bounce count', 'wp-piwik').':', $this->value($response, 'entry_bounce_count').' ('.$this->value($response, 'bounce_rate').')'), + array(__('Min. generation time', 'wp-piwik').':', $this->value($response, 'min_time_generation')), + array(__('Max. generation time', 'wp-piwik').':', $this->value($response, 'max_time_generation')) + ); + $tableFoot = (self::$settings->getGlobalOption('piwik_shortcut')?array(__('Shortcut', 'wp-piwik').':', 'Piwik'.(isset($aryConf['inline']) && $aryConf['inline']?' - WP-Piwik':'')):null); + $this->table($tableHead, $tableBody, $tableFoot); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php new file mode 100644 index 0000000..51c8882 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php @@ -0,0 +1,21 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Referrers', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'Referrers.getWebsites'; + $this->name = 'Referrer'; + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php new file mode 100644 index 0000000..d6cd460 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php @@ -0,0 +1,75 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Resolutions', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'Resolution.getResolution'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Resolution', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php new file mode 100644 index 0000000..2cddf7e --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php @@ -0,0 +1,38 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Site Search', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'Actions.getSiteSearchKeywords'; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Keyword', 'wp-piwik'), __('Requests', 'wp-piwik'), __('Bounced', 'wp-piwik')); + $tableBody = array(); + $count = 0; + if (is_array($response)) + foreach ($response as $row) { + $count++; + $tableBody[] = array(htmlentities($row['label']), $row['nb_visits'], $row['bounce_rate']); + if ($count == 10) break; + } + $this->table($tableHead, $tableBody, null); + } + } + + } diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php new file mode 100644 index 0000000..a552225 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php @@ -0,0 +1,31 @@ +parameter = array( + 'url' => get_bloginfo('url') + ); + $this->title = $prefix.__('SEO', 'wp-piwik'); + $this->method = 'SEO.getRank'; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + echo '
            '; + if (is_array($response)) + foreach ($response as $val) + echo ''; + else echo ''; + echo '
            '.(isset($val['logo_link']) && !empty($val['logo_link'])?''.$val['label'].'':$val['label']).''.$val['rank'].'
            SEO module currently not available.
            '; + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php new file mode 100644 index 0000000..c5f48bc --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php @@ -0,0 +1,73 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Operation System Details', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'DevicesDetection.getOsVersions'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Operation System', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php new file mode 100644 index 0000000..aae05ec --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php @@ -0,0 +1,73 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Operation Systems', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'DevicesDetection.getOsFamilies'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Operation System', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php new file mode 100644 index 0000000..8aea5d0 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php @@ -0,0 +1,80 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => $timeSettings['period'], + 'date' => $timeSettings['date'] + ); + $this->title = $prefix.__('Types', 'wp-piwik').' ('.__($timeSettings['description'],'wp-piwik').')'; + $this->method = 'DevicesDetection.getType'; + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function addHeaderLines() { + echo ''; + echo ''; + echo ''; + } + + public function show() { + $response = self::$wpPiwik->request($this->apiID[$this->method]); + $tableBody = array(); + if (!empty($response['result']) && $response['result'] ='error') + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response['message'], ENT_QUOTES, 'utf-8'); + else { + $tableHead = array(__('Type', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Percent', 'wp-piwik')); + if (isset($response[0]['nb_uniq_visitors'])) $unique = 'nb_uniq_visitors'; + else $unique = 'sum_daily_nb_uniq_visitors'; + $count = 0; + $sum = 0; + $js = array(); + $class = array(); + if (is_array($response)) + foreach ($response as $row) { + $count++; + $sum += isset($row[$unique])?$row[$unique]:0; + if ($count < $this->limit) + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + elseif (!isset($tableBody['Others'])) { + $tableBody['Others'] = array($row['label'], $row[$unique], 0); + $class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $tableBody['Others'][1] += $row[$unique]; + $tableBody[$row['label']] = array($row['label'], $row[$unique], 0); + $class[$row['label']] = 'wp-piwik-hideDetails hidden'; + $js[$row['label']] = '$j'."( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + if ($count > $this->limit) + $tableBody['Others'][0] = __('Others', 'wp-piwik'); + elseif ($count == $this->limit) { + $class['Others'] = $js['Others'] = ''; + } + + foreach ($tableBody as $key => $row) + $tableBody[$key][2] = number_format($row[1]/$sum*100, 2).'%'; + + if (!empty($tableBody)) $this->pieChart($tableBody); + $this->table($tableHead, $tableBody, null, false, $js, $class); + } + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php new file mode 100644 index 0000000..e54cd35 --- /dev/null +++ b/wp-content/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php @@ -0,0 +1,68 @@ +getTimeSettings(); + $this->parameter = array( + 'idSite' => self::$wpPiwik->getPiwikSiteId($this->blogId), + 'period' => isset($params['period'])?$params['period']:$timeSettings['period'], + 'date' => 'last'.($timeSettings['period']=='day'?'30':'12'), + 'limit' => null + ); + $this->title = $prefix.__('Visitors', 'wp-piwik').' ('.__($this->rangeName(),'wp-piwik').')'; + $this->method = array('VisitsSummary.getVisits', 'VisitsSummary.getUniqueVisitors', 'VisitsSummary.getBounceCount', 'VisitsSummary.getActions'); + $this->context = 'normal'; + wp_enqueue_script('wp-piwik', self::$wpPiwik->getPluginURL().'js/wp-piwik.js', array(), self::$wpPiwik->getPluginVersion(), true); + wp_enqueue_script('wp-piwik-jqplot',self::$wpPiwik->getPluginURL().'js/jqplot/wp-piwik.jqplot.js',array('jquery')); + wp_enqueue_style('wp-piwik', self::$wpPiwik->getPluginURL().'css/wp-piwik.css',array(),self::$wpPiwik->getPluginVersion()); + add_action('admin_head-index.php', array($this, 'addHeaderLines')); + } + + public function show() { + $response = array(); + $success = true; + foreach ($this->method as $method) { + $response[$method] = self::$wpPiwik->request($this->apiID[$method]); + if (!empty($response[$method]['result']) && $response[$method]['result'] ='error') + $success = false; + } + if (!$success) + echo ''.__('Piwik error', 'wp-piwik').': '.htmlentities($response[$method]['message'], ENT_QUOTES, 'utf-8'); + else { + $data = array(); + if (is_array($response) && is_array($response['VisitsSummary.getVisits'])) + foreach ($response['VisitsSummary.getVisits'] as $key => $value) { + if ($this->parameter['period'] == 'week') { + preg_match("/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/", $key, $dateList); + $jsKey = $dateList[0]; + $textKey = $this->dateFormat($jsKey, 'week'); + } elseif ($this->parameter['period'] == 'month') { + $jsKey = $key.'-01'; + $textKey = $key; + } else $jsKey = $textKey = $key; + $data[] = array( + $textKey, + $value, + $response['VisitsSummary.getUniqueVisitors'][$key]?$response['VisitsSummary.getUniqueVisitors'][$key]:'-', + $response['VisitsSummary.getBounceCount'][$key]?$response['VisitsSummary.getBounceCount'][$key]:'-', + $response['VisitsSummary.getActions'][$key]?$response['VisitsSummary.getActions'][$key]:'-' + ); + $javaScript[] = 'javascript:wp_piwik_datelink(\''.urlencode('wp-piwik_stats').'\',\''.str_replace('-', '', $jsKey).'\',\''.(isset($_GET['wpmu_show_stats'])?(int) $_GET['wpmu_show_stats']:'').'\');'; + } + $this->table( + array(__('Date', 'wp-piwik'), __('Visits', 'wp-piwik'), __('Unique', 'wp-piwik'), __('Bounced', 'wp-piwik'), __('Page Views', 'wp-piwik')), + array_reverse($data), + array(), + 'clickable', + array_reverse(isset($javaScript)?$javaScript:[]) + ); + } + + } + + } \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/config.php b/wp-content/plugins/wp-piwik/config.php new file mode 100644 index 0000000..49d441e --- /dev/null +++ b/wp-content/plugins/wp-piwik/config.php @@ -0,0 +1,9 @@ + + + + + + GNU General Public License - GNU Project - Free Software Foundation (FSF) + +

            GNU GENERAL PUBLIC LICENSE

            +

            Version 3, 29 June 2007

            + +

            Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

            + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed.

            + +

            Preamble

            + +

            The GNU General Public License is a free, copyleft license for +software and other kinds of works.

            + +

            The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others.

            + +

            For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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.

            + +

            Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it.

            + +

            For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions.

            + +

            Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users.

            + +

            Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free.

            + +

            The precise terms and conditions for copying, distribution and +modification follow.

            + +

            TERMS AND CONDITIONS

            + +

            0. Definitions.

            + +

            “This License” refers to version 3 of the GNU General Public License.

            + +

            “Copyright” also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks.

            + +

            “The Program” refers to any copyrightable work licensed under this +License. Each licensee is addressed as “you”. “Licensees” and +“recipients” may be individuals or organizations.

            + +

            To “modify” a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a “modified version” of the +earlier work or a work “based on” the earlier work.

            + +

            A “covered work” means either the unmodified Program or a work based +on the Program.

            + +

            To “propagate” a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well.

            + +

            To “convey” a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying.

            + +

            An interactive user interface displays “Appropriate Legal Notices” +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion.

            + +

            1. Source Code.

            + +

            The “source code” for a work means the preferred form of the work +for making modifications to it. “Object code” means any non-source +form of a work.

            + +

            A “Standard Interface” means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language.

            + +

            The “System Libraries” of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +“Major Component”, in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it.

            + +

            The “Corresponding Source” for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work.

            + +

            The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source.

            + +

            The Corresponding Source for a work in source code form is that +same work.

            + +

            2. Basic Permissions.

            + +

            All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law.

            + +

            You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you.

            + +

            Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary.

            + +

            3. Protecting Users' Legal Rights From Anti-Circumvention Law.

            + +

            No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures.

            + +

            When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures.

            + +

            4. Conveying Verbatim Copies.

            + +

            You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program.

            + +

            You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee.

            + +

            5. Conveying Modified Source Versions.

            + +

            You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions:

            + +
              +
            • a) The work must carry prominent notices stating that you modified + it, and giving a relevant date.
            • + +
            • b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + “keep intact all notices”.
            • + +
            • c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it.
            • + +
            • d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so.
            • +
            + +

            A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +“aggregate” if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate.

            + +

            6. Conveying Non-Source Forms.

            + +

            You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways:

            + +
              +
            • a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange.
            • + +
            • b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge.
            • + +
            • c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b.
            • + +
            • d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements.
            • + +
            • e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d.
            • +
            + +

            A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work.

            + +

            A “User Product” is either (1) a “consumer product”, which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, “normally used” refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product.

            + +

            “Installation Information” for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made.

            + +

            If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM).

            + +

            The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network.

            + +

            Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying.

            + +

            7. Additional Terms.

            + +

            “Additional permissions” are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions.

            + +

            When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission.

            + +

            Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms:

            + +
              +
            • a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or
            • + +
            • b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or
            • + +
            • c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or
            • + +
            • d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or
            • + +
            • e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or
            • + +
            • f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors.
            • +
            + +

            All other non-permissive additional terms are considered “further +restrictions” within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying.

            + +

            If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms.

            + +

            Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way.

            + +

            8. Termination.

            + +

            You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11).

            + +

            However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation.

            + +

            Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice.

            + +

            Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10.

            + +

            9. Acceptance Not Required for Having Copies.

            + +

            You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so.

            + +

            10. Automatic Licensing of Downstream Recipients.

            + +

            Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License.

            + +

            An “entity transaction” is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts.

            + +

            You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it.

            + +

            11. Patents.

            + +

            A “contributor” is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's “contributor version”.

            + +

            A contributor's “essential patent claims” are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, “control” includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License.

            + +

            Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version.

            + +

            In the following three paragraphs, a “patent license” is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To “grant” such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party.

            + +

            If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. “Knowingly relying” means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid.

            + +

            If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it.

            + +

            A patent license is “discriminatory” if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007.

            + +

            Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law.

            + +

            12. No Surrender of Others' Freedom.

            + +

            If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program.

            + +

            13. Use with the GNU Affero General Public License.

            + +

            Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such.

            + +

            14. Revised Versions of this License.

            + +

            The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License “or any later version” applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation.

            + +

            If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program.

            + +

            Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version.

            + +

            15. Disclaimer of Warranty.

            + +

            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.

            + +

            16. Limitation of Liability.

            + +

            IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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.

            + +

            17. Interpretation of Sections 15 and 16.

            + +

            If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee.

            + +

            END OF TERMS AND CONDITIONS

            + +

            How to Apply These Terms to Your New Programs

            + +

            If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms.

            + +

            To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the “copyright” line and a pointer to where the full notice is found.

            + +
                <one line to give the program's name and a brief idea of what it does.>
            +    Copyright (C) <year>  <name of author>
            +
            +    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 3 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, see <http://www.gnu.org/licenses/>.
            +
            + +

            Also add information on how to contact you by electronic and paper mail.

            + +

            If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode:

            + +
                <program>  Copyright (C) <year>  <name of author>
            +    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
            +    This is free software, and you are welcome to redistribute it
            +    under certain conditions; type `show c' for details.
            +
            + +

            The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an “about box”.

            + +

            You should also get your employer (if you work as a programmer) or school, +if any, to sign a “copyright disclaimer” for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>.

            + +

            The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>.

            + + + \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/index.php b/wp-content/plugins/wp-piwik/index.php new file mode 100644 index 0000000..9b3347d --- /dev/null +++ b/wp-content/plugins/wp-piwik/index.php @@ -0,0 +1,2 @@ +. + +Downloads can be found at . + +The mailing list is at . + +Examples and unit tests are at . + +Documentation is at . + +The project page and source code are at . + +Bugs, issues, feature requests: . + +Basic Usage Instructions: + +jqPlot requires jQuery (1.4+ required for certain features). jQuery 1.9.1 is included in +the distribution. To use jqPlot include jQuery, the jqPlot jQuery plugin, the jqPlot css file and +optionally the excanvas script to support IE version prior to IE 9 in your web page: + +> +> +> +> + +For usage instructions, see in usage.txt. For available options, see + in jqPlotOptions.txt. + +Building from source: + +If you've cloned the repository, you can build a distribution from source. +You need to have ant installed. You can simply +type "ant" from the jqplot directory to build the default "all" target. +There are 6 pertinent targets: clean, dist, min, docs, compress and all. Use: + +> ant -p + +to get a description of the various build targets. + +Legal Notices: + +Copyright (c) 2009-2013 Chris Leonello +jqPlot is currently available for use in all personal or commercial projects +under both the MIT and GPL version 2.0 licenses. This means that you can +choose the license that best suits your project and use it accordingly. + +Although not required, the author would appreciate an email letting him +know of any substantial use of jqPlot. You can reach the author at: +chris at jqplot or see http://www.jqplot.com/info.php . + +If you are feeling kind and generous, consider supporting the project by +making a donation at: http://www.jqplot.com/donate.php . + +jqPlot includes date instance methods and printf/sprintf functions by other authors: + +Date instance methods: + + author Ken Snyder (ken d snyder at gmail dot com) + date 2008-09-10 + version 2.0.2 (http://kendsnyder.com/sandbox/date/) + license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + +JavaScript printf/sprintf functions. + + version 2007.04.27 + author Ash Searle + http://hexmen.com/blog/2007/03/printf-sprintf/ + http://hexmen.com/js/sprintf.js + The author (Ash Searle) has placed this code in the public domain: + "This code is unrestricted: you are free to use it however you like." diff --git a/wp-content/plugins/wp-piwik/js/jqplot/changes.txt b/wp-content/plugins/wp-piwik/js/jqplot/changes.txt new file mode 100644 index 0000000..ce990ea --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/jqplot/changes.txt @@ -0,0 +1,458 @@ +Title: Change Log + +1.0.8: +* Issue #375: sortMergedLabels does not sort string labels +* Issue #279: Groups > 3 Causes Alignment Issues +* Issue #439: IE can't display a customized legend in Quirks mode +* Issue #482: "Undefined" error message when plotting a chart with no data +* Issue #116: Don't mix spaces and tabs for indentation +* Issue #564: Metergauge renderer not resizable when replotting +* Issue #409: MeterGaugeRenderer replot/redraw offsets center +* Issue #523: Adding rectangles to Canvas Overlay plugin +* Issue #756: jqplot.min files contain non-UTF-8 characters +* Issue #223: fillToZero does not color negative values when crossover point is 0 +* Pull Request #23: Adding rectangles to Canvas Overlay plugin +* Pull Request #28: Cross-over points of 0 will actually change colors +* Pull Request #35: Don't highlight hidden bars or show tooltips for them +* Pull Request #41: Add dutch(nl) and svenska(sv) translations for dates +* Add tooltip support for Pie Charts +* Update to latest YUI compressor + +1.0.7: +* Issue #726: Bug in sprintf %p, sometimes it outputs exponential form rather than decimal +* Issue #717: Plot's preDrawHooks not called +* Issue #707: Browser hangs with LogAxisRenderer when value is 0 +* Issue #695: Horizontal Bar Chart Negative Series Colors Not Working +* Issue #670: Examples IE7, IE8 and IE9 multipleBarColors.html failure and fix +* Issue #636: X Axis Date Renderer Single Day Not plotting +* Issue #607: Integration issue +* Issue #571: Decimal numbers not properly formatted +* Issue #552: jqPlot crashes when interval too small +* Issue #536: DateAxisRenderer invalid scaling +* Issue #534: "decimalMark" in the "jqplot.sprintf.js" +* Issue #529: Scientific notation on label values ending in 0 +* Issue #521: invalid JS in meterGaugeRenderer.js +* Issue #516: Including BezierCurveRenderer plugin and initializing jqplot with no options give error +* Issue #500: DateAxisRenderer has timezone related issues +* Issue #452: Including ALL jqPlot plugins causes an Error +* Issue #494: No point when use LogAxisRenderer and a point has a zero value +* Issue #430: getIsoWeek: invalid method call +* Issue #280: jqplot Options +* Issue #179: Spelling/grammar +* Pull Request #18: Implement getTop in CanvasAxisTickRenderer +* Pull Request #21: Performance issue when drawing pointlabels with zeros/null values +* Pull Request #24: Added suggested fix in comment #8 for issue #536 +* Pull Request #29: Removed unbalanced addition of UTC offset +* Pull Request #33: Documentation fixes (issue #179, other changes) +* Pull Request #34: Start of updating jqPlotOptions.txt +* Pull Request #37: Example and suggested fix for issues #552 and issue #536 +* Pull Request #39: Fixed trailing comma which caused issues with IE7 + +1.0.6: +* Add left sidebar navigation to examples +* Update examples for jquery 1.9.1 and jquery ui 1.10.0 +* Add colorpicker.js to distribution +* Fix some problems with examples when viewing with local file system +* Add "minified" copyright notice for minified files, similar to jquery's notice. +* Pull Request #25: jqplot.sprintf.js is no longer the last file in the concatenated jquery.jqplot.js +* Pull Request #17: Fixed bug causing custom pointLabels passed with plot data to be ignored for horizontal bar graphs. +* Pull Request #10: Build error by invalid encoding. +* Issue #714: handle tickColor in meterGaugeRenderer +* Issue #519: jsDate Polish Localization + +1.0.5: +* Updated to jQuery 1.9 + +1.0.0b2: +* Major improvements in memory usage: +** Merged in changes from Timo Besenruether to reuse canvas elements and improve + memory performance. +** Fixed all identifiable DOM leaks. +** Mergged in changes from cguillot for memory improvements in IE < 9. +* Added vertical and dashed vertical line support for canvas overlay. +* Fixed bug where initially hidden plots would not display. +* Fixed bug with point labels and null data points. +* Updated to jQuery 1.6.1. +* Improved pie slice margin calculation and fixed slice margin and pie positioning + with small slices. +* Improved bar renderer so bars always start at 0 if: +** The axis is a linear axis (not log/date). +** There are no other line types besides bars attached to the axis. +** The data on the axis is all >= 0. +** The user has not specified a pad, padMin or forceTickAt0 = true option. +* Modified tick prefix behavious so prefix no added to all ticks, even if format + string is specified. +* Fix to ensure original tick formats are applied when zooming and resetting + zoom. +* Updated auto tick format string so format adjusted when zooming. +* Modified auto tick computation to put less ticks on small plots and more + ticks on large plots. +* Update bubble render to support gradients in IE 9. + +1.0.0b1: +* Much improved tick generation algorithm to get precise rounded + tick values (Thanks Scott Prahl!). +* Auto compute tick format string if none is provided. +* Much better "slicing" of pie charts when using "sliceMargin" option to set + a gap between the slices. +* Expanded canvasOverlay plugin to create arbitrary dashed and solid + horizontal and vertical lines on top of plot. +* Added defaultColors and defaultNegativeColors options to $.jqplot.config. +* Fixed issue #318, highlighter & bar renderer incompatability. +* Improve highlighter tooltip positioning with negative bars. +* Fixed #305, mispelling of jqlotDragStart and jqlotDragStop. MUST NOW BIND + TO jqplotDragStart and jqplotDragStop. +* Fixed #290, some variables left in global scope. +* Fixed #289, OHLC line widths hard coded at 1.5. Now set by lineWidth option. +* Fixed #296 for determining databounds on log axes. +* Updated to jQuery 1.5.1 +* Fixed waterfall plot to ensure first and last bars always fill to zero. +* Added lineJoin and lineCap option to series lines. +* Bar widths now based on width of grid, not plot target for better scaling. +* Added looseZoom option to cursor so zooming can produce well rounded ticks. +* Added forceTickAt0 and forceTickAt100 options to ensure there will always + be a tick at 0 or 100 in the plot. +* Fixed bug where cursor legend didn't honor series showLabel option. + + +1.0.0a: + +* Series can now be moved forward or backward in stack to e.g. bring a line + forward when mousing over a point. +* Can now move outside of grid area while zooming. Can have zoom + constrained to grid area or allow zooming outside. +* Fixed issue #142 with tooltip drawn on top of event canvas, hiding + mouse events. +* Fixed #147 where pie slices with 0 value not rendering properly in IE. +* Fixed #130 where stack data not sorted properly. +* Fixed bug with null values not handled properly in category axes. +* Fixed #156 where pie charts not rendering on QTWebKit. +* Now using feature detection for canvas and canvas text capability + rather than browser version. +* Added enahncedLegendRenderer plugin to allow multi row/column legends + and clickable labels to show/hide series. +* Added fillToValue option to allow filled line plot to fill to an + arbitrary value. +* Added block plot plugin. +* Added funnel type charts. +* Added meter gauge type charts. +* Added plot theming support. +* $.jqplot.config.enablePlugins now false by default. +* Implemented highlighting on bar, pie, donut, funnel, etc. charts. +* Fix to pointlabels plugin to align labels properly on multi series plots. +* Added custom error handling to display error message in plot area. +* Fixed issue where would call to draw grid border of 0 width would + result in a default border being drawn. +* Added options to place legend outside of grid and shrink grid so everything + stays within plot div. +* Fixed bug in color generator so now calls to get() continually cycle + through colors just like next(). +* Added defaultAxisStart option. +* Added gradient fills to bubbles. +* Added bubble charts. +* Added showLabels option to bubble charts. +* Pass bubble radius to event callback in bubble charts. +* Fixed #207, typo in docs. +* Fixed #206 where "value" pie slice data labels were displaying wrong + value. +* Fixed #147 with 0 value slices in IE6. +* Fixed issue #241, disabled varyBarColor option in stacked charts. +* Added dataRenderer option to allow custom processors for JSON, AJAX + and anywhere else you might want to get data. +* Fixed null value handling so plot now properly skip or join over nulls. +* Fixed showTicks and showTickMarks option conflicts. +* Fixed issue #185 where pointLabels plugin incompatibility could crash + pie, donut and other plots. +* Fixed #23 and #143 to obey gridPadding option. +* Fixed #233 with highlighter tooltip separator. +* Fixed #224 where type checking failing on GWT. +* Fixed #272 with pie highlighting not working on replot. +* Memory performance improvements. +* Changes to build script so everything should build when pulled from repo. +* Fixed issue #275, IE 6/7 don't support array indexing of strings. +* Added event listener hooks for mouseUp, mouseDown, etc. to all line plots. +* Fixed bug with highlighter not working when null in data. +* Updated to jQuery 1.4.4 +* Fixed bug where donut plots showed value of radians of slice instead + of actual data. +* Reverted to excanvas r3 so IE8 no longer has to emulate IE7. +* Added tooltipContentEditor option to highlighter, allowing callback + to manipulate tooltip content at run time (thanks Tim Bunce!). +* Fixed bug where axes scale not resetting. +* Fixed bug with date axes where data bounds not properly set. +* Fixed issue where tick marks disappear if grid lines turned off. +* Updated replot method to allow passing in axes options for more control. +* Added experimental support for "broken" axes. +* Fixed bug with pies where pies with 0 valued slices did not draw correctly. +* Added canvasOverlay plugin to allow drawing of arbitrary shapes on a canvas + over the plot. +* Added option to display arbitrary text/html (message, animated gif, etc.) if + plot is constructed without data. Allow a "data loading" indicator to be shown. +* Added resetAxisValues method to manually update axis ticks without + redrawing the plot. +* Fix to labels on negative bars so label postiion of 'n' will be below a negative bar, + just as it is above a positive bar (thanks guigod!). +* Added thousands separator character (') to sprintf formatting (thanks yuichi1004!). +* Re-factored date parsing/formatting to use new jsDate module which does not + extend the Date prototype. + + +0.9.7: + +* Added Mekko chart plot type with enhanced legend and axes support. +* Implemented vertical waterfall charts. Can create waterfall plot as + option to bar chart. See examples folder of distribution. +* Enhanced plot labels for waterfall style. +* Enhanced bar plots so you can now color each bar of a series + independently with the "varyBarColor" option. +* Re-factored series drawing so that each series and series shadow drawn + on its own canvas. Allows series to be redrawn independently of each other. +* Added additional default series colors. +* Added useNegativeColors option to turn off negative color array and use + only seriesColors array to define all bar/filled line colors. +* Fix css for cursor legend. +* Modified shape renderer so rectangles can be stroked and filled. +* Re-factored date methods out of dateAxisRenderer so that date formatter + and methods can be accesses outside of dateAxisRenderer plugin. +* Fixed #132, now trigger series change event on plot target instead of drag canvas. +* Fixes issue #116 where some source files had mix of tabs and spaces + for indentation. Should have been all spaces. +* Fixed issue #126, some links broken in docs section of web site. +* Fixed issue #90, trendline plugin incompatibility with pie renderer. +* Updated samples in examples folder of distribution to include navigation + links if web server is set up to process .html files with php. + + +0.9.6: + +* New, easier to use, replot() method for placing plots in tabs, accordions, + resizable containers or for changing plot parameters programmatically. +* Updated legend renderer for pie charts to draw swatches which will + print correctly. +* Fixed issue #118 with patch from taum so autoscale option will + honor tickInterval and numberTicks options +* Fix to plot diameter calculation for initially hidden plots. +* Added examples for making plots in jQuery UI tabs and accordions. +* Fixed issue #120 where pie chart with single slice not displaying + correctly in IE and Chrome + + +0.9.5.2: + +* Fixed #102 where double clicking on plot that has zoom enabled, but + has not been zoomed resulted in error. +* Fixed bug where candlestick coloring options not working. +* Added option to turn individual series labels off in the legend. + + +0.9.5.1: + +* Fixed bug where tooltip not working with OHLC and candlestick charts. +* Added additional marker styles: plus, X and dash. + + +0.9.5: + +* Implemented "zoomProxy". zoomProxy allows zooming one plot from another + such as an overview plot. +* Zooming can now be constrained to just x or y axis. +* Enhanced cursor plugin with vertical "dataTracking" line. This is a line + at the cursor location with a readout of data points at the line location + which are displayed in the chart legend. +* Changed cursor tooltip format string. Now one format string is used for + entire tooltip. +* Added mechanisms to specify plot size when plot target is hidden or plot + height/width otherwise cannot be determined from markup. +* Added $.jqplot.config object to specify jqplot wide configuration options. + These include enablePlugins to globally set the default plugin state on/off + and defaultHeight/defaultWidth to specify default plot height/width. +* Added fillToZero option which forces filled charts to fill to zero as opposed + to axis minimum. Thus negative filled bar/line values will fill upwards to + zero axis value. +* Added option to disable stacking on individual lines. +* Changed targetId property of the plot object so it now includes a "#" before + the id string. +* Improved tick and body sizing of Open Hi Low Close and candlestick charts. +* Removed lots of web site related files from the repository. This means that, + if working from the sources, user's won't be able to build the jqplot web + site and the docs/tests that are hosted on that site. The minified and + compressed distribution packages will build fine. +* Lots of examples were added to a separate examples directory to better show + functionality of jqPlot for local testing with the distribution. +* Many various bug fixes and other minor enhancements. + + +0.9.4: + +* Implemented axis labels. Labels can be rendered in div tags or as canvas + elements supporting rotated text. +* Improved rotated axis label positioning so labels will start or end at a + tick position. +* Fixed bug where an empty data series would hang plot rendering. +* completed issue #66 for misc. improvements to documentation. +* Fixed issue #64 where the same ID's were assigned to cursor and highlighter + elements. +* Added option to legend to encode special HTML characters. +* Fixed undesirable behavior where point labels for points off the plot + were being rendered. +* Added edgeTolerance option to point label renderer to control rendering of + labels near plot edges. + + +0.9.3: + +* Preliminary support for axis labels. Currently rendered into DIV tags, + so no rotated label support. This feature is currently experimental. +* Fixed bug #52, needed space in tick div tag between style and class declarations + or plot failed in certain application doctypes. +* Fixed issue #54, miter style line join for chart lines causing spikes at steep + changes in slope. Changed miter style to round. +* Added examples for new autoscaling algorithm. +* Fixed bug #57, category axis labels disappear on redraw() +* Improved algorithm which controlled maximum number of labels that would display + on a category axis. +* Fixed bug #45 where null values causing errors in plotData and gridData. +* Fixed issue #60 where seriesColors option was not working. + + +0.9.2: + +* Fixed bug #45 where a plot could crash if series had different numbers of points. +* Fixed issue #50, added option to turn off sorting of series data. +* Fixed issue #31, implemented a better axis autoscaling algorithm and added an autoscale option. + +0.9.1: + +* Fixed bug #40, when axis pad, padMax, padMin set to 0, graph would fail to render. +* Fixed bug #41 where pie and bar charts not rendered correctly on redraw(). +* Fixed bug #11, filled stacked line plots not rendering correctly in IE. +* Fixed bug #42 where stacked charts not rendering with string date axis ticks. +* Fixed bug in redraw() method where axes ticks were not reset. +* Fixed "jqplotPreRedrawEvent" that should have been named "jqplotPostRedraw" event. + +0.9.0: + +* Added Open Hi Low Close charts, Candlestick charts and Hi Low Close charts. +* Added support for arbitrary labels on the data points. +* Enhanced highlighter plugin to allow custom formatting control of entire tooltip. +* Enhanced highlighter to support multiple y values in a data point. +* Fixed bug #38 where series with a single point with a negative value would fail. +* Improvements to examples to show what plugins to include. +* Expanded documentation for some of the plugins. + +0.8.5: + +* Added zooming ability with double click or single click options to reset zoom. +* Modified default tick spacing algorithm for date axes to give more space to ticks. +* Fixed bug #2 where tickInterval wasn't working properly. +* Added neighborThreshold option to control how close mouse must be to + point to trigger neighbor detection. +* Added double click event handler on plot. + +0.8.0: + +* Support for up to 9 y axes. +* Added option to control padding at max/min bounds of axes separately. +* Closed issue #21, added options to control grid line color and width. +* Closed issue #20, added options to filled line charts to stoke above + fill and customize fill color and transparency. +* Improved structure of on line documentation to make usage and options + docs default. +* Added much documentation on options and css styling. + +0.7.1: + +* Bug fix release +* Fixed bug #6, missing semi-colons messing up some javascript compressors. +* Fixed bug #13 where 2D ticks array of [values, labels] would fail to + renderer with DateAxisRenderer. +* Fixes bug #16 where pie renderer overwriting options for all plot types + and crashing non pie plots. +* Fixes bug #17 constrainTo dragable option mispelled as "contstrainTo". + Fixed dragable color issue when used with trend lines. + +0.7.0: + +* Pie chart support +* Enabled tooltipLocation option in highlighter. +* Highlighter Tooltip will account for mark size and highlight size when + positioning itself. +* Added ability to show just x, y or both axes in highlighter tooltip. +* Added customization of separator between axes values in highlighter tooltip. +* Modified how shadows are drawn for lines, bars and markers. Now drawn first, + so they are always behind the object. +* Adjustments to shadow parameters on lines to account for new shadow positioning. +* Added a ColorGenerator class to robustly return next available color + for a plot with wrap around to first color at end. +* Udates to docs about css file. +* Fixed bug with String x values in series and IE error on sorting (Category Axis). +* Added cursor changes in dragable plugin when cursor near dragable point. + +0.6.6b: + +* Added excanvas.js and excanvas.min.js to compressed distributions. +* Added example/test html pages I had locally into repository and to + compressed distributions. + +0.6.6a: + +* Removed absolute positioning from dom element and put back into css file. +* Duplicate of 0.6.6 with a suffix to unambiguously differentiate between + previously posted 0.6.6 release. + +0.6.6: + +* Fixed bug #5, trend line plugin failing when no trend line options specified. +* Added absolute position css spec to axis tick dom element. +* Enhancement to category axes, more intuitive handling of series with + missing data values. + +0.6.5: + +* Fixed bug #4, series of unequal data length not rendering correctly. + This is a bugfix release only. + +0.6.4: + +* Fixed bug (issue #1 in tracker) where flat line data series (all x and/or y + values are euqal) or single value data series would crash. + +0.6.3: + +* Support for stacked line (a.k.a. area) and stacked bar (horizontal and + vertical) charts. +* Refactored barRenderer to use default shape and shadow renderers. +* Added info (contacts & support information) page to web site. + +0.6.2: + +* This is a minor upgrade to docs and build only. No functionality has changed. +* Ant build script generates entire site, examples, tests and distribution. +* Improvements to documentation. + +0.6.1: + +* New sprintf implementation from Ash Searle that implements %g. +* Fix to sprintf e/f formats. +* Created new format specifier, %p and %P to preserve significance. +* Modified p/P format to better display larger numbers. +* Fixed and simplified significant digits calculation for sprintf. +* Added option to have cursor tooltip follow the mouse or not. +* Added options to change size of highlight. +* Updates to handle dates like '6-May-09'. +* Mods to improve look of web site. +* Updates to documentation. +* Added license and copyright statement to source files. + +0.6.0: + +* Added rotated text support. Uses native canvas text functionality in + browsers that support it or draws text on canvas with Hershey font +* metrics for non-supporting browsers. +* Removed lots of lint in js code. +* Moved tick css from js code into css file. +* Fix to tick positioning css. y axis ticks were positioned to wrong side of axis div. +* Re-factored axis tick renderer instantiation into the axes renderers themselves. + + +For changes prior to 0.6.0 release, please see change log at http://bitbucket.org/cleonello/jqplot/changesets/ diff --git a/wp-content/plugins/wp-piwik/js/jqplot/copyright.txt b/wp-content/plugins/wp-piwik/js/jqplot/copyright.txt new file mode 100644 index 0000000..86d4c40 --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/jqplot/copyright.txt @@ -0,0 +1,56 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: @VERSION + * + * Copyright (c) 2009-2013 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2013 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ diff --git a/wp-content/plugins/wp-piwik/js/jqplot/excanvas.min.js b/wp-content/plugins/wp-piwik/js/jqplot/excanvas.min.js new file mode 100644 index 0000000..83373a5 --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/jqplot/excanvas.min.js @@ -0,0 +1,3 @@ +/* jqPlot @VERSION | (c) 2009-2013 Chris Leonello | jplot.com + jsDate | (c) 2010-2013 Chris Leonello + */if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&").replace(/"/g,""")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;i.family="'"+i.family.replace(/(\'|\")/g,"").replace(/\s*,\s*/g,"', '")+"'";return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(al){var aj=[];var Z=false;var m=10;var am=10;aj.push("ak.x){ak.x=j.x}if(ag.y==null||j.yak.y){ak.y=j.y}}}aj.push(' ">');if(!al){w(this,aj)}else{G(this,aj,ag,ak)}aj.push("");this.element_.insertAdjacentHTML("beforeEnd",aj.join(""))};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d+1-ao[0][0])+","+n(aq.y/d-2*ao[1][0]);ag.push('','','');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P;G_vmlCanvasManager._version=888})()}; \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/js/jqplot/gpl-2.0.txt b/wp-content/plugins/wp-piwik/js/jqplot/gpl-2.0.txt new file mode 100644 index 0000000..864c6b8 --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/jqplot/gpl-2.0.txt @@ -0,0 +1,280 @@ +Title: GPL Version 2 + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/js/jqplot/index.php b/wp-content/plugins/wp-piwik/js/jqplot/index.php new file mode 100644 index 0000000..9b3347d --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/jqplot/index.php @@ -0,0 +1,2 @@ +'+ao+"");L("#"+an).addClass("jqplot-error");document.getElementById(an).style.background=L.jqplot.config.errorBackground;document.getElementById(an).style.border=L.jqplot.config.errorBorder;document.getElementById(an).style.fontFamily=L.jqplot.config.errorFontFamily;document.getElementById(an).style.fontSize=L.jqplot.config.errorFontSize;document.getElementById(an).style.fontStyle=L.jqplot.config.errorFontStyle;document.getElementById(an).style.fontWeight=L.jqplot.config.errorFontWeight}}else{am.init(an,aj,ah);am.draw();am.themeEngine.init.call(am);return am}};L.jqplot.version="1.0.8";L.jqplot.revision="1250";L.jqplot.targetCounter=1;L.jqplot.CanvasManager=function(){if(typeof L.jqplot.CanvasManager.canvases=="undefined"){L.jqplot.CanvasManager.canvases=[];L.jqplot.CanvasManager.free=[]}var ah=[];this.getCanvas=function(){var ak;var aj=true;if(!L.jqplot.use_excanvas){for(var al=0,ai=L.jqplot.CanvasManager.canvases.length;al887){L.jqplot.support_canvas_text.result=true}else{L.jqplot.support_canvas_text.result=!!(document.createElement("canvas").getContext&&typeof document.createElement("canvas").getContext("2d").fillText=="function")}}return L.jqplot.support_canvas_text.result};L.jqplot.use_excanvas=((!L.support.boxModel||!L.support.objectAll||!$support.leadingWhitespace)&&!L.jqplot.support_canvas())?true:false;L.jqplot.preInitHooks=[];L.jqplot.postInitHooks=[];L.jqplot.preParseOptionsHooks=[];L.jqplot.postParseOptionsHooks=[];L.jqplot.preDrawHooks=[];L.jqplot.postDrawHooks=[];L.jqplot.preDrawSeriesHooks=[];L.jqplot.postDrawSeriesHooks=[];L.jqplot.preDrawLegendHooks=[];L.jqplot.addLegendRowHooks=[];L.jqplot.preSeriesInitHooks=[];L.jqplot.postSeriesInitHooks=[];L.jqplot.preParseSeriesOptionsHooks=[];L.jqplot.postParseSeriesOptionsHooks=[];L.jqplot.eventListenerHooks=[];L.jqplot.preDrawSeriesShadowHooks=[];L.jqplot.postDrawSeriesShadowHooks=[];L.jqplot.ElemContainer=function(){this._elem;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null}};L.jqplot.ElemContainer.prototype.createElement=function(ak,am,ai,aj,an){this._offsets=am;var ah=ai||"jqplot";var al=document.createElement(ak);this._elem=L(al);this._elem.addClass(ah);this._elem.css(aj);this._elem.attr(an);al=null;return this._elem};L.jqplot.ElemContainer.prototype.getWidth=function(){if(this._elem){return this._elem.outerWidth(true)}else{return null}};L.jqplot.ElemContainer.prototype.getHeight=function(){if(this._elem){return this._elem.outerHeight(true)}else{return null}};L.jqplot.ElemContainer.prototype.getPosition=function(){if(this._elem){return this._elem.position()}else{return{top:null,left:null,bottom:null,right:null}}};L.jqplot.ElemContainer.prototype.getTop=function(){return this.getPosition().top};L.jqplot.ElemContainer.prototype.getLeft=function(){return this.getPosition().left};L.jqplot.ElemContainer.prototype.getBottom=function(){return this._elem.css("bottom")};L.jqplot.ElemContainer.prototype.getRight=function(){return this._elem.css("right")};function w(ah){L.jqplot.ElemContainer.call(this);this.name=ah;this._series=[];this.show=false;this.tickRenderer=L.jqplot.AxisTickRenderer;this.tickOptions={};this.labelRenderer=L.jqplot.AxisLabelRenderer;this.labelOptions={};this.label=null;this.showLabel=true;this.min=null;this.max=null;this.autoscale=false;this.pad=1.2;this.padMax=null;this.padMin=null;this.ticks=[];this.numberTicks;this.tickInterval;this.renderer=L.jqplot.LinearAxisRenderer;this.rendererOptions={};this.showTicks=true;this.showTickMarks=true;this.showMinorTicks=true;this.drawMajorGridlines=true;this.drawMinorGridlines=false;this.drawMajorTickMarks=true;this.drawMinorTickMarks=true;this.useSeriesColor=false;this.borderWidth=null;this.borderColor=null;this.scaleToHiddenSeries=false;this._dataBounds={min:null,max:null};this._intervalStats=[];this._offsets={min:null,max:null};this._ticks=[];this._label=null;this.syncTicks=null;this.tickSpacing=75;this._min=null;this._max=null;this._tickInterval=null;this._numberTicks=null;this.__ticks=null;this._options={}}w.prototype=new L.jqplot.ElemContainer();w.prototype.constructor=w;w.prototype.init=function(){if(L.isFunction(this.renderer)){this.renderer=new this.renderer()}this.tickOptions.axis=this.name;if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTicks}if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTickMarks}if(this.tickOptions.showLabel==null){this.tickOptions.showLabel=this.showTicks}if(this.label==null||this.label==""){this.showLabel=false}else{this.labelOptions.label=this.label}if(this.showLabel==false){this.labelOptions.show=false}if(this.pad==0){this.pad=1}if(this.padMax==0){this.padMax=1}if(this.padMin==0){this.padMin=1}if(this.padMax==null){this.padMax=(this.pad-1)/2+1}if(this.padMin==null){this.padMin=(this.pad-1)/2+1}this.pad=this.padMax+this.padMin-1;if(this.min!=null||this.max!=null){this.autoscale=false}if(this.syncTicks==null&&this.name.indexOf("y")>-1){this.syncTicks=true}else{if(this.syncTicks==null){this.syncTicks=false}}this.renderer.init.call(this,this.rendererOptions)};w.prototype.draw=function(ah,ai){if(this.__ticks){this.__ticks=null}return this.renderer.draw.call(this,ah,ai)};w.prototype.set=function(){this.renderer.set.call(this)};w.prototype.pack=function(ai,ah){if(this.show){this.renderer.pack.call(this,ai,ah)}if(this._min==null){this._min=this.min;this._max=this.max;this._tickInterval=this.tickInterval;this._numberTicks=this.numberTicks;this.__ticks=this._ticks}};w.prototype.reset=function(){this.renderer.reset.call(this)};w.prototype.resetScale=function(ah){L.extend(true,this,{min:null,max:null,numberTicks:null,tickInterval:null,_ticks:[],ticks:[]},ah);this.resetDataBounds()};w.prototype.resetDataBounds=function(){var ao=this._dataBounds;ao.min=null;ao.max=null;var ai,ap,am;var aj=(this.show)?true:false;for(var al=0;alao.max)||ao.max==null){ao.max=am[ak][0]}}else{if((am[ak][ah]!=null&&am[ak][ah]ao.max)||ao.max==null){ao.max=am[ak][an]}}}if(aj&&ap.renderer.constructor!==L.jqplot.BarRenderer){aj=false}else{if(aj&&this._options.hasOwnProperty("forceTickAt0")&&this._options.forceTickAt0==false){aj=false}else{if(aj&&ap.renderer.constructor===L.jqplot.BarRenderer){if(ap.barDirection=="vertical"&&this.name!="xaxis"&&this.name!="x2axis"){if(this._options.pad!=null||this._options.padMin!=null){aj=false}}else{if(ap.barDirection=="horizontal"&&(this.name=="xaxis"||this.name=="x2axis")){if(this._options.pad!=null||this._options.padMin!=null){aj=false}}}}}}}}if(aj&&this.renderer.constructor===L.jqplot.LinearAxisRenderer&&ao.min>=0){this.padMin=1;this.forceTickAt0=true}};function q(ah){L.jqplot.ElemContainer.call(this);this.show=false;this.location="ne";this.labels=[];this.showLabels=true;this.showSwatches=true;this.placement="insideGrid";this.xoffset=0;this.yoffset=0;this.border;this.background;this.textColor;this.fontFamily;this.fontSize;this.rowSpacing="0.5em";this.renderer=L.jqplot.TableLegendRenderer;this.rendererOptions={};this.preDraw=false;this.marginTop=null;this.marginRight=null;this.marginBottom=null;this.marginLeft=null;this.escapeHtml=false;this._series=[];L.extend(true,this,ah)}q.prototype=new L.jqplot.ElemContainer();q.prototype.constructor=q;q.prototype.setOptions=function(ah){L.extend(true,this,ah);if(this.placement=="inside"){this.placement="insideGrid"}if(this.xoffset>0){if(this.placement=="insideGrid"){switch(this.location){case"nw":case"w":case"sw":if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break;case"ne":case"e":case"se":default:if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break}}else{if(this.placement=="outside"){switch(this.location){case"nw":case"w":case"sw":if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break;case"ne":case"e":case"se":default:if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break}}}this.xoffset=0}if(this.yoffset>0){if(this.placement=="outside"){switch(this.location){case"sw":case"s":case"se":if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break;case"ne":case"n":case"nw":default:if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break}}else{if(this.placement=="insideGrid"){switch(this.location){case"sw":case"s":case"se":if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break;case"ne":case"n":case"nw":default:if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break}}}this.yoffset=0}};q.prototype.init=function(){if(L.isFunction(this.renderer)){this.renderer=new this.renderer()}this.renderer.init.call(this,this.rendererOptions)};q.prototype.draw=function(ai,aj){for(var ah=0;ah');this.target.append(az);az.height(aD);az.width(aA);az.css("top",this.eventCanvas._offsets.top);az.css("left",this.eventCanvas._offsets.left);var aC=L('
            ');az.append(aC);aC.html(this.noDataIndicator.indicator);var aB=aC.height();var ax=aC.width();aC.height(aB);aC.width(ax);aC.css("top",(aD-aB)/2+"px")})}}this.data=L.extend(true,[],ar);this.parseOptions(ay);if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this.title.init();this.legend.init();this._sumy=0;this._sumx=0;this.computePlotData();for(var at=0;at0){for(var aq=au;aq--;){var an=this._plotData[aq][ap][av];if(aw*an>=0){this._plotData[au][ap][av]+=an;this._stackData[au][ap][av]+=an;break}}}}}else{for(var ar=0;ar0){at._prevPlotData=this.series[au-1]._plotData}at._sumy=0;at._sumx=0;for(ar=at.data.length-1;ar>-1;ar--){at._sumy+=at.data[ar][1];at._sumx+=at.data[ar][0]}}};this.populatePlotData=function(au,av){this._plotData=[];this._stackData=[];au._stackData=[];au._plotData=[];var ay={x:[],y:[]};if(this.stackSeries&&!au.disableStack){au._stack=true;var ax=(au._stackAxis==="x")?0:1;var az=L.extend(true,[],au.data);var aA=L.extend(true,[],au.data);var an,am,ao,aw,al;for(var ar=0;ar=0){aA[aq][ax]+=aw}}}for(var at=0;at0){au._prevPlotData=this.series[av-1]._plotData}au._sumy=0;au._sumx=0;for(at=au.data.length-1;at>-1;at--){au._sumy+=au.data[at][1];au._sumx+=au.data[at][0]}};this.getNextSeriesColor=(function(am){var al=0;var an=am.seriesColors;return function(){if(al=0&&an>=0){al.top+=aK;al.bottom+=aK;al.left+=an;al.right+=an}}var am=["top","bottom","left","right"];for(var aB in am){if(this._gridPadding[am[aB]]==null&&al[am[aB]]>0){this._gridPadding[am[aB]]=al[am[aB]]}else{if(this._gridPadding[am[aB]]==null){this._gridPadding[am[aB]]=this._defaultGridPadding[am[aB]]}}}var aA=this._gridPadding;if(this.legend.placement==="outsideGrid"){aA={top:this.title.getHeight(),left:0,right:0,bottom:0};if(this.legend.location==="s"){aA.left=this._gridPadding.left;aA.right=this._gridPadding.right}}ar.xaxis.pack({position:"absolute",bottom:this._gridPadding.bottom-ar.xaxis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});ar.yaxis.pack({position:"absolute",top:0,left:this._gridPadding.left-ar.yaxis.getWidth(),height:this._height},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});ar.x2axis.pack({position:"absolute",top:this._gridPadding.top-ar.x2axis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});for(aH=8;aH>0;aH--){ar[aG[aH-1]].pack({position:"absolute",top:0,right:this._gridPadding.right-az[aH-1]},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top})}var au=(this._width-this._gridPadding.left-this._gridPadding.right)/2+this._gridPadding.left-ar.yMidAxis.getWidth()/2;ar.yMidAxis.pack({position:"absolute",top:0,left:au,zIndex:9,textAlign:"center"},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});this.target.append(this.grid.createElement(this._gridPadding,this));this.grid.draw();var aq=this.series;var aJ=aq.length;for(aH=0,aE=aJ;aHax)?av:ax;var ar=this.series[aw];var aq=this.series[au];if(aq.renderer.smooth){var ap=aq.renderer._smoothedData.slice(0).reverse()}else{var ap=aq.gridData.slice(0).reverse()}if(ar.renderer.smooth){var at=ar.renderer._smoothedData.concat(ap)}else{var at=ar.gridData.concat(ap)}var ao=(an.color!==null)?an.color:this.series[ax].fillColor;var ay=(an.baseSeries!==null)?an.baseSeries:aw;var am=this.series[ay].renderer.shapeRenderer;var al={fillStyle:ao,fill:true,closePath:true};am.draw(ar.shadowCanvas._ctx,at,al)};this.bindCustomEvents=function(){this.eventCanvas._elem.bind("click",{plot:this},this.onClick);this.eventCanvas._elem.bind("dblclick",{plot:this},this.onDblClick);this.eventCanvas._elem.bind("mousedown",{plot:this},this.onMouseDown);this.eventCanvas._elem.bind("mousemove",{plot:this},this.onMouseMove);this.eventCanvas._elem.bind("mouseenter",{plot:this},this.onMouseEnter);this.eventCanvas._elem.bind("mouseleave",{plot:this},this.onMouseLeave);if(this.captureRightClick){this.eventCanvas._elem.bind("mouseup",{plot:this},this.onRightClick);this.eventCanvas._elem.get(0).oncontextmenu=function(){return false}}else{this.eventCanvas._elem.bind("mouseup",{plot:this},this.onMouseUp)}};function ai(av){var au=av.data.plot;var ap=au.eventCanvas._elem.offset();var at={x:av.pageX-ap.left,y:av.pageY-ap.top};var aq={xaxis:null,yaxis:null,x2axis:null,y2axis:null,y3axis:null,y4axis:null,y5axis:null,y6axis:null,y7axis:null,y8axis:null,y9axis:null,yMidAxis:null};var ar=["xaxis","yaxis","x2axis","y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];var al=au.axes;var am,ao;for(am=11;am>0;am--){ao=ar[am-1];if(al[ao].show){aq[ao]=al[ao].series_p2u(at[ao.charAt(0)])}}return{offsets:ap,gridPos:at,dataPos:aq}}function ak(al,am){var aq=am.series;var aW,aU,aT,aO,aP,aJ,aI,aw,au,az,aA,aK;var aS,aX,aQ,ar,aH,aM,aV;var an,aN;for(aT=am.seriesStack.length-1;aT>=0;aT--){aW=am.seriesStack[aT];aO=aq[aW];aV=aO._highlightThreshold;switch(aO.renderer.constructor){case L.jqplot.BarRenderer:aJ=al.x;aI=al.y;for(aU=0;aUaH[0][0]&&aJaH[2][1]&&aIaH[0][0]+aV[0][0]&&aJaH[2][1]&&aI0&&-aI>=0){aw=2*Math.PI-Math.atan(-aI/aJ)}else{if(aJ>0&&-aI<0){aw=-Math.atan(-aI/aJ)}else{if(aJ<0){aw=Math.PI-Math.atan(-aI/aJ)}else{if(aJ==0&&-aI>0){aw=3*Math.PI/2}else{if(aJ==0&&-aI<0){aw=Math.PI/2}else{if(aJ==0&&aI==0){aw=0}}}}}}if(az){aw-=az;if(aw<0){aw+=2*Math.PI}else{if(aw>2*Math.PI){aw-=2*Math.PI}}}au=aO.sliceMargin/180*Math.PI;if(aPaO._innerRadius){for(aU=0;aU0)?aO.gridData[aU-1][1]+au:au;aK=aO.gridData[aU][1];if(aw>aA&&aw0&&-aI>=0){aw=2*Math.PI-Math.atan(-aI/aJ)}else{if(aJ>0&&-aI<0){aw=-Math.atan(-aI/aJ)}else{if(aJ<0){aw=Math.PI-Math.atan(-aI/aJ)}else{if(aJ==0&&-aI>0){aw=3*Math.PI/2}else{if(aJ==0&&-aI<0){aw=Math.PI/2}else{if(aJ==0&&aI==0){aw=0}}}}}}if(az){aw-=az;if(aw<0){aw+=2*Math.PI}else{if(aw>2*Math.PI){aw-=2*Math.PI}}}au=aO.sliceMargin/180*Math.PI;if(aP0)?aO.gridData[aU-1][1]+au:au;aK=aO.gridData[aU][1];if(aw>aA&&aw=ay[0][1]&&aI<=ay[3][1]&&aJ>=at[0]&&aJ<=aE[0]){return{seriesIndex:aO.index,pointIndex:aU,gridData:null,data:aO.data[aU]}}}break;case L.jqplot.LineRenderer:aJ=al.x;aI=al.y;aP=aO.renderer;if(aO.show){if((aO.fill||(aO.renderer.bands.show&&aO.renderer.bands.fill))&&(!am.plugins.highlighter||!am.plugins.highlighter.show)){var ax=false;if(aJ>aO._boundingBox[0][0]&&aJaO._boundingBox[1][1]&&aI=aI||aB[1]=aI){if(aC[0]+(aI-aC[1])/(aB[1]-aC[1])*(aB[0]-aC[0])0)?aN:0;for(var aU=0;aU=aQ[0]-aP._bodyWidth/2&&aJ<=aQ[0]+aP._bodyWidth/2&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{if(!aP.hlc){var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][1])&&aI<=av(aO.data[aU][2])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}else{if(aQ[0]!=null&&aQ[1]!=null){aX=Math.sqrt((aJ-aQ[0])*(aJ-aQ[0])+(aI-aQ[1])*(aI-aQ[1]));if(aX<=an&&(aX<=aS||aS==null)){aS=aX;return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}}}break;default:aJ=al.x;aI=al.y;aP=aO.renderer;if(aO.show){aN=aO.markerRenderer.size/2+aO.neighborThreshold;an=(aN>0)?aN:0;for(var aU=0;aU=aQ[0]-aP._bodyWidth/2&&aJ<=aQ[0]+aP._bodyWidth/2&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{if(!aP.hlc){var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][1])&&aI<=av(aO.data[aU][2])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}else{aX=Math.sqrt((aJ-aQ[0])*(aJ-aQ[0])+(aI-aQ[1])*(aI-aQ[1]));if(aX<=an&&(aX<=aS||aS==null)){aS=aX;return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}break}}return null}this.onClick=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotClick");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onDblClick=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotDblClick");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onMouseDown=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotMouseDown");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onMouseUp=function(an){var am=ai(an);var al=L.Event("jqplotMouseUp");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,null,an.data.plot])};this.onRightClick=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);if(ap.captureRightClick){if(an.which==3){var al=L.Event("jqplotRightClick");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])}else{var al=L.Event("jqplotMouseUp");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])}}};this.onMouseMove=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotMouseMove");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onMouseEnter=function(an){var am=ai(an);var ao=an.data.plot;var al=L.Event("jqplotMouseEnter");al.pageX=an.pageX;al.pageY=an.pageY;al.relatedTarget=an.relatedTarget;L(this).trigger(al,[am.gridPos,am.dataPos,null,ao])};this.onMouseLeave=function(an){var am=ai(an);var ao=an.data.plot;var al=L.Event("jqplotMouseLeave");al.pageX=an.pageX;al.pageY=an.pageY;al.relatedTarget=an.relatedTarget;L(this).trigger(al,[am.gridPos,am.dataPos,null,ao])};this.drawSeries=function(an,al){var ap,ao,am;al=(typeof(an)==="number"&&al==null)?an:al;an=(typeof(an)==="object")?an:{};if(al!=u){ao=this.series[al];am=ao.shadowCanvas._ctx;am.clearRect(0,0,am.canvas.width,am.canvas.height);ao.drawShadow(am,an,this);am=ao.canvas._ctx;am.clearRect(0,0,am.canvas.width,am.canvas.height);ao.draw(am,an,this);if(ao.renderer.constructor==L.jqplot.BezierCurveRenderer){if(al660)?ah[aj]*0.85:0.73*ah[aj]+90;ah[aj]=parseInt(ah[aj],10);(ah[aj]>255)?255:ah[aj]}ah[3]=0.3+0.35*al[3];ak.push("rgba("+ah[0]+","+ah[1]+","+ah[2]+","+ah[3]+")")}}else{var al=L.jqplot.getColorComponents(ai);var ah=[al[0],al[1],al[2]];var an=ah[0]+ah[1]+ah[2];for(var aj=0;aj<3;aj++){ah[aj]=(an>660)?ah[aj]*0.85:0.73*ah[aj]+90;ah[aj]=parseInt(ah[aj],10);(ah[aj]>255)?255:ah[aj]}ah[3]=0.3+0.35*al[3];ak="rgba("+ah[0]+","+ah[1]+","+ah[2]+","+ah[3]+")"}return ak};L.jqplot.ColorGenerator=function(ai){ai=ai||L.jqplot.config.defaultColors;var ah=0;this.next=function(){if(ah0){return ai[ah--]}else{ah=ai.length-1;return ai[ah]}};this.get=function(ak){var aj=ak-ai.length*Math.floor(ak/ai.length);return ai[aj]};this.setColors=function(aj){ai=aj};this.reset=function(){ah=0};this.getIndex=function(){return ah};this.setIndex=function(aj){ah=aj}};L.jqplot.hex2rgb=function(aj,ah){aj=aj.replace("#","");if(aj.length==3){aj=aj.charAt(0)+aj.charAt(0)+aj.charAt(1)+aj.charAt(1)+aj.charAt(2)+aj.charAt(2)}var ai;ai="rgba("+parseInt(aj.slice(0,2),16)+", "+parseInt(aj.slice(2,4),16)+", "+parseInt(aj.slice(4,6),16);if(ah){ai+=", "+ah}ai+=")";return ai};L.jqplot.rgb2hex=function(am){var aj=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;var ah=am.match(aj);var al="#";for(var ak=1;ak<4;ak++){var ai;if(ah[ak].search(/%/)!=-1){ai=parseInt(255*ah[ak]/100,10).toString(16);if(ai.length==1){ai="0"+ai}}else{ai=parseInt(ah[ak],10).toString(16);if(ai.length==1){ai="0"+ai}}al+=ai}return al};L.jqplot.normalize2rgb=function(ai,ah){if(ai.search(/^ *rgba?\(/)!=-1){return ai}else{if(ai.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/)!=-1){return L.jqplot.hex2rgb(ai,ah)}else{throw new Error("Invalid color spec")}}};L.jqplot.getColorComponents=function(am){am=L.jqplot.colorKeywordMap[am]||am;var ak=L.jqplot.normalize2rgb(am);var aj=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;var ah=ak.match(aj);var ai=[];for(var al=1;al<4;al++){if(ah[al].search(/%/)!=-1){ai[al-1]=parseInt(255*ah[al]/100,10)}else{ai[al-1]=parseInt(ah[al],10)}}ai[3]=parseFloat(ah[4])?parseFloat(ah[4]):1;return ai};L.jqplot.colorKeywordMap={aliceblue:"rgb(240, 248, 255)",antiquewhite:"rgb(250, 235, 215)",aqua:"rgb( 0, 255, 255)",aquamarine:"rgb(127, 255, 212)",azure:"rgb(240, 255, 255)",beige:"rgb(245, 245, 220)",bisque:"rgb(255, 228, 196)",black:"rgb( 0, 0, 0)",blanchedalmond:"rgb(255, 235, 205)",blue:"rgb( 0, 0, 255)",blueviolet:"rgb(138, 43, 226)",brown:"rgb(165, 42, 42)",burlywood:"rgb(222, 184, 135)",cadetblue:"rgb( 95, 158, 160)",chartreuse:"rgb(127, 255, 0)",chocolate:"rgb(210, 105, 30)",coral:"rgb(255, 127, 80)",cornflowerblue:"rgb(100, 149, 237)",cornsilk:"rgb(255, 248, 220)",crimson:"rgb(220, 20, 60)",cyan:"rgb( 0, 255, 255)",darkblue:"rgb( 0, 0, 139)",darkcyan:"rgb( 0, 139, 139)",darkgoldenrod:"rgb(184, 134, 11)",darkgray:"rgb(169, 169, 169)",darkgreen:"rgb( 0, 100, 0)",darkgrey:"rgb(169, 169, 169)",darkkhaki:"rgb(189, 183, 107)",darkmagenta:"rgb(139, 0, 139)",darkolivegreen:"rgb( 85, 107, 47)",darkorange:"rgb(255, 140, 0)",darkorchid:"rgb(153, 50, 204)",darkred:"rgb(139, 0, 0)",darksalmon:"rgb(233, 150, 122)",darkseagreen:"rgb(143, 188, 143)",darkslateblue:"rgb( 72, 61, 139)",darkslategray:"rgb( 47, 79, 79)",darkslategrey:"rgb( 47, 79, 79)",darkturquoise:"rgb( 0, 206, 209)",darkviolet:"rgb(148, 0, 211)",deeppink:"rgb(255, 20, 147)",deepskyblue:"rgb( 0, 191, 255)",dimgray:"rgb(105, 105, 105)",dimgrey:"rgb(105, 105, 105)",dodgerblue:"rgb( 30, 144, 255)",firebrick:"rgb(178, 34, 34)",floralwhite:"rgb(255, 250, 240)",forestgreen:"rgb( 34, 139, 34)",fuchsia:"rgb(255, 0, 255)",gainsboro:"rgb(220, 220, 220)",ghostwhite:"rgb(248, 248, 255)",gold:"rgb(255, 215, 0)",goldenrod:"rgb(218, 165, 32)",gray:"rgb(128, 128, 128)",grey:"rgb(128, 128, 128)",green:"rgb( 0, 128, 0)",greenyellow:"rgb(173, 255, 47)",honeydew:"rgb(240, 255, 240)",hotpink:"rgb(255, 105, 180)",indianred:"rgb(205, 92, 92)",indigo:"rgb( 75, 0, 130)",ivory:"rgb(255, 255, 240)",khaki:"rgb(240, 230, 140)",lavender:"rgb(230, 230, 250)",lavenderblush:"rgb(255, 240, 245)",lawngreen:"rgb(124, 252, 0)",lemonchiffon:"rgb(255, 250, 205)",lightblue:"rgb(173, 216, 230)",lightcoral:"rgb(240, 128, 128)",lightcyan:"rgb(224, 255, 255)",lightgoldenrodyellow:"rgb(250, 250, 210)",lightgray:"rgb(211, 211, 211)",lightgreen:"rgb(144, 238, 144)",lightgrey:"rgb(211, 211, 211)",lightpink:"rgb(255, 182, 193)",lightsalmon:"rgb(255, 160, 122)",lightseagreen:"rgb( 32, 178, 170)",lightskyblue:"rgb(135, 206, 250)",lightslategray:"rgb(119, 136, 153)",lightslategrey:"rgb(119, 136, 153)",lightsteelblue:"rgb(176, 196, 222)",lightyellow:"rgb(255, 255, 224)",lime:"rgb( 0, 255, 0)",limegreen:"rgb( 50, 205, 50)",linen:"rgb(250, 240, 230)",magenta:"rgb(255, 0, 255)",maroon:"rgb(128, 0, 0)",mediumaquamarine:"rgb(102, 205, 170)",mediumblue:"rgb( 0, 0, 205)",mediumorchid:"rgb(186, 85, 211)",mediumpurple:"rgb(147, 112, 219)",mediumseagreen:"rgb( 60, 179, 113)",mediumslateblue:"rgb(123, 104, 238)",mediumspringgreen:"rgb( 0, 250, 154)",mediumturquoise:"rgb( 72, 209, 204)",mediumvioletred:"rgb(199, 21, 133)",midnightblue:"rgb( 25, 25, 112)",mintcream:"rgb(245, 255, 250)",mistyrose:"rgb(255, 228, 225)",moccasin:"rgb(255, 228, 181)",navajowhite:"rgb(255, 222, 173)",navy:"rgb( 0, 0, 128)",oldlace:"rgb(253, 245, 230)",olive:"rgb(128, 128, 0)",olivedrab:"rgb(107, 142, 35)",orange:"rgb(255, 165, 0)",orangered:"rgb(255, 69, 0)",orchid:"rgb(218, 112, 214)",palegoldenrod:"rgb(238, 232, 170)",palegreen:"rgb(152, 251, 152)",paleturquoise:"rgb(175, 238, 238)",palevioletred:"rgb(219, 112, 147)",papayawhip:"rgb(255, 239, 213)",peachpuff:"rgb(255, 218, 185)",peru:"rgb(205, 133, 63)",pink:"rgb(255, 192, 203)",plum:"rgb(221, 160, 221)",powderblue:"rgb(176, 224, 230)",purple:"rgb(128, 0, 128)",red:"rgb(255, 0, 0)",rosybrown:"rgb(188, 143, 143)",royalblue:"rgb( 65, 105, 225)",saddlebrown:"rgb(139, 69, 19)",salmon:"rgb(250, 128, 114)",sandybrown:"rgb(244, 164, 96)",seagreen:"rgb( 46, 139, 87)",seashell:"rgb(255, 245, 238)",sienna:"rgb(160, 82, 45)",silver:"rgb(192, 192, 192)",skyblue:"rgb(135, 206, 235)",slateblue:"rgb(106, 90, 205)",slategray:"rgb(112, 128, 144)",slategrey:"rgb(112, 128, 144)",snow:"rgb(255, 250, 250)",springgreen:"rgb( 0, 255, 127)",steelblue:"rgb( 70, 130, 180)",tan:"rgb(210, 180, 140)",teal:"rgb( 0, 128, 128)",thistle:"rgb(216, 191, 216)",tomato:"rgb(255, 99, 71)",turquoise:"rgb( 64, 224, 208)",violet:"rgb(238, 130, 238)",wheat:"rgb(245, 222, 179)",white:"rgb(255, 255, 255)",whitesmoke:"rgb(245, 245, 245)",yellow:"rgb(255, 255, 0)",yellowgreen:"rgb(154, 205, 50)"};L.jqplot.AxisLabelRenderer=function(ah){L.jqplot.ElemContainer.call(this);this.axis;this.show=true;this.label="";this.fontFamily=null;this.fontSize=null;this.textColor=null;this._elem;this.escapeHTML=false;L.extend(true,this,ah)};L.jqplot.AxisLabelRenderer.prototype=new L.jqplot.ElemContainer();L.jqplot.AxisLabelRenderer.prototype.constructor=L.jqplot.AxisLabelRenderer;L.jqplot.AxisLabelRenderer.prototype.init=function(ah){L.extend(true,this,ah)};L.jqplot.AxisLabelRenderer.prototype.draw=function(ah,ai){if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=L('
            ');if(Number(this.label)){this._elem.css("white-space","nowrap")}if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}return this._elem};L.jqplot.AxisLabelRenderer.prototype.pack=function(){};L.jqplot.AxisTickRenderer=function(ah){L.jqplot.ElemContainer.call(this);this.mark="outside";this.axis;this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.size=4;this.markSize=6;this.show=true;this.showLabel=true;this.label=null;this.value=null;this._styles={};this.formatter=L.jqplot.DefaultTickFormatter;this.prefix="";this.suffix="";this.formatString="";this.fontFamily;this.fontSize;this.textColor;this.escapeHTML=false;this._elem;this._breakTick=false;L.extend(true,this,ah)};L.jqplot.AxisTickRenderer.prototype.init=function(ah){L.extend(true,this,ah)};L.jqplot.AxisTickRenderer.prototype=new L.jqplot.ElemContainer();L.jqplot.AxisTickRenderer.prototype.constructor=L.jqplot.AxisTickRenderer;L.jqplot.AxisTickRenderer.prototype.setTick=function(ah,aj,ai){this.value=ah;this.axis=aj;if(ai){this.isMinorTick=true}return this};L.jqplot.AxisTickRenderer.prototype.draw=function(){if(this.label===null){this.label=this.prefix+this.formatter(this.formatString,this.value)+this.suffix}var ai={position:"absolute"};if(Number(this.label)){ai.whitSpace="nowrap"}if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=L(document.createElement("div"));this._elem.addClass("jqplot-"+this.axis+"-tick");if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}this._elem.css(ai);for(var ah in this._styles){this._elem.css(ah,this._styles[ah])}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}if(this._breakTick){this._elem.addClass("jqplot-breakTick")}return this._elem};L.jqplot.DefaultTickFormatter=function(ah,ai){if(typeof ai=="number"){if(!ah){ah=L.jqplot.config.defaultTickFormatString}return L.jqplot.sprintf(ah,ai)}else{return String(ai)}};L.jqplot.PercentTickFormatter=function(ah,ai){if(typeof ai=="number"){ai=100*ai;if(!ah){ah=L.jqplot.config.defaultTickFormatString}return L.jqplot.sprintf(ah,ai)}else{return String(ai)}};L.jqplot.AxisTickRenderer.prototype.pack=function(){};L.jqplot.CanvasGridRenderer=function(){this.shadowRenderer=new L.jqplot.ShadowRenderer()};L.jqplot.CanvasGridRenderer.prototype.init=function(ai){this._ctx;L.extend(true,this,ai);var ah={lineJoin:"miter",lineCap:"round",fill:false,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.shadowWidth,closePath:false,strokeStyle:this.shadowColor};this.renderer.shadowRenderer.init(ah)};L.jqplot.CanvasGridRenderer.prototype.createElement=function(ak){var aj;if(this._elem){if(L.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==u){aj=this._elem.get(0);window.G_vmlCanvasManager.uninitElement(aj);aj=null}this._elem.emptyForce();this._elem=null}aj=ak.canvasManager.getCanvas();var ah=this._plotDimensions.width;var ai=this._plotDimensions.height;aj.width=ah;aj.height=ai;this._elem=L(aj);this._elem.addClass("jqplot-grid-canvas");this._elem.css({position:"absolute",left:0,top:0});aj=ak.canvasManager.initCanvas(aj);this._top=this._offsets.top;this._bottom=ai-this._offsets.bottom;this._left=this._offsets.left;this._right=ah-this._offsets.right;this._width=this._right-this._left;this._height=this._bottom-this._top;aj=null;return this._elem};L.jqplot.CanvasGridRenderer.prototype.draw=function(){this._ctx=this._elem.get(0).getContext("2d");var at=this._ctx;var aw=this._axes;at.save();at.clearRect(0,0,this._plotDimensions.width,this._plotDimensions.height);at.fillStyle=this.backgroundColor||this.background;at.fillRect(this._left,this._top,this._width,this._height);at.save();at.lineJoin="miter";at.lineCap="butt";at.lineWidth=this.gridLineWidth;at.strokeStyle=this.gridLineColor;var aA,az,ap,aq;var am=["xaxis","yaxis","x2axis","y2axis"];for(var ay=4;ay>0;ay--){var aD=am[ay-1];var ah=aw[aD];var aB=ah._ticks;var ar=aB.length;if(ah.show){if(ah.drawBaseline){var aC={};if(ah.baselineWidth!==null){aC.lineWidth=ah.baselineWidth}if(ah.baselineColor!==null){aC.strokeStyle=ah.baselineColor}switch(aD){case"xaxis":ao(this._left,this._bottom,this._right,this._bottom,aC);break;case"yaxis":ao(this._left,this._bottom,this._left,this._top,aC);break;case"x2axis":ao(this._left,this._bottom,this._right,this._bottom,aC);break;case"y2axis":ao(this._right,this._bottom,this._right,this._top,aC);break}}for(var au=ar;au>0;au--){var an=aB[au-1];if(an.show){var ak=Math.round(ah.u2p(an.value))+0.5;switch(aD){case"xaxis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(ak,this._top,ak,this._bottom)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._bottom;az=this._bottom+ap;break;case"inside":aA=this._bottom-ap;az=this._bottom;break;case"cross":aA=this._bottom-ap;az=this._bottom+ap;break;default:aA=this._bottom;az=this._bottom+ap;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[ak,aA],[ak,az]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ao(ak,aA,ak,az)}break;case"yaxis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(this._right,ak,this._left,ak)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._left-ap;az=this._left;break;case"inside":aA=this._left;az=this._left+ap;break;case"cross":aA=this._left-ap;az=this._left+ap;break;default:aA=this._left-ap;az=this._left;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[aA,ak],[az,ak]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ao(aA,ak,az,ak,{strokeStyle:ah.borderColor})}break;case"x2axis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(ak,this._bottom,ak,this._top)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._top-ap;az=this._top;break;case"inside":aA=this._top;az=this._top+ap;break;case"cross":aA=this._top-ap;az=this._top+ap;break;default:aA=this._top-ap;az=this._top;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[ak,aA],[ak,az]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ao(ak,aA,ak,az)}break;case"y2axis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(this._left,ak,this._right,ak)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._right;az=this._right+ap;break;case"inside":aA=this._right-ap;az=this._right;break;case"cross":aA=this._right-ap;az=this._right+ap;break;default:aA=this._right;az=this._right+ap;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[aA,ak],[az,ak]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ao(aA,ak,az,ak,{strokeStyle:ah.borderColor})}break;default:break}}}an=null}ah=null;aB=null}am=["y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];for(var ay=7;ay>0;ay--){var ah=aw[am[ay-1]];var aB=ah._ticks;if(ah.show){var ai=aB[ah.numberTicks-1];var al=aB[0];var aj=ah.getLeft();var av=[[aj,ai.getTop()+ai.getHeight()/2],[aj,al.getTop()+al.getHeight()/2+1]];if(this.shadow){this.renderer.shadowRenderer.draw(at,av,{lineCap:"butt",fill:false,closePath:false})}ao(av[0][0],av[0][1],av[1][0],av[1][1],{lineCap:"butt",strokeStyle:ah.borderColor,lineWidth:ah.borderWidth});for(var au=aB.length;au>0;au--){var an=aB[au-1];ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;if(an.showMark&&an.mark){switch(aq){case"outside":aA=aj;az=aj+ap;break;case"inside":aA=aj-ap;az=aj;break;case"cross":aA=aj-ap;az=aj+ap;break;default:aA=aj;az=aj+ap;break}av=[[aA,ak],[az,ak]];if(this.shadow){this.renderer.shadowRenderer.draw(at,av,{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ao(aA,ak,az,ak,{strokeStyle:ah.borderColor})}an=null}al=null}ah=null;aB=null}at.restore();function ao(aH,aG,aE,ax,aF){at.save();aF=aF||{};if(aF.lineWidth==null||aF.lineWidth!=0){L.extend(true,at,aF);at.beginPath();at.moveTo(aH,aG);at.lineTo(aE,ax);at.stroke();at.restore()}}if(this.shadow){var av=[[this._left,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(at,av)}if(this.borderWidth!=0&&this.drawBorder){ao(this._left,this._top,this._right,this._top,{lineCap:"round",strokeStyle:aw.x2axis.borderColor,lineWidth:aw.x2axis.borderWidth});ao(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:aw.y2axis.borderColor,lineWidth:aw.y2axis.borderWidth});ao(this._right,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:aw.xaxis.borderColor,lineWidth:aw.xaxis.borderWidth});ao(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:aw.yaxis.borderColor,lineWidth:aw.yaxis.borderWidth})}at.restore();at=null;aw=null};L.jqplot.DivTitleRenderer=function(){};L.jqplot.DivTitleRenderer.prototype.init=function(ah){L.extend(true,this,ah)};L.jqplot.DivTitleRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}var ak=this.renderer;var aj=document.createElement("div");this._elem=L(aj);this._elem.addClass("jqplot-title");if(!this.text){this.show=false;this._elem.height(0);this._elem.width(0)}else{if(this.text){var ah;if(this.color){ah=this.color}else{if(this.textColor){ah=this.textColor}}var ai={position:"absolute",top:"0px",left:"0px"};if(this._plotWidth){ai.width=this._plotWidth+"px"}if(this.fontSize){ai.fontSize=this.fontSize}if(typeof this.textAlign==="string"){ai.textAlign=this.textAlign}else{ai.textAlign="center"}if(ah){ai.color=ah}if(this.paddingBottom){ai.paddingBottom=this.paddingBottom}if(this.fontFamily){ai.fontFamily=this.fontFamily}this._elem.css(ai);if(this.escapeHtml){this._elem.text(this.text)}else{this._elem.html(this.text)}}}aj=null;return this._elem};L.jqplot.DivTitleRenderer.prototype.pack=function(){};var r=0.1;L.jqplot.LinePattern=function(aw,aq){var ap={dotted:[r,L.jqplot.config.dotGapLength],dashed:[L.jqplot.config.dashLength,L.jqplot.config.gapLength],solid:null};if(typeof aq==="string"){if(aq[0]==="."||aq[0]==="-"){var ax=aq;aq=[];for(var ao=0,al=ax.length;ao0)&&(aC>0)){aA/=aB;az/=aB;while(true){var aD=aC*ar;if(aD=aq.length){ak=0}ar=aq[ak]}else{au=ay;at=aE;if((ak&1)==0){aw.lineTo(au,at)}else{aw.moveTo(au,at)}ar-=aB/aC;break}}}};var ai=function(){aw.beginPath()};var am=function(){aj(an,ah)};return{moveTo:av,lineTo:aj,beginPath:ai,closePath:am}};L.jqplot.LineRenderer=function(){this.shapeRenderer=new L.jqplot.ShapeRenderer();this.shadowRenderer=new L.jqplot.ShadowRenderer()};L.jqplot.LineRenderer.prototype.init=function(ai,an){ai=ai||{};this._type="line";this.renderer.animation={show:false,direction:"left",speed:2500,_supported:true};this.renderer.smooth=false;this.renderer.tension=null;this.renderer.constrainSmoothing=true;this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];this.renderer.bandData=[];this.renderer.bands={show:false,hiData:[],lowData:[],color:this.color,showLines:false,fill:true,fillColor:null,_min:null,_max:null,interval:"3%"};var al={highlightMouseOver:ai.highlightMouseOver,highlightMouseDown:ai.highlightMouseDown,highlightColor:ai.highlightColor};delete (ai.highlightMouseOver);delete (ai.highlightMouseDown);delete (ai.highlightColor);L.extend(true,this.renderer,ai);this.renderer.options=ai;if(this.renderer.bandData.length>1&&(!ai.bands||ai.bands.show==null)){this.renderer.bands.show=true}else{if(ai.bands&&ai.bands.show==null&&ai.bands.interval!=null){this.renderer.bands.show=true}}if(this.fill){this.renderer.bands.show=false}if(this.renderer.bands.show){this.renderer.initBands.call(this,this.renderer.options,an)}if(this._stack){this.renderer.smooth=false}var am={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,strokeStyle:this.color,fillStyle:this.fillColor,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shapeRenderer.init(am);var aj=ai.shadowOffset;if(aj==null){if(this.lineWidth>2.5){aj=1.25*(1+(Math.atan((this.lineWidth/2.5))/0.785398163-1)*0.6)}else{aj=1.25*Math.atan((this.lineWidth/2.5))/0.785398163}}var ah={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,angle:this.shadowAngle,offset:aj,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shadowRenderer.init(ah);this._areaPoints=[];this._boundingBox=[[],[]];if(!this.isTrendline&&this.fill||this.renderer.bands.show){this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColor=null;if(al.highlightMouseDown&&al.highlightMouseOver==null){al.highlightMouseOver=false}L.extend(true,this,{highlightMouseOver:al.highlightMouseOver,highlightMouseDown:al.highlightMouseDown,highlightColor:al.highlightColor});if(!this.highlightColor){var ak=(this.renderer.bands.show)?this.renderer.bands.fillColor:this.fillColor;this.highlightColor=L.jqplot.computeHighlightColors(ak)}if(this.highlighter){this.highlighter.show=false}}if(!this.isTrendline&&an){an.plugins.lineRenderer={};an.postInitHooks.addOnce(z);an.postDrawHooks.addOnce(af);an.eventListenerHooks.addOnce("jqplotMouseMove",h);an.eventListenerHooks.addOnce("jqplotMouseDown",e);an.eventListenerHooks.addOnce("jqplotMouseUp",ad);an.eventListenerHooks.addOnce("jqplotClick",g);an.eventListenerHooks.addOnce("jqplotRightClick",s)}};L.jqplot.LineRenderer.prototype.initBands=function(ak,av){var al=ak.bandData||[];var an=this.renderer.bands;an.hiData=[];an.lowData=[];var aB=this.data;an._max=null;an._min=null;if(al.length==2){if(L.isArray(al[0][0])){var ao;var ah=0,ar=0;for(var aw=0,at=al[0].length;awan._max)||an._max==null){an._max=ao[1]}if((ao[1]!=null&&ao[1]an._max)||an._max==null){an._max=ao[1];ar=1}if((ao[1]!=null&&ao[1]al[1][0])?0:1;var aC=(aj)?0:1;for(var aw=0,at=aB.length;aw2&&!L.isArray(al[0][0])){var aj=(al[0][0]>al[0][1])?0:1;var aC=(aj)?0:1;for(var aw=0,at=al.length;awan._max)||an._max==null){an._max=am[aw][1]}}for(var aw=0,at=ap.length;aw0){aR=Math.abs((ap[aQ][1]-ap[aQ-1][1])/(ap[aQ][0]-ap[aQ-1][0]))}am=aR/aG+aE;aM=aF*A(am)-aF*A(aE)+aS;aT=(aO+aM)/2}else{aT=aU}for(aK=0;aK2){var ao;if(this.renderer.constrainSmoothing){ao=J.call(this,this.gridData);this.renderer._smoothedData=ao[0];this.renderer._smoothedPlotData=ao[1];if(ak.show){ao=J.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ao[0];ao=J.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ao[0]}ao=null}else{ao=F.call(this,this.gridData);this.renderer._smoothedData=ao[0];this.renderer._smoothedPlotData=ao[1];if(ak.show){ao=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ao[0];ao=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ao[0]}ao=null}}};L.jqplot.LineRenderer.prototype.makeGridData=function(ao,aq){var am=this._xaxis.series_u2p;var ah=this._yaxis.series_u2p;var ar=[];var aj=[];this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];var al=this.renderer.bands;var ai=false;for(var an=0;an2){var ap;if(this.renderer.constrainSmoothing){ap=J.call(this,ar);this.renderer._smoothedData=ap[0];this.renderer._smoothedPlotData=ap[1];if(al.show){ap=J.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ap[0];ap=J.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ap[0]}ap=null}else{ap=F.call(this,ar);this.renderer._smoothedData=ap[0];this.renderer._smoothedPlotData=ap[1];if(al.show){ap=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ap[0];ap=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ap[0]}ap=null}}return ar};L.jqplot.LineRenderer.prototype.draw=function(ax,aI,ai,aB){var aC;var aq=L.extend(true,{},ai);var ak=(aq.shadow!=u)?aq.shadow:this.shadow;var aJ=(aq.showLine!=u)?aq.showLine:this.showLine;var aA=(aq.fill!=u)?aq.fill:this.fill;var ah=(aq.fillAndStroke!=u)?aq.fillAndStroke:this.fillAndStroke;var ar,ay,av,aE;ax.save();if(aI.length){if(aJ){if(aA){if(this.fillToZero){var aF=this.negativeColor;if(!this.useNegativeColors){aF=aq.fillStyle}var ao=false;var ap=aq.fillStyle;if(ah){var aH=aI.slice(0)}if(this.index==0||!this._stack){var aw=[];var aL=(this.renderer.smooth)?this.renderer._smoothedPlotData:this._plotData;this._areaPoints=[];var aG=this._yaxis.series_u2p(this.fillToValue);var aj=this._xaxis.series_u2p(this.fillToValue);aq.closePath=true;if(this.fillAxis=="y"){aw.push([aI[0][0],aG]);this._areaPoints.push([aI[0][0],aG]);for(var aC=0;aC0;aC--){aI.push(au[aC-1])}if(ak){this.renderer.shadowRenderer.draw(ax,aI,aq)}this._areaPoints=aI;this.renderer.shapeRenderer.draw(ax,aI,aq)}}else{if(ah){var aH=aI.slice(0)}if(this.index==0||!this._stack){var al=ax.canvas.height;aI.unshift([aI[0][0],al]);var aD=aI.length;aI.push([aI[aD-1][0],al])}else{var au=this._prevGridData;for(var aC=au.length;aC>0;aC--){aI.push(au[aC-1])}}this._areaPoints=aI;if(ak){this.renderer.shadowRenderer.draw(ax,aI,aq)}this.renderer.shapeRenderer.draw(ax,aI,aq)}if(ah){var az=L.extend(true,{},aq,{fill:false,closePath:false});this.renderer.shapeRenderer.draw(ax,aH,az);if(this.markerRenderer.show){if(this.renderer.smooth){aH=this.gridData}for(aC=0;aCat[0]||ar==null){ar=at[0]}if(aEat[1]||ay==null){ay=at[1]}}if(this.type==="line"&&this.renderer.bands.show){aE=this._yaxis.series_u2p(this.renderer.bands._min);ay=this._yaxis.series_u2p(this.renderer.bands._max)}this._boundingBox=[[ar,aE],[av,ay]];if(this.markerRenderer.show&&!aA){if(this.renderer.smooth){aI=this.gridData}for(aC=0;aCao){ao=aj}}}al=null;am=null;if(ah){ai=this._label._elem.outerWidth(true);an=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){ao=ao+an;this._elem.css({height:ao+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){ao=ao+an;this._elem.css({height:ao+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){ao=ao+ai;this._elem.css({width:ao+"px",left:"0px",top:"0px"});if(ah&&this._label.constructor==L.jqplot.AxisLabelRenderer){this._label._elem.css("width",ai+"px")}}else{ao=ao+ai;this._elem.css({width:ao+"px",right:"0px",top:"0px"});if(ah&&this._label.constructor==L.jqplot.AxisLabelRenderer){this._label._elem.css("width",ai+"px")}}}}}};L.jqplot.LinearAxisRenderer.prototype.createTicks=function(aj){var aT=this._ticks;var aK=this.ticks;var az=this.name;var aB=this._dataBounds;var ah=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;var an;var a6,aI;var ap,ao;var a4,a0;var aH=this.min;var a5=this.max;var aW=this.numberTicks;var ba=this.tickInterval;var am=30;this._scalefact=(Math.max(ah,am+1)-am)/300;if(aK.length){for(a0=0;a0this.breakPoints[0]&&aO[0]<=this.breakPoints[1]){aU.show=false;aU.showGridline=false;aU.label=aO[1]}else{aU.label=aO[1]}}}else{aU.label=aO[1]}aU.setTick(aO[0],this.name);this._ticks.push(aU)}else{if(L.isPlainObject(aO)){L.extend(true,aU,aO);aU.axis=this.name;this._ticks.push(aU)}else{aU.value=aO;if(this.breakPoints){if(aO==this.breakPoints[0]){aU.label=this.breakTickLabel;aU._breakTick=true;aU.showGridline=false;aU.showMark=false}else{if(aO>this.breakPoints[0]&&aO<=this.breakPoints[1]){aU.show=false;aU.showGridline=false}}}aU.setTick(aO,this.name);this._ticks.push(aU)}}}this.numberTicks=aK.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1)}else{if(az=="xaxis"||az=="x2axis"){ah=this._plotDimensions.width}else{ah=this._plotDimensions.height}var ax=this.numberTicks;if(this.alignTicks){if(this.name==="x2axis"&&aj.axes.xaxis.show){ax=aj.axes.xaxis.numberTicks}else{if(this.name.charAt(0)==="y"&&this.name!=="yaxis"&&this.name!=="yMidAxis"&&aj.axes.yaxis.show){ax=aj.axes.yaxis.numberTicks}}}a6=((this.min!=null)?this.min:aB.min);aI=((this.max!=null)?this.max:aB.max);var av=aI-a6;var aS,ay;var at;if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(this.min==null||this.max==null&&this.tickInterval==null&&!this.autoscale){if(this.forceTickAt0){if(a6>0){a6=0}if(aI<0){aI=0}}if(this.forceTickAt100){if(a6>100){a6=100}if(aI<100){aI=100}}var aE=false,a1=false;if(this.min!=null){aE=true}else{if(this.max!=null){a1=true}}var aP=L.jqplot.LinearTickGenerator(a6,aI,this._scalefact,ax,aE,a1);var aw=(this.min!=null)?a6:a6+av*(this.padMin-1);var aQ=(this.max!=null)?aI:aI-av*(this.padMax-1);if(a6aQ){aw=(this.min!=null)?a6:a6-av*(this.padMin-1);aQ=(this.max!=null)?aI:aI+av*(this.padMax-1);aP=L.jqplot.LinearTickGenerator(aw,aQ,this._scalefact,ax,aE,a1)}this.min=aP[0];this.max=aP[1];this.numberTicks=aP[2];this._autoFormatString=aP[3];this.tickInterval=aP[4]}else{if(a6==aI){var ai=0.05;if(a6>0){ai=Math.max(Math.log(a6)/Math.LN10,0.05)}a6-=ai;aI+=ai}if(this.autoscale&&this.min==null&&this.max==null){var ak,al,ar;var aC=false;var aN=false;var aA={min:null,max:null,average:null,stddev:null};for(var a0=0;a0a2){a2=aR[aZ]}}}var au=(a2-aG)/a2;if(aV.renderer.constructor==L.jqplot.BarRenderer){if(aG>=0&&(aV.fillToZero||au>0.1)){aC=true}else{aC=false;if(aV.fill&&aV.fillToZero&&aG<0&&a2>0){aN=true}else{aN=false}}}else{if(aV.fill){if(aG>=0&&(aV.fillToZero||au>0.1)){aC=true}else{if(aG<0&&a2>0&&aV.fillToZero){aC=false;aN=true}else{aC=false;aN=false}}}else{if(aG<0){aC=false}}}}}if(aC){this.numberTicks=2+Math.ceil((ah-(this.tickSpacing-1))/this.tickSpacing);this.min=0;aH=0;al=aI/(this.numberTicks-1);at=Math.pow(10,Math.abs(Math.floor(Math.log(al)/Math.LN10)));if(al/at==parseInt(al/at,10)){al+=at}this.tickInterval=Math.ceil(al/at)*at;this.max=this.tickInterval*(this.numberTicks-1)}else{if(aN){this.numberTicks=2+Math.ceil((ah-(this.tickSpacing-1))/this.tickSpacing);var aJ=Math.ceil(Math.abs(a6)/av*(this.numberTicks-1));var a9=this.numberTicks-1-aJ;al=Math.max(Math.abs(a6/aJ),Math.abs(aI/a9));at=Math.pow(10,Math.abs(Math.floor(Math.log(al)/Math.LN10)));this.tickInterval=Math.ceil(al/at)*at;this.max=this.tickInterval*a9;this.min=-this.tickInterval*aJ}else{if(this.numberTicks==null){if(this.tickInterval){this.numberTicks=3+Math.ceil(av/this.tickInterval)}else{this.numberTicks=2+Math.ceil((ah-(this.tickSpacing-1))/this.tickSpacing)}}if(this.tickInterval==null){al=av/(this.numberTicks-1);if(al<1){at=Math.pow(10,Math.abs(Math.floor(Math.log(al)/Math.LN10)))}else{at=1}this.tickInterval=Math.ceil(al*at*this.pad)/at}else{at=1/this.tickInterval}ak=this.tickInterval*(this.numberTicks-1);ar=(ak-av)/2;if(this.min==null){this.min=Math.floor(at*(a6-ar))/at}if(this.max==null){this.max=this.min+ak}}}var aF=L.jqplot.getSignificantFigures(this.tickInterval);var aM;if(aF.digitsLeft>=aF.significantDigits){aM="%d"}else{var at=Math.max(0,5-aF.digitsLeft);at=Math.min(at,aF.digitsRight);aM="%."+at+"f"}this._autoFormatString=aM}else{aS=(this.min!=null)?this.min:a6-av*(this.padMin-1);ay=(this.max!=null)?this.max:aI+av*(this.padMax-1);av=ay-aS;if(this.numberTicks==null){if(this.tickInterval!=null){this.numberTicks=Math.ceil((ay-aS)/this.tickInterval)+1}else{if(ah>100){this.numberTicks=parseInt(3+(ah-100)/75,10)}else{this.numberTicks=2}}}if(this.tickInterval==null){this.tickInterval=av/(this.numberTicks-1)}if(this.max==null){ay=aS+this.tickInterval*(this.numberTicks-1)}if(this.min==null){aS=ay-this.tickInterval*(this.numberTicks-1)}var aF=L.jqplot.getSignificantFigures(this.tickInterval);var aM;if(aF.digitsLeft>=aF.significantDigits){aM="%d"}else{var at=Math.max(0,5-aF.digitsLeft);at=Math.min(at,aF.digitsRight);aM="%."+at+"f"}this._autoFormatString=aM;this.min=aS;this.max=ay}if(this.renderer.constructor==L.jqplot.LinearAxisRenderer&&this._autoFormatString==""){av=this.max-this.min;var a7=new this.tickRenderer(this.tickOptions);var aL=a7.formatString||L.jqplot.config.defaultTickFormatString;var aL=aL.match(L.jqplot.sprintf.regex)[0];var a3=0;if(aL){if(aL.search(/[fFeEgGpP]/)>-1){var aY=aL.match(/\%\.(\d{0,})?[eEfFgGpP]/);if(aY){a3=parseInt(aY[1],10)}else{a3=6}}else{if(aL.search(/[di]/)>-1){a3=0}}var aq=Math.pow(10,-a3);if(this.tickIntervalthis.breakPoints[0]&&aAthis.breakPoints[0]&&aAthis.breakPoints[0]&&aA=this.breakPoints[1]){return(aA-au)*ak/al}else{return(aA+this.breakPoints[1]-this.breakPoints[0]-au)*ak/al}};this.series_p2u=function(aA){return aA*al/ak+au}}}else{this.p2u=function(aA){return(aA-am)*al/ak+at};this.u2p=function(aA){return(aA-at)*ak/al+am};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(aA){return(aA-at)*ak/al};this.series_p2u=function(aA){return aA*al/ak+at}}else{this.series_u2p=function(aA){return(aA-au)*ak/al};this.series_p2u=function(aA){return aA*al/ak+au}}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var av=0;av0){ah=-ap._textRenderer.height*Math.cos(-ap._textRenderer.angle)/2}else{ah=-ap.getHeight()+ap._textRenderer.height*Math.cos(ap._textRenderer.angle)/2}break;case"middle":ah=-ap.getHeight()/2;break;default:ah=-ap.getHeight()/2;break}}else{ah=-ap.getHeight()/2}var az=this.u2p(ap.value)+ah+"px";ap._elem.css("top",az);ap.pack()}}if(aq){var aw=this._label._elem.outerHeight(true);this._label._elem.css("top",ao-ak/2-aw/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}ay=null};function i(ai){var ah;ai=Math.abs(ai);if(ai>=10){ah="%d"}else{if(ai>1){if(ai===parseInt(ai,10)){ah="%d"}else{ah="%.1f"}}else{var aj=-Math.floor(Math.log(ai)/Math.LN10);ah="%."+aj+"f"}}return ah}var b=[0.1,0.2,0.3,0.4,0.5,0.8,1,2,3,4,5];var c=function(ai){var ah=b.indexOf(ai);if(ah>0){return b[ah-1]}else{return b[b.length-1]/100}};var k=function(ai){var ah=b.indexOf(ai);if(ah5){ah=10*aj}else{if(am>2){ah=5*aj}else{if(am>1){ah=2*aj}else{ah=aj}}}}else{if(am>5){ah=10*aj}else{if(am>4){ah=5*aj}else{if(am>3){ah=4*aj}else{if(am>2){ah=3*aj}else{if(am>1){ah=2*aj}else{ah=aj}}}}}}return ah}function Q(ai,ah){ah=ah||1;var ak=Math.floor(Math.log(ai)/Math.LN10);var am=Math.pow(10,ak);var al=ai/am;var aj;al=al/ah;if(al<=0.38){aj=0.1}else{if(al<=1.6){aj=0.2}else{if(al<=4){aj=0.5}else{if(al<=8){aj=1}else{if(al<=16){aj=2}else{aj=5}}}}}return aj*am}function x(aj,ai){var al=Math.floor(Math.log(aj)/Math.LN10);var an=Math.pow(10,al);var am=aj/an;var ah;var ak;am=am/ai;if(am<=0.38){ak=0.1}else{if(am<=1.6){ak=0.2}else{if(am<=4){ak=0.5}else{if(am<=8){ak=1}else{if(am<=16){ak=2}else{ak=5}}}}}ah=ak*an;return[ah,ak,an]}L.jqplot.LinearTickGenerator=function(an,aq,aj,ak,ao,ar){ao=(ao===null)?false:ao;ar=(ar===null||ao)?false:ar;if(an===aq){aq=(aq)?0:1}aj=aj||1;if(aqat){at=aB}if(ai>aA){aA=ai}})}an.width=at+Number(av);an.height=aA+Number(ax);var ak=an.getContext("2d");ak.save();ak.fillStyle=al;ak.fillRect(0,0,an.width,an.height);ak.restore();ak.translate(au,ar);ak.textAlign="left";ak.textBaseline="top";function aC(aE){var aF=parseInt(L(aE).css("line-height"),10);if(isNaN(aF)){aF=parseInt(L(aE).css("font-size"),10)*1.2}return aF}function aD(aF,aE,aS,aG,aO,aH){var aQ=aC(aF);var aK=L(aF).innerWidth();var aL=L(aF).innerHeight();var aN=aS.split(/\s+/);var aR=aN.length;var aP="";var aM=[];var aU=aO;var aT=aG;for(var aJ=0;aJaK){aM.push(aJ);aP="";aJ--}}if(aM.length===0){if(L(aF).css("textAlign")==="center"){aT=aG+(aH-aE.measureText(aP).width)/2-au}aE.fillText(aS,aT,aO)}else{aP=aN.slice(0,aM[0]).join(" ");if(L(aF).css("textAlign")==="center"){aT=aG+(aH-aE.measureText(aP).width)/2-au}aE.fillText(aP,aT,aU);aU+=aQ;for(var aJ=1,aI=aM.length;aJ0){ak.strokeRect(aI,aL,L(aG).innerWidth(),L(aG).innerHeight())}L(aG).find("div.jqplot-table-legend-swatch-outline").each(function(){var aU=L(this);ak.strokeStyle=aU.css("border-top-color");var aQ=aI+aU.position().left;var aR=aL+aU.position().top;ak.strokeRect(aQ,aR,aU.innerWidth(),aU.innerHeight());aQ+=parseInt(aU.css("padding-left"),10);aR+=parseInt(aU.css("padding-top"),10);var aT=aU.innerHeight()-2*parseInt(aU.css("padding-top"),10);var aP=aU.innerWidth()-2*parseInt(aU.css("padding-left"),10);var aS=aU.children("div.jqplot-table-legend-swatch");ak.fillStyle=aS.css("background-color");ak.fillRect(aQ,aR,aP,aT)});L(aG).find("td.jqplot-table-legend-label").each(function(){var aR=L(this);var aP=aI+aR.position().left;var aQ=aL+aR.position().top+parseInt(aR.css("padding-top"),10);ak.font=aR.jqplotGetComputedFontStyle();ak.fillStyle=aR.css("color");aD(aR,ak,aR.text(),aP,aQ,aM)});var aH=null}else{if(aN=="canvas"){ak.drawImage(aG,aI,aL)}}}}L(this).children().each(function(){aw(this,av,ax)});return an};L.fn.jqplotToImageStr=function(ai){var ah=L(this).jqplotToImageCanvas(ai);if(ah){return ah.toDataURL("image/png")}else{return null}};L.fn.jqplotToImageElem=function(ah){var ai=document.createElement("img");var aj=L(this).jqplotToImageStr(ah);ai.src=aj;return ai};L.fn.jqplotToImageElemStr=function(ah){var ai="";return ai};L.fn.jqplotSaveImage=function(){var ah=L(this).jqplotToImageStr({});if(ah){window.location.href=ah.replace("image/png","image/octet-stream")}};L.fn.jqplotViewImage=function(){var ai=L(this).jqplotToImageElemStr({});var aj=L(this).jqplotToImageStr({});if(ai){var ah=window.open("");ah.document.open("image/png");ah.document.write(ai);ah.document.close();ah=null}};var ag=function(){this.syntax=ag.config.syntax;this._type="jsDate";this.proxy=new Date();this.options={};this.locale=ag.regional.getLocale();this.formatString="";this.defaultCentury=ag.config.defaultCentury;switch(arguments.length){case 0:break;case 1:if(l(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var aj=this.options=arguments[0];this.syntax=aj.syntax||this.syntax;this.defaultCentury=aj.defaultCentury||this.defaultCentury;this.proxy=ag.createDate(aj.date)}else{this.proxy=ag.createDate(arguments[0])}break;default:var ah=[];for(var ai=0;ai0?"floor":"ceil"](ak))};ag.prototype.getAbbrDayName=function(){return ag.regional[this.locale]["dayNamesShort"][this.proxy.getDay()]};ag.prototype.getAbbrMonthName=function(){return ag.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()]};ag.prototype.getAMPM=function(){return this.proxy.getHours()>=12?"PM":"AM"};ag.prototype.getAmPm=function(){return this.proxy.getHours()>=12?"pm":"am"};ag.prototype.getCentury=function(){return parseInt(this.proxy.getFullYear()/100,10)};ag.prototype.getDate=function(){return this.proxy.getDate()};ag.prototype.getDay=function(){return this.proxy.getDay()};ag.prototype.getDayOfWeek=function(){var ah=this.proxy.getDay();return ah===0?7:ah};ag.prototype.getDayOfYear=function(){var ai=this.proxy;var ah=ai-new Date(""+ai.getFullYear()+"/1/1 GMT");ah+=ai.getTimezoneOffset()*60000;ai=null;return parseInt(ah/60000/60/24,10)+1};ag.prototype.getDayName=function(){return ag.regional[this.locale]["dayNames"][this.proxy.getDay()]};ag.prototype.getFullWeekOfYear=function(){var ak=this.proxy;var ah=this.getDayOfYear();var aj=6-ak.getDay();var ai=parseInt((ah+aj)/7,10);return ai};ag.prototype.getFullYear=function(){return this.proxy.getFullYear()};ag.prototype.getGmtOffset=function(){var ah=this.proxy.getTimezoneOffset()/60;var ai=ah<0?"+":"-";ah=Math.abs(ah);return ai+N(Math.floor(ah),2)+":"+N((ah%1)*60,2)};ag.prototype.getHours=function(){return this.proxy.getHours()};ag.prototype.getHours12=function(){var ah=this.proxy.getHours();return ah>12?ah-12:(ah==0?12:ah)};ag.prototype.getIsoWeek=function(){var ak=this.proxy;var aj=this.getWeekOfYear();var ah=(new Date(""+ak.getFullYear()+"/1/1")).getDay();var ai=aj+(ah>4||ah<=1?0:1);if(ai==53&&(new Date(""+ak.getFullYear()+"/12/31")).getDay()<4){ai=1}else{if(ai===0){ak=new ag(new Date(""+(ak.getFullYear()-1)+"/12/31"));ai=ak.getIsoWeek()}}ak=null;return ai};ag.prototype.getMilliseconds=function(){return this.proxy.getMilliseconds()};ag.prototype.getMinutes=function(){return this.proxy.getMinutes()};ag.prototype.getMonth=function(){return this.proxy.getMonth()};ag.prototype.getMonthName=function(){return ag.regional[this.locale]["monthNames"][this.proxy.getMonth()]};ag.prototype.getMonthNumber=function(){return this.proxy.getMonth()+1};ag.prototype.getSeconds=function(){return this.proxy.getSeconds()};ag.prototype.getShortYear=function(){return this.proxy.getYear()%100};ag.prototype.getTime=function(){return this.proxy.getTime()};ag.prototype.getTimezoneAbbr=function(){return this.proxy.toString().replace(/^.*\(([^)]+)\)$/,"$1")};ag.prototype.getTimezoneName=function(){var ah=/(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());return ah[1]||ah[2]||"GMT"+this.getGmtOffset()};ag.prototype.getTimezoneOffset=function(){return this.proxy.getTimezoneOffset()};ag.prototype.getWeekOfYear=function(){var ah=this.getDayOfYear();var aj=7-this.getDayOfWeek();var ai=parseInt((ah+aj)/7,10);return ai};ag.prototype.getUnix=function(){return Math.round(this.proxy.getTime()/1000,0)};ag.prototype.getYear=function(){return this.proxy.getYear()};ag.prototype.next=function(ah){ah=ah||"day";return this.clone().add(1,ah)};ag.prototype.set=function(){switch(arguments.length){case 0:this.proxy=new Date();break;case 1:if(l(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var aj=this.options=arguments[0];this.syntax=aj.syntax||this.syntax;this.defaultCentury=aj.defaultCentury||this.defaultCentury;this.proxy=ag.createDate(aj.date)}else{this.proxy=ag.createDate(arguments[0])}break;default:var ah=[];for(var ai=0;ai0?"floor":"ceil"](ah/12));var ai=aj.getMonth()+(ah%12);if(ai==12){ai=0;aj.setYear(aj.getFullYear()+1)}else{if(ai==-1){ai=11;aj.setYear(aj.getFullYear()-1)}}aj.setMonth(ai)},diff:function(al,aj){var ah=al.getFullYear()-aj.getFullYear();var ai=al.getMonth()-aj.getMonth()+(ah*12);var ak=al.getDate()-aj.getDate();return ai+(ak/30)}},year:{add:function(ai,ah){ai.setYear(ai.getFullYear()+Math[ah>0?"floor":"ceil"](ah))},diff:function(ai,ah){return E.month.diff(ai,ah)/12}}};for(var Y in E){if(Y.substring(Y.length-1)!="s"){E[Y+"s"]=E[Y]}}var H=function(al,ak,ai){if(ag.formats[ai]["shortcuts"][ak]){return ag.strftime(al,ag.formats[ai]["shortcuts"][ak],ai)}else{var ah=(ag.formats[ai]["codes"][ak]||"").split(".");var aj=al["get"+ah[0]]?al["get"+ah[0]]():"";if(ah[1]){aj=N(aj,ah[1])}return aj}};ag.strftime=function(an,ak,aj,ao){var ai="perl";var am=ag.regional.getLocale();if(aj&&ag.formats.hasOwnProperty(aj)){ai=aj}else{if(aj&&ag.regional.hasOwnProperty(aj)){am=aj}}if(ao&&ag.formats.hasOwnProperty(ao)){ai=ao}else{if(ao&&ag.regional.hasOwnProperty(ao)){am=ao}}if(l(an)!="[object Object]"||an._type!="jsDate"){an=new ag(an);an.locale=am}if(!ak){ak=an.formatString||ag.regional[am]["formatString"]}var ah=ak||"%Y-%m-%d",ap="",al;while(ah.length>0){if(al=ah.match(ag.formats[ai].codes.matcher)){ap+=ah.slice(0,al.index);ap+=(al[1]||"")+H(an,al[2],ai);ah=ah.slice(al.index+al[0].length)}else{ap+=ah;ah=""}}return ap};ag.formats={ISO:"%Y-%m-%dT%H:%M:%S.%N%G",SQL:"%Y-%m-%d %H:%M:%S"};ag.formats.perl={codes:{matcher:/()%(#?(%|[a-z]))/i,Y:"FullYear",y:"ShortYear.2",m:"MonthNumber.2","#m":"MonthNumber",B:"MonthName",b:"AbbrMonthName",d:"Date.2","#d":"Date",e:"Date",A:"DayName",a:"AbbrDayName",w:"Day",H:"Hours.2","#H":"Hours",I:"Hours12.2","#I":"Hours12",p:"AMPM",M:"Minutes.2","#M":"Minutes",S:"Seconds.2","#S":"Seconds",s:"Unix",N:"Milliseconds.3","#N":"Milliseconds",O:"TimezoneOffset",Z:"TimezoneName",G:"GmtOffset"},shortcuts:{F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",D:"%m/%d/%y","#c":"%a %b %e %H:%M:%S %Y",v:"%e-%b-%Y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};ag.formats.php={codes:{matcher:/()%((%|[a-z]))/i,a:"AbbrDayName",A:"DayName",d:"Date.2",e:"Date",j:"DayOfYear.3",u:"DayOfWeek",w:"Day",U:"FullWeekOfYear.2",V:"IsoWeek.2",W:"WeekOfYear.2",b:"AbbrMonthName",B:"MonthName",m:"MonthNumber.2",h:"AbbrMonthName",C:"Century.2",y:"ShortYear.2",Y:"FullYear",H:"Hours.2",I:"Hours12.2",l:"Hours12",p:"AMPM",P:"AmPm",M:"Minutes.2",S:"Seconds.2",s:"Unix",O:"TimezoneOffset",z:"GmtOffset",Z:"TimezoneAbbr"},shortcuts:{D:"%m/%d/%y",F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};ag.createDate=function(aj){if(aj==null){return new Date()}if(aj instanceof Date){return aj}if(typeof aj=="number"){return new Date(aj)}var ao=String(aj).replace(/^\s*(.+)\s*$/g,"$1");ao=ao.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/,"$1/$2/$3");ao=ao.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i,"$1 $2 $3");var an=ao.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);if(an&&an.length>3){var at=parseFloat(an[3]);var am=ag.config.defaultCentury+at;am=String(am);ao=ao.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i,an[1]+" "+an[2]+" "+am)}an=ao.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);function ar(ax,aw){var aC=parseFloat(aw[1]);var aB=parseFloat(aw[2]);var aA=parseFloat(aw[3]);var az=ag.config.defaultCentury;var av,au,aD,ay;if(aC>31){au=aA;aD=aB;av=az+aC}else{au=aB;aD=aC;av=az+aA}ay=aD+"/"+au+"/"+av;return ax.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/,ay)}if(an&&an.length>3){ao=ar(ao,an)}var an=ao.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);if(an&&an.length>3){ao=ar(ao,an)}var al=0;var ai=ag.matchers.length;var aq,ah,ap=ao,ak;while(al31){ah=an;ai=am+ao}else{ah=ao;ai=am+an}var ap=ab(aj[2],ag.regional[ag.regional.getLocale()]["monthNamesShort"]);if(ap==-1){ap=ab(aj[2],ag.regional[ag.regional.getLocale()]["monthNames"])}ak.setFullYear(ai,ap,ah);ak.setHours(0,0,0,0);return ak}else{return al}}];function ab(aj,ak){if(ak.indexOf){return ak.indexOf(aj)}for(var ah=0,ai=ak.length;ah=ap)?"":Array(1+ap-au.length>>>0).join(aq);return at?au+ar:ar+au}function ak(ar){var aq=new String(ar);for(var ap=10;ap>0;ap--){if(aq==(aq=aq.replace(/^(\d+)(\d{3})/,"$1"+L.jqplot.sprintf.thousandsSeparator+"$2"))){break}}return aq}function aj(av,au,ax,ar,at,aq){var aw=ar-av.length;if(aw>0){var ap=" ";if(aq){ap=" "}if(ax||!at){av=an(av,ar,ap,ax)}else{av=av.slice(0,au.length)+an("",aw,"0",true)+av.slice(au.length)}}return av}function ao(ay,aq,aw,ar,ap,av,ax,au){var at=ay>>>0;aw=aw&&at&&{"2":"0b","8":"0","16":"0x"}[aq]||"";ay=aw+an(at.toString(aq),av||0,"0",false);return aj(ay,aw,ar,ap,ax,au)}function ah(au,av,ar,ap,at,aq){if(ap!=null){au=au.slice(0,ap)}return aj(au,"",av,ar,at,aq)}var ai=arguments,al=0,am=ai[al++];return am.replace(L.jqplot.sprintf.regex,function(aM,ax,ay,aB,aO,aJ,av){if(aM=="%%"){return"%"}var aD=false,az="",aA=false,aL=false,aw=false,au=false;for(var aI=0;ay&&aI-1?6:(av=="d")?0:void (0)}else{if(aJ=="*"){aJ=+ai[al++]}else{if(aJ.charAt(0)=="*"){aJ=+ai[aJ.slice(1,-1)]}else{aJ=+aJ}}}var aF=ax?ai[ax.slice(0,-1)]:ai[al++];switch(av){case"s":if(aF==null){return""}return ah(String(aF),aD,aB,aJ,aA,aw);case"c":return ah(String.fromCharCode(+aF),aD,aB,aJ,aA,aw);case"b":return ao(aF,2,aL,aD,aB,aJ,aA,aw);case"o":return ao(aF,8,aL,aD,aB,aJ,aA,aw);case"x":return ao(aF,16,aL,aD,aB,aJ,aA,aw);case"X":return ao(aF,16,aL,aD,aB,aJ,aA,aw).toUpperCase();case"u":return ao(aF,10,aL,aD,aB,aJ,aA,aw);case"i":var ar=parseInt(+aF,10);if(isNaN(ar)){return""}var aH=ar<0?"-":az;var aK=au?ak(String(Math.abs(ar))):String(Math.abs(ar));aF=aH+an(aK,aJ,"0",false);return aj(aF,aH,aD,aB,aA,aw);case"d":var ar=Math.round(+aF);if(isNaN(ar)){return""}var aH=ar<0?"-":az;var aK=au?ak(String(Math.abs(ar))):String(Math.abs(ar));aF=aH+an(aK,aJ,"0",false);return aj(aF,aH,aD,aB,aA,aw);case"e":case"E":case"f":case"F":case"g":case"G":var ar=+aF;if(isNaN(ar)){return""}var aH=ar<0?"-":az;var at=["toExponential","toFixed","toPrecision"]["efg".indexOf(av.toLowerCase())];var aN=["toString","toUpperCase"]["eEfFgG".indexOf(av)%2];var aK=Math.abs(ar)[at](aJ);var aE=aK.toString().split(".");aE[0]=au?ak(aE[0]):aE[0];aK=aE.join(L.jqplot.sprintf.decimalMark);aF=aH+aK;var aC=aj(aF,aH,aD,aB,aA,aw)[aN]();return aC;case"p":case"P":var ar=+aF;if(isNaN(ar)){return""}var aH=ar<0?"-":az;var aE=String(Number(Math.abs(ar)).toExponential()).split(/e|E/);var aq=(aE[0].indexOf(".")!=-1)?aE[0].length-1:String(ar).length;var aG=(aE[1]<0)?-aE[1]-1:0;if(Math.abs(ar)<1){if(aq+aG<=aJ){aF=aH+Math.abs(ar).toPrecision(aq)}else{if(aq<=aJ-1){aF=aH+Math.abs(ar).toExponential(aq-1)}else{aF=aH+Math.abs(ar).toExponential(aJ-1)}}}else{var ap=(aq<=aJ)?aq:aJ;aF=aH+Math.abs(ar).toPrecision(ap)}var aN=["toString","toUpperCase"]["pP".indexOf(av)%2];return aj(aF,aH,aD,aB,aA,aw)[aN]();case"n":return"";default:return aM}})};L.jqplot.sprintf.thousandsSeparator=",";L.jqplot.sprintf.decimalMark=".";L.jqplot.sprintf.regex=/%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g;L.jqplot.getSignificantFigures=function(al){var an=String(Number(Math.abs(al)).toExponential()).split(/e|E/);var am=(an[0].indexOf(".")!=-1)?an[0].length-1:an[0].length;var ai=(an[1]<0)?-an[1]-1:0;var ah=parseInt(an[1],10);var aj=(ah+1>0)?ah+1:0;var ak=(am<=aj)?0:am-ah-1;return{significantDigits:am,digitsLeft:aj,digitsRight:ak,zeros:ai,exponent:ah}};L.jqplot.getPrecision=function(ah){return L.jqplot.getSignificantFigures(ah).digitsRight};var X=L.uiBackCompat!==false;L.jqplot.effects={effect:{}};var m="jqplot.storage.";L.extend(L.jqplot.effects,{version:"1.9pre",save:function(ai,aj){for(var ah=0;ah").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),ah={width:ai.width(),height:ai.height()},ak=document.activeElement;ai.wrap(al);if(ai[0]===ak||L.contains(ai[0],ak)){L(ak).focus()}al=ai.parent();if(ai.css("position")==="static"){al.css({position:"relative"});ai.css({position:"relative"})}else{L.extend(aj,{position:ai.css("position"),zIndex:ai.css("z-index")});L.each(["top","left","bottom","right"],function(am,an){aj[an]=ai.css(an);if(isNaN(parseInt(aj[an],10))){aj[an]="auto"}});ai.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}ai.css(ah);return al.css(aj).show()},removeWrapper:function(ah){var ai=document.activeElement;if(ah.parent().is(".ui-effects-wrapper")){ah.parent().replaceWith(ah);if(ah[0]===ai||L.contains(ah[0],ai)){L(ai).focus()}}return ah}});function j(ai,ah,aj,ak){if(L.isPlainObject(ai)){return ai}ai={effect:ai};if(ah===u){ah={}}if(L.isFunction(ah)){ak=ah;aj=null;ah={}}if(L.type(ah)==="number"||L.fx.speeds[ah]){ak=aj;aj=ah;ah={}}if(L.isFunction(aj)){ak=aj;aj=null}if(ah){L.extend(ai,ah)}aj=aj||ah.duration;ai.duration=L.fx.off?0:typeof aj==="number"?aj:aj in L.fx.speeds?L.fx.speeds[aj]:L.fx.speeds._default;ai.complete=ak||ah.complete;return ai}function ae(ah){if(!ah||typeof ah==="number"||L.fx.speeds[ah]){return true}if(typeof ah==="string"&&!L.jqplot.effects.effect[ah]){if(X&&L.jqplot.effects[ah]){return false}return true}return false}L.fn.extend({jqplotEffect:function(ap,aq,ai,ao){var an=j.apply(this,arguments),ak=an.mode,al=an.queue,am=L.jqplot.effects.effect[an.effect],ah=!am&&X&&L.jqplot.effects[an.effect];if(L.fx.off||!(am||ah)){if(ak){return this[ak](an.duration,an.complete)}else{return this.each(function(){if(an.complete){an.complete.call(this)}})}}function aj(au){var av=L(this),at=an.complete,aw=an.mode;function ar(){if(L.isFunction(at)){at.call(av[0])}if(L.isFunction(au)){au()}}if(av.is(":hidden")?aw==="hide":aw==="show"){ar()}else{am.call(av[0],an,ar)}}if(am){return al===false?this.each(aj):this.queue(al||"fx",aj)}else{return ah.call(this,{options:an,duration:an.duration,callback:an.complete,mode:an.mode})}}});var a=/up|down|vertical/,v=/up|left|vertical|horizontal/;L.jqplot.effects.effect.blind=function(aj,ao){var ak=L(this),ar=["position","top","bottom","left","right","height","width"],ap=L.jqplot.effects.setMode(ak,aj.mode||"hide"),au=aj.direction||"up",am=a.test(au),al=am?"height":"width",aq=am?"top":"left",aw=v.test(au),an={},av=ap==="show",ai,ah,at;if(ak.parent().is(".ui-effects-wrapper")){L.jqplot.effects.save(ak.parent(),ar)}else{L.jqplot.effects.save(ak,ar)}ak.show();at=parseInt(ak.css("top"),10);ai=L.jqplot.effects.createWrapper(ak).css({overflow:"hidden"});ah=am?ai[al]()+at:ai[al]();an[al]=av?String(ah):"0";if(!aw){ak.css(am?"bottom":"right",0).css(am?"top":"left","").css({position:"absolute"});an[aq]=av?"0":String(ah)}if(av){ai.css(al,0);if(!aw){ai.css(aq,ah)}}ai.animate(an,{duration:aj.duration,easing:aj.easing,queue:false,complete:function(){if(ap==="hide"){ak.hide()}L.jqplot.effects.restore(ak,ar);L.jqplot.effects.removeWrapper(ak);ao()}})}})(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/wp-piwik/js/jqplot/plugins/jqplot.pieRenderer.min.js b/wp-content/plugins/wp-piwik/js/jqplot/plugins/jqplot.pieRenderer.min.js new file mode 100644 index 0000000..a09f8f1 --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/jqplot/plugins/jqplot.pieRenderer.min.js @@ -0,0 +1,3 @@ +/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com + jsDate | (c) 2010-2013 Chris Leonello + */(function(e){e.jqplot.PieRenderer=function(){e.jqplot.LineRenderer.call(this)};e.jqplot.PieRenderer.prototype=new e.jqplot.LineRenderer();e.jqplot.PieRenderer.prototype.constructor=e.jqplot.PieRenderer;e.jqplot.PieRenderer.prototype.init=function(q,u){this.diameter=null;this.padding=20;this.sliceMargin=0;this.fill=true;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=5;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.dataLabels="percent";this.showDataLabels=false;this.dataLabelFormatString=null;this.dataLabelThreshold=3;this.dataLabelPositionFactor=0.52;this.dataLabelNudge=2;this.dataLabelCenterOn=true;this.startAngle=0;this.tickRenderer=e.jqplot.PieTickRenderer;this._drawData=true;this._type="pie";if(q.highlightMouseDown&&q.highlightMouseOver==null){q.highlightMouseOver=false}e.extend(true,this,q);if(this.sliceMargin<0){this.sliceMargin=0}this._diameter=null;this._radius=null;this._sliceAngles=[];this._highlightedPoint=null;if(this.highlightColors.length==0){for(var s=0;s570)?o[p]*0.8:o[p]+0.3*(255-o[p]);o[p]=parseInt(o[p],10)}this.highlightColors.push("rgb("+o[0]+","+o[1]+","+o[2]+")")}}this.highlightColorGenerator=new e.jqplot.ColorGenerator(this.highlightColors);u.postParseOptionsHooks.addOnce(m);u.postInitHooks.addOnce(g);u.eventListenerHooks.addOnce("jqplotMouseMove",b);u.eventListenerHooks.addOnce("jqplotMouseDown",a);u.eventListenerHooks.addOnce("jqplotMouseUp",l);u.eventListenerHooks.addOnce("jqplotClick",f);u.eventListenerHooks.addOnce("jqplotRightClick",n);u.postDrawHooks.addOnce(i)};e.jqplot.PieRenderer.prototype.setGridData=function(t){var p=[];var u=[];var o=this.startAngle/180*Math.PI;var s=0;this._drawData=false;for(var r=0;r0){p[r]+=p[r-1]}s+=this.data[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0){p[r]+=p[r-1]}s+=t[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0&&s>0.01&&s<6.282){w=parseFloat(p)/2/h(q)}return w}e.jqplot.PieRenderer.prototype.drawSlice=function(B,z,y,u,w){if(this._drawData){var p=this._radius;var A=this.fill;var x=this.lineWidth;var s=this.sliceMargin;if(this.fill==false){s+=this.lineWidth}B.save();B.translate(this._center[0],this._center[1]);var D=j(z,y,this.sliceMargin,this.fill,this.lineWidth);var o=D*Math.cos((z+y)/2);var C=D*Math.sin((z+y)/2);if((y-z)<=Math.PI){p-=D}else{p+=D}B.translate(o,C);if(w){for(var v=0,t=this.shadowDepth;v6.282+this.startAngle){y=6.282+this.startAngle;if(z>y){z=6.281+this.startAngle}}if(z>=y){return}B.beginPath();B.fillStyle=u;B.strokeStyle=u;B.lineWidth=x;B.arc(0,0,r,z,y,false);B.lineTo(0,0);B.closePath();if(A){B.fill()}else{B.stroke()}}};e.jqplot.PieRenderer.prototype.draw=function(B,z,E,o){var W;var H=(E!=undefined)?E:{};var t=0;var s=0;var N=1;var L=new e.jqplot.ColorGenerator(this.seriesColors);if(E.legendInfo&&E.legendInfo.placement=="insideGrid"){var J=E.legendInfo;switch(J.location){case"nw":t=J.width+J.xoffset;break;case"w":t=J.width+J.xoffset;break;case"sw":t=J.width+J.xoffset;break;case"ne":t=J.width+J.xoffset;N=-1;break;case"e":t=J.width+J.xoffset;N=-1;break;case"se":t=J.width+J.xoffset;N=-1;break;case"n":s=J.height+J.yoffset;break;case"s":s=J.height+J.yoffset;N=-1;break;default:break}}var K=(H.shadow!=undefined)?H.shadow:this.shadow;var A=(H.fill!=undefined)?H.fill:this.fill;var C=B.canvas.width;var I=B.canvas.height;var Q=C-t-2*this.padding;var X=I-s-2*this.padding;var M=Math.min(Q,X);var Y=M;this._sliceAngles=[];var v=this.sliceMargin;if(this.fill==false){v+=this.lineWidth}var q;var G=0;var R,aa,Z,ab;var D=this.startAngle/180*Math.PI;for(var W=0,V=z.length;WMath.PI){G=Math.max(q,G)}}if(this.diameter!=null&&this.diameter>0){this._diameter=this.diameter-2*G}else{this._diameter=Y-2*G}if(this._diameter<6){e.jqplot.log("Diameter of pie too small, not rendering.");return}var S=this._radius=this._diameter/2;this._center=[(C-N*t)/2+N*t+G*Math.cos(D),(I-N*s)/2+N*s+G*Math.sin(D)];if(this.shadow){for(var W=0,V=z.length;W=this.dataLabelThreshold){var F,U=(this._sliceAngles[W][0]+this._sliceAngles[W][1])/2,T;if(this.dataLabels=="label"){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,z[W][0])}else{if(this.dataLabels=="value"){F=this.dataLabelFormatString||"%d";T=e.jqplot.sprintf(F,this.data[W][1])}else{if(this.dataLabels=="percent"){F=this.dataLabelFormatString||"%d%%";T=e.jqplot.sprintf(F,z[W][2]*100)}else{if(this.dataLabels.constructor==Array){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,this.dataLabels[W])}}}}var p=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var P=this._center[0]+Math.cos(U)*p+this.canvas._offsets.left;var O=this._center[1]+Math.sin(U)*p+this.canvas._offsets.top;var u=e('
            '+T+"
            ").insertBefore(o.eventCanvas._elem);if(this.dataLabelCenterOn){P-=u.width()/2;O-=u.height()/2}else{P-=u.width()*Math.sin(U/2);O-=u.height()/2}P=Math.round(P);O=Math.round(O);u.css({left:P,top:O})}}};e.jqplot.PieAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.PieAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.PieAxisRenderer.prototype.constructor=e.jqplot.PieAxisRenderer;e.jqplot.PieAxisRenderer.prototype.init=function(o){this.tickRenderer=e.jqplot.PieTickRenderer;e.extend(true,this,o);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.PieLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.PieLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.PieLegendRenderer.prototype.constructor=e.jqplot.PieLegendRenderer;e.jqplot.PieLegendRenderer.prototype.init=function(o){this.numberRows=null;this.numberColumns=null;e.extend(true,this,o)};e.jqplot.PieLegendRenderer.prototype.draw=function(){var r=this;if(this.show){var B=this._series;this._elem=e(document.createElement("table"));this._elem.addClass("jqplot-table-legend");var E={position:"absolute"};if(this.background){E.background=this.background}if(this.border){E.border=this.border}if(this.fontSize){E.fontSize=this.fontSize}if(this.fontFamily){E.fontFamily=this.fontFamily}if(this.textColor){E.textColor=this.textColor}if(this.marginTop!=null){E.marginTop=this.marginTop}if(this.marginBottom!=null){E.marginBottom=this.marginBottom}if(this.marginLeft!=null){E.marginLeft=this.marginLeft}if(this.marginRight!=null){E.marginRight=this.marginRight}this._elem.css(E);var I=false,A=false,o,y;var C=B[0];var p=new e.jqplot.ColorGenerator(C.seriesColors);if(C.show){var J=C.data;if(this.numberRows){o=this.numberRows;if(!this.numberColumns){y=Math.ceil(J.length/o)}else{y=this.numberColumns}}else{if(this.numberColumns){y=this.numberColumns;o=Math.ceil(J.length/this.numberColumns)}else{o=J.length;y=1}}var H,G;var q,w,v;var x,z,F;var D=0;var u,t;for(H=0;H0){I=true}else{I=false}}else{if(H==o-1){I=false}else{I=true}}z=(I)?this.rowSpacing:"0";w=e(document.createElement("td"));w.addClass("jqplot-table-legend jqplot-table-legend-swatch");w.css({textAlign:"center",paddingTop:z});u=e(document.createElement("div"));u.addClass("jqplot-table-legend-swatch-outline");t=e(document.createElement("div"));t.addClass("jqplot-table-legend-swatch");t.css({backgroundColor:F,borderColor:F});w.append(u.append(t));v=e(document.createElement("td"));v.addClass("jqplot-table-legend jqplot-table-legend-label");v.css("paddingTop",z);if(this.escapeHtml){v.text(x)}else{v.html(x)}if(A){v.prependTo(q);w.prependTo(q)}else{w.appendTo(q);v.appendTo(q)}I=true}D++}}}}return this._elem};e.jqplot.PieRenderer.prototype.handleMove=function(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];r.target.trigger("jqplotDataMouseOver",o);if(r.series[o[0]].highlightMouseOver&&!(o[0]==r.plugins.pieRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){r.target.trigger("jqplotDataHighlight",o);d(r,o[0],o[1])}}else{if(s==null){k(r)}}};function c(s,r,p){p=p||{};p.axesDefaults=p.axesDefaults||{};p.legend=p.legend||{};p.seriesDefaults=p.seriesDefaults||{};var o=false;if(p.seriesDefaults.renderer==e.jqplot.PieRenderer){o=true}else{if(p.series){for(var q=0;q. + +The project page and downloads are at . + +Below are a few examples to demonstrate jqPlot usage. These plots are shown as static images. +Many more examples of dynamically rendered plots can be seen on the test and examples pages here: <../../tests/>. + +Include the Files: + +jqPlot requires jQuery (1.4+ required for certain features). jQuery is included in the distribution. +To use jqPlot include jquery, the jqPlot jQuery plugin, jqPlot css file and optionally the excanvas +script for IE support in your web page. Note, excanvas is required only for IE versions below 9. IE 9 includes +native support for the canvas element and does not require excanvas: + +> +> +> +> + +Add a plot container: + +Add a container (target) to your web page where you want your plot to show up. +Be sure to give your target a width and a height: + +>
            + +Create a plot: + +Then, create the actual plot by calling the +$.jqplot plugin with the id of your target and some data: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]); + +Which will produce a +chart like: + +(see images/basicline.png) + +Plot Options: + +You can customize the plot by passing options to the $.jqplot function. Options are described in + in the jqPlotOptions.txt file. An example of options usage: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]], +> { title:'Exponential Line', +> axes:{yaxis:{min:-10, max:240}}, +> series:[{color:'#5FAB78'}] +> }); + +Which will produce +a plot like: + +(see images/basicoptions.png) + +Using Plugins: + +You can use jqPlot plugins (that is, plugins to the jqPlot plugin) by including them in your html +after you include the jqPlot plugin. Here is how to include the log axis plugin: + +> +> +> +> +> + +Important note: For jqplot builds r529 and above (0.9.7r529 and higher), you must explicitly +enable plugins via either the { show: true } plugin option to the plot or by using +the $.jqplot.config.enablePlugins = true; config options set on the page before plot creation. +Only plugins that can be immediately active upon loading are affected. This includes +non-renderer plugins like cursor, dragable, highlighter, and trendline. + +Here is the same $.jqplot call +but with a log y axis: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]], +> { title:'Exponential Line', +> axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer}}, +> series:[{color:'#5FAB78'}] +> }); + +Which produces +a plot like: + +(see images/basiclogaxis.png) + +You can further customize with options specific +to the log axis plugin: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]], +> { title:'Exponential Line', +> axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer, tickDistribution:'power'}}, +> series:[{color:'#5FAB78'}] +> }); + +Which makes a +plot like: + +(see images/basiclogoptions.png) + +For a full list of options, see in the jqPlotOptions.txt file. + +You can add as many plugins as you wish. Order is generally not important. +Some plugins, like the highlighter plugin which highlights data points near the +mouse, don't need any extra options or setup to function. Highlighter does have +additional options which the user can set. + +Other plugins, the barRenderer for example, provide functionality that must be specified +in the chart options object. To render a series as a bar graph with the bar renderer, +you would first include the plugin after jqPlot: + +> + +Then you would create +a chart like: + +> $.jqplot('chartdiv', [[34.53, 56.32, 25.1, 18.6]], {series:[{renderer:$.jqplot.BarRenderer}]}); + +Here the default LineRenderer is replaced by a BarRenderer to generate a bar graph for the first (and only) series. diff --git a/wp-content/plugins/wp-piwik/js/jqplot/wp-piwik.jqplot.js b/wp-content/plugins/wp-piwik/js/jqplot/wp-piwik.jqplot.js new file mode 100644 index 0000000..25b05ed --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/jqplot/wp-piwik.jqplot.js @@ -0,0 +1,10 @@ +/* Files combined for WP-Piwik. Get jqPlot at http://www.jqplot.com/ */ +/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com + jsDate | (c) 2010-2013 Chris Leonello +*/(function(L){var u;L.fn.emptyForce=function(){for(var ah=0,ai;(ai=L(this)[ah])!=null;ah++){if(ai.nodeType===1){L.cleanData(ai.getElementsByTagName("*"))}if(L.jqplot.use_excanvas){ai.outerHTML=""}else{while(ai.firstChild){ai.removeChild(ai.firstChild)}}ai=null}return L(this)};L.fn.removeChildForce=function(ah){while(ah.firstChild){this.removeChildForce(ah.firstChild);ah.removeChild(ah.firstChild)}};L.fn.jqplot=function(){var ah=[];var aj=[];for(var ak=0,ai=arguments.length;ak'+ao+"");L("#"+an).addClass("jqplot-error");document.getElementById(an).style.background=L.jqplot.config.errorBackground;document.getElementById(an).style.border=L.jqplot.config.errorBorder;document.getElementById(an).style.fontFamily=L.jqplot.config.errorFontFamily;document.getElementById(an).style.fontSize=L.jqplot.config.errorFontSize;document.getElementById(an).style.fontStyle=L.jqplot.config.errorFontStyle;document.getElementById(an).style.fontWeight=L.jqplot.config.errorFontWeight}}else{am.init(an,aj,ah);am.draw();am.themeEngine.init.call(am);return am}};L.jqplot.version="1.0.8";L.jqplot.revision="1250";L.jqplot.targetCounter=1;L.jqplot.CanvasManager=function(){if(typeof L.jqplot.CanvasManager.canvases=="undefined"){L.jqplot.CanvasManager.canvases=[];L.jqplot.CanvasManager.free=[]}var ah=[];this.getCanvas=function(){var ak;var aj=true;if(!L.jqplot.use_excanvas){for(var al=0,ai=L.jqplot.CanvasManager.canvases.length;al887){L.jqplot.support_canvas_text.result=true}else{L.jqplot.support_canvas_text.result=!!(document.createElement("canvas").getContext&&typeof document.createElement("canvas").getContext("2d").fillText=="function")}}return L.jqplot.support_canvas_text.result};L.jqplot.use_excanvas=((!L.support.boxModel||!L.support.objectAll||!$support.leadingWhitespace)&&!L.jqplot.support_canvas())?true:false;L.jqplot.preInitHooks=[];L.jqplot.postInitHooks=[];L.jqplot.preParseOptionsHooks=[];L.jqplot.postParseOptionsHooks=[];L.jqplot.preDrawHooks=[];L.jqplot.postDrawHooks=[];L.jqplot.preDrawSeriesHooks=[];L.jqplot.postDrawSeriesHooks=[];L.jqplot.preDrawLegendHooks=[];L.jqplot.addLegendRowHooks=[];L.jqplot.preSeriesInitHooks=[];L.jqplot.postSeriesInitHooks=[];L.jqplot.preParseSeriesOptionsHooks=[];L.jqplot.postParseSeriesOptionsHooks=[];L.jqplot.eventListenerHooks=[];L.jqplot.preDrawSeriesShadowHooks=[];L.jqplot.postDrawSeriesShadowHooks=[];L.jqplot.ElemContainer=function(){this._elem;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null}};L.jqplot.ElemContainer.prototype.createElement=function(ak,am,ai,aj,an){this._offsets=am;var ah=ai||"jqplot";var al=document.createElement(ak);this._elem=L(al);this._elem.addClass(ah);this._elem.css(aj);this._elem.attr(an);al=null;return this._elem};L.jqplot.ElemContainer.prototype.getWidth=function(){if(this._elem){return this._elem.outerWidth(true)}else{return null}};L.jqplot.ElemContainer.prototype.getHeight=function(){if(this._elem){return this._elem.outerHeight(true)}else{return null}};L.jqplot.ElemContainer.prototype.getPosition=function(){if(this._elem){return this._elem.position()}else{return{top:null,left:null,bottom:null,right:null}}};L.jqplot.ElemContainer.prototype.getTop=function(){return this.getPosition().top};L.jqplot.ElemContainer.prototype.getLeft=function(){return this.getPosition().left};L.jqplot.ElemContainer.prototype.getBottom=function(){return this._elem.css("bottom")};L.jqplot.ElemContainer.prototype.getRight=function(){return this._elem.css("right")};function w(ah){L.jqplot.ElemContainer.call(this);this.name=ah;this._series=[];this.show=false;this.tickRenderer=L.jqplot.AxisTickRenderer;this.tickOptions={};this.labelRenderer=L.jqplot.AxisLabelRenderer;this.labelOptions={};this.label=null;this.showLabel=true;this.min=null;this.max=null;this.autoscale=false;this.pad=1.2;this.padMax=null;this.padMin=null;this.ticks=[];this.numberTicks;this.tickInterval;this.renderer=L.jqplot.LinearAxisRenderer;this.rendererOptions={};this.showTicks=true;this.showTickMarks=true;this.showMinorTicks=true;this.drawMajorGridlines=true;this.drawMinorGridlines=false;this.drawMajorTickMarks=true;this.drawMinorTickMarks=true;this.useSeriesColor=false;this.borderWidth=null;this.borderColor=null;this.scaleToHiddenSeries=false;this._dataBounds={min:null,max:null};this._intervalStats=[];this._offsets={min:null,max:null};this._ticks=[];this._label=null;this.syncTicks=null;this.tickSpacing=75;this._min=null;this._max=null;this._tickInterval=null;this._numberTicks=null;this.__ticks=null;this._options={}}w.prototype=new L.jqplot.ElemContainer();w.prototype.constructor=w;w.prototype.init=function(){if(L.isFunction(this.renderer)){this.renderer=new this.renderer()}this.tickOptions.axis=this.name;if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTicks}if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTickMarks}if(this.tickOptions.showLabel==null){this.tickOptions.showLabel=this.showTicks}if(this.label==null||this.label==""){this.showLabel=false}else{this.labelOptions.label=this.label}if(this.showLabel==false){this.labelOptions.show=false}if(this.pad==0){this.pad=1}if(this.padMax==0){this.padMax=1}if(this.padMin==0){this.padMin=1}if(this.padMax==null){this.padMax=(this.pad-1)/2+1}if(this.padMin==null){this.padMin=(this.pad-1)/2+1}this.pad=this.padMax+this.padMin-1;if(this.min!=null||this.max!=null){this.autoscale=false}if(this.syncTicks==null&&this.name.indexOf("y")>-1){this.syncTicks=true}else{if(this.syncTicks==null){this.syncTicks=false}}this.renderer.init.call(this,this.rendererOptions)};w.prototype.draw=function(ah,ai){if(this.__ticks){this.__ticks=null}return this.renderer.draw.call(this,ah,ai)};w.prototype.set=function(){this.renderer.set.call(this)};w.prototype.pack=function(ai,ah){if(this.show){this.renderer.pack.call(this,ai,ah)}if(this._min==null){this._min=this.min;this._max=this.max;this._tickInterval=this.tickInterval;this._numberTicks=this.numberTicks;this.__ticks=this._ticks}};w.prototype.reset=function(){this.renderer.reset.call(this)};w.prototype.resetScale=function(ah){L.extend(true,this,{min:null,max:null,numberTicks:null,tickInterval:null,_ticks:[],ticks:[]},ah);this.resetDataBounds()};w.prototype.resetDataBounds=function(){var ao=this._dataBounds;ao.min=null;ao.max=null;var ai,ap,am;var aj=(this.show)?true:false;for(var al=0;alao.max)||ao.max==null){ao.max=am[ak][0]}}else{if((am[ak][ah]!=null&&am[ak][ah]ao.max)||ao.max==null){ao.max=am[ak][an]}}}if(aj&&ap.renderer.constructor!==L.jqplot.BarRenderer){aj=false}else{if(aj&&this._options.hasOwnProperty("forceTickAt0")&&this._options.forceTickAt0==false){aj=false}else{if(aj&&ap.renderer.constructor===L.jqplot.BarRenderer){if(ap.barDirection=="vertical"&&this.name!="xaxis"&&this.name!="x2axis"){if(this._options.pad!=null||this._options.padMin!=null){aj=false}}else{if(ap.barDirection=="horizontal"&&(this.name=="xaxis"||this.name=="x2axis")){if(this._options.pad!=null||this._options.padMin!=null){aj=false}}}}}}}}if(aj&&this.renderer.constructor===L.jqplot.LinearAxisRenderer&&ao.min>=0){this.padMin=1;this.forceTickAt0=true}};function q(ah){L.jqplot.ElemContainer.call(this);this.show=false;this.location="ne";this.labels=[];this.showLabels=true;this.showSwatches=true;this.placement="insideGrid";this.xoffset=0;this.yoffset=0;this.border;this.background;this.textColor;this.fontFamily;this.fontSize;this.rowSpacing="0.5em";this.renderer=L.jqplot.TableLegendRenderer;this.rendererOptions={};this.preDraw=false;this.marginTop=null;this.marginRight=null;this.marginBottom=null;this.marginLeft=null;this.escapeHtml=false;this._series=[];L.extend(true,this,ah)}q.prototype=new L.jqplot.ElemContainer();q.prototype.constructor=q;q.prototype.setOptions=function(ah){L.extend(true,this,ah);if(this.placement=="inside"){this.placement="insideGrid"}if(this.xoffset>0){if(this.placement=="insideGrid"){switch(this.location){case"nw":case"w":case"sw":if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break;case"ne":case"e":case"se":default:if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break}}else{if(this.placement=="outside"){switch(this.location){case"nw":case"w":case"sw":if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break;case"ne":case"e":case"se":default:if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break}}}this.xoffset=0}if(this.yoffset>0){if(this.placement=="outside"){switch(this.location){case"sw":case"s":case"se":if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break;case"ne":case"n":case"nw":default:if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break}}else{if(this.placement=="insideGrid"){switch(this.location){case"sw":case"s":case"se":if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break;case"ne":case"n":case"nw":default:if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break}}}this.yoffset=0}};q.prototype.init=function(){if(L.isFunction(this.renderer)){this.renderer=new this.renderer()}this.renderer.init.call(this,this.rendererOptions)};q.prototype.draw=function(ai,aj){for(var ah=0;ah');this.target.append(az);az.height(aD);az.width(aA);az.css("top",this.eventCanvas._offsets.top);az.css("left",this.eventCanvas._offsets.left);var aC=L('
            ');az.append(aC);aC.html(this.noDataIndicator.indicator);var aB=aC.height();var ax=aC.width();aC.height(aB);aC.width(ax);aC.css("top",(aD-aB)/2+"px")})}}this.data=L.extend(true,[],ar);this.parseOptions(ay);if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this.title.init();this.legend.init();this._sumy=0;this._sumx=0;this.computePlotData();for(var at=0;at0){for(var aq=au;aq--;){var an=this._plotData[aq][ap][av];if(aw*an>=0){this._plotData[au][ap][av]+=an;this._stackData[au][ap][av]+=an;break}}}}}else{for(var ar=0;ar0){at._prevPlotData=this.series[au-1]._plotData}at._sumy=0;at._sumx=0;for(ar=at.data.length-1;ar>-1;ar--){at._sumy+=at.data[ar][1];at._sumx+=at.data[ar][0]}}};this.populatePlotData=function(au,av){this._plotData=[];this._stackData=[];au._stackData=[];au._plotData=[];var ay={x:[],y:[]};if(this.stackSeries&&!au.disableStack){au._stack=true;var ax=(au._stackAxis==="x")?0:1;var az=L.extend(true,[],au.data);var aA=L.extend(true,[],au.data);var an,am,ao,aw,al;for(var ar=0;ar=0){aA[aq][ax]+=aw}}}for(var at=0;at0){au._prevPlotData=this.series[av-1]._plotData}au._sumy=0;au._sumx=0;for(at=au.data.length-1;at>-1;at--){au._sumy+=au.data[at][1];au._sumx+=au.data[at][0]}};this.getNextSeriesColor=(function(am){var al=0;var an=am.seriesColors;return function(){if(al=0&&an>=0){al.top+=aK;al.bottom+=aK;al.left+=an;al.right+=an}}var am=["top","bottom","left","right"];for(var aB in am){if(this._gridPadding[am[aB]]==null&&al[am[aB]]>0){this._gridPadding[am[aB]]=al[am[aB]]}else{if(this._gridPadding[am[aB]]==null){this._gridPadding[am[aB]]=this._defaultGridPadding[am[aB]]}}}var aA=this._gridPadding;if(this.legend.placement==="outsideGrid"){aA={top:this.title.getHeight(),left:0,right:0,bottom:0};if(this.legend.location==="s"){aA.left=this._gridPadding.left;aA.right=this._gridPadding.right}}ar.xaxis.pack({position:"absolute",bottom:this._gridPadding.bottom-ar.xaxis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});ar.yaxis.pack({position:"absolute",top:0,left:this._gridPadding.left-ar.yaxis.getWidth(),height:this._height},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});ar.x2axis.pack({position:"absolute",top:this._gridPadding.top-ar.x2axis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});for(aH=8;aH>0;aH--){ar[aG[aH-1]].pack({position:"absolute",top:0,right:this._gridPadding.right-az[aH-1]},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top})}var au=(this._width-this._gridPadding.left-this._gridPadding.right)/2+this._gridPadding.left-ar.yMidAxis.getWidth()/2;ar.yMidAxis.pack({position:"absolute",top:0,left:au,zIndex:9,textAlign:"center"},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});this.target.append(this.grid.createElement(this._gridPadding,this));this.grid.draw();var aq=this.series;var aJ=aq.length;for(aH=0,aE=aJ;aHax)?av:ax;var ar=this.series[aw];var aq=this.series[au];if(aq.renderer.smooth){var ap=aq.renderer._smoothedData.slice(0).reverse()}else{var ap=aq.gridData.slice(0).reverse()}if(ar.renderer.smooth){var at=ar.renderer._smoothedData.concat(ap)}else{var at=ar.gridData.concat(ap)}var ao=(an.color!==null)?an.color:this.series[ax].fillColor;var ay=(an.baseSeries!==null)?an.baseSeries:aw;var am=this.series[ay].renderer.shapeRenderer;var al={fillStyle:ao,fill:true,closePath:true};am.draw(ar.shadowCanvas._ctx,at,al)};this.bindCustomEvents=function(){this.eventCanvas._elem.bind("click",{plot:this},this.onClick);this.eventCanvas._elem.bind("dblclick",{plot:this},this.onDblClick);this.eventCanvas._elem.bind("mousedown",{plot:this},this.onMouseDown);this.eventCanvas._elem.bind("mousemove",{plot:this},this.onMouseMove);this.eventCanvas._elem.bind("mouseenter",{plot:this},this.onMouseEnter);this.eventCanvas._elem.bind("mouseleave",{plot:this},this.onMouseLeave);if(this.captureRightClick){this.eventCanvas._elem.bind("mouseup",{plot:this},this.onRightClick);this.eventCanvas._elem.get(0).oncontextmenu=function(){return false}}else{this.eventCanvas._elem.bind("mouseup",{plot:this},this.onMouseUp)}};function ai(av){var au=av.data.plot;var ap=au.eventCanvas._elem.offset();var at={x:av.pageX-ap.left,y:av.pageY-ap.top};var aq={xaxis:null,yaxis:null,x2axis:null,y2axis:null,y3axis:null,y4axis:null,y5axis:null,y6axis:null,y7axis:null,y8axis:null,y9axis:null,yMidAxis:null};var ar=["xaxis","yaxis","x2axis","y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];var al=au.axes;var am,ao;for(am=11;am>0;am--){ao=ar[am-1];if(al[ao].show){aq[ao]=al[ao].series_p2u(at[ao.charAt(0)])}}return{offsets:ap,gridPos:at,dataPos:aq}}function ak(al,am){var aq=am.series;var aW,aU,aT,aO,aP,aJ,aI,aw,au,az,aA,aK;var aS,aX,aQ,ar,aH,aM,aV;var an,aN;for(aT=am.seriesStack.length-1;aT>=0;aT--){aW=am.seriesStack[aT];aO=aq[aW];aV=aO._highlightThreshold;switch(aO.renderer.constructor){case L.jqplot.BarRenderer:aJ=al.x;aI=al.y;for(aU=0;aUaH[0][0]&&aJaH[2][1]&&aIaH[0][0]+aV[0][0]&&aJaH[2][1]&&aI0&&-aI>=0){aw=2*Math.PI-Math.atan(-aI/aJ)}else{if(aJ>0&&-aI<0){aw=-Math.atan(-aI/aJ)}else{if(aJ<0){aw=Math.PI-Math.atan(-aI/aJ)}else{if(aJ==0&&-aI>0){aw=3*Math.PI/2}else{if(aJ==0&&-aI<0){aw=Math.PI/2}else{if(aJ==0&&aI==0){aw=0}}}}}}if(az){aw-=az;if(aw<0){aw+=2*Math.PI}else{if(aw>2*Math.PI){aw-=2*Math.PI}}}au=aO.sliceMargin/180*Math.PI;if(aPaO._innerRadius){for(aU=0;aU0)?aO.gridData[aU-1][1]+au:au;aK=aO.gridData[aU][1];if(aw>aA&&aw0&&-aI>=0){aw=2*Math.PI-Math.atan(-aI/aJ)}else{if(aJ>0&&-aI<0){aw=-Math.atan(-aI/aJ)}else{if(aJ<0){aw=Math.PI-Math.atan(-aI/aJ)}else{if(aJ==0&&-aI>0){aw=3*Math.PI/2}else{if(aJ==0&&-aI<0){aw=Math.PI/2}else{if(aJ==0&&aI==0){aw=0}}}}}}if(az){aw-=az;if(aw<0){aw+=2*Math.PI}else{if(aw>2*Math.PI){aw-=2*Math.PI}}}au=aO.sliceMargin/180*Math.PI;if(aP0)?aO.gridData[aU-1][1]+au:au;aK=aO.gridData[aU][1];if(aw>aA&&aw=ay[0][1]&&aI<=ay[3][1]&&aJ>=at[0]&&aJ<=aE[0]){return{seriesIndex:aO.index,pointIndex:aU,gridData:null,data:aO.data[aU]}}}break;case L.jqplot.LineRenderer:aJ=al.x;aI=al.y;aP=aO.renderer;if(aO.show){if((aO.fill||(aO.renderer.bands.show&&aO.renderer.bands.fill))&&(!am.plugins.highlighter||!am.plugins.highlighter.show)){var ax=false;if(aJ>aO._boundingBox[0][0]&&aJaO._boundingBox[1][1]&&aI=aI||aB[1]=aI){if(aC[0]+(aI-aC[1])/(aB[1]-aC[1])*(aB[0]-aC[0])0)?aN:0;for(var aU=0;aU=aQ[0]-aP._bodyWidth/2&&aJ<=aQ[0]+aP._bodyWidth/2&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{if(!aP.hlc){var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][1])&&aI<=av(aO.data[aU][2])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}else{if(aQ[0]!=null&&aQ[1]!=null){aX=Math.sqrt((aJ-aQ[0])*(aJ-aQ[0])+(aI-aQ[1])*(aI-aQ[1]));if(aX<=an&&(aX<=aS||aS==null)){aS=aX;return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}}}break;default:aJ=al.x;aI=al.y;aP=aO.renderer;if(aO.show){aN=aO.markerRenderer.size/2+aO.neighborThreshold;an=(aN>0)?aN:0;for(var aU=0;aU=aQ[0]-aP._bodyWidth/2&&aJ<=aQ[0]+aP._bodyWidth/2&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{if(!aP.hlc){var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][2])&&aI<=av(aO.data[aU][3])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}else{var av=aO._yaxis.series_u2p;if(aJ>=aQ[0]-aP._tickLength&&aJ<=aQ[0]+aP._tickLength&&aI>=av(aO.data[aU][1])&&aI<=av(aO.data[aU][2])){return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}else{aX=Math.sqrt((aJ-aQ[0])*(aJ-aQ[0])+(aI-aQ[1])*(aI-aQ[1]));if(aX<=an&&(aX<=aS||aS==null)){aS=aX;return{seriesIndex:aW,pointIndex:aU,gridData:aQ,data:aO.data[aU]}}}}}break}}return null}this.onClick=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotClick");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onDblClick=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotDblClick");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onMouseDown=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotMouseDown");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onMouseUp=function(an){var am=ai(an);var al=L.Event("jqplotMouseUp");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,null,an.data.plot])};this.onRightClick=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);if(ap.captureRightClick){if(an.which==3){var al=L.Event("jqplotRightClick");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])}else{var al=L.Event("jqplotMouseUp");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])}}};this.onMouseMove=function(an){var am=ai(an);var ap=an.data.plot;var ao=ak(am.gridPos,ap);var al=L.Event("jqplotMouseMove");al.pageX=an.pageX;al.pageY=an.pageY;L(this).trigger(al,[am.gridPos,am.dataPos,ao,ap])};this.onMouseEnter=function(an){var am=ai(an);var ao=an.data.plot;var al=L.Event("jqplotMouseEnter");al.pageX=an.pageX;al.pageY=an.pageY;al.relatedTarget=an.relatedTarget;L(this).trigger(al,[am.gridPos,am.dataPos,null,ao])};this.onMouseLeave=function(an){var am=ai(an);var ao=an.data.plot;var al=L.Event("jqplotMouseLeave");al.pageX=an.pageX;al.pageY=an.pageY;al.relatedTarget=an.relatedTarget;L(this).trigger(al,[am.gridPos,am.dataPos,null,ao])};this.drawSeries=function(an,al){var ap,ao,am;al=(typeof(an)==="number"&&al==null)?an:al;an=(typeof(an)==="object")?an:{};if(al!=u){ao=this.series[al];am=ao.shadowCanvas._ctx;am.clearRect(0,0,am.canvas.width,am.canvas.height);ao.drawShadow(am,an,this);am=ao.canvas._ctx;am.clearRect(0,0,am.canvas.width,am.canvas.height);ao.draw(am,an,this);if(ao.renderer.constructor==L.jqplot.BezierCurveRenderer){if(al660)?ah[aj]*0.85:0.73*ah[aj]+90;ah[aj]=parseInt(ah[aj],10);(ah[aj]>255)?255:ah[aj]}ah[3]=0.3+0.35*al[3];ak.push("rgba("+ah[0]+","+ah[1]+","+ah[2]+","+ah[3]+")")}}else{var al=L.jqplot.getColorComponents(ai);var ah=[al[0],al[1],al[2]];var an=ah[0]+ah[1]+ah[2];for(var aj=0;aj<3;aj++){ah[aj]=(an>660)?ah[aj]*0.85:0.73*ah[aj]+90;ah[aj]=parseInt(ah[aj],10);(ah[aj]>255)?255:ah[aj]}ah[3]=0.3+0.35*al[3];ak="rgba("+ah[0]+","+ah[1]+","+ah[2]+","+ah[3]+")"}return ak};L.jqplot.ColorGenerator=function(ai){ai=ai||L.jqplot.config.defaultColors;var ah=0;this.next=function(){if(ah0){return ai[ah--]}else{ah=ai.length-1;return ai[ah]}};this.get=function(ak){var aj=ak-ai.length*Math.floor(ak/ai.length);return ai[aj]};this.setColors=function(aj){ai=aj};this.reset=function(){ah=0};this.getIndex=function(){return ah};this.setIndex=function(aj){ah=aj}};L.jqplot.hex2rgb=function(aj,ah){aj=aj.replace("#","");if(aj.length==3){aj=aj.charAt(0)+aj.charAt(0)+aj.charAt(1)+aj.charAt(1)+aj.charAt(2)+aj.charAt(2)}var ai;ai="rgba("+parseInt(aj.slice(0,2),16)+", "+parseInt(aj.slice(2,4),16)+", "+parseInt(aj.slice(4,6),16);if(ah){ai+=", "+ah}ai+=")";return ai};L.jqplot.rgb2hex=function(am){var aj=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;var ah=am.match(aj);var al="#";for(var ak=1;ak<4;ak++){var ai;if(ah[ak].search(/%/)!=-1){ai=parseInt(255*ah[ak]/100,10).toString(16);if(ai.length==1){ai="0"+ai}}else{ai=parseInt(ah[ak],10).toString(16);if(ai.length==1){ai="0"+ai}}al+=ai}return al};L.jqplot.normalize2rgb=function(ai,ah){if(ai.search(/^ *rgba?\(/)!=-1){return ai}else{if(ai.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/)!=-1){return L.jqplot.hex2rgb(ai,ah)}else{throw new Error("Invalid color spec")}}};L.jqplot.getColorComponents=function(am){am=L.jqplot.colorKeywordMap[am]||am;var ak=L.jqplot.normalize2rgb(am);var aj=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;var ah=ak.match(aj);var ai=[];for(var al=1;al<4;al++){if(ah[al].search(/%/)!=-1){ai[al-1]=parseInt(255*ah[al]/100,10)}else{ai[al-1]=parseInt(ah[al],10)}}ai[3]=parseFloat(ah[4])?parseFloat(ah[4]):1;return ai};L.jqplot.colorKeywordMap={aliceblue:"rgb(240, 248, 255)",antiquewhite:"rgb(250, 235, 215)",aqua:"rgb( 0, 255, 255)",aquamarine:"rgb(127, 255, 212)",azure:"rgb(240, 255, 255)",beige:"rgb(245, 245, 220)",bisque:"rgb(255, 228, 196)",black:"rgb( 0, 0, 0)",blanchedalmond:"rgb(255, 235, 205)",blue:"rgb( 0, 0, 255)",blueviolet:"rgb(138, 43, 226)",brown:"rgb(165, 42, 42)",burlywood:"rgb(222, 184, 135)",cadetblue:"rgb( 95, 158, 160)",chartreuse:"rgb(127, 255, 0)",chocolate:"rgb(210, 105, 30)",coral:"rgb(255, 127, 80)",cornflowerblue:"rgb(100, 149, 237)",cornsilk:"rgb(255, 248, 220)",crimson:"rgb(220, 20, 60)",cyan:"rgb( 0, 255, 255)",darkblue:"rgb( 0, 0, 139)",darkcyan:"rgb( 0, 139, 139)",darkgoldenrod:"rgb(184, 134, 11)",darkgray:"rgb(169, 169, 169)",darkgreen:"rgb( 0, 100, 0)",darkgrey:"rgb(169, 169, 169)",darkkhaki:"rgb(189, 183, 107)",darkmagenta:"rgb(139, 0, 139)",darkolivegreen:"rgb( 85, 107, 47)",darkorange:"rgb(255, 140, 0)",darkorchid:"rgb(153, 50, 204)",darkred:"rgb(139, 0, 0)",darksalmon:"rgb(233, 150, 122)",darkseagreen:"rgb(143, 188, 143)",darkslateblue:"rgb( 72, 61, 139)",darkslategray:"rgb( 47, 79, 79)",darkslategrey:"rgb( 47, 79, 79)",darkturquoise:"rgb( 0, 206, 209)",darkviolet:"rgb(148, 0, 211)",deeppink:"rgb(255, 20, 147)",deepskyblue:"rgb( 0, 191, 255)",dimgray:"rgb(105, 105, 105)",dimgrey:"rgb(105, 105, 105)",dodgerblue:"rgb( 30, 144, 255)",firebrick:"rgb(178, 34, 34)",floralwhite:"rgb(255, 250, 240)",forestgreen:"rgb( 34, 139, 34)",fuchsia:"rgb(255, 0, 255)",gainsboro:"rgb(220, 220, 220)",ghostwhite:"rgb(248, 248, 255)",gold:"rgb(255, 215, 0)",goldenrod:"rgb(218, 165, 32)",gray:"rgb(128, 128, 128)",grey:"rgb(128, 128, 128)",green:"rgb( 0, 128, 0)",greenyellow:"rgb(173, 255, 47)",honeydew:"rgb(240, 255, 240)",hotpink:"rgb(255, 105, 180)",indianred:"rgb(205, 92, 92)",indigo:"rgb( 75, 0, 130)",ivory:"rgb(255, 255, 240)",khaki:"rgb(240, 230, 140)",lavender:"rgb(230, 230, 250)",lavenderblush:"rgb(255, 240, 245)",lawngreen:"rgb(124, 252, 0)",lemonchiffon:"rgb(255, 250, 205)",lightblue:"rgb(173, 216, 230)",lightcoral:"rgb(240, 128, 128)",lightcyan:"rgb(224, 255, 255)",lightgoldenrodyellow:"rgb(250, 250, 210)",lightgray:"rgb(211, 211, 211)",lightgreen:"rgb(144, 238, 144)",lightgrey:"rgb(211, 211, 211)",lightpink:"rgb(255, 182, 193)",lightsalmon:"rgb(255, 160, 122)",lightseagreen:"rgb( 32, 178, 170)",lightskyblue:"rgb(135, 206, 250)",lightslategray:"rgb(119, 136, 153)",lightslategrey:"rgb(119, 136, 153)",lightsteelblue:"rgb(176, 196, 222)",lightyellow:"rgb(255, 255, 224)",lime:"rgb( 0, 255, 0)",limegreen:"rgb( 50, 205, 50)",linen:"rgb(250, 240, 230)",magenta:"rgb(255, 0, 255)",maroon:"rgb(128, 0, 0)",mediumaquamarine:"rgb(102, 205, 170)",mediumblue:"rgb( 0, 0, 205)",mediumorchid:"rgb(186, 85, 211)",mediumpurple:"rgb(147, 112, 219)",mediumseagreen:"rgb( 60, 179, 113)",mediumslateblue:"rgb(123, 104, 238)",mediumspringgreen:"rgb( 0, 250, 154)",mediumturquoise:"rgb( 72, 209, 204)",mediumvioletred:"rgb(199, 21, 133)",midnightblue:"rgb( 25, 25, 112)",mintcream:"rgb(245, 255, 250)",mistyrose:"rgb(255, 228, 225)",moccasin:"rgb(255, 228, 181)",navajowhite:"rgb(255, 222, 173)",navy:"rgb( 0, 0, 128)",oldlace:"rgb(253, 245, 230)",olive:"rgb(128, 128, 0)",olivedrab:"rgb(107, 142, 35)",orange:"rgb(255, 165, 0)",orangered:"rgb(255, 69, 0)",orchid:"rgb(218, 112, 214)",palegoldenrod:"rgb(238, 232, 170)",palegreen:"rgb(152, 251, 152)",paleturquoise:"rgb(175, 238, 238)",palevioletred:"rgb(219, 112, 147)",papayawhip:"rgb(255, 239, 213)",peachpuff:"rgb(255, 218, 185)",peru:"rgb(205, 133, 63)",pink:"rgb(255, 192, 203)",plum:"rgb(221, 160, 221)",powderblue:"rgb(176, 224, 230)",purple:"rgb(128, 0, 128)",red:"rgb(255, 0, 0)",rosybrown:"rgb(188, 143, 143)",royalblue:"rgb( 65, 105, 225)",saddlebrown:"rgb(139, 69, 19)",salmon:"rgb(250, 128, 114)",sandybrown:"rgb(244, 164, 96)",seagreen:"rgb( 46, 139, 87)",seashell:"rgb(255, 245, 238)",sienna:"rgb(160, 82, 45)",silver:"rgb(192, 192, 192)",skyblue:"rgb(135, 206, 235)",slateblue:"rgb(106, 90, 205)",slategray:"rgb(112, 128, 144)",slategrey:"rgb(112, 128, 144)",snow:"rgb(255, 250, 250)",springgreen:"rgb( 0, 255, 127)",steelblue:"rgb( 70, 130, 180)",tan:"rgb(210, 180, 140)",teal:"rgb( 0, 128, 128)",thistle:"rgb(216, 191, 216)",tomato:"rgb(255, 99, 71)",turquoise:"rgb( 64, 224, 208)",violet:"rgb(238, 130, 238)",wheat:"rgb(245, 222, 179)",white:"rgb(255, 255, 255)",whitesmoke:"rgb(245, 245, 245)",yellow:"rgb(255, 255, 0)",yellowgreen:"rgb(154, 205, 50)"};L.jqplot.AxisLabelRenderer=function(ah){L.jqplot.ElemContainer.call(this);this.axis;this.show=true;this.label="";this.fontFamily=null;this.fontSize=null;this.textColor=null;this._elem;this.escapeHTML=false;L.extend(true,this,ah)};L.jqplot.AxisLabelRenderer.prototype=new L.jqplot.ElemContainer();L.jqplot.AxisLabelRenderer.prototype.constructor=L.jqplot.AxisLabelRenderer;L.jqplot.AxisLabelRenderer.prototype.init=function(ah){L.extend(true,this,ah)};L.jqplot.AxisLabelRenderer.prototype.draw=function(ah,ai){if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=L('
            ');if(Number(this.label)){this._elem.css("white-space","nowrap")}if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}return this._elem};L.jqplot.AxisLabelRenderer.prototype.pack=function(){};L.jqplot.AxisTickRenderer=function(ah){L.jqplot.ElemContainer.call(this);this.mark="outside";this.axis;this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.size=4;this.markSize=6;this.show=true;this.showLabel=true;this.label=null;this.value=null;this._styles={};this.formatter=L.jqplot.DefaultTickFormatter;this.prefix="";this.suffix="";this.formatString="";this.fontFamily;this.fontSize;this.textColor;this.escapeHTML=false;this._elem;this._breakTick=false;L.extend(true,this,ah)};L.jqplot.AxisTickRenderer.prototype.init=function(ah){L.extend(true,this,ah)};L.jqplot.AxisTickRenderer.prototype=new L.jqplot.ElemContainer();L.jqplot.AxisTickRenderer.prototype.constructor=L.jqplot.AxisTickRenderer;L.jqplot.AxisTickRenderer.prototype.setTick=function(ah,aj,ai){this.value=ah;this.axis=aj;if(ai){this.isMinorTick=true}return this};L.jqplot.AxisTickRenderer.prototype.draw=function(){if(this.label===null){this.label=this.prefix+this.formatter(this.formatString,this.value)+this.suffix}var ai={position:"absolute"};if(Number(this.label)){ai.whitSpace="nowrap"}if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=L(document.createElement("div"));this._elem.addClass("jqplot-"+this.axis+"-tick");if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}this._elem.css(ai);for(var ah in this._styles){this._elem.css(ah,this._styles[ah])}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}if(this._breakTick){this._elem.addClass("jqplot-breakTick")}return this._elem};L.jqplot.DefaultTickFormatter=function(ah,ai){if(typeof ai=="number"){if(!ah){ah=L.jqplot.config.defaultTickFormatString}return L.jqplot.sprintf(ah,ai)}else{return String(ai)}};L.jqplot.PercentTickFormatter=function(ah,ai){if(typeof ai=="number"){ai=100*ai;if(!ah){ah=L.jqplot.config.defaultTickFormatString}return L.jqplot.sprintf(ah,ai)}else{return String(ai)}};L.jqplot.AxisTickRenderer.prototype.pack=function(){};L.jqplot.CanvasGridRenderer=function(){this.shadowRenderer=new L.jqplot.ShadowRenderer()};L.jqplot.CanvasGridRenderer.prototype.init=function(ai){this._ctx;L.extend(true,this,ai);var ah={lineJoin:"miter",lineCap:"round",fill:false,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.shadowWidth,closePath:false,strokeStyle:this.shadowColor};this.renderer.shadowRenderer.init(ah)};L.jqplot.CanvasGridRenderer.prototype.createElement=function(ak){var aj;if(this._elem){if(L.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==u){aj=this._elem.get(0);window.G_vmlCanvasManager.uninitElement(aj);aj=null}this._elem.emptyForce();this._elem=null}aj=ak.canvasManager.getCanvas();var ah=this._plotDimensions.width;var ai=this._plotDimensions.height;aj.width=ah;aj.height=ai;this._elem=L(aj);this._elem.addClass("jqplot-grid-canvas");this._elem.css({position:"absolute",left:0,top:0});aj=ak.canvasManager.initCanvas(aj);this._top=this._offsets.top;this._bottom=ai-this._offsets.bottom;this._left=this._offsets.left;this._right=ah-this._offsets.right;this._width=this._right-this._left;this._height=this._bottom-this._top;aj=null;return this._elem};L.jqplot.CanvasGridRenderer.prototype.draw=function(){this._ctx=this._elem.get(0).getContext("2d");var at=this._ctx;var aw=this._axes;at.save();at.clearRect(0,0,this._plotDimensions.width,this._plotDimensions.height);at.fillStyle=this.backgroundColor||this.background;at.fillRect(this._left,this._top,this._width,this._height);at.save();at.lineJoin="miter";at.lineCap="butt";at.lineWidth=this.gridLineWidth;at.strokeStyle=this.gridLineColor;var aA,az,ap,aq;var am=["xaxis","yaxis","x2axis","y2axis"];for(var ay=4;ay>0;ay--){var aD=am[ay-1];var ah=aw[aD];var aB=ah._ticks;var ar=aB.length;if(ah.show){if(ah.drawBaseline){var aC={};if(ah.baselineWidth!==null){aC.lineWidth=ah.baselineWidth}if(ah.baselineColor!==null){aC.strokeStyle=ah.baselineColor}switch(aD){case"xaxis":ao(this._left,this._bottom,this._right,this._bottom,aC);break;case"yaxis":ao(this._left,this._bottom,this._left,this._top,aC);break;case"x2axis":ao(this._left,this._bottom,this._right,this._bottom,aC);break;case"y2axis":ao(this._right,this._bottom,this._right,this._top,aC);break}}for(var au=ar;au>0;au--){var an=aB[au-1];if(an.show){var ak=Math.round(ah.u2p(an.value))+0.5;switch(aD){case"xaxis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(ak,this._top,ak,this._bottom)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._bottom;az=this._bottom+ap;break;case"inside":aA=this._bottom-ap;az=this._bottom;break;case"cross":aA=this._bottom-ap;az=this._bottom+ap;break;default:aA=this._bottom;az=this._bottom+ap;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[ak,aA],[ak,az]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ao(ak,aA,ak,az)}break;case"yaxis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(this._right,ak,this._left,ak)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._left-ap;az=this._left;break;case"inside":aA=this._left;az=this._left+ap;break;case"cross":aA=this._left-ap;az=this._left+ap;break;default:aA=this._left-ap;az=this._left;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[aA,ak],[az,ak]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ao(aA,ak,az,ak,{strokeStyle:ah.borderColor})}break;case"x2axis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(ak,this._bottom,ak,this._top)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._top-ap;az=this._top;break;case"inside":aA=this._top;az=this._top+ap;break;case"cross":aA=this._top-ap;az=this._top+ap;break;default:aA=this._top-ap;az=this._top;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[ak,aA],[ak,az]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ao(ak,aA,ak,az)}break;case"y2axis":if(an.showGridline&&this.drawGridlines&&((!an.isMinorTick&&ah.drawMajorGridlines)||(an.isMinorTick&&ah.drawMinorGridlines))){ao(this._left,ak,this._right,ak)}if(an.showMark&&an.mark&&((!an.isMinorTick&&ah.drawMajorTickMarks)||(an.isMinorTick&&ah.drawMinorTickMarks))){ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;switch(aq){case"outside":aA=this._right;az=this._right+ap;break;case"inside":aA=this._right-ap;az=this._right;break;case"cross":aA=this._right-ap;az=this._right+ap;break;default:aA=this._right;az=this._right+ap;break}if(this.shadow){this.renderer.shadowRenderer.draw(at,[[aA,ak],[az,ak]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ao(aA,ak,az,ak,{strokeStyle:ah.borderColor})}break;default:break}}}an=null}ah=null;aB=null}am=["y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];for(var ay=7;ay>0;ay--){var ah=aw[am[ay-1]];var aB=ah._ticks;if(ah.show){var ai=aB[ah.numberTicks-1];var al=aB[0];var aj=ah.getLeft();var av=[[aj,ai.getTop()+ai.getHeight()/2],[aj,al.getTop()+al.getHeight()/2+1]];if(this.shadow){this.renderer.shadowRenderer.draw(at,av,{lineCap:"butt",fill:false,closePath:false})}ao(av[0][0],av[0][1],av[1][0],av[1][1],{lineCap:"butt",strokeStyle:ah.borderColor,lineWidth:ah.borderWidth});for(var au=aB.length;au>0;au--){var an=aB[au-1];ap=an.markSize;aq=an.mark;var ak=Math.round(ah.u2p(an.value))+0.5;if(an.showMark&&an.mark){switch(aq){case"outside":aA=aj;az=aj+ap;break;case"inside":aA=aj-ap;az=aj;break;case"cross":aA=aj-ap;az=aj+ap;break;default:aA=aj;az=aj+ap;break}av=[[aA,ak],[az,ak]];if(this.shadow){this.renderer.shadowRenderer.draw(at,av,{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ao(aA,ak,az,ak,{strokeStyle:ah.borderColor})}an=null}al=null}ah=null;aB=null}at.restore();function ao(aH,aG,aE,ax,aF){at.save();aF=aF||{};if(aF.lineWidth==null||aF.lineWidth!=0){L.extend(true,at,aF);at.beginPath();at.moveTo(aH,aG);at.lineTo(aE,ax);at.stroke();at.restore()}}if(this.shadow){var av=[[this._left,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(at,av)}if(this.borderWidth!=0&&this.drawBorder){ao(this._left,this._top,this._right,this._top,{lineCap:"round",strokeStyle:aw.x2axis.borderColor,lineWidth:aw.x2axis.borderWidth});ao(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:aw.y2axis.borderColor,lineWidth:aw.y2axis.borderWidth});ao(this._right,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:aw.xaxis.borderColor,lineWidth:aw.xaxis.borderWidth});ao(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:aw.yaxis.borderColor,lineWidth:aw.yaxis.borderWidth})}at.restore();at=null;aw=null};L.jqplot.DivTitleRenderer=function(){};L.jqplot.DivTitleRenderer.prototype.init=function(ah){L.extend(true,this,ah)};L.jqplot.DivTitleRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}var ak=this.renderer;var aj=document.createElement("div");this._elem=L(aj);this._elem.addClass("jqplot-title");if(!this.text){this.show=false;this._elem.height(0);this._elem.width(0)}else{if(this.text){var ah;if(this.color){ah=this.color}else{if(this.textColor){ah=this.textColor}}var ai={position:"absolute",top:"0px",left:"0px"};if(this._plotWidth){ai.width=this._plotWidth+"px"}if(this.fontSize){ai.fontSize=this.fontSize}if(typeof this.textAlign==="string"){ai.textAlign=this.textAlign}else{ai.textAlign="center"}if(ah){ai.color=ah}if(this.paddingBottom){ai.paddingBottom=this.paddingBottom}if(this.fontFamily){ai.fontFamily=this.fontFamily}this._elem.css(ai);if(this.escapeHtml){this._elem.text(this.text)}else{this._elem.html(this.text)}}}aj=null;return this._elem};L.jqplot.DivTitleRenderer.prototype.pack=function(){};var r=0.1;L.jqplot.LinePattern=function(aw,aq){var ap={dotted:[r,L.jqplot.config.dotGapLength],dashed:[L.jqplot.config.dashLength,L.jqplot.config.gapLength],solid:null};if(typeof aq==="string"){if(aq[0]==="."||aq[0]==="-"){var ax=aq;aq=[];for(var ao=0,al=ax.length;ao0)&&(aC>0)){aA/=aB;az/=aB;while(true){var aD=aC*ar;if(aD=aq.length){ak=0}ar=aq[ak]}else{au=ay;at=aE;if((ak&1)==0){aw.lineTo(au,at)}else{aw.moveTo(au,at)}ar-=aB/aC;break}}}};var ai=function(){aw.beginPath()};var am=function(){aj(an,ah)};return{moveTo:av,lineTo:aj,beginPath:ai,closePath:am}};L.jqplot.LineRenderer=function(){this.shapeRenderer=new L.jqplot.ShapeRenderer();this.shadowRenderer=new L.jqplot.ShadowRenderer()};L.jqplot.LineRenderer.prototype.init=function(ai,an){ai=ai||{};this._type="line";this.renderer.animation={show:false,direction:"left",speed:2500,_supported:true};this.renderer.smooth=false;this.renderer.tension=null;this.renderer.constrainSmoothing=true;this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];this.renderer.bandData=[];this.renderer.bands={show:false,hiData:[],lowData:[],color:this.color,showLines:false,fill:true,fillColor:null,_min:null,_max:null,interval:"3%"};var al={highlightMouseOver:ai.highlightMouseOver,highlightMouseDown:ai.highlightMouseDown,highlightColor:ai.highlightColor};delete (ai.highlightMouseOver);delete (ai.highlightMouseDown);delete (ai.highlightColor);L.extend(true,this.renderer,ai);this.renderer.options=ai;if(this.renderer.bandData.length>1&&(!ai.bands||ai.bands.show==null)){this.renderer.bands.show=true}else{if(ai.bands&&ai.bands.show==null&&ai.bands.interval!=null){this.renderer.bands.show=true}}if(this.fill){this.renderer.bands.show=false}if(this.renderer.bands.show){this.renderer.initBands.call(this,this.renderer.options,an)}if(this._stack){this.renderer.smooth=false}var am={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,strokeStyle:this.color,fillStyle:this.fillColor,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shapeRenderer.init(am);var aj=ai.shadowOffset;if(aj==null){if(this.lineWidth>2.5){aj=1.25*(1+(Math.atan((this.lineWidth/2.5))/0.785398163-1)*0.6)}else{aj=1.25*Math.atan((this.lineWidth/2.5))/0.785398163}}var ah={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,angle:this.shadowAngle,offset:aj,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shadowRenderer.init(ah);this._areaPoints=[];this._boundingBox=[[],[]];if(!this.isTrendline&&this.fill||this.renderer.bands.show){this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColor=null;if(al.highlightMouseDown&&al.highlightMouseOver==null){al.highlightMouseOver=false}L.extend(true,this,{highlightMouseOver:al.highlightMouseOver,highlightMouseDown:al.highlightMouseDown,highlightColor:al.highlightColor});if(!this.highlightColor){var ak=(this.renderer.bands.show)?this.renderer.bands.fillColor:this.fillColor;this.highlightColor=L.jqplot.computeHighlightColors(ak)}if(this.highlighter){this.highlighter.show=false}}if(!this.isTrendline&&an){an.plugins.lineRenderer={};an.postInitHooks.addOnce(z);an.postDrawHooks.addOnce(af);an.eventListenerHooks.addOnce("jqplotMouseMove",h);an.eventListenerHooks.addOnce("jqplotMouseDown",e);an.eventListenerHooks.addOnce("jqplotMouseUp",ad);an.eventListenerHooks.addOnce("jqplotClick",g);an.eventListenerHooks.addOnce("jqplotRightClick",s)}};L.jqplot.LineRenderer.prototype.initBands=function(ak,av){var al=ak.bandData||[];var an=this.renderer.bands;an.hiData=[];an.lowData=[];var aB=this.data;an._max=null;an._min=null;if(al.length==2){if(L.isArray(al[0][0])){var ao;var ah=0,ar=0;for(var aw=0,at=al[0].length;awan._max)||an._max==null){an._max=ao[1]}if((ao[1]!=null&&ao[1]an._max)||an._max==null){an._max=ao[1];ar=1}if((ao[1]!=null&&ao[1]al[1][0])?0:1;var aC=(aj)?0:1;for(var aw=0,at=aB.length;aw2&&!L.isArray(al[0][0])){var aj=(al[0][0]>al[0][1])?0:1;var aC=(aj)?0:1;for(var aw=0,at=al.length;awan._max)||an._max==null){an._max=am[aw][1]}}for(var aw=0,at=ap.length;aw0){aR=Math.abs((ap[aQ][1]-ap[aQ-1][1])/(ap[aQ][0]-ap[aQ-1][0]))}am=aR/aG+aE;aM=aF*A(am)-aF*A(aE)+aS;aT=(aO+aM)/2}else{aT=aU}for(aK=0;aK2){var ao;if(this.renderer.constrainSmoothing){ao=J.call(this,this.gridData);this.renderer._smoothedData=ao[0];this.renderer._smoothedPlotData=ao[1];if(ak.show){ao=J.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ao[0];ao=J.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ao[0]}ao=null}else{ao=F.call(this,this.gridData);this.renderer._smoothedData=ao[0];this.renderer._smoothedPlotData=ao[1];if(ak.show){ao=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ao[0];ao=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ao[0]}ao=null}}};L.jqplot.LineRenderer.prototype.makeGridData=function(ao,aq){var am=this._xaxis.series_u2p;var ah=this._yaxis.series_u2p;var ar=[];var aj=[];this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];var al=this.renderer.bands;var ai=false;for(var an=0;an2){var ap;if(this.renderer.constrainSmoothing){ap=J.call(this,ar);this.renderer._smoothedData=ap[0];this.renderer._smoothedPlotData=ap[1];if(al.show){ap=J.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ap[0];ap=J.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ap[0]}ap=null}else{ap=F.call(this,ar);this.renderer._smoothedData=ap[0];this.renderer._smoothedPlotData=ap[1];if(al.show){ap=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ap[0];ap=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ap[0]}ap=null}}return ar};L.jqplot.LineRenderer.prototype.draw=function(ax,aI,ai,aB){var aC;var aq=L.extend(true,{},ai);var ak=(aq.shadow!=u)?aq.shadow:this.shadow;var aJ=(aq.showLine!=u)?aq.showLine:this.showLine;var aA=(aq.fill!=u)?aq.fill:this.fill;var ah=(aq.fillAndStroke!=u)?aq.fillAndStroke:this.fillAndStroke;var ar,ay,av,aE;ax.save();if(aI.length){if(aJ){if(aA){if(this.fillToZero){var aF=this.negativeColor;if(!this.useNegativeColors){aF=aq.fillStyle}var ao=false;var ap=aq.fillStyle;if(ah){var aH=aI.slice(0)}if(this.index==0||!this._stack){var aw=[];var aL=(this.renderer.smooth)?this.renderer._smoothedPlotData:this._plotData;this._areaPoints=[];var aG=this._yaxis.series_u2p(this.fillToValue);var aj=this._xaxis.series_u2p(this.fillToValue);aq.closePath=true;if(this.fillAxis=="y"){aw.push([aI[0][0],aG]);this._areaPoints.push([aI[0][0],aG]);for(var aC=0;aC0;aC--){aI.push(au[aC-1])}if(ak){this.renderer.shadowRenderer.draw(ax,aI,aq)}this._areaPoints=aI;this.renderer.shapeRenderer.draw(ax,aI,aq)}}else{if(ah){var aH=aI.slice(0)}if(this.index==0||!this._stack){var al=ax.canvas.height;aI.unshift([aI[0][0],al]);var aD=aI.length;aI.push([aI[aD-1][0],al])}else{var au=this._prevGridData;for(var aC=au.length;aC>0;aC--){aI.push(au[aC-1])}}this._areaPoints=aI;if(ak){this.renderer.shadowRenderer.draw(ax,aI,aq)}this.renderer.shapeRenderer.draw(ax,aI,aq)}if(ah){var az=L.extend(true,{},aq,{fill:false,closePath:false});this.renderer.shapeRenderer.draw(ax,aH,az);if(this.markerRenderer.show){if(this.renderer.smooth){aH=this.gridData}for(aC=0;aCat[0]||ar==null){ar=at[0]}if(aEat[1]||ay==null){ay=at[1]}}if(this.type==="line"&&this.renderer.bands.show){aE=this._yaxis.series_u2p(this.renderer.bands._min);ay=this._yaxis.series_u2p(this.renderer.bands._max)}this._boundingBox=[[ar,aE],[av,ay]];if(this.markerRenderer.show&&!aA){if(this.renderer.smooth){aI=this.gridData}for(aC=0;aCao){ao=aj}}}al=null;am=null;if(ah){ai=this._label._elem.outerWidth(true);an=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){ao=ao+an;this._elem.css({height:ao+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){ao=ao+an;this._elem.css({height:ao+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){ao=ao+ai;this._elem.css({width:ao+"px",left:"0px",top:"0px"});if(ah&&this._label.constructor==L.jqplot.AxisLabelRenderer){this._label._elem.css("width",ai+"px")}}else{ao=ao+ai;this._elem.css({width:ao+"px",right:"0px",top:"0px"});if(ah&&this._label.constructor==L.jqplot.AxisLabelRenderer){this._label._elem.css("width",ai+"px")}}}}}};L.jqplot.LinearAxisRenderer.prototype.createTicks=function(aj){var aT=this._ticks;var aK=this.ticks;var az=this.name;var aB=this._dataBounds;var ah=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;var an;var a6,aI;var ap,ao;var a4,a0;var aH=this.min;var a5=this.max;var aW=this.numberTicks;var ba=this.tickInterval;var am=30;this._scalefact=(Math.max(ah,am+1)-am)/300;if(aK.length){for(a0=0;a0this.breakPoints[0]&&aO[0]<=this.breakPoints[1]){aU.show=false;aU.showGridline=false;aU.label=aO[1]}else{aU.label=aO[1]}}}else{aU.label=aO[1]}aU.setTick(aO[0],this.name);this._ticks.push(aU)}else{if(L.isPlainObject(aO)){L.extend(true,aU,aO);aU.axis=this.name;this._ticks.push(aU)}else{aU.value=aO;if(this.breakPoints){if(aO==this.breakPoints[0]){aU.label=this.breakTickLabel;aU._breakTick=true;aU.showGridline=false;aU.showMark=false}else{if(aO>this.breakPoints[0]&&aO<=this.breakPoints[1]){aU.show=false;aU.showGridline=false}}}aU.setTick(aO,this.name);this._ticks.push(aU)}}}this.numberTicks=aK.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1)}else{if(az=="xaxis"||az=="x2axis"){ah=this._plotDimensions.width}else{ah=this._plotDimensions.height}var ax=this.numberTicks;if(this.alignTicks){if(this.name==="x2axis"&&aj.axes.xaxis.show){ax=aj.axes.xaxis.numberTicks}else{if(this.name.charAt(0)==="y"&&this.name!=="yaxis"&&this.name!=="yMidAxis"&&aj.axes.yaxis.show){ax=aj.axes.yaxis.numberTicks}}}a6=((this.min!=null)?this.min:aB.min);aI=((this.max!=null)?this.max:aB.max);var av=aI-a6;var aS,ay;var at;if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(this.min==null||this.max==null&&this.tickInterval==null&&!this.autoscale){if(this.forceTickAt0){if(a6>0){a6=0}if(aI<0){aI=0}}if(this.forceTickAt100){if(a6>100){a6=100}if(aI<100){aI=100}}var aE=false,a1=false;if(this.min!=null){aE=true}else{if(this.max!=null){a1=true}}var aP=L.jqplot.LinearTickGenerator(a6,aI,this._scalefact,ax,aE,a1);var aw=(this.min!=null)?a6:a6+av*(this.padMin-1);var aQ=(this.max!=null)?aI:aI-av*(this.padMax-1);if(a6aQ){aw=(this.min!=null)?a6:a6-av*(this.padMin-1);aQ=(this.max!=null)?aI:aI+av*(this.padMax-1);aP=L.jqplot.LinearTickGenerator(aw,aQ,this._scalefact,ax,aE,a1)}this.min=aP[0];this.max=aP[1];this.numberTicks=aP[2];this._autoFormatString=aP[3];this.tickInterval=aP[4]}else{if(a6==aI){var ai=0.05;if(a6>0){ai=Math.max(Math.log(a6)/Math.LN10,0.05)}a6-=ai;aI+=ai}if(this.autoscale&&this.min==null&&this.max==null){var ak,al,ar;var aC=false;var aN=false;var aA={min:null,max:null,average:null,stddev:null};for(var a0=0;a0a2){a2=aR[aZ]}}}var au=(a2-aG)/a2;if(aV.renderer.constructor==L.jqplot.BarRenderer){if(aG>=0&&(aV.fillToZero||au>0.1)){aC=true}else{aC=false;if(aV.fill&&aV.fillToZero&&aG<0&&a2>0){aN=true}else{aN=false}}}else{if(aV.fill){if(aG>=0&&(aV.fillToZero||au>0.1)){aC=true}else{if(aG<0&&a2>0&&aV.fillToZero){aC=false;aN=true}else{aC=false;aN=false}}}else{if(aG<0){aC=false}}}}}if(aC){this.numberTicks=2+Math.ceil((ah-(this.tickSpacing-1))/this.tickSpacing);this.min=0;aH=0;al=aI/(this.numberTicks-1);at=Math.pow(10,Math.abs(Math.floor(Math.log(al)/Math.LN10)));if(al/at==parseInt(al/at,10)){al+=at}this.tickInterval=Math.ceil(al/at)*at;this.max=this.tickInterval*(this.numberTicks-1)}else{if(aN){this.numberTicks=2+Math.ceil((ah-(this.tickSpacing-1))/this.tickSpacing);var aJ=Math.ceil(Math.abs(a6)/av*(this.numberTicks-1));var a9=this.numberTicks-1-aJ;al=Math.max(Math.abs(a6/aJ),Math.abs(aI/a9));at=Math.pow(10,Math.abs(Math.floor(Math.log(al)/Math.LN10)));this.tickInterval=Math.ceil(al/at)*at;this.max=this.tickInterval*a9;this.min=-this.tickInterval*aJ}else{if(this.numberTicks==null){if(this.tickInterval){this.numberTicks=3+Math.ceil(av/this.tickInterval)}else{this.numberTicks=2+Math.ceil((ah-(this.tickSpacing-1))/this.tickSpacing)}}if(this.tickInterval==null){al=av/(this.numberTicks-1);if(al<1){at=Math.pow(10,Math.abs(Math.floor(Math.log(al)/Math.LN10)))}else{at=1}this.tickInterval=Math.ceil(al*at*this.pad)/at}else{at=1/this.tickInterval}ak=this.tickInterval*(this.numberTicks-1);ar=(ak-av)/2;if(this.min==null){this.min=Math.floor(at*(a6-ar))/at}if(this.max==null){this.max=this.min+ak}}}var aF=L.jqplot.getSignificantFigures(this.tickInterval);var aM;if(aF.digitsLeft>=aF.significantDigits){aM="%d"}else{var at=Math.max(0,5-aF.digitsLeft);at=Math.min(at,aF.digitsRight);aM="%."+at+"f"}this._autoFormatString=aM}else{aS=(this.min!=null)?this.min:a6-av*(this.padMin-1);ay=(this.max!=null)?this.max:aI+av*(this.padMax-1);av=ay-aS;if(this.numberTicks==null){if(this.tickInterval!=null){this.numberTicks=Math.ceil((ay-aS)/this.tickInterval)+1}else{if(ah>100){this.numberTicks=parseInt(3+(ah-100)/75,10)}else{this.numberTicks=2}}}if(this.tickInterval==null){this.tickInterval=av/(this.numberTicks-1)}if(this.max==null){ay=aS+this.tickInterval*(this.numberTicks-1)}if(this.min==null){aS=ay-this.tickInterval*(this.numberTicks-1)}var aF=L.jqplot.getSignificantFigures(this.tickInterval);var aM;if(aF.digitsLeft>=aF.significantDigits){aM="%d"}else{var at=Math.max(0,5-aF.digitsLeft);at=Math.min(at,aF.digitsRight);aM="%."+at+"f"}this._autoFormatString=aM;this.min=aS;this.max=ay}if(this.renderer.constructor==L.jqplot.LinearAxisRenderer&&this._autoFormatString==""){av=this.max-this.min;var a7=new this.tickRenderer(this.tickOptions);var aL=a7.formatString||L.jqplot.config.defaultTickFormatString;var aL=aL.match(L.jqplot.sprintf.regex)[0];var a3=0;if(aL){if(aL.search(/[fFeEgGpP]/)>-1){var aY=aL.match(/\%\.(\d{0,})?[eEfFgGpP]/);if(aY){a3=parseInt(aY[1],10)}else{a3=6}}else{if(aL.search(/[di]/)>-1){a3=0}}var aq=Math.pow(10,-a3);if(this.tickIntervalthis.breakPoints[0]&&aAthis.breakPoints[0]&&aAthis.breakPoints[0]&&aA=this.breakPoints[1]){return(aA-au)*ak/al}else{return(aA+this.breakPoints[1]-this.breakPoints[0]-au)*ak/al}};this.series_p2u=function(aA){return aA*al/ak+au}}}else{this.p2u=function(aA){return(aA-am)*al/ak+at};this.u2p=function(aA){return(aA-at)*ak/al+am};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(aA){return(aA-at)*ak/al};this.series_p2u=function(aA){return aA*al/ak+at}}else{this.series_u2p=function(aA){return(aA-au)*ak/al};this.series_p2u=function(aA){return aA*al/ak+au}}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var av=0;av0){ah=-ap._textRenderer.height*Math.cos(-ap._textRenderer.angle)/2}else{ah=-ap.getHeight()+ap._textRenderer.height*Math.cos(ap._textRenderer.angle)/2}break;case"middle":ah=-ap.getHeight()/2;break;default:ah=-ap.getHeight()/2;break}}else{ah=-ap.getHeight()/2}var az=this.u2p(ap.value)+ah+"px";ap._elem.css("top",az);ap.pack()}}if(aq){var aw=this._label._elem.outerHeight(true);this._label._elem.css("top",ao-ak/2-aw/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}ay=null};function i(ai){var ah;ai=Math.abs(ai);if(ai>=10){ah="%d"}else{if(ai>1){if(ai===parseInt(ai,10)){ah="%d"}else{ah="%.1f"}}else{var aj=-Math.floor(Math.log(ai)/Math.LN10);ah="%."+aj+"f"}}return ah}var b=[0.1,0.2,0.3,0.4,0.5,0.8,1,2,3,4,5];var c=function(ai){var ah=b.indexOf(ai);if(ah>0){return b[ah-1]}else{return b[b.length-1]/100}};var k=function(ai){var ah=b.indexOf(ai);if(ah5){ah=10*aj}else{if(am>2){ah=5*aj}else{if(am>1){ah=2*aj}else{ah=aj}}}}else{if(am>5){ah=10*aj}else{if(am>4){ah=5*aj}else{if(am>3){ah=4*aj}else{if(am>2){ah=3*aj}else{if(am>1){ah=2*aj}else{ah=aj}}}}}}return ah}function Q(ai,ah){ah=ah||1;var ak=Math.floor(Math.log(ai)/Math.LN10);var am=Math.pow(10,ak);var al=ai/am;var aj;al=al/ah;if(al<=0.38){aj=0.1}else{if(al<=1.6){aj=0.2}else{if(al<=4){aj=0.5}else{if(al<=8){aj=1}else{if(al<=16){aj=2}else{aj=5}}}}}return aj*am}function x(aj,ai){var al=Math.floor(Math.log(aj)/Math.LN10);var an=Math.pow(10,al);var am=aj/an;var ah;var ak;am=am/ai;if(am<=0.38){ak=0.1}else{if(am<=1.6){ak=0.2}else{if(am<=4){ak=0.5}else{if(am<=8){ak=1}else{if(am<=16){ak=2}else{ak=5}}}}}ah=ak*an;return[ah,ak,an]}L.jqplot.LinearTickGenerator=function(an,aq,aj,ak,ao,ar){ao=(ao===null)?false:ao;ar=(ar===null||ao)?false:ar;if(an===aq){aq=(aq)?0:1}aj=aj||1;if(aqat){at=aB}if(ai>aA){aA=ai}})}an.width=at+Number(av);an.height=aA+Number(ax);var ak=an.getContext("2d");ak.save();ak.fillStyle=al;ak.fillRect(0,0,an.width,an.height);ak.restore();ak.translate(au,ar);ak.textAlign="left";ak.textBaseline="top";function aC(aE){var aF=parseInt(L(aE).css("line-height"),10);if(isNaN(aF)){aF=parseInt(L(aE).css("font-size"),10)*1.2}return aF}function aD(aF,aE,aS,aG,aO,aH){var aQ=aC(aF);var aK=L(aF).innerWidth();var aL=L(aF).innerHeight();var aN=aS.split(/\s+/);var aR=aN.length;var aP="";var aM=[];var aU=aO;var aT=aG;for(var aJ=0;aJaK){aM.push(aJ);aP="";aJ--}}if(aM.length===0){if(L(aF).css("textAlign")==="center"){aT=aG+(aH-aE.measureText(aP).width)/2-au}aE.fillText(aS,aT,aO)}else{aP=aN.slice(0,aM[0]).join(" ");if(L(aF).css("textAlign")==="center"){aT=aG+(aH-aE.measureText(aP).width)/2-au}aE.fillText(aP,aT,aU);aU+=aQ;for(var aJ=1,aI=aM.length;aJ0){ak.strokeRect(aI,aL,L(aG).innerWidth(),L(aG).innerHeight())}L(aG).find("div.jqplot-table-legend-swatch-outline").each(function(){var aU=L(this);ak.strokeStyle=aU.css("border-top-color");var aQ=aI+aU.position().left;var aR=aL+aU.position().top;ak.strokeRect(aQ,aR,aU.innerWidth(),aU.innerHeight());aQ+=parseInt(aU.css("padding-left"),10);aR+=parseInt(aU.css("padding-top"),10);var aT=aU.innerHeight()-2*parseInt(aU.css("padding-top"),10);var aP=aU.innerWidth()-2*parseInt(aU.css("padding-left"),10);var aS=aU.children("div.jqplot-table-legend-swatch");ak.fillStyle=aS.css("background-color");ak.fillRect(aQ,aR,aP,aT)});L(aG).find("td.jqplot-table-legend-label").each(function(){var aR=L(this);var aP=aI+aR.position().left;var aQ=aL+aR.position().top+parseInt(aR.css("padding-top"),10);ak.font=aR.jqplotGetComputedFontStyle();ak.fillStyle=aR.css("color");aD(aR,ak,aR.text(),aP,aQ,aM)});var aH=null}else{if(aN=="canvas"){ak.drawImage(aG,aI,aL)}}}}L(this).children().each(function(){aw(this,av,ax)});return an};L.fn.jqplotToImageStr=function(ai){var ah=L(this).jqplotToImageCanvas(ai);if(ah){return ah.toDataURL("image/png")}else{return null}};L.fn.jqplotToImageElem=function(ah){var ai=document.createElement("img");var aj=L(this).jqplotToImageStr(ah);ai.src=aj;return ai};L.fn.jqplotToImageElemStr=function(ah){var ai="";return ai};L.fn.jqplotSaveImage=function(){var ah=L(this).jqplotToImageStr({});if(ah){window.location.href=ah.replace("image/png","image/octet-stream")}};L.fn.jqplotViewImage=function(){var ai=L(this).jqplotToImageElemStr({});var aj=L(this).jqplotToImageStr({});if(ai){var ah=window.open("");ah.document.open("image/png");ah.document.write(ai);ah.document.close();ah=null}};var ag=function(){this.syntax=ag.config.syntax;this._type="jsDate";this.proxy=new Date();this.options={};this.locale=ag.regional.getLocale();this.formatString="";this.defaultCentury=ag.config.defaultCentury;switch(arguments.length){case 0:break;case 1:if(l(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var aj=this.options=arguments[0];this.syntax=aj.syntax||this.syntax;this.defaultCentury=aj.defaultCentury||this.defaultCentury;this.proxy=ag.createDate(aj.date)}else{this.proxy=ag.createDate(arguments[0])}break;default:var ah=[];for(var ai=0;ai0?"floor":"ceil"](ak))};ag.prototype.getAbbrDayName=function(){return ag.regional[this.locale]["dayNamesShort"][this.proxy.getDay()]};ag.prototype.getAbbrMonthName=function(){return ag.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()]};ag.prototype.getAMPM=function(){return this.proxy.getHours()>=12?"PM":"AM"};ag.prototype.getAmPm=function(){return this.proxy.getHours()>=12?"pm":"am"};ag.prototype.getCentury=function(){return parseInt(this.proxy.getFullYear()/100,10)};ag.prototype.getDate=function(){return this.proxy.getDate()};ag.prototype.getDay=function(){return this.proxy.getDay()};ag.prototype.getDayOfWeek=function(){var ah=this.proxy.getDay();return ah===0?7:ah};ag.prototype.getDayOfYear=function(){var ai=this.proxy;var ah=ai-new Date(""+ai.getFullYear()+"/1/1 GMT");ah+=ai.getTimezoneOffset()*60000;ai=null;return parseInt(ah/60000/60/24,10)+1};ag.prototype.getDayName=function(){return ag.regional[this.locale]["dayNames"][this.proxy.getDay()]};ag.prototype.getFullWeekOfYear=function(){var ak=this.proxy;var ah=this.getDayOfYear();var aj=6-ak.getDay();var ai=parseInt((ah+aj)/7,10);return ai};ag.prototype.getFullYear=function(){return this.proxy.getFullYear()};ag.prototype.getGmtOffset=function(){var ah=this.proxy.getTimezoneOffset()/60;var ai=ah<0?"+":"-";ah=Math.abs(ah);return ai+N(Math.floor(ah),2)+":"+N((ah%1)*60,2)};ag.prototype.getHours=function(){return this.proxy.getHours()};ag.prototype.getHours12=function(){var ah=this.proxy.getHours();return ah>12?ah-12:(ah==0?12:ah)};ag.prototype.getIsoWeek=function(){var ak=this.proxy;var aj=this.getWeekOfYear();var ah=(new Date(""+ak.getFullYear()+"/1/1")).getDay();var ai=aj+(ah>4||ah<=1?0:1);if(ai==53&&(new Date(""+ak.getFullYear()+"/12/31")).getDay()<4){ai=1}else{if(ai===0){ak=new ag(new Date(""+(ak.getFullYear()-1)+"/12/31"));ai=ak.getIsoWeek()}}ak=null;return ai};ag.prototype.getMilliseconds=function(){return this.proxy.getMilliseconds()};ag.prototype.getMinutes=function(){return this.proxy.getMinutes()};ag.prototype.getMonth=function(){return this.proxy.getMonth()};ag.prototype.getMonthName=function(){return ag.regional[this.locale]["monthNames"][this.proxy.getMonth()]};ag.prototype.getMonthNumber=function(){return this.proxy.getMonth()+1};ag.prototype.getSeconds=function(){return this.proxy.getSeconds()};ag.prototype.getShortYear=function(){return this.proxy.getYear()%100};ag.prototype.getTime=function(){return this.proxy.getTime()};ag.prototype.getTimezoneAbbr=function(){return this.proxy.toString().replace(/^.*\(([^)]+)\)$/,"$1")};ag.prototype.getTimezoneName=function(){var ah=/(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());return ah[1]||ah[2]||"GMT"+this.getGmtOffset()};ag.prototype.getTimezoneOffset=function(){return this.proxy.getTimezoneOffset()};ag.prototype.getWeekOfYear=function(){var ah=this.getDayOfYear();var aj=7-this.getDayOfWeek();var ai=parseInt((ah+aj)/7,10);return ai};ag.prototype.getUnix=function(){return Math.round(this.proxy.getTime()/1000,0)};ag.prototype.getYear=function(){return this.proxy.getYear()};ag.prototype.next=function(ah){ah=ah||"day";return this.clone().add(1,ah)};ag.prototype.set=function(){switch(arguments.length){case 0:this.proxy=new Date();break;case 1:if(l(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var aj=this.options=arguments[0];this.syntax=aj.syntax||this.syntax;this.defaultCentury=aj.defaultCentury||this.defaultCentury;this.proxy=ag.createDate(aj.date)}else{this.proxy=ag.createDate(arguments[0])}break;default:var ah=[];for(var ai=0;ai0?"floor":"ceil"](ah/12));var ai=aj.getMonth()+(ah%12);if(ai==12){ai=0;aj.setYear(aj.getFullYear()+1)}else{if(ai==-1){ai=11;aj.setYear(aj.getFullYear()-1)}}aj.setMonth(ai)},diff:function(al,aj){var ah=al.getFullYear()-aj.getFullYear();var ai=al.getMonth()-aj.getMonth()+(ah*12);var ak=al.getDate()-aj.getDate();return ai+(ak/30)}},year:{add:function(ai,ah){ai.setYear(ai.getFullYear()+Math[ah>0?"floor":"ceil"](ah))},diff:function(ai,ah){return E.month.diff(ai,ah)/12}}};for(var Y in E){if(Y.substring(Y.length-1)!="s"){E[Y+"s"]=E[Y]}}var H=function(al,ak,ai){if(ag.formats[ai]["shortcuts"][ak]){return ag.strftime(al,ag.formats[ai]["shortcuts"][ak],ai)}else{var ah=(ag.formats[ai]["codes"][ak]||"").split(".");var aj=al["get"+ah[0]]?al["get"+ah[0]]():"";if(ah[1]){aj=N(aj,ah[1])}return aj}};ag.strftime=function(an,ak,aj,ao){var ai="perl";var am=ag.regional.getLocale();if(aj&&ag.formats.hasOwnProperty(aj)){ai=aj}else{if(aj&&ag.regional.hasOwnProperty(aj)){am=aj}}if(ao&&ag.formats.hasOwnProperty(ao)){ai=ao}else{if(ao&&ag.regional.hasOwnProperty(ao)){am=ao}}if(l(an)!="[object Object]"||an._type!="jsDate"){an=new ag(an);an.locale=am}if(!ak){ak=an.formatString||ag.regional[am]["formatString"]}var ah=ak||"%Y-%m-%d",ap="",al;while(ah.length>0){if(al=ah.match(ag.formats[ai].codes.matcher)){ap+=ah.slice(0,al.index);ap+=(al[1]||"")+H(an,al[2],ai);ah=ah.slice(al.index+al[0].length)}else{ap+=ah;ah=""}}return ap};ag.formats={ISO:"%Y-%m-%dT%H:%M:%S.%N%G",SQL:"%Y-%m-%d %H:%M:%S"};ag.formats.perl={codes:{matcher:/()%(#?(%|[a-z]))/i,Y:"FullYear",y:"ShortYear.2",m:"MonthNumber.2","#m":"MonthNumber",B:"MonthName",b:"AbbrMonthName",d:"Date.2","#d":"Date",e:"Date",A:"DayName",a:"AbbrDayName",w:"Day",H:"Hours.2","#H":"Hours",I:"Hours12.2","#I":"Hours12",p:"AMPM",M:"Minutes.2","#M":"Minutes",S:"Seconds.2","#S":"Seconds",s:"Unix",N:"Milliseconds.3","#N":"Milliseconds",O:"TimezoneOffset",Z:"TimezoneName",G:"GmtOffset"},shortcuts:{F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",D:"%m/%d/%y","#c":"%a %b %e %H:%M:%S %Y",v:"%e-%b-%Y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};ag.formats.php={codes:{matcher:/()%((%|[a-z]))/i,a:"AbbrDayName",A:"DayName",d:"Date.2",e:"Date",j:"DayOfYear.3",u:"DayOfWeek",w:"Day",U:"FullWeekOfYear.2",V:"IsoWeek.2",W:"WeekOfYear.2",b:"AbbrMonthName",B:"MonthName",m:"MonthNumber.2",h:"AbbrMonthName",C:"Century.2",y:"ShortYear.2",Y:"FullYear",H:"Hours.2",I:"Hours12.2",l:"Hours12",p:"AMPM",P:"AmPm",M:"Minutes.2",S:"Seconds.2",s:"Unix",O:"TimezoneOffset",z:"GmtOffset",Z:"TimezoneAbbr"},shortcuts:{D:"%m/%d/%y",F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};ag.createDate=function(aj){if(aj==null){return new Date()}if(aj instanceof Date){return aj}if(typeof aj=="number"){return new Date(aj)}var ao=String(aj).replace(/^\s*(.+)\s*$/g,"$1");ao=ao.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/,"$1/$2/$3");ao=ao.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i,"$1 $2 $3");var an=ao.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);if(an&&an.length>3){var at=parseFloat(an[3]);var am=ag.config.defaultCentury+at;am=String(am);ao=ao.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i,an[1]+" "+an[2]+" "+am)}an=ao.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);function ar(ax,aw){var aC=parseFloat(aw[1]);var aB=parseFloat(aw[2]);var aA=parseFloat(aw[3]);var az=ag.config.defaultCentury;var av,au,aD,ay;if(aC>31){au=aA;aD=aB;av=az+aC}else{au=aB;aD=aC;av=az+aA}ay=aD+"/"+au+"/"+av;return ax.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/,ay)}if(an&&an.length>3){ao=ar(ao,an)}var an=ao.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);if(an&&an.length>3){ao=ar(ao,an)}var al=0;var ai=ag.matchers.length;var aq,ah,ap=ao,ak;while(al31){ah=an;ai=am+ao}else{ah=ao;ai=am+an}var ap=ab(aj[2],ag.regional[ag.regional.getLocale()]["monthNamesShort"]);if(ap==-1){ap=ab(aj[2],ag.regional[ag.regional.getLocale()]["monthNames"])}ak.setFullYear(ai,ap,ah);ak.setHours(0,0,0,0);return ak}else{return al}}];function ab(aj,ak){if(ak.indexOf){return ak.indexOf(aj)}for(var ah=0,ai=ak.length;ah=ap)?"":Array(1+ap-au.length>>>0).join(aq);return at?au+ar:ar+au}function ak(ar){var aq=new String(ar);for(var ap=10;ap>0;ap--){if(aq==(aq=aq.replace(/^(\d+)(\d{3})/,"$1"+L.jqplot.sprintf.thousandsSeparator+"$2"))){break}}return aq}function aj(av,au,ax,ar,at,aq){var aw=ar-av.length;if(aw>0){var ap=" ";if(aq){ap=" "}if(ax||!at){av=an(av,ar,ap,ax)}else{av=av.slice(0,au.length)+an("",aw,"0",true)+av.slice(au.length)}}return av}function ao(ay,aq,aw,ar,ap,av,ax,au){var at=ay>>>0;aw=aw&&at&&{"2":"0b","8":"0","16":"0x"}[aq]||"";ay=aw+an(at.toString(aq),av||0,"0",false);return aj(ay,aw,ar,ap,ax,au)}function ah(au,av,ar,ap,at,aq){if(ap!=null){au=au.slice(0,ap)}return aj(au,"",av,ar,at,aq)}var ai=arguments,al=0,am=ai[al++];return am.replace(L.jqplot.sprintf.regex,function(aM,ax,ay,aB,aO,aJ,av){if(aM=="%%"){return"%"}var aD=false,az="",aA=false,aL=false,aw=false,au=false;for(var aI=0;ay&&aI-1?6:(av=="d")?0:void (0)}else{if(aJ=="*"){aJ=+ai[al++]}else{if(aJ.charAt(0)=="*"){aJ=+ai[aJ.slice(1,-1)]}else{aJ=+aJ}}}var aF=ax?ai[ax.slice(0,-1)]:ai[al++];switch(av){case"s":if(aF==null){return""}return ah(String(aF),aD,aB,aJ,aA,aw);case"c":return ah(String.fromCharCode(+aF),aD,aB,aJ,aA,aw);case"b":return ao(aF,2,aL,aD,aB,aJ,aA,aw);case"o":return ao(aF,8,aL,aD,aB,aJ,aA,aw);case"x":return ao(aF,16,aL,aD,aB,aJ,aA,aw);case"X":return ao(aF,16,aL,aD,aB,aJ,aA,aw).toUpperCase();case"u":return ao(aF,10,aL,aD,aB,aJ,aA,aw);case"i":var ar=parseInt(+aF,10);if(isNaN(ar)){return""}var aH=ar<0?"-":az;var aK=au?ak(String(Math.abs(ar))):String(Math.abs(ar));aF=aH+an(aK,aJ,"0",false);return aj(aF,aH,aD,aB,aA,aw);case"d":var ar=Math.round(+aF);if(isNaN(ar)){return""}var aH=ar<0?"-":az;var aK=au?ak(String(Math.abs(ar))):String(Math.abs(ar));aF=aH+an(aK,aJ,"0",false);return aj(aF,aH,aD,aB,aA,aw);case"e":case"E":case"f":case"F":case"g":case"G":var ar=+aF;if(isNaN(ar)){return""}var aH=ar<0?"-":az;var at=["toExponential","toFixed","toPrecision"]["efg".indexOf(av.toLowerCase())];var aN=["toString","toUpperCase"]["eEfFgG".indexOf(av)%2];var aK=Math.abs(ar)[at](aJ);var aE=aK.toString().split(".");aE[0]=au?ak(aE[0]):aE[0];aK=aE.join(L.jqplot.sprintf.decimalMark);aF=aH+aK;var aC=aj(aF,aH,aD,aB,aA,aw)[aN]();return aC;case"p":case"P":var ar=+aF;if(isNaN(ar)){return""}var aH=ar<0?"-":az;var aE=String(Number(Math.abs(ar)).toExponential()).split(/e|E/);var aq=(aE[0].indexOf(".")!=-1)?aE[0].length-1:String(ar).length;var aG=(aE[1]<0)?-aE[1]-1:0;if(Math.abs(ar)<1){if(aq+aG<=aJ){aF=aH+Math.abs(ar).toPrecision(aq)}else{if(aq<=aJ-1){aF=aH+Math.abs(ar).toExponential(aq-1)}else{aF=aH+Math.abs(ar).toExponential(aJ-1)}}}else{var ap=(aq<=aJ)?aq:aJ;aF=aH+Math.abs(ar).toPrecision(ap)}var aN=["toString","toUpperCase"]["pP".indexOf(av)%2];return aj(aF,aH,aD,aB,aA,aw)[aN]();case"n":return"";default:return aM}})};L.jqplot.sprintf.thousandsSeparator=",";L.jqplot.sprintf.decimalMark=".";L.jqplot.sprintf.regex=/%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g;L.jqplot.getSignificantFigures=function(al){var an=String(Number(Math.abs(al)).toExponential()).split(/e|E/);var am=(an[0].indexOf(".")!=-1)?an[0].length-1:an[0].length;var ai=(an[1]<0)?-an[1]-1:0;var ah=parseInt(an[1],10);var aj=(ah+1>0)?ah+1:0;var ak=(am<=aj)?0:am-ah-1;return{significantDigits:am,digitsLeft:aj,digitsRight:ak,zeros:ai,exponent:ah}};L.jqplot.getPrecision=function(ah){return L.jqplot.getSignificantFigures(ah).digitsRight};var X=L.uiBackCompat!==false;L.jqplot.effects={effect:{}};var m="jqplot.storage.";L.extend(L.jqplot.effects,{version:"1.9pre",save:function(ai,aj){for(var ah=0;ah").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),ah={width:ai.width(),height:ai.height()},ak=document.activeElement;ai.wrap(al);if(ai[0]===ak||L.contains(ai[0],ak)){L(ak).focus()}al=ai.parent();if(ai.css("position")==="static"){al.css({position:"relative"});ai.css({position:"relative"})}else{L.extend(aj,{position:ai.css("position"),zIndex:ai.css("z-index")});L.each(["top","left","bottom","right"],function(am,an){aj[an]=ai.css(an);if(isNaN(parseInt(aj[an],10))){aj[an]="auto"}});ai.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}ai.css(ah);return al.css(aj).show()},removeWrapper:function(ah){var ai=document.activeElement;if(ah.parent().is(".ui-effects-wrapper")){ah.parent().replaceWith(ah);if(ah[0]===ai||L.contains(ah[0],ai)){L(ai).focus()}}return ah}});function j(ai,ah,aj,ak){if(L.isPlainObject(ai)){return ai}ai={effect:ai};if(ah===u){ah={}}if(L.isFunction(ah)){ak=ah;aj=null;ah={}}if(L.type(ah)==="number"||L.fx.speeds[ah]){ak=aj;aj=ah;ah={}}if(L.isFunction(aj)){ak=aj;aj=null}if(ah){L.extend(ai,ah)}aj=aj||ah.duration;ai.duration=L.fx.off?0:typeof aj==="number"?aj:aj in L.fx.speeds?L.fx.speeds[aj]:L.fx.speeds._default;ai.complete=ak||ah.complete;return ai}function ae(ah){if(!ah||typeof ah==="number"||L.fx.speeds[ah]){return true}if(typeof ah==="string"&&!L.jqplot.effects.effect[ah]){if(X&&L.jqplot.effects[ah]){return false}return true}return false}L.fn.extend({jqplotEffect:function(ap,aq,ai,ao){var an=j.apply(this,arguments),ak=an.mode,al=an.queue,am=L.jqplot.effects.effect[an.effect],ah=!am&&X&&L.jqplot.effects[an.effect];if(L.fx.off||!(am||ah)){if(ak){return this[ak](an.duration,an.complete)}else{return this.each(function(){if(an.complete){an.complete.call(this)}})}}function aj(au){var av=L(this),at=an.complete,aw=an.mode;function ar(){if(L.isFunction(at)){at.call(av[0])}if(L.isFunction(au)){au()}}if(av.is(":hidden")?aw==="hide":aw==="show"){ar()}else{am.call(av[0],an,ar)}}if(am){return al===false?this.each(aj):this.queue(al||"fx",aj)}else{return ah.call(this,{options:an,duration:an.duration,callback:an.complete,mode:an.mode})}}});var a=/up|down|vertical/,v=/up|left|vertical|horizontal/;L.jqplot.effects.effect.blind=function(aj,ao){var ak=L(this),ar=["position","top","bottom","left","right","height","width"],ap=L.jqplot.effects.setMode(ak,aj.mode||"hide"),au=aj.direction||"up",am=a.test(au),al=am?"height":"width",aq=am?"top":"left",aw=v.test(au),an={},av=ap==="show",ai,ah,at;if(ak.parent().is(".ui-effects-wrapper")){L.jqplot.effects.save(ak.parent(),ar)}else{L.jqplot.effects.save(ak,ar)}ak.show();at=parseInt(ak.css("top"),10);ai=L.jqplot.effects.createWrapper(ak).css({overflow:"hidden"});ah=am?ai[al]()+at:ai[al]();an[al]=av?String(ah):"0";if(!aw){ak.css(am?"bottom":"right",0).css(am?"top":"left","").css({position:"absolute"});an[aq]=av?"0":String(ah)}if(av){ai.css(al,0);if(!aw){ai.css(aq,ah)}}ai.animate(an,{duration:aj.duration,easing:aj.easing,queue:false,complete:function(){if(ap==="hide"){ak.hide()}L.jqplot.effects.restore(ak,ar);L.jqplot.effects.removeWrapper(ak);ao()}})}})(jQuery); +/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com + jsDate | (c) 2010-2013 Chris Leonello +*/(function(f){f.jqplot.Trendline=function(){this.show=f.jqplot.config.enablePlugins;this.color="#666666";this.renderer=new f.jqplot.LineRenderer();this.rendererOptions={marker:{show:false}};this.label="";this.type="linear";this.shadow=true;this.markerRenderer={show:false};this.lineWidth=1.5;this.shadowAngle=45;this.shadowOffset=1;this.shadowAlpha=0.07;this.shadowDepth=3;this.isTrendline=true};f.jqplot.postSeriesInitHooks.push(e);f.jqplot.postDrawSeriesHooks.push(g);f.jqplot.addLegendRowHooks.push(a);function a(k){var j=null;if(k.trendline&&k.trendline.show){var i=k.trendline.label.toString();if(i){j={label:i,color:k.trendline.color}}}return j}function e(m,k,j,i,l){if(this._type&&(this._type==="line"||this._type=="bar")){this.trendline=new f.jqplot.Trendline();i=i||{};f.extend(true,this.trendline,{color:this.color},j.trendline,i.trendline);this.trendline.renderer.init.call(this.trendline,null)}}function g(m,i){i=f.extend(true,{},this.trendline,i);if(this.trendline&&i.show){var k;var l=i.data||this.data;k=c(l,this.trendline.type);var j=i.gridData||this.renderer.makeGridData.call(this,k.data);this.trendline.renderer.draw.call(this.trendline,m,j,{showLine:true,shadow:this.trendline.shadow})}}function b(w,v,n){var u=(n==null)?"linear":n;var s=w.length;var t;var z;var o=0;var m=0;var r=0;var q=0;var l=0;var j=[];var k=[];if(u=="linear"){k=w;j=v}else{if(u=="exp"||u=="exponential"){for(var p=0;p570)?o[p]*0.8:o[p]+0.3*(255-o[p]);o[p]=parseInt(o[p],10)}this.highlightColors.push("rgb("+o[0]+","+o[1]+","+o[2]+")")}}this.highlightColorGenerator=new e.jqplot.ColorGenerator(this.highlightColors);u.postParseOptionsHooks.addOnce(m);u.postInitHooks.addOnce(g);u.eventListenerHooks.addOnce("jqplotMouseMove",b);u.eventListenerHooks.addOnce("jqplotMouseDown",a);u.eventListenerHooks.addOnce("jqplotMouseUp",l);u.eventListenerHooks.addOnce("jqplotClick",f);u.eventListenerHooks.addOnce("jqplotRightClick",n);u.postDrawHooks.addOnce(i)};e.jqplot.PieRenderer.prototype.setGridData=function(t){var p=[];var u=[];var o=this.startAngle/180*Math.PI;var s=0;this._drawData=false;for(var r=0;r0){p[r]+=p[r-1]}s+=this.data[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0){p[r]+=p[r-1]}s+=t[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0&&s>0.01&&s<6.282){w=parseFloat(p)/2/h(q)}return w}e.jqplot.PieRenderer.prototype.drawSlice=function(B,z,y,u,w){if(this._drawData){var p=this._radius;var A=this.fill;var x=this.lineWidth;var s=this.sliceMargin;if(this.fill==false){s+=this.lineWidth}B.save();B.translate(this._center[0],this._center[1]);var D=j(z,y,this.sliceMargin,this.fill,this.lineWidth);var o=D*Math.cos((z+y)/2);var C=D*Math.sin((z+y)/2);if((y-z)<=Math.PI){p-=D}else{p+=D}B.translate(o,C);if(w){for(var v=0,t=this.shadowDepth;v6.282+this.startAngle){y=6.282+this.startAngle;if(z>y){z=6.281+this.startAngle}}if(z>=y){return}B.beginPath();B.fillStyle=u;B.strokeStyle=u;B.lineWidth=x;B.arc(0,0,r,z,y,false);B.lineTo(0,0);B.closePath();if(A){B.fill()}else{B.stroke()}}};e.jqplot.PieRenderer.prototype.draw=function(B,z,E,o){var W;var H=(E!=undefined)?E:{};var t=0;var s=0;var N=1;var L=new e.jqplot.ColorGenerator(this.seriesColors);if(E.legendInfo&&E.legendInfo.placement=="insideGrid"){var J=E.legendInfo;switch(J.location){case"nw":t=J.width+J.xoffset;break;case"w":t=J.width+J.xoffset;break;case"sw":t=J.width+J.xoffset;break;case"ne":t=J.width+J.xoffset;N=-1;break;case"e":t=J.width+J.xoffset;N=-1;break;case"se":t=J.width+J.xoffset;N=-1;break;case"n":s=J.height+J.yoffset;break;case"s":s=J.height+J.yoffset;N=-1;break;default:break}}var K=(H.shadow!=undefined)?H.shadow:this.shadow;var A=(H.fill!=undefined)?H.fill:this.fill;var C=B.canvas.width;var I=B.canvas.height;var Q=C-t-2*this.padding;var X=I-s-2*this.padding;var M=Math.min(Q,X);var Y=M;this._sliceAngles=[];var v=this.sliceMargin;if(this.fill==false){v+=this.lineWidth}var q;var G=0;var R,aa,Z,ab;var D=this.startAngle/180*Math.PI;for(var W=0,V=z.length;WMath.PI){G=Math.max(q,G)}}if(this.diameter!=null&&this.diameter>0){this._diameter=this.diameter-2*G}else{this._diameter=Y-2*G}if(this._diameter<6){e.jqplot.log("Diameter of pie too small, not rendering.");return}var S=this._radius=this._diameter/2;this._center=[(C-N*t)/2+N*t+G*Math.cos(D),(I-N*s)/2+N*s+G*Math.sin(D)];if(this.shadow){for(var W=0,V=z.length;W=this.dataLabelThreshold){var F,U=(this._sliceAngles[W][0]+this._sliceAngles[W][1])/2,T;if(this.dataLabels=="label"){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,z[W][0])}else{if(this.dataLabels=="value"){F=this.dataLabelFormatString||"%d";T=e.jqplot.sprintf(F,this.data[W][1])}else{if(this.dataLabels=="percent"){F=this.dataLabelFormatString||"%d%%";T=e.jqplot.sprintf(F,z[W][2]*100)}else{if(this.dataLabels.constructor==Array){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,this.dataLabels[W])}}}}var p=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var P=this._center[0]+Math.cos(U)*p+this.canvas._offsets.left;var O=this._center[1]+Math.sin(U)*p+this.canvas._offsets.top;var u=e('
            '+T+"
            ").insertBefore(o.eventCanvas._elem);if(this.dataLabelCenterOn){P-=u.width()/2;O-=u.height()/2}else{P-=u.width()*Math.sin(U/2);O-=u.height()/2}P=Math.round(P);O=Math.round(O);u.css({left:P,top:O})}}};e.jqplot.PieAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.PieAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.PieAxisRenderer.prototype.constructor=e.jqplot.PieAxisRenderer;e.jqplot.PieAxisRenderer.prototype.init=function(o){this.tickRenderer=e.jqplot.PieTickRenderer;e.extend(true,this,o);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.PieLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.PieLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.PieLegendRenderer.prototype.constructor=e.jqplot.PieLegendRenderer;e.jqplot.PieLegendRenderer.prototype.init=function(o){this.numberRows=null;this.numberColumns=null;e.extend(true,this,o)};e.jqplot.PieLegendRenderer.prototype.draw=function(){var r=this;if(this.show){var B=this._series;this._elem=e(document.createElement("table"));this._elem.addClass("jqplot-table-legend");var E={position:"absolute"};if(this.background){E.background=this.background}if(this.border){E.border=this.border}if(this.fontSize){E.fontSize=this.fontSize}if(this.fontFamily){E.fontFamily=this.fontFamily}if(this.textColor){E.textColor=this.textColor}if(this.marginTop!=null){E.marginTop=this.marginTop}if(this.marginBottom!=null){E.marginBottom=this.marginBottom}if(this.marginLeft!=null){E.marginLeft=this.marginLeft}if(this.marginRight!=null){E.marginRight=this.marginRight}this._elem.css(E);var I=false,A=false,o,y;var C=B[0];var p=new e.jqplot.ColorGenerator(C.seriesColors);if(C.show){var J=C.data;if(this.numberRows){o=this.numberRows;if(!this.numberColumns){y=Math.ceil(J.length/o)}else{y=this.numberColumns}}else{if(this.numberColumns){y=this.numberColumns;o=Math.ceil(J.length/this.numberColumns)}else{o=J.length;y=1}}var H,G;var q,w,v;var x,z,F;var D=0;var u,t;for(H=0;H0){I=true}else{I=false}}else{if(H==o-1){I=false}else{I=true}}z=(I)?this.rowSpacing:"0";w=e(document.createElement("td"));w.addClass("jqplot-table-legend jqplot-table-legend-swatch");w.css({textAlign:"center",paddingTop:z});u=e(document.createElement("div"));u.addClass("jqplot-table-legend-swatch-outline");t=e(document.createElement("div"));t.addClass("jqplot-table-legend-swatch");t.css({backgroundColor:F,borderColor:F});w.append(u.append(t));v=e(document.createElement("td"));v.addClass("jqplot-table-legend jqplot-table-legend-label");v.css("paddingTop",z);if(this.escapeHtml){v.text(x)}else{v.html(x)}if(A){v.prependTo(q);w.prependTo(q)}else{w.appendTo(q);v.appendTo(q)}I=true}D++}}}}return this._elem};e.jqplot.PieRenderer.prototype.handleMove=function(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];r.target.trigger("jqplotDataMouseOver",o);if(r.series[o[0]].highlightMouseOver&&!(o[0]==r.plugins.pieRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){r.target.trigger("jqplotDataHighlight",o);d(r,o[0],o[1])}}else{if(s==null){k(r)}}};function c(s,r,p){p=p||{};p.axesDefaults=p.axesDefaults||{};p.legend=p.legend||{};p.seriesDefaults=p.seriesDefaults||{};var o=false;if(p.seriesDefaults.renderer==e.jqplot.PieRenderer){o=true}else{if(p.series){for(var q=0;qSparkline: 1,4,6,6,8,5,3,5

            +* $('.sparkline').sparkline(); +* There must be no spaces in the enclosed data set +* +* Otherwise values must be an array of numbers or null values +*

            Sparkline: This text replaced if the browser is compatible

            +* $('#sparkline1').sparkline([1,4,6,6,8,5,3,5]) +* $('#sparkline2').sparkline([1,4,6,null,null,5,3,5]) +* +* Values can also be specified in an HTML comment, or as a values attribute: +*

            Sparkline:

            +*

            Sparkline:

            +* $('.sparkline').sparkline(); +* +* For line charts, x values can also be specified: +*

            Sparkline: 1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5

            +* $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ]) +* +* By default, options should be passed in as teh second argument to the sparkline function: +* $('.sparkline').sparkline([1,2,3,4], {type: 'bar'}) +* +* Options can also be set by passing them on the tag itself. This feature is disabled by default though +* as there's a slight performance overhead: +* $('.sparkline').sparkline([1,2,3,4], {enableTagOptions: true}) +*

            Sparkline: loading

            +* Prefix all options supplied as tag attribute with "spark" (configurable by setting tagOptionPrefix) +* +* Supported options: +* lineColor - Color of the line used for the chart +* fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart +* width - Width of the chart - Defaults to 3 times the number of values in pixels +* height - Height of the chart - Defaults to the height of the containing element +* chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied +* chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied +* chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax +* chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied +* chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied +* composite - If true then don't erase any existing chart attached to the tag, but draw +* another chart over the top - Note that width and height are ignored if an +* existing chart is detected. +* tagValuesAttribute - Name of tag attribute to check for data values - Defaults to 'values' +* enableTagOptions - Whether to check tags for sparkline options +* tagOptionPrefix - Prefix used for options supplied as tag attributes - Defaults to 'spark' +* disableHiddenCheck - If set to true, then the plugin will assume that charts will never be drawn into a +* hidden dom element, avoding a browser reflow +* disableInteraction - If set to true then all mouseover/click interaction behaviour will be disabled, +* making the plugin perform much like it did in 1.x +* disableTooltips - If set to true then tooltips will be disabled - Defaults to false (tooltips enabled) +* disableHighlight - If set to true then highlighting of selected chart elements on mouseover will be disabled +* defaults to false (highlights enabled) +* highlightLighten - Factor to lighten/darken highlighted chart values by - Defaults to 1.4 for a 40% increase +* tooltipContainer - Specify which DOM element the tooltip should be rendered into - defaults to document.body +* tooltipClassname - Optional CSS classname to apply to tooltips - If not specified then a default style will be applied +* tooltipOffsetX - How many pixels away from the mouse pointer to render the tooltip on the X axis +* tooltipOffsetY - How many pixels away from the mouse pointer to render the tooltip on the r axis +* tooltipFormatter - Optional callback that allows you to override the HTML displayed in the tooltip +* callback is given arguments of (sparkline, options, fields) +* tooltipChartTitle - If specified then the tooltip uses the string specified by this setting as a title +* tooltipFormat - A format string or SPFormat object (or an array thereof for multiple entries) +* to control the format of the tooltip +* tooltipPrefix - A string to prepend to each field displayed in a tooltip +* tooltipSuffix - A string to append to each field displayed in a tooltip +* tooltipSkipNull - If true then null values will not have a tooltip displayed (defaults to true) +* tooltipValueLookups - An object or range map to map field values to tooltip strings +* (eg. to map -1 to "Lost", 0 to "Draw", and 1 to "Win") +* numberFormatter - Optional callback for formatting numbers in tooltips +* numberDigitGroupSep - Character to use for group separator in numbers "1,234" - Defaults to "," +* numberDecimalMark - Character to use for the decimal point when formatting numbers - Defaults to "." +* numberDigitGroupCount - Number of digits between group separator - Defaults to 3 +* +* There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default), +* 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box' +* line - Line chart. Options: +* spotColor - Set to '' to not end each line in a circular spot +* minSpotColor - If set, color of spot at minimum value +* maxSpotColor - If set, color of spot at maximum value +* spotRadius - Radius in pixels +* lineWidth - Width of line in pixels +* normalRangeMin +* normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal" +* or expected range of values +* normalRangeColor - Color to use for the above bar +* drawNormalOnTop - Draw the normal range above the chart fill color if true +* defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart +* highlightSpotColor - The color to use for drawing a highlight spot on mouseover - Set to null to disable +* highlightLineColor - The color to use for drawing a highlight line on mouseover - Set to null to disable +* valueSpots - Specify which points to draw spots on, and in which color. Accepts a range map +* +* bar - Bar chart. Options: +* barColor - Color of bars for postive values +* negBarColor - Color of bars for negative values +* zeroColor - Color of bars with zero values +* nullColor - Color of bars with null values - Defaults to omitting the bar entirely +* barWidth - Width of bars in pixels +* colorMap - Optional mappnig of values to colors to override the *BarColor values above +* can be an Array of values to control the color of individual bars or a range map +* to specify colors for individual ranges of values +* barSpacing - Gap between bars in pixels +* zeroAxis - Centers the y-axis around zero if true +* +* tristate - Charts values of win (>0), lose (<0) or draw (=0) +* posBarColor - Color of win values +* negBarColor - Color of lose values +* zeroBarColor - Color of draw values +* barWidth - Width of bars in pixels +* barSpacing - Gap between bars in pixels +* colorMap - Optional mappnig of values to colors to override the *BarColor values above +* can be an Array of values to control the color of individual bars or a range map +* to specify colors for individual ranges of values +* +* discrete - Options: +* lineHeight - Height of each line in pixels - Defaults to 30% of the graph height +* thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor +* thresholdColor +* +* bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ... +* options: +* targetColor - The color of the vertical target marker +* targetWidth - The width of the target marker in pixels +* performanceColor - The color of the performance measure horizontal bar +* rangeColors - Colors to use for each qualitative range background color +* +* pie - Pie chart. Options: +* sliceColors - An array of colors to use for pie slices +* offset - Angle in degrees to offset the first slice - Try -90 or +90 +* borderWidth - Width of border to draw around the pie chart, in pixels - Defaults to 0 (no border) +* borderColor - Color to use for the pie chart border - Defaults to #000 +* +* box - Box plot. Options: +* raw - Set to true to supply pre-computed plot points as values +* values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier +* When set to false you can supply any number of values and the box plot will +* be computed for you. Default is false. +* showOutliers - Set to true (default) to display outliers as circles +* outlierIQR - Interquartile range used to determine outliers. Default 1.5 +* boxLineColor - Outline color of the box +* boxFillColor - Fill color for the box +* whiskerColor - Line color used for whiskers +* outlierLineColor - Outline color of outlier circles +* outlierFillColor - Fill color of the outlier circles +* spotRadius - Radius of outlier circles +* medianColor - Line color of the median line +* target - Draw a target cross hair at the supplied value (default undefined) +* +* +* +* Examples: +* $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false }); +* $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 }); +* $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }): +* $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' }); +* $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' }); +* $('#pie').sparkline([1,1,2], { type:'pie' }); +*/ + +/*jslint regexp: true, browser: true, jquery: true, white: true, nomen: false, plusplus: false, maxerr: 500, indent: 4 */ + +(function(document, Math, undefined) { // performance/minified-size optimization +(function(factory) { + if(typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (jQuery && !jQuery.fn.sparkline) { + factory(jQuery); + } +}; +(function($) { + 'use strict'; + + var UNSET_OPTION = {}, + getDefaults, createClass, SPFormat, clipval, quartile, normalizeValue, normalizeValues, + remove, isNumber, all, sum, addCSS, ensureArray, formatNumber, RangeMap, + MouseHandler, Tooltip, barHighlightMixin, + line, bar, tristate, discrete, bullet, pie, box, defaultStyles, initStyles, + VShape, VCanvas_base, VCanvas_canvas, VCanvas_vml, pending, shapeCount = 0; + + /** + * Default configuration settings + */ + getDefaults = function () { + return { + // Settings common to most/all chart types + common: { + type: 'line', + lineColor: '#00f', + fillColor: '#cdf', + defaultPixelsPerValue: 3, + width: 'auto', + height: 'auto', + composite: false, + tagValuesAttribute: 'values', + tagOptionsPrefix: 'spark', + enableTagOptions: false, + enableHighlight: true, + highlightLighten: 1.4, + tooltipSkipNull: true, + tooltipPrefix: '', + tooltipSuffix: '', + disableHiddenCheck: false, + numberFormatter: false, + numberDigitGroupCount: 3, + numberDigitGroupSep: ',', + numberDecimalMark: '.', + disableTooltips: false, + disableInteraction: false + }, + // Defaults for line charts + line: { + spotColor: '#f80', + highlightSpotColor: '#5f5', + highlightLineColor: '#f22', + spotRadius: 1.5, + minSpotColor: '#f80', + maxSpotColor: '#f80', + lineWidth: 1, + normalRangeMin: undefined, + normalRangeMax: undefined, + normalRangeColor: '#ccc', + drawNormalOnTop: false, + chartRangeMin: undefined, + chartRangeMax: undefined, + chartRangeMinX: undefined, + chartRangeMaxX: undefined, + tooltipFormat: new SPFormat(' {{prefix}}{{y}}{{suffix}}') + }, + // Defaults for bar charts + bar: { + barColor: '#3366cc', + negBarColor: '#f44', + stackedBarColor: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', + '#dd4477', '#0099c6', '#990099'], + zeroColor: undefined, + nullColor: undefined, + zeroAxis: true, + barWidth: 4, + barSpacing: 1, + chartRangeMax: undefined, + chartRangeMin: undefined, + chartRangeClip: false, + colorMap: undefined, + tooltipFormat: new SPFormat(' {{prefix}}{{value}}{{suffix}}') + }, + // Defaults for tristate charts + tristate: { + barWidth: 4, + barSpacing: 1, + posBarColor: '#6f6', + negBarColor: '#f44', + zeroBarColor: '#999', + colorMap: {}, + tooltipFormat: new SPFormat(' {{value:map}}'), + tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } } + }, + // Defaults for discrete charts + discrete: { + lineHeight: 'auto', + thresholdColor: undefined, + thresholdValue: 0, + chartRangeMax: undefined, + chartRangeMin: undefined, + chartRangeClip: false, + tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}') + }, + // Defaults for bullet charts + bullet: { + targetColor: '#f33', + targetWidth: 3, // width of the target bar in pixels + performanceColor: '#33f', + rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff'], + base: undefined, // set this to a number to change the base start number + tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'), + tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} } + }, + // Defaults for pie charts + pie: { + offset: 0, + sliceColors: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', + '#dd4477', '#0099c6', '#990099'], + borderWidth: 0, + borderColor: '#000', + tooltipFormat: new SPFormat(' {{value}} ({{percent.1}}%)') + }, + // Defaults for box plots + box: { + raw: false, + boxLineColor: '#000', + boxFillColor: '#cdf', + whiskerColor: '#000', + outlierLineColor: '#333', + outlierFillColor: '#fff', + medianColor: '#f00', + showOutliers: true, + outlierIQR: 1.5, + spotRadius: 1.5, + target: undefined, + targetColor: '#4a2', + chartRangeMax: undefined, + chartRangeMin: undefined, + tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'), + tooltipFormatFieldlistKey: 'field', + tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median', + uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier', + lw: 'Left Whisker', rw: 'Right Whisker'} } + } + }; + }; + + // You can have tooltips use a css class other than jqstooltip by specifying tooltipClassname + defaultStyles = '.jqstooltip { ' + + 'position: absolute;' + + 'left: 0px;' + + 'top: 0px;' + + 'visibility: hidden;' + + 'background: rgb(0, 0, 0) transparent;' + + 'background-color: rgba(0,0,0,0.6);' + + 'filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);' + + '-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";' + + 'color: white;' + + 'font: 10px arial, san serif;' + + 'text-align: left;' + + 'white-space: nowrap;' + + 'padding: 5px;' + + 'border: 1px solid white;' + + 'z-index: 10000;' + + '}' + + '.jqsfield { ' + + 'color: white;' + + 'font: 10px arial, san serif;' + + 'text-align: left;' + + '}'; + + /** + * Utilities + */ + + createClass = function (/* [baseclass, [mixin, ...]], definition */) { + var Class, args; + Class = function () { + this.init.apply(this, arguments); + }; + if (arguments.length > 1) { + if (arguments[0]) { + Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]); + Class._super = arguments[0].prototype; + } else { + Class.prototype = arguments[arguments.length - 1]; + } + if (arguments.length > 2) { + args = Array.prototype.slice.call(arguments, 1, -1); + args.unshift(Class.prototype); + $.extend.apply($, args); + } + } else { + Class.prototype = arguments[0]; + } + Class.prototype.cls = Class; + return Class; + }; + + /** + * Wraps a format string for tooltips + * {{x}} + * {{x.2} + * {{x:months}} + */ + $.SPFormatClass = SPFormat = createClass({ + fre: /\{\{([\w.]+?)(:(.+?))?\}\}/g, + precre: /(\w+)\.(\d+)/, + + init: function (format, fclass) { + this.format = format; + this.fclass = fclass; + }, + + render: function (fieldset, lookups, options) { + var self = this, + fields = fieldset, + match, token, lookupkey, fieldvalue, prec; + return this.format.replace(this.fre, function () { + var lookup; + token = arguments[1]; + lookupkey = arguments[3]; + match = self.precre.exec(token); + if (match) { + prec = match[2]; + token = match[1]; + } else { + prec = false; + } + fieldvalue = fields[token]; + if (fieldvalue === undefined) { + return ''; + } + if (lookupkey && lookups && lookups[lookupkey]) { + lookup = lookups[lookupkey]; + if (lookup.get) { // RangeMap + return lookups[lookupkey].get(fieldvalue) || fieldvalue; + } else { + return lookups[lookupkey][fieldvalue] || fieldvalue; + } + } + if (isNumber(fieldvalue)) { + if (options.get('numberFormatter')) { + fieldvalue = options.get('numberFormatter')(fieldvalue); + } else { + fieldvalue = formatNumber(fieldvalue, prec, + options.get('numberDigitGroupCount'), + options.get('numberDigitGroupSep'), + options.get('numberDecimalMark')); + } + } + return fieldvalue; + }); + } + }); + + // convience method to avoid needing the new operator + $.spformat = function(format, fclass) { + return new SPFormat(format, fclass); + }; + + clipval = function (val, min, max) { + if (val < min) { + return min; + } + if (val > max) { + return max; + } + return val; + }; + + quartile = function (values, q) { + var vl; + if (q === 2) { + vl = Math.floor(values.length / 2); + return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2; + } else { + if (values.length % 2 ) { // odd + vl = (values.length * q + q) / 4; + return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; + } else { //even + vl = (values.length * q + 2) / 4; + return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; + + } + } + }; + + normalizeValue = function (val) { + var nf; + switch (val) { + case 'undefined': + val = undefined; + break; + case 'null': + val = null; + break; + case 'true': + val = true; + break; + case 'false': + val = false; + break; + default: + nf = parseFloat(val); + if (val == nf) { + val = nf; + } + } + return val; + }; + + normalizeValues = function (vals) { + var i, result = []; + for (i = vals.length; i--;) { + result[i] = normalizeValue(vals[i]); + } + return result; + }; + + remove = function (vals, filter) { + var i, vl, result = []; + for (i = 0, vl = vals.length; i < vl; i++) { + if (vals[i] !== filter) { + result.push(vals[i]); + } + } + return result; + }; + + isNumber = function (num) { + return !isNaN(parseFloat(num)) && isFinite(num); + }; + + formatNumber = function (num, prec, groupsize, groupsep, decsep) { + var p, i; + num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split(''); + p = (p = $.inArray('.', num)) < 0 ? num.length : p; + if (p < num.length) { + num[p] = decsep; + } + for (i = p - groupsize; i > 0; i -= groupsize) { + num.splice(i, 0, groupsep); + } + return num.join(''); + }; + + // determine if all values of an array match a value + // returns true if the array is empty + all = function (val, arr, ignoreNull) { + var i; + for (i = arr.length; i--; ) { + if (ignoreNull && arr[i] === null) continue; + if (arr[i] !== val) { + return false; + } + } + return true; + }; + + // sums the numeric values in an array, ignoring other values + sum = function (vals) { + var total = 0, i; + for (i = vals.length; i--;) { + total += typeof vals[i] === 'number' ? vals[i] : 0; + } + return total; + }; + + ensureArray = function (val) { + return $.isArray(val) ? val : [val]; + }; + + // http://paulirish.com/2008/bookmarklet-inject-new-css-rules/ + addCSS = function(css) { + var tag; + //if ('\v' == 'v') /* ie only */ { + if (document.createStyleSheet) { + document.createStyleSheet().cssText = css; + } else { + tag = document.createElement('style'); + tag.type = 'text/css'; + document.getElementsByTagName('head')[0].appendChild(tag); + tag[(typeof document.body.style.WebkitAppearance == 'string') /* webkit only */ ? 'innerText' : 'innerHTML'] = css; + } + }; + + // Provide a cross-browser interface to a few simple drawing primitives + $.fn.simpledraw = function (width, height, useExisting, interact) { + var target, mhandler; + if (useExisting && (target = this.data('_jqs_vcanvas'))) { + return target; + } + + if ($.fn.sparkline.canvas === false) { + // We've already determined that neither Canvas nor VML are available + return false; + + } else if ($.fn.sparkline.canvas === undefined) { + // No function defined yet -- need to see if we support Canvas or VML + var el = document.createElement('canvas'); + if (!!(el.getContext && el.getContext('2d'))) { + // Canvas is available + $.fn.sparkline.canvas = function(width, height, target, interact) { + return new VCanvas_canvas(width, height, target, interact); + }; + } else if (document.namespaces && !document.namespaces.v) { + // VML is available + document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); + $.fn.sparkline.canvas = function(width, height, target, interact) { + return new VCanvas_vml(width, height, target); + }; + } else { + // Neither Canvas nor VML are available + $.fn.sparkline.canvas = false; + return false; + } + } + + if (width === undefined) { + width = $(this).innerWidth(); + } + if (height === undefined) { + height = $(this).innerHeight(); + } + + target = $.fn.sparkline.canvas(width, height, this, interact); + + mhandler = $(this).data('_jqs_mhandler'); + if (mhandler) { + mhandler.registerCanvas(target); + } + return target; + }; + + $.fn.cleardraw = function () { + var target = this.data('_jqs_vcanvas'); + if (target) { + target.reset(); + } + }; + + $.RangeMapClass = RangeMap = createClass({ + init: function (map) { + var key, range, rangelist = []; + for (key in map) { + if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) { + range = key.split(':'); + range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]); + range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]); + range[2] = map[key]; + rangelist.push(range); + } + } + this.map = map; + this.rangelist = rangelist || false; + }, + + get: function (value) { + var rangelist = this.rangelist, + i, range, result; + if ((result = this.map[value]) !== undefined) { + return result; + } + if (rangelist) { + for (i = rangelist.length; i--;) { + range = rangelist[i]; + if (range[0] <= value && range[1] >= value) { + return range[2]; + } + } + } + return undefined; + } + }); + + // Convenience function + $.range_map = function(map) { + return new RangeMap(map); + }; + + MouseHandler = createClass({ + init: function (el, options) { + var $el = $(el); + this.$el = $el; + this.options = options; + this.currentPageX = 0; + this.currentPageY = 0; + this.el = el; + this.splist = []; + this.tooltip = null; + this.over = false; + this.displayTooltips = !options.get('disableTooltips'); + this.highlightEnabled = !options.get('disableHighlight'); + }, + + registerSparkline: function (sp) { + this.splist.push(sp); + if (this.over) { + this.updateDisplay(); + } + }, + + registerCanvas: function (canvas) { + var $canvas = $(canvas.canvas); + this.canvas = canvas; + this.$canvas = $canvas; + $canvas.mouseenter($.proxy(this.mouseenter, this)); + $canvas.mouseleave($.proxy(this.mouseleave, this)); + $canvas.click($.proxy(this.mouseclick, this)); + }, + + reset: function (removeTooltip) { + this.splist = []; + if (this.tooltip && removeTooltip) { + this.tooltip.remove(); + this.tooltip = undefined; + } + }, + + mouseclick: function (e) { + var clickEvent = $.Event('sparklineClick'); + clickEvent.originalEvent = e; + clickEvent.sparklines = this.splist; + this.$el.trigger(clickEvent); + }, + + mouseenter: function (e) { + $(document.body).unbind('mousemove.jqs'); + $(document.body).bind('mousemove.jqs', $.proxy(this.mousemove, this)); + this.over = true; + this.currentPageX = e.pageX; + this.currentPageY = e.pageY; + this.currentEl = e.target; + if (!this.tooltip && this.displayTooltips) { + this.tooltip = new Tooltip(this.options); + this.tooltip.updatePosition(e.pageX, e.pageY); + } + this.updateDisplay(); + }, + + mouseleave: function () { + $(document.body).unbind('mousemove.jqs'); + var splist = this.splist, + spcount = splist.length, + needsRefresh = false, + sp, i; + this.over = false; + this.currentEl = null; + + if (this.tooltip) { + this.tooltip.remove(); + this.tooltip = null; + } + + for (i = 0; i < spcount; i++) { + sp = splist[i]; + if (sp.clearRegionHighlight()) { + needsRefresh = true; + } + } + + if (needsRefresh) { + this.canvas.render(); + } + }, + + mousemove: function (e) { + this.currentPageX = e.pageX; + this.currentPageY = e.pageY; + this.currentEl = e.target; + if (this.tooltip) { + this.tooltip.updatePosition(e.pageX, e.pageY); + } + this.updateDisplay(); + }, + + updateDisplay: function () { + var splist = this.splist, + spcount = splist.length, + needsRefresh = false, + offset = this.$canvas.offset(), + localX = this.currentPageX - offset.left, + localY = this.currentPageY - offset.top, + tooltiphtml, sp, i, result, changeEvent; + if (!this.over) { + return; + } + for (i = 0; i < spcount; i++) { + sp = splist[i]; + result = sp.setRegionHighlight(this.currentEl, localX, localY); + if (result) { + needsRefresh = true; + } + } + if (needsRefresh) { + changeEvent = $.Event('sparklineRegionChange'); + changeEvent.sparklines = this.splist; + this.$el.trigger(changeEvent); + if (this.tooltip) { + tooltiphtml = ''; + for (i = 0; i < spcount; i++) { + sp = splist[i]; + tooltiphtml += sp.getCurrentRegionTooltip(); + } + this.tooltip.setContent(tooltiphtml); + } + if (!this.disableHighlight) { + this.canvas.render(); + } + } + if (result === null) { + this.mouseleave(); + } + } + }); + + + Tooltip = createClass({ + sizeStyle: 'position: static !important;' + + 'display: block !important;' + + 'visibility: hidden !important;' + + 'float: left !important;', + + init: function (options) { + var tooltipClassname = options.get('tooltipClassname', 'jqstooltip'), + sizetipStyle = this.sizeStyle, + offset; + this.container = options.get('tooltipContainer') || document.body; + this.tooltipOffsetX = options.get('tooltipOffsetX', 10); + this.tooltipOffsetY = options.get('tooltipOffsetY', 12); + // remove any previous lingering tooltip + $('#jqssizetip').remove(); + $('#jqstooltip').remove(); + this.sizetip = $('
            ', { + id: 'jqssizetip', + style: sizetipStyle, + 'class': tooltipClassname + }); + this.tooltip = $('
            ', { + id: 'jqstooltip', + 'class': tooltipClassname + }).appendTo(this.container); + // account for the container's location + offset = this.tooltip.offset(); + this.offsetLeft = offset.left; + this.offsetTop = offset.top; + this.hidden = true; + $(window).unbind('resize.jqs scroll.jqs'); + $(window).bind('resize.jqs scroll.jqs', $.proxy(this.updateWindowDims, this)); + this.updateWindowDims(); + }, + + updateWindowDims: function () { + this.scrollTop = $(window).scrollTop(); + this.scrollLeft = $(window).scrollLeft(); + this.scrollRight = this.scrollLeft + $(window).width(); + this.updatePosition(); + }, + + getSize: function (content) { + this.sizetip.html(content).appendTo(this.container); + this.width = this.sizetip.width() + 1; + this.height = this.sizetip.height(); + this.sizetip.remove(); + }, + + setContent: function (content) { + if (!content) { + this.tooltip.css('visibility', 'hidden'); + this.hidden = true; + return; + } + this.getSize(content); + this.tooltip.html(content) + .css({ + 'width': this.width, + 'height': this.height, + 'visibility': 'visible' + }); + if (this.hidden) { + this.hidden = false; + this.updatePosition(); + } + }, + + updatePosition: function (x, y) { + if (x === undefined) { + if (this.mousex === undefined) { + return; + } + x = this.mousex - this.offsetLeft; + y = this.mousey - this.offsetTop; + + } else { + this.mousex = x = x - this.offsetLeft; + this.mousey = y = y - this.offsetTop; + } + if (!this.height || !this.width || this.hidden) { + return; + } + + y -= this.height + this.tooltipOffsetY; + x += this.tooltipOffsetX; + + if (y < this.scrollTop) { + y = this.scrollTop; + } + if (x < this.scrollLeft) { + x = this.scrollLeft; + } else if (x + this.width > this.scrollRight) { + x = this.scrollRight - this.width; + } + + this.tooltip.css({ + 'left': x, + 'top': y + }); + }, + + remove: function () { + this.tooltip.remove(); + this.sizetip.remove(); + this.sizetip = this.tooltip = undefined; + $(window).unbind('resize.jqs scroll.jqs'); + } + }); + + initStyles = function() { + addCSS(defaultStyles); + }; + + $(initStyles); + + pending = []; + $.fn.sparkline = function (userValues, userOptions) { + return this.each(function () { + var options = new $.fn.sparkline.options(this, userOptions), + $this = $(this), + render, i; + render = function () { + var values, width, height, tmp, mhandler, sp, vals; + if (userValues === 'html' || userValues === undefined) { + vals = this.getAttribute(options.get('tagValuesAttribute')); + if (vals === undefined || vals === null) { + vals = $this.html(); + } + values = vals.replace(/(^\s*\s*$)|\s+/g, '').split(','); + } else { + values = userValues; + } + + width = options.get('width') === 'auto' ? values.length * options.get('defaultPixelsPerValue') : options.get('width'); + if (options.get('height') === 'auto') { + if (!options.get('composite') || !$.data(this, '_jqs_vcanvas')) { + // must be a better way to get the line height + tmp = document.createElement('span'); + tmp.innerHTML = 'a'; + $this.html(tmp); + height = $(tmp).innerHeight() || $(tmp).height(); + $(tmp).remove(); + tmp = null; + } + } else { + height = options.get('height'); + } + + if (!options.get('disableInteraction')) { + mhandler = $.data(this, '_jqs_mhandler'); + if (!mhandler) { + mhandler = new MouseHandler(this, options); + $.data(this, '_jqs_mhandler', mhandler); + } else if (!options.get('composite')) { + mhandler.reset(); + } + } else { + mhandler = false; + } + + if (options.get('composite') && !$.data(this, '_jqs_vcanvas')) { + if (!$.data(this, '_jqs_errnotify')) { + alert('Attempted to attach a composite sparkline to an element with no existing sparkline'); + $.data(this, '_jqs_errnotify', true); + } + return; + } + + sp = new $.fn.sparkline[options.get('type')](this, values, options, width, height); + + sp.render(); + + if (mhandler) { + mhandler.registerSparkline(sp); + } + }; + if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || !$(this).parents('body').length) { + if (!options.get('composite') && $.data(this, '_jqs_pending')) { + // remove any existing references to the element + for (i = pending.length; i; i--) { + if (pending[i - 1][0] == this) { + pending.splice(i - 1, 1); + } + } + } + pending.push([this, render]); + $.data(this, '_jqs_pending', true); + } else { + render.call(this); + } + }); + }; + + $.fn.sparkline.defaults = getDefaults(); + + + $.sparkline_display_visible = function () { + var el, i, pl; + var done = []; + for (i = 0, pl = pending.length; i < pl; i++) { + el = pending[i][0]; + if ($(el).is(':visible') && !$(el).parents().is(':hidden')) { + pending[i][1].call(el); + $.data(pending[i][0], '_jqs_pending', false); + done.push(i); + } else if (!$(el).closest('html').length && !$.data(el, '_jqs_pending')) { + // element has been inserted and removed from the DOM + // If it was not yet inserted into the dom then the .data request + // will return true. + // removing from the dom causes the data to be removed. + $.data(pending[i][0], '_jqs_pending', false); + done.push(i); + } + } + for (i = done.length; i; i--) { + pending.splice(done[i - 1], 1); + } + }; + + + /** + * User option handler + */ + $.fn.sparkline.options = createClass({ + init: function (tag, userOptions) { + var extendedOptions, defaults, base, tagOptionType; + this.userOptions = userOptions = userOptions || {}; + this.tag = tag; + this.tagValCache = {}; + defaults = $.fn.sparkline.defaults; + base = defaults.common; + this.tagOptionsPrefix = userOptions.enableTagOptions && (userOptions.tagOptionsPrefix || base.tagOptionsPrefix); + + tagOptionType = this.getTagSetting('type'); + if (tagOptionType === UNSET_OPTION) { + extendedOptions = defaults[userOptions.type || base.type]; + } else { + extendedOptions = defaults[tagOptionType]; + } + this.mergedOptions = $.extend({}, base, extendedOptions, userOptions); + }, + + + getTagSetting: function (key) { + var prefix = this.tagOptionsPrefix, + val, i, pairs, keyval; + if (prefix === false || prefix === undefined) { + return UNSET_OPTION; + } + if (this.tagValCache.hasOwnProperty(key)) { + val = this.tagValCache.key; + } else { + val = this.tag.getAttribute(prefix + key); + if (val === undefined || val === null) { + val = UNSET_OPTION; + } else if (val.substr(0, 1) === '[') { + val = val.substr(1, val.length - 2).split(','); + for (i = val.length; i--;) { + val[i] = normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g, '')); + } + } else if (val.substr(0, 1) === '{') { + pairs = val.substr(1, val.length - 2).split(','); + val = {}; + for (i = pairs.length; i--;) { + keyval = pairs[i].split(':', 2); + val[keyval[0].replace(/(^\s*)|(\s*$)/g, '')] = normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g, '')); + } + } else { + val = normalizeValue(val); + } + this.tagValCache.key = val; + } + return val; + }, + + get: function (key, defaultval) { + var tagOption = this.getTagSetting(key), + result; + if (tagOption !== UNSET_OPTION) { + return tagOption; + } + return (result = this.mergedOptions[key]) === undefined ? defaultval : result; + } + }); + + + $.fn.sparkline._base = createClass({ + disabled: false, + + init: function (el, values, options, width, height) { + this.el = el; + this.$el = $(el); + this.values = values; + this.options = options; + this.width = width; + this.height = height; + this.currentRegion = undefined; + }, + + /** + * Setup the canvas + */ + initTarget: function () { + var interactive = !this.options.get('disableInteraction'); + if (!(this.target = this.$el.simpledraw(this.width, this.height, this.options.get('composite'), interactive))) { + this.disabled = true; + } else { + this.canvasWidth = this.target.pixelWidth; + this.canvasHeight = this.target.pixelHeight; + } + }, + + /** + * Actually render the chart to the canvas + */ + render: function () { + if (this.disabled) { + this.el.innerHTML = ''; + return false; + } + return true; + }, + + /** + * Return a region id for a given x/y co-ordinate + */ + getRegion: function (x, y) { + }, + + /** + * Highlight an item based on the moused-over x,y co-ordinate + */ + setRegionHighlight: function (el, x, y) { + var currentRegion = this.currentRegion, + highlightEnabled = !this.options.get('disableHighlight'), + newRegion; + if (x > this.canvasWidth || y > this.canvasHeight || x < 0 || y < 0) { + return null; + } + newRegion = this.getRegion(el, x, y); + if (currentRegion !== newRegion) { + if (currentRegion !== undefined && highlightEnabled) { + this.removeHighlight(); + } + this.currentRegion = newRegion; + if (newRegion !== undefined && highlightEnabled) { + this.renderHighlight(); + } + return true; + } + return false; + }, + + /** + * Reset any currently highlighted item + */ + clearRegionHighlight: function () { + if (this.currentRegion !== undefined) { + this.removeHighlight(); + this.currentRegion = undefined; + return true; + } + return false; + }, + + renderHighlight: function () { + this.changeHighlight(true); + }, + + removeHighlight: function () { + this.changeHighlight(false); + }, + + changeHighlight: function (highlight) {}, + + /** + * Fetch the HTML to display as a tooltip + */ + getCurrentRegionTooltip: function () { + var options = this.options, + header = '', + entries = [], + fields, formats, formatlen, fclass, text, i, + showFields, showFieldsKey, newFields, fv, + formatter, format, fieldlen, j; + if (this.currentRegion === undefined) { + return ''; + } + fields = this.getCurrentRegionFields(); + formatter = options.get('tooltipFormatter'); + if (formatter) { + return formatter(this, options, fields); + } + if (options.get('tooltipChartTitle')) { + header += '
            ' + options.get('tooltipChartTitle') + '
            \n'; + } + formats = this.options.get('tooltipFormat'); + if (!formats) { + return ''; + } + if (!$.isArray(formats)) { + formats = [formats]; + } + if (!$.isArray(fields)) { + fields = [fields]; + } + showFields = this.options.get('tooltipFormatFieldlist'); + showFieldsKey = this.options.get('tooltipFormatFieldlistKey'); + if (showFields && showFieldsKey) { + // user-selected ordering of fields + newFields = []; + for (i = fields.length; i--;) { + fv = fields[i][showFieldsKey]; + if ((j = $.inArray(fv, showFields)) != -1) { + newFields[j] = fields[i]; + } + } + fields = newFields; + } + formatlen = formats.length; + fieldlen = fields.length; + for (i = 0; i < formatlen; i++) { + format = formats[i]; + if (typeof format === 'string') { + format = new SPFormat(format); + } + fclass = format.fclass || 'jqsfield'; + for (j = 0; j < fieldlen; j++) { + if (!fields[j].isNull || !options.get('tooltipSkipNull')) { + $.extend(fields[j], { + prefix: options.get('tooltipPrefix'), + suffix: options.get('tooltipSuffix') + }); + text = format.render(fields[j], options.get('tooltipValueLookups'), options); + entries.push('
            ' + text + '
            '); + } + } + } + if (entries.length) { + return header + entries.join('\n'); + } + return ''; + }, + + getCurrentRegionFields: function () {}, + + calcHighlightColor: function (color, options) { + var highlightColor = options.get('highlightColor'), + lighten = options.get('highlightLighten'), + parse, mult, rgbnew, i; + if (highlightColor) { + return highlightColor; + } + if (lighten) { + // extract RGB values + parse = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color) || /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color); + if (parse) { + rgbnew = []; + mult = color.length === 4 ? 16 : 1; + for (i = 0; i < 3; i++) { + rgbnew[i] = clipval(Math.round(parseInt(parse[i + 1], 16) * mult * lighten), 0, 255); + } + return 'rgb(' + rgbnew.join(',') + ')'; + } + + } + return color; + } + + }); + + barHighlightMixin = { + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + target = this.target, + shapeids = this.regionShapes[currentRegion], + newShapes; + // will be null if the region value was null + if (shapeids) { + newShapes = this.renderRegion(currentRegion, highlight); + if ($.isArray(newShapes) || $.isArray(shapeids)) { + target.replaceWithShapes(shapeids, newShapes); + this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) { + return newShape.id; + }); + } else { + target.replaceWithShape(shapeids, newShapes); + this.regionShapes[currentRegion] = newShapes.id; + } + } + }, + + render: function () { + var values = this.values, + target = this.target, + regionShapes = this.regionShapes, + shapes, ids, i, j; + + if (!this.cls._super.render.call(this)) { + return; + } + for (i = values.length; i--;) { + shapes = this.renderRegion(i); + if (shapes) { + if ($.isArray(shapes)) { + ids = []; + for (j = shapes.length; j--;) { + shapes[j].append(); + ids.push(shapes[j].id); + } + regionShapes[i] = ids; + } else { + shapes.append(); + regionShapes[i] = shapes.id; // store just the shapeid + } + } else { + // null value + regionShapes[i] = null; + } + } + target.render(); + } + }; + + /** + * Line charts + */ + $.fn.sparkline.line = line = createClass($.fn.sparkline._base, { + type: 'line', + + init: function (el, values, options, width, height) { + line._super.init.call(this, el, values, options, width, height); + this.vertices = []; + this.regionMap = []; + this.xvalues = []; + this.yvalues = []; + this.yminmax = []; + this.hightlightSpotId = null; + this.lastShapeId = null; + this.initTarget(); + }, + + getRegion: function (el, x, y) { + var i, + regionMap = this.regionMap; // maps regions to value positions + for (i = regionMap.length; i--;) { + if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) { + return regionMap[i][2]; + } + } + return undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.yvalues[currentRegion] === null, + x: this.xvalues[currentRegion], + y: this.yvalues[currentRegion], + color: this.options.get('lineColor'), + fillColor: this.options.get('fillColor'), + offset: currentRegion + }; + }, + + renderHighlight: function () { + var currentRegion = this.currentRegion, + target = this.target, + vertex = this.vertices[currentRegion], + options = this.options, + spotRadius = options.get('spotRadius'), + highlightSpotColor = options.get('highlightSpotColor'), + highlightLineColor = options.get('highlightLineColor'), + highlightSpot, highlightLine; + + if (!vertex) { + return; + } + if (spotRadius && highlightSpotColor) { + highlightSpot = target.drawCircle(vertex[0], vertex[1], + spotRadius, undefined, highlightSpotColor); + this.highlightSpotId = highlightSpot.id; + target.insertAfterShape(this.lastShapeId, highlightSpot); + } + if (highlightLineColor) { + highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0], + this.canvasTop + this.canvasHeight, highlightLineColor); + this.highlightLineId = highlightLine.id; + target.insertAfterShape(this.lastShapeId, highlightLine); + } + }, + + removeHighlight: function () { + var target = this.target; + if (this.highlightSpotId) { + target.removeShapeId(this.highlightSpotId); + this.highlightSpotId = null; + } + if (this.highlightLineId) { + target.removeShapeId(this.highlightLineId); + this.highlightLineId = null; + } + }, + + scanValues: function () { + var values = this.values, + valcount = values.length, + xvalues = this.xvalues, + yvalues = this.yvalues, + yminmax = this.yminmax, + i, val, isStr, isArray, sp; + for (i = 0; i < valcount; i++) { + val = values[i]; + isStr = typeof(values[i]) === 'string'; + isArray = typeof(values[i]) === 'object' && values[i] instanceof Array; + sp = isStr && values[i].split(':'); + if (isStr && sp.length === 2) { // x:y + xvalues.push(Number(sp[0])); + yvalues.push(Number(sp[1])); + yminmax.push(Number(sp[1])); + } else if (isArray) { + xvalues.push(val[0]); + yvalues.push(val[1]); + yminmax.push(val[1]); + } else { + xvalues.push(i); + if (values[i] === null || values[i] === 'null') { + yvalues.push(null); + } else { + yvalues.push(Number(val)); + yminmax.push(Number(val)); + } + } + } + if (this.options.get('xvalues')) { + xvalues = this.options.get('xvalues'); + } + + this.maxy = this.maxyorg = Math.max.apply(Math, yminmax); + this.miny = this.minyorg = Math.min.apply(Math, yminmax); + + this.maxx = Math.max.apply(Math, xvalues); + this.minx = Math.min.apply(Math, xvalues); + + this.xvalues = xvalues; + this.yvalues = yvalues; + this.yminmax = yminmax; + + }, + + processRangeOptions: function () { + var options = this.options, + normalRangeMin = options.get('normalRangeMin'), + normalRangeMax = options.get('normalRangeMax'); + + if (normalRangeMin !== undefined) { + if (normalRangeMin < this.miny) { + this.miny = normalRangeMin; + } + if (normalRangeMax > this.maxy) { + this.maxy = normalRangeMax; + } + } + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) { + this.miny = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) { + this.maxy = options.get('chartRangeMax'); + } + if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) { + this.minx = options.get('chartRangeMinX'); + } + if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) { + this.maxx = options.get('chartRangeMaxX'); + } + + }, + + drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) { + var normalRangeMin = this.options.get('normalRangeMin'), + normalRangeMax = this.options.get('normalRangeMax'), + ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))), + height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey); + this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append(); + }, + + render: function () { + var options = this.options, + target = this.target, + canvasWidth = this.canvasWidth, + canvasHeight = this.canvasHeight, + vertices = this.vertices, + spotRadius = options.get('spotRadius'), + regionMap = this.regionMap, + rangex, rangey, yvallast, + canvasTop, canvasLeft, + vertex, path, paths, x, y, xnext, xpos, xposnext, + last, next, yvalcount, lineShapes, fillShapes, plen, + valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i; + + if (!line._super.render.call(this)) { + return; + } + + this.scanValues(); + this.processRangeOptions(); + + xvalues = this.xvalues; + yvalues = this.yvalues; + + if (!this.yminmax.length || this.yvalues.length < 2) { + // empty or all null valuess + return; + } + + canvasTop = canvasLeft = 0; + + rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx; + rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny; + yvallast = this.yvalues.length - 1; + + if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) { + spotRadius = 0; + } + if (spotRadius) { + // adjust the canvas size as required so that spots will fit + hlSpotsEnabled = options.get('highlightSpotColor') && !options.get('disableInteraction'); + if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) { + canvasHeight -= Math.ceil(spotRadius); + } + if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) { + canvasHeight -= Math.ceil(spotRadius); + canvasTop += Math.ceil(spotRadius); + } + if (hlSpotsEnabled || + ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) { + canvasLeft += Math.ceil(spotRadius); + canvasWidth -= Math.ceil(spotRadius); + } + if (hlSpotsEnabled || options.get('spotColor') || + (options.get('minSpotColor') || options.get('maxSpotColor') && + (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) { + canvasWidth -= Math.ceil(spotRadius); + } + } + + + canvasHeight--; + + if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) { + this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); + } + + path = []; + paths = [path]; + last = next = null; + yvalcount = yvalues.length; + for (i = 0; i < yvalcount; i++) { + x = xvalues[i]; + xnext = xvalues[i + 1]; + y = yvalues[i]; + xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)); + xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth; + next = xpos + ((xposnext - xpos) / 2); + regionMap[i] = [last || 0, next, i]; + last = next; + if (y === null) { + if (i) { + if (yvalues[i - 1] !== null) { + path = []; + paths.push(path); + } + vertices.push(null); + } + } else { + if (y < this.miny) { + y = this.miny; + } + if (y > this.maxy) { + y = this.maxy; + } + if (!path.length) { + // previous value was null + path.push([xpos, canvasTop + canvasHeight]); + } + vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))]; + path.push(vertex); + vertices.push(vertex); + } + } + + lineShapes = []; + fillShapes = []; + plen = paths.length; + for (i = 0; i < plen; i++) { + path = paths[i]; + if (path.length) { + if (options.get('fillColor')) { + path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]); + fillShapes.push(path.slice(0)); + path.pop(); + } + // if there's only a single point in this path, then we want to display it + // as a vertical line which means we keep path[0] as is + if (path.length > 2) { + // else we want the first value + path[0] = [path[0][0], path[1][1]]; + } + lineShapes.push(path); + } + } + + // draw the fill first, then optionally the normal range, then the line on top of that + plen = fillShapes.length; + for (i = 0; i < plen; i++) { + target.drawShape(fillShapes[i], + options.get('fillColor'), options.get('fillColor')).append(); + } + + if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) { + this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); + } + + plen = lineShapes.length; + for (i = 0; i < plen; i++) { + target.drawShape(lineShapes[i], options.get('lineColor'), undefined, + options.get('lineWidth')).append(); + } + + if (spotRadius && options.get('valueSpots')) { + valueSpots = options.get('valueSpots'); + if (valueSpots.get === undefined) { + valueSpots = new RangeMap(valueSpots); + } + for (i = 0; i < yvalcount; i++) { + color = valueSpots.get(yvalues[i]); + if (color) { + target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))), + spotRadius, undefined, + color).append(); + } + } + + } + if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) { + target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))), + spotRadius, undefined, + options.get('spotColor')).append(); + } + if (this.maxy !== this.minyorg) { + if (spotRadius && options.get('minSpotColor')) { + x = xvalues[$.inArray(this.minyorg, yvalues)]; + target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))), + spotRadius, undefined, + options.get('minSpotColor')).append(); + } + if (spotRadius && options.get('maxSpotColor')) { + x = xvalues[$.inArray(this.maxyorg, yvalues)]; + target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))), + spotRadius, undefined, + options.get('maxSpotColor')).append(); + } + } + + this.lastShapeId = target.getLastShapeId(); + this.canvasTop = canvasTop; + target.render(); + } + }); + + /** + * Bar charts + */ + $.fn.sparkline.bar = bar = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'bar', + + init: function (el, values, options, width, height) { + var barWidth = parseInt(options.get('barWidth'), 10), + barSpacing = parseInt(options.get('barSpacing'), 10), + chartRangeMin = options.get('chartRangeMin'), + chartRangeMax = options.get('chartRangeMax'), + chartRangeClip = options.get('chartRangeClip'), + stackMin = Infinity, + stackMax = -Infinity, + isStackString, groupMin, groupMax, stackRanges, + numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax, + stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf; + bar._super.init.call(this, el, values, options, width, height); + + // scan values to determine whether to stack bars + for (i = 0, vlen = values.length; i < vlen; i++) { + val = values[i]; + isStackString = typeof(val) === 'string' && val.indexOf(':') > -1; + if (isStackString || $.isArray(val)) { + stacked = true; + if (isStackString) { + val = values[i] = normalizeValues(val.split(':')); + } + val = remove(val, null); // min/max will treat null as zero + groupMin = Math.min.apply(Math, val); + groupMax = Math.max.apply(Math, val); + if (groupMin < stackMin) { + stackMin = groupMin; + } + if (groupMax > stackMax) { + stackMax = groupMax; + } + } + } + + this.stacked = stacked; + this.regionShapes = {}; + this.barWidth = barWidth; + this.barSpacing = barSpacing; + this.totalBarWidth = barWidth + barSpacing; + this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); + + this.initTarget(); + + if (chartRangeClip) { + clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin; + clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax; + } + + numValues = []; + stackRanges = stacked ? [] : numValues; + var stackTotals = []; + var stackRangesNeg = []; + for (i = 0, vlen = values.length; i < vlen; i++) { + if (stacked) { + vlist = values[i]; + values[i] = svals = []; + stackTotals[i] = 0; + stackRanges[i] = stackRangesNeg[i] = 0; + for (j = 0, slen = vlist.length; j < slen; j++) { + val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j]; + if (val !== null) { + if (val > 0) { + stackTotals[i] += val; + } + if (stackMin < 0 && stackMax > 0) { + if (val < 0) { + stackRangesNeg[i] += Math.abs(val); + } else { + stackRanges[i] += val; + } + } else { + stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin)); + } + numValues.push(val); + } + } + } else { + val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i]; + val = values[i] = normalizeValue(val); + if (val !== null) { + numValues.push(val); + } + } + } + this.max = max = Math.max.apply(Math, numValues); + this.min = min = Math.min.apply(Math, numValues); + this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max; + this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min; + + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) { + min = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) { + max = options.get('chartRangeMax'); + } + + this.zeroAxis = zeroAxis = options.get('zeroAxis', true); + if (min <= 0 && max >= 0 && zeroAxis) { + xaxisOffset = 0; + } else if (zeroAxis == false) { + xaxisOffset = min; + } else if (min > 0) { + xaxisOffset = min; + } else { + xaxisOffset = max; + } + this.xaxisOffset = xaxisOffset; + + range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - min; + + // as we plot zero/min values a single pixel line, we add a pixel to all other + // values - Reduce the effective canvas size to suit + this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1; + + if (min < xaxisOffset) { + yMaxCalc = (stacked && max >= 0) ? stackMax : max; + yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight; + if (yoffset !== Math.ceil(yoffset)) { + this.canvasHeightEf -= 2; + yoffset = Math.ceil(yoffset); + } + } else { + yoffset = this.canvasHeight; + } + this.yoffset = yoffset; + + if ($.isArray(options.get('colorMap'))) { + this.colorMapByIndex = options.get('colorMap'); + this.colorMapByValue = null; + } else { + this.colorMapByIndex = null; + this.colorMapByValue = options.get('colorMap'); + if (this.colorMapByValue && this.colorMapByValue.get === undefined) { + this.colorMapByValue = new RangeMap(this.colorMapByValue); + } + } + + this.range = range; + }, + + getRegion: function (el, x, y) { + var result = Math.floor(x / this.totalBarWidth); + return (result < 0 || result >= this.values.length) ? undefined : result; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion, + values = ensureArray(this.values[currentRegion]), + result = [], + value, i; + for (i = values.length; i--;) { + value = values[i]; + result.push({ + isNull: value === null, + value: value, + color: this.calcColor(i, value, currentRegion), + offset: currentRegion + }); + } + return result; + }, + + calcColor: function (stacknum, value, valuenum) { + var colorMapByIndex = this.colorMapByIndex, + colorMapByValue = this.colorMapByValue, + options = this.options, + color, newColor; + if (this.stacked) { + color = options.get('stackedBarColor'); + } else { + color = (value < 0) ? options.get('negBarColor') : options.get('barColor'); + } + if (value === 0 && options.get('zeroColor') !== undefined) { + color = options.get('zeroColor'); + } + if (colorMapByValue && (newColor = colorMapByValue.get(value))) { + color = newColor; + } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { + color = colorMapByIndex[valuenum]; + } + return $.isArray(color) ? color[stacknum % color.length] : color; + }, + + /** + * Render bar(s) for a region + */ + renderRegion: function (valuenum, highlight) { + var vals = this.values[valuenum], + options = this.options, + xaxisOffset = this.xaxisOffset, + result = [], + range = this.range, + stacked = this.stacked, + target = this.target, + x = valuenum * this.totalBarWidth, + canvasHeightEf = this.canvasHeightEf, + yoffset = this.yoffset, + y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin; + + vals = $.isArray(vals) ? vals : [vals]; + valcount = vals.length; + val = vals[0]; + isNull = all(null, vals); + allMin = all(xaxisOffset, vals, true); + + if (isNull) { + if (options.get('nullColor')) { + color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options); + y = (yoffset > 0) ? yoffset - 1 : yoffset; + return target.drawRect(x, y, this.barWidth - 1, 0, color, color); + } else { + return undefined; + } + } + yoffsetNeg = yoffset; + for (i = 0; i < valcount; i++) { + val = vals[i]; + + if (stacked && val === xaxisOffset) { + if (!allMin || minPlotted) { + continue; + } + minPlotted = true; + } + + if (range > 0) { + height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range))) + 1; + } else { + height = 1; + } + if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) { + y = yoffsetNeg; + yoffsetNeg += height; + } else { + y = yoffset - height; + yoffset -= height; + } + color = this.calcColor(i, val, valuenum); + if (highlight) { + color = this.calcHighlightColor(color, options); + } + result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color)); + } + if (result.length === 1) { + return result[0]; + } + return result; + } + }); + + /** + * Tristate charts + */ + $.fn.sparkline.tristate = tristate = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'tristate', + + init: function (el, values, options, width, height) { + var barWidth = parseInt(options.get('barWidth'), 10), + barSpacing = parseInt(options.get('barSpacing'), 10); + tristate._super.init.call(this, el, values, options, width, height); + + this.regionShapes = {}; + this.barWidth = barWidth; + this.barSpacing = barSpacing; + this.totalBarWidth = barWidth + barSpacing; + this.values = $.map(values, Number); + this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); + + if ($.isArray(options.get('colorMap'))) { + this.colorMapByIndex = options.get('colorMap'); + this.colorMapByValue = null; + } else { + this.colorMapByIndex = null; + this.colorMapByValue = options.get('colorMap'); + if (this.colorMapByValue && this.colorMapByValue.get === undefined) { + this.colorMapByValue = new RangeMap(this.colorMapByValue); + } + } + this.initTarget(); + }, + + getRegion: function (el, x, y) { + return Math.floor(x / this.totalBarWidth); + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + color: this.calcColor(this.values[currentRegion], currentRegion), + offset: currentRegion + }; + }, + + calcColor: function (value, valuenum) { + var values = this.values, + options = this.options, + colorMapByIndex = this.colorMapByIndex, + colorMapByValue = this.colorMapByValue, + color, newColor; + + if (colorMapByValue && (newColor = colorMapByValue.get(value))) { + color = newColor; + } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { + color = colorMapByIndex[valuenum]; + } else if (values[valuenum] < 0) { + color = options.get('negBarColor'); + } else if (values[valuenum] > 0) { + color = options.get('posBarColor'); + } else { + color = options.get('zeroBarColor'); + } + return color; + }, + + renderRegion: function (valuenum, highlight) { + var values = this.values, + options = this.options, + target = this.target, + canvasHeight, height, halfHeight, + x, y, color; + + canvasHeight = target.pixelHeight; + halfHeight = Math.round(canvasHeight / 2); + + x = valuenum * this.totalBarWidth; + if (values[valuenum] < 0) { + y = halfHeight; + height = halfHeight - 1; + } else if (values[valuenum] > 0) { + y = 0; + height = halfHeight - 1; + } else { + y = halfHeight - 1; + height = 2; + } + color = this.calcColor(values[valuenum], valuenum); + if (color === null) { + return; + } + if (highlight) { + color = this.calcHighlightColor(color, options); + } + return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color); + } + }); + + /** + * Discrete charts + */ + $.fn.sparkline.discrete = discrete = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'discrete', + + init: function (el, values, options, width, height) { + discrete._super.init.call(this, el, values, options, width, height); + + this.regionShapes = {}; + this.values = values = $.map(values, Number); + this.min = Math.min.apply(Math, values); + this.max = Math.max.apply(Math, values); + this.range = this.max - this.min; + this.width = width = options.get('width') === 'auto' ? values.length * 2 : this.width; + this.interval = Math.floor(width / values.length); + this.itemWidth = width / values.length; + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) { + this.min = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) { + this.max = options.get('chartRangeMax'); + } + this.initTarget(); + if (this.target) { + this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight'); + } + }, + + getRegion: function (el, x, y) { + return Math.floor(x / this.itemWidth); + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + offset: currentRegion + }; + }, + + renderRegion: function (valuenum, highlight) { + var values = this.values, + options = this.options, + min = this.min, + max = this.max, + range = this.range, + interval = this.interval, + target = this.target, + canvasHeight = this.canvasHeight, + lineHeight = this.lineHeight, + pheight = canvasHeight - lineHeight, + ytop, val, color, x; + + val = clipval(values[valuenum], min, max); + x = valuenum * interval; + ytop = Math.round(pheight - pheight * ((val - min) / range)); + color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor'); + if (highlight) { + color = this.calcHighlightColor(color, options); + } + return target.drawLine(x, ytop, x, ytop + lineHeight, color); + } + }); + + /** + * Bullet charts + */ + $.fn.sparkline.bullet = bullet = createClass($.fn.sparkline._base, { + type: 'bullet', + + init: function (el, values, options, width, height) { + var min, max, vals; + bullet._super.init.call(this, el, values, options, width, height); + + // values: target, performance, range1, range2, range3 + this.values = values = normalizeValues(values); + // target or performance could be null + vals = values.slice(); + vals[0] = vals[0] === null ? vals[2] : vals[0]; + vals[1] = values[1] === null ? vals[2] : vals[1]; + min = Math.min.apply(Math, values); + max = Math.max.apply(Math, values); + if (options.get('base') === undefined) { + min = min < 0 ? min : 0; + } else { + min = options.get('base'); + } + this.min = min; + this.max = max; + this.range = max - min; + this.shapes = {}; + this.valueShapes = {}; + this.regiondata = {}; + this.width = width = options.get('width') === 'auto' ? '4.0em' : width; + this.target = this.$el.simpledraw(width, height, options.get('composite')); + if (!values.length) { + this.disabled = true; + } + this.initTarget(); + }, + + getRegion: function (el, x, y) { + var shapeid = this.target.getShapeAt(el, x, y); + return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + fieldkey: currentRegion.substr(0, 1), + value: this.values[currentRegion.substr(1)], + region: currentRegion + }; + }, + + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + shapeid = this.valueShapes[currentRegion], + shape; + delete this.shapes[shapeid]; + switch (currentRegion.substr(0, 1)) { + case 'r': + shape = this.renderRange(currentRegion.substr(1), highlight); + break; + case 'p': + shape = this.renderPerformance(highlight); + break; + case 't': + shape = this.renderTarget(highlight); + break; + } + this.valueShapes[currentRegion] = shape.id; + this.shapes[shape.id] = currentRegion; + this.target.replaceWithShape(shapeid, shape); + }, + + renderRange: function (rn, highlight) { + var rangeval = this.values[rn], + rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)), + color = this.options.get('rangeColors')[rn - 2]; + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color); + }, + + renderPerformance: function (highlight) { + var perfval = this.values[1], + perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)), + color = this.options.get('performanceColor'); + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1, + Math.round(this.canvasHeight * 0.4) - 1, color, color); + }, + + renderTarget: function (highlight) { + var targetval = this.values[0], + x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)), + targettop = Math.round(this.canvasHeight * 0.10), + targetheight = this.canvasHeight - (targettop * 2), + color = this.options.get('targetColor'); + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color); + }, + + render: function () { + var vlen = this.values.length, + target = this.target, + i, shape; + if (!bullet._super.render.call(this)) { + return; + } + for (i = 2; i < vlen; i++) { + shape = this.renderRange(i).append(); + this.shapes[shape.id] = 'r' + i; + this.valueShapes['r' + i] = shape.id; + } + if (this.values[1] !== null) { + shape = this.renderPerformance().append(); + this.shapes[shape.id] = 'p1'; + this.valueShapes.p1 = shape.id; + } + if (this.values[0] !== null) { + shape = this.renderTarget().append(); + this.shapes[shape.id] = 't0'; + this.valueShapes.t0 = shape.id; + } + target.render(); + } + }); + + /** + * Pie charts + */ + $.fn.sparkline.pie = pie = createClass($.fn.sparkline._base, { + type: 'pie', + + init: function (el, values, options, width, height) { + var total = 0, i; + + pie._super.init.call(this, el, values, options, width, height); + + this.shapes = {}; // map shape ids to value offsets + this.valueShapes = {}; // maps value offsets to shape ids + this.values = values = $.map(values, Number); + + if (options.get('width') === 'auto') { + this.width = this.height; + } + + if (values.length > 0) { + for (i = values.length; i--;) { + total += values[i]; + } + } + this.total = total; + this.initTarget(); + this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2); + }, + + getRegion: function (el, x, y) { + var shapeid = this.target.getShapeAt(el, x, y); + return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + percent: this.values[currentRegion] / this.total * 100, + color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length], + offset: currentRegion + }; + }, + + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + newslice = this.renderSlice(currentRegion, highlight), + shapeid = this.valueShapes[currentRegion]; + delete this.shapes[shapeid]; + this.target.replaceWithShape(shapeid, newslice); + this.valueShapes[currentRegion] = newslice.id; + this.shapes[newslice.id] = currentRegion; + }, + + renderSlice: function (valuenum, highlight) { + var target = this.target, + options = this.options, + radius = this.radius, + borderWidth = options.get('borderWidth'), + offset = options.get('offset'), + circle = 2 * Math.PI, + values = this.values, + total = this.total, + next = offset ? (2*Math.PI)*(offset/360) : 0, + start, end, i, vlen, color; + + vlen = values.length; + for (i = 0; i < vlen; i++) { + start = next; + end = next; + if (total > 0) { // avoid divide by zero + end = next + (circle * (values[i] / total)); + } + if (valuenum === i) { + color = options.get('sliceColors')[i % options.get('sliceColors').length]; + if (highlight) { + color = this.calcHighlightColor(color, options); + } + + return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color); + } + next = end; + } + }, + + render: function () { + var target = this.target, + values = this.values, + options = this.options, + radius = this.radius, + borderWidth = options.get('borderWidth'), + shape, i; + + if (!pie._super.render.call(this)) { + return; + } + if (borderWidth) { + target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)), + options.get('borderColor'), undefined, borderWidth).append(); + } + for (i = values.length; i--;) { + if (values[i]) { // don't render zero values + shape = this.renderSlice(i).append(); + this.valueShapes[i] = shape.id; // store just the shapeid + this.shapes[shape.id] = i; + } + } + target.render(); + } + }); + + /** + * Box plots + */ + $.fn.sparkline.box = box = createClass($.fn.sparkline._base, { + type: 'box', + + init: function (el, values, options, width, height) { + box._super.init.call(this, el, values, options, width, height); + this.values = $.map(values, Number); + this.width = options.get('width') === 'auto' ? '4.0em' : width; + this.initTarget(); + if (!this.values.length) { + this.disabled = 1; + } + }, + + /** + * Simulate a single region + */ + getRegion: function () { + return 1; + }, + + getCurrentRegionFields: function () { + var result = [ + { field: 'lq', value: this.quartiles[0] }, + { field: 'med', value: this.quartiles[1] }, + { field: 'uq', value: this.quartiles[2] } + ]; + if (this.loutlier !== undefined) { + result.push({ field: 'lo', value: this.loutlier}); + } + if (this.routlier !== undefined) { + result.push({ field: 'ro', value: this.routlier}); + } + if (this.lwhisker !== undefined) { + result.push({ field: 'lw', value: this.lwhisker}); + } + if (this.rwhisker !== undefined) { + result.push({ field: 'rw', value: this.rwhisker}); + } + return result; + }, + + render: function () { + var target = this.target, + values = this.values, + vlen = values.length, + options = this.options, + canvasWidth = this.canvasWidth, + canvasHeight = this.canvasHeight, + minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'), + maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'), + canvasLeft = 0, + lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i, + size, unitSize; + + if (!box._super.render.call(this)) { + return; + } + + if (options.get('raw')) { + if (options.get('showOutliers') && values.length > 5) { + loutlier = values[0]; + lwhisker = values[1]; + q1 = values[2]; + q2 = values[3]; + q3 = values[4]; + rwhisker = values[5]; + routlier = values[6]; + } else { + lwhisker = values[0]; + q1 = values[1]; + q2 = values[2]; + q3 = values[3]; + rwhisker = values[4]; + } + } else { + values.sort(function (a, b) { return a - b; }); + q1 = quartile(values, 1); + q2 = quartile(values, 2); + q3 = quartile(values, 3); + iqr = q3 - q1; + if (options.get('showOutliers')) { + lwhisker = rwhisker = undefined; + for (i = 0; i < vlen; i++) { + if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) { + lwhisker = values[i]; + } + if (values[i] < q3 + (iqr * options.get('outlierIQR'))) { + rwhisker = values[i]; + } + } + loutlier = values[0]; + routlier = values[vlen - 1]; + } else { + lwhisker = values[0]; + rwhisker = values[vlen - 1]; + } + } + this.quartiles = [q1, q2, q3]; + this.lwhisker = lwhisker; + this.rwhisker = rwhisker; + this.loutlier = loutlier; + this.routlier = routlier; + + unitSize = canvasWidth / (maxValue - minValue + 1); + if (options.get('showOutliers')) { + canvasLeft = Math.ceil(options.get('spotRadius')); + canvasWidth -= 2 * Math.ceil(options.get('spotRadius')); + unitSize = canvasWidth / (maxValue - minValue + 1); + if (loutlier < lwhisker) { + target.drawCircle((loutlier - minValue) * unitSize + canvasLeft, + canvasHeight / 2, + options.get('spotRadius'), + options.get('outlierLineColor'), + options.get('outlierFillColor')).append(); + } + if (routlier > rwhisker) { + target.drawCircle((routlier - minValue) * unitSize + canvasLeft, + canvasHeight / 2, + options.get('spotRadius'), + options.get('outlierLineColor'), + options.get('outlierFillColor')).append(); + } + } + + // box + target.drawRect( + Math.round((q1 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.1), + Math.round((q3 - q1) * unitSize), + Math.round(canvasHeight * 0.8), + options.get('boxLineColor'), + options.get('boxFillColor')).append(); + // left whisker + target.drawLine( + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + Math.round((q1 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + options.get('lineColor')).append(); + target.drawLine( + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 4), + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight - canvasHeight / 4), + options.get('whiskerColor')).append(); + // right whisker + target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + Math.round((q3 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + options.get('lineColor')).append(); + target.drawLine( + Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 4), + Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight - canvasHeight / 4), + options.get('whiskerColor')).append(); + // median line + target.drawLine( + Math.round((q2 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.1), + Math.round((q2 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.9), + options.get('medianColor')).append(); + if (options.get('target')) { + size = Math.ceil(options.get('spotRadius')); + target.drawLine( + Math.round((options.get('target') - minValue) * unitSize + canvasLeft), + Math.round((canvasHeight / 2) - size), + Math.round((options.get('target') - minValue) * unitSize + canvasLeft), + Math.round((canvasHeight / 2) + size), + options.get('targetColor')).append(); + target.drawLine( + Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size), + Math.round(canvasHeight / 2), + Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size), + Math.round(canvasHeight / 2), + options.get('targetColor')).append(); + } + target.render(); + } + }); + + // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier + // This is accessible as $(foo).simpledraw() + + VShape = createClass({ + init: function (target, id, type, args) { + this.target = target; + this.id = id; + this.type = type; + this.args = args; + }, + append: function () { + this.target.appendShape(this); + return this; + } + }); + + VCanvas_base = createClass({ + _pxregex: /(\d+)(px)?\s*$/i, + + init: function (width, height, target) { + if (!width) { + return; + } + this.width = width; + this.height = height; + this.target = target; + this.lastShapeId = null; + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + }, + + drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) { + return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth); + }, + + drawShape: function (path, lineColor, fillColor, lineWidth) { + return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]); + }, + + drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) { + return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]); + }, + + drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) { + return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]); + }, + + drawRect: function (x, y, width, height, lineColor, fillColor) { + return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]); + }, + + getElement: function () { + return this.canvas; + }, + + /** + * Return the most recently inserted shape id + */ + getLastShapeId: function () { + return this.lastShapeId; + }, + + /** + * Clear and reset the canvas + */ + reset: function () { + alert('reset not implemented'); + }, + + _insert: function (el, target) { + $(target).html(el); + }, + + /** + * Calculate the pixel dimensions of the canvas + */ + _calculatePixelDims: function (width, height, canvas) { + // XXX This should probably be a configurable option + var match; + match = this._pxregex.exec(height); + if (match) { + this.pixelHeight = match[1]; + } else { + this.pixelHeight = $(canvas).height(); + } + match = this._pxregex.exec(width); + if (match) { + this.pixelWidth = match[1]; + } else { + this.pixelWidth = $(canvas).width(); + } + }, + + /** + * Generate a shape object and id for later rendering + */ + _genShape: function (shapetype, shapeargs) { + var id = shapeCount++; + shapeargs.unshift(id); + return new VShape(this, id, shapetype, shapeargs); + }, + + /** + * Add a shape to the end of the render queue + */ + appendShape: function (shape) { + alert('appendShape not implemented'); + }, + + /** + * Replace one shape with another + */ + replaceWithShape: function (shapeid, shape) { + alert('replaceWithShape not implemented'); + }, + + /** + * Insert one shape after another in the render queue + */ + insertAfterShape: function (shapeid, shape) { + alert('insertAfterShape not implemented'); + }, + + /** + * Remove a shape from the queue + */ + removeShapeId: function (shapeid) { + alert('removeShapeId not implemented'); + }, + + /** + * Find a shape at the specified x/y co-ordinates + */ + getShapeAt: function (el, x, y) { + alert('getShapeAt not implemented'); + }, + + /** + * Render all queued shapes onto the canvas + */ + render: function () { + alert('render not implemented'); + } + }); + + VCanvas_canvas = createClass(VCanvas_base, { + init: function (width, height, target, interact) { + VCanvas_canvas._super.init.call(this, width, height, target); + this.canvas = document.createElement('canvas'); + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + $(this.canvas).css({ display: 'inline-block', width: width, height: height, verticalAlign: 'top' }); + this._insert(this.canvas, target); + this._calculatePixelDims(width, height, this.canvas); + this.canvas.width = this.pixelWidth; + this.canvas.height = this.pixelHeight; + this.interact = interact; + this.shapes = {}; + this.shapeseq = []; + this.currentTargetShapeId = undefined; + $(this.canvas).css({width: this.pixelWidth, height: this.pixelHeight}); + }, + + _getContext: function (lineColor, fillColor, lineWidth) { + var context = this.canvas.getContext('2d'); + if (lineColor !== undefined) { + context.strokeStyle = lineColor; + } + context.lineWidth = lineWidth === undefined ? 1 : lineWidth; + if (fillColor !== undefined) { + context.fillStyle = fillColor; + } + return context; + }, + + reset: function () { + var context = this._getContext(); + context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); + this.shapes = {}; + this.shapeseq = []; + this.currentTargetShapeId = undefined; + }, + + _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { + var context = this._getContext(lineColor, fillColor, lineWidth), + i, plen; + context.beginPath(); + context.moveTo(path[0][0] + 0.5, path[0][1] + 0.5); + for (i = 1, plen = path.length; i < plen; i++) { + context.lineTo(path[i][0] + 0.5, path[i][1] + 0.5); // the 0.5 offset gives us crisp pixel-width lines + } + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor !== undefined) { + context.fill(); + } + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + }, + + _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { + var context = this._getContext(lineColor, fillColor, lineWidth); + context.beginPath(); + context.arc(x, y, radius, 0, 2 * Math.PI, false); + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor !== undefined) { + context.fill(); + } + }, + + _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { + var context = this._getContext(lineColor, fillColor); + context.beginPath(); + context.moveTo(x, y); + context.arc(x, y, radius, startAngle, endAngle, false); + context.lineTo(x, y); + context.closePath(); + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor) { + context.fill(); + } + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + }, + + _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { + return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor); + }, + + appendShape: function (shape) { + this.shapes[shape.id] = shape; + this.shapeseq.push(shape.id); + this.lastShapeId = shape.id; + return shape.id; + }, + + replaceWithShape: function (shapeid, shape) { + var shapeseq = this.shapeseq, + i; + this.shapes[shape.id] = shape; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] == shapeid) { + shapeseq[i] = shape.id; + } + } + delete this.shapes[shapeid]; + }, + + replaceWithShapes: function (shapeids, shapes) { + var shapeseq = this.shapeseq, + shapemap = {}, + sid, i, first; + + for (i = shapeids.length; i--;) { + shapemap[shapeids[i]] = true; + } + for (i = shapeseq.length; i--;) { + sid = shapeseq[i]; + if (shapemap[sid]) { + shapeseq.splice(i, 1); + delete this.shapes[sid]; + first = i; + } + } + for (i = shapes.length; i--;) { + shapeseq.splice(first, 0, shapes[i].id); + this.shapes[shapes[i].id] = shapes[i]; + } + + }, + + insertAfterShape: function (shapeid, shape) { + var shapeseq = this.shapeseq, + i; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] === shapeid) { + shapeseq.splice(i + 1, 0, shape.id); + this.shapes[shape.id] = shape; + return; + } + } + }, + + removeShapeId: function (shapeid) { + var shapeseq = this.shapeseq, + i; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] === shapeid) { + shapeseq.splice(i, 1); + break; + } + } + delete this.shapes[shapeid]; + }, + + getShapeAt: function (el, x, y) { + this.targetX = x; + this.targetY = y; + this.render(); + return this.currentTargetShapeId; + }, + + render: function () { + var shapeseq = this.shapeseq, + shapes = this.shapes, + shapeCount = shapeseq.length, + context = this._getContext(), + shapeid, shape, i; + context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); + for (i = 0; i < shapeCount; i++) { + shapeid = shapeseq[i]; + shape = shapes[shapeid]; + this['_draw' + shape.type].apply(this, shape.args); + } + if (!this.interact) { + // not interactive so no need to keep the shapes array + this.shapes = {}; + this.shapeseq = []; + } + } + + }); + + VCanvas_vml = createClass(VCanvas_base, { + init: function (width, height, target) { + var groupel; + VCanvas_vml._super.init.call(this, width, height, target); + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + this.canvas = document.createElement('span'); + $(this.canvas).css({ display: 'inline-block', position: 'relative', overflow: 'hidden', width: width, height: height, margin: '0px', padding: '0px', verticalAlign: 'top'}); + this._insert(this.canvas, target); + this._calculatePixelDims(width, height, this.canvas); + this.canvas.width = this.pixelWidth; + this.canvas.height = this.pixelHeight; + groupel = ''; + this.canvas.insertAdjacentHTML('beforeEnd', groupel); + this.group = $(this.canvas).children()[0]; + this.rendered = false; + this.prerender = ''; + }, + + _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { + var vpath = [], + initial, stroke, fill, closed, vel, plen, i; + for (i = 0, plen = path.length; i < plen; i++) { + vpath[i] = '' + (path[i][0]) + ',' + (path[i][1]); + } + initial = vpath.splice(0, 1); + lineWidth = lineWidth === undefined ? 1 : lineWidth; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + closed = vpath[0] === vpath[vpath.length - 1] ? 'x ' : ''; + vel = '' + + ' '; + return vel; + }, + + _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { + var stroke, fill, vel; + x -= radius; + y -= radius; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + vel = ''; + return vel; + + }, + + _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { + var vpath, startx, starty, endx, endy, stroke, fill, vel; + if (startAngle === endAngle) { + return ''; // VML seems to have problem when start angle equals end angle. + } + if ((endAngle - startAngle) === (2 * Math.PI)) { + startAngle = 0.0; // VML seems to have a problem when drawing a full circle that doesn't start 0 + endAngle = (2 * Math.PI); + } + + startx = x + Math.round(Math.cos(startAngle) * radius); + starty = y + Math.round(Math.sin(startAngle) * radius); + endx = x + Math.round(Math.cos(endAngle) * radius); + endy = y + Math.round(Math.sin(endAngle) * radius); + + if (startx === endx && starty === endy) { + if ((endAngle - startAngle) < Math.PI) { + // Prevent very small slices from being mistaken as a whole pie + return ''; + } + // essentially going to be the entire circle, so ignore startAngle + startx = endx = x + radius; + starty = endy = y; + } + + if (startx === endx && starty === endy && (endAngle - startAngle) < Math.PI) { + return ''; + } + + vpath = [x - radius, y - radius, x + radius, y + radius, startx, starty, endx, endy]; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="1px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + vel = '' + + ' '; + return vel; + }, + + _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { + return this._drawShape(shapeid, [[x, y], [x, y + height], [x + width, y + height], [x + width, y], [x, y]], lineColor, fillColor); + }, + + reset: function () { + this.group.innerHTML = ''; + }, + + appendShape: function (shape) { + var vel = this['_draw' + shape.type].apply(this, shape.args); + if (this.rendered) { + this.group.insertAdjacentHTML('beforeEnd', vel); + } else { + this.prerender += vel; + } + this.lastShapeId = shape.id; + return shape.id; + }, + + replaceWithShape: function (shapeid, shape) { + var existing = $('#jqsshape' + shapeid), + vel = this['_draw' + shape.type].apply(this, shape.args); + existing[0].outerHTML = vel; + }, + + replaceWithShapes: function (shapeids, shapes) { + // replace the first shapeid with all the new shapes then toast the remaining old shapes + var existing = $('#jqsshape' + shapeids[0]), + replace = '', + slen = shapes.length, + i; + for (i = 0; i < slen; i++) { + replace += this['_draw' + shapes[i].type].apply(this, shapes[i].args); + } + existing[0].outerHTML = replace; + for (i = 1; i < shapeids.length; i++) { + $('#jqsshape' + shapeids[i]).remove(); + } + }, + + insertAfterShape: function (shapeid, shape) { + var existing = $('#jqsshape' + shapeid), + vel = this['_draw' + shape.type].apply(this, shape.args); + existing[0].insertAdjacentHTML('afterEnd', vel); + }, + + removeShapeId: function (shapeid) { + var existing = $('#jqsshape' + shapeid); + this.group.removeChild(existing[0]); + }, + + getShapeAt: function (el, x, y) { + var shapeid = el.id.substr(8); + return shapeid; + }, + + render: function () { + if (!this.rendered) { + // batch the intial render into a single repaint + this.group.innerHTML = this.prerender; + this.rendered = true; + } + } + }); + +}))}(document, Math));;; diff --git a/wp-content/plugins/wp-piwik/js/sparkline/jquery.sparkline.min.js b/wp-content/plugins/wp-piwik/js/sparkline/jquery.sparkline.min.js new file mode 100644 index 0000000..fa616bf --- /dev/null +++ b/wp-content/plugins/wp-piwik/js/sparkline/jquery.sparkline.min.js @@ -0,0 +1,5 @@ +/* jquery.sparkline 2.1.2 - http://omnipotent.net/jquery.sparkline/ +** Licensed under the New BSD License - see above site for details */ + +(function(a,b,c){(function(a){typeof define=="function"&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.sparkline&&a(jQuery)})(function(d){"use strict";var e={},f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L=0;f=function(){return{common:{type:"line",lineColor:"#00f",fillColor:"#cdf",defaultPixelsPerValue:3,width:"auto",height:"auto",composite:!1,tagValuesAttribute:"values",tagOptionsPrefix:"spark",enableTagOptions:!1,enableHighlight:!0,highlightLighten:1.4,tooltipSkipNull:!0,tooltipPrefix:"",tooltipSuffix:"",disableHiddenCheck:!1,numberFormatter:!1,numberDigitGroupCount:3,numberDigitGroupSep:",",numberDecimalMark:".",disableTooltips:!1,disableInteraction:!1},line:{spotColor:"#f80",highlightSpotColor:"#5f5",highlightLineColor:"#f22",spotRadius:1.5,minSpotColor:"#f80",maxSpotColor:"#f80",lineWidth:1,normalRangeMin:c,normalRangeMax:c,normalRangeColor:"#ccc",drawNormalOnTop:!1,chartRangeMin:c,chartRangeMax:c,chartRangeMinX:c,chartRangeMaxX:c,tooltipFormat:new h(' {{prefix}}{{y}}{{suffix}}')},bar:{barColor:"#3366cc",negBarColor:"#f44",stackedBarColor:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],zeroColor:c,nullColor:c,zeroAxis:!0,barWidth:4,barSpacing:1,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,colorMap:c,tooltipFormat:new h(' {{prefix}}{{value}}{{suffix}}')},tristate:{barWidth:4,barSpacing:1,posBarColor:"#6f6",negBarColor:"#f44",zeroBarColor:"#999",colorMap:{},tooltipFormat:new h(' {{value:map}}'),tooltipValueLookups:{map:{"-1":"Loss",0:"Draw",1:"Win"}}},discrete:{lineHeight:"auto",thresholdColor:c,thresholdValue:0,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,tooltipFormat:new h("{{prefix}}{{value}}{{suffix}}")},bullet:{targetColor:"#f33",targetWidth:3,performanceColor:"#33f",rangeColors:["#d3dafe","#a8b6ff","#7f94ff"],base:c,tooltipFormat:new h("{{fieldkey:fields}} - {{value}}"),tooltipValueLookups:{fields:{r:"Range",p:"Performance",t:"Target"}}},pie:{offset:0,sliceColors:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],borderWidth:0,borderColor:"#000",tooltipFormat:new h(' {{value}} ({{percent.1}}%)')},box:{raw:!1,boxLineColor:"#000",boxFillColor:"#cdf",whiskerColor:"#000",outlierLineColor:"#333",outlierFillColor:"#fff",medianColor:"#f00",showOutliers:!0,outlierIQR:1.5,spotRadius:1.5,target:c,targetColor:"#4a2",chartRangeMax:c,chartRangeMin:c,tooltipFormat:new h("{{field:fields}}: {{value}}"),tooltipFormatFieldlistKey:"field",tooltipValueLookups:{fields:{lq:"Lower Quartile",med:"Median",uq:"Upper Quartile",lo:"Left Outlier",ro:"Right Outlier",lw:"Left Whisker",rw:"Right Whisker"}}}}},E='.jqstooltip { position: absolute;left: 0px;top: 0px;visibility: hidden;background: rgb(0, 0, 0) transparent;background-color: rgba(0,0,0,0.6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";color: white;font: 10px arial, san serif;text-align: left;white-space: nowrap;padding: 5px;border: 1px solid white;z-index: 10000;}.jqsfield { color: white;font: 10px arial, san serif;text-align: left;}',g=function(){var a,b;return a=function(){this.init.apply(this,arguments)},arguments.length>1?(arguments[0]?(a.prototype=d.extend(new arguments[0],arguments[arguments.length-1]),a._super=arguments[0].prototype):a.prototype=arguments[arguments.length-1],arguments.length>2&&(b=Array.prototype.slice.call(arguments,1,-1),b.unshift(a.prototype),d.extend.apply(d,b))):a.prototype=arguments[0],a.prototype.cls=a,a},d.SPFormatClass=h=g({fre:/\{\{([\w.]+?)(:(.+?))?\}\}/g,precre:/(\w+)\.(\d+)/,init:function(a,b){this.format=a,this.fclass=b},render:function(a,b,d){var e=this,f=a,g,h,i,j,k;return this.format.replace(this.fre,function(){var a;return h=arguments[1],i=arguments[3],g=e.precre.exec(h),g?(k=g[2],h=g[1]):k=!1,j=f[h],j===c?"":i&&b&&b[i]?(a=b[i],a.get?b[i].get(j)||j:b[i][j]||j):(n(j)&&(d.get("numberFormatter")?j=d.get("numberFormatter")(j):j=s(j,k,d.get("numberDigitGroupCount"),d.get("numberDigitGroupSep"),d.get("numberDecimalMark"))),j)})}}),d.spformat=function(a,b){return new h(a,b)},i=function(a,b,c){return ac?c:a},j=function(a,c){var d;return c===2?(d=b.floor(a.length/2),a.length%2?a[d]:(a[d-1]+a[d])/2):a.length%2?(d=(a.length*c+c)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1]):(d=(a.length*c+2)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1])},k=function(a){var b;switch(a){case"undefined":a=c;break;case"null":a=null;break;case"true":a=!0;break;case"false":a=!1;break;default:b=parseFloat(a),a==b&&(a=b)}return a},l=function(a){var b,c=[];for(b=a.length;b--;)c[b]=k(a[b]);return c},m=function(a,b){var c,d,e=[];for(c=0,d=a.length;c0;h-=c)a.splice(h,0,e);return a.join("")},o=function(a,b,c){var d;for(d=b.length;d--;){if(c&&b[d]===null)continue;if(b[d]!==a)return!1}return!0},p=function(a){var b=0,c;for(c=a.length;c--;)b+=typeof a[c]=="number"?a[c]:0;return b},r=function(a){return d.isArray(a)?a:[a]},q=function(b){var c;a.createStyleSheet?a.createStyleSheet().cssText=b:(c=a.createElement("style"),c.type="text/css",a.getElementsByTagName("head")[0].appendChild(c),c[typeof a.body.style.WebkitAppearance=="string"?"innerText":"innerHTML"]=b)},d.fn.simpledraw=function(b,e,f,g){var h,i;if(f&&(h=this.data("_jqs_vcanvas")))return h;if(d.fn.sparkline.canvas===!1)return!1;if(d.fn.sparkline.canvas===c){var j=a.createElement("canvas");if(!j.getContext||!j.getContext("2d")){if(!a.namespaces||!!a.namespaces.v)return d.fn.sparkline.canvas=!1,!1;a.namespaces.add("v","urn:schemas-microsoft-com:vml","#default#VML"),d.fn.sparkline.canvas=function(a,b,c,d){return new J(a,b,c)}}else d.fn.sparkline.canvas=function(a,b,c,d){return new I(a,b,c,d)}}return b===c&&(b=d(this).innerWidth()),e===c&&(e=d(this).innerHeight()),h=d.fn.sparkline.canvas(b,e,this,g),i=d(this).data("_jqs_mhandler"),i&&i.registerCanvas(h),h},d.fn.cleardraw=function(){var a=this.data("_jqs_vcanvas");a&&a.reset()},d.RangeMapClass=t=g({init:function(a){var b,c,d=[];for(b in a)a.hasOwnProperty(b)&&typeof b=="string"&&b.indexOf(":")>-1&&(c=b.split(":"),c[0]=c[0].length===0?-Infinity:parseFloat(c[0]),c[1]=c[1].length===0?Infinity:parseFloat(c[1]),c[2]=a[b],d.push(c));this.map=a,this.rangelist=d||!1},get:function(a){var b=this.rangelist,d,e,f;if((f=this.map[a])!==c)return f;if(b)for(d=b.length;d--;){e=b[d];if(e[0]<=a&&e[1]>=a)return e[2]}return c}}),d.range_map=function(a){return new t(a)},u=g({init:function(a,b){var c=d(a);this.$el=c,this.options=b,this.currentPageX=0,this.currentPageY=0,this.el=a,this.splist=[],this.tooltip=null,this.over=!1,this.displayTooltips=!b.get("disableTooltips"),this.highlightEnabled=!b.get("disableHighlight")},registerSparkline:function(a){this.splist.push(a),this.over&&this.updateDisplay()},registerCanvas:function(a){var b=d(a.canvas);this.canvas=a,this.$canvas=b,b.mouseenter(d.proxy(this.mouseenter,this)),b.mouseleave(d.proxy(this.mouseleave,this)),b.click(d.proxy(this.mouseclick,this))},reset:function(a){this.splist=[],this.tooltip&&a&&(this.tooltip.remove(),this.tooltip=c)},mouseclick:function(a){var b=d.Event("sparklineClick");b.originalEvent=a,b.sparklines=this.splist,this.$el.trigger(b)},mouseenter:function(b){d(a.body).unbind("mousemove.jqs"),d(a.body).bind("mousemove.jqs",d.proxy(this.mousemove,this)),this.over=!0,this.currentPageX=b.pageX,this.currentPageY=b.pageY,this.currentEl=b.target,!this.tooltip&&this.displayTooltips&&(this.tooltip=new v(this.options),this.tooltip.updatePosition(b.pageX,b.pageY)),this.updateDisplay()},mouseleave:function(){d(a.body).unbind("mousemove.jqs");var b=this.splist,c=b.length,e=!1,f,g;this.over=!1,this.currentEl=null,this.tooltip&&(this.tooltip.remove(),this.tooltip=null);for(g=0;g
            +
            + + + +
            > + +
            + + + + + diff --git a/wp-content/themes/generatepress/functions.php b/wp-content/themes/generatepress/functions.php new file mode 100644 index 0000000..9c828f3 --- /dev/null +++ b/wp-content/themes/generatepress/functions.php @@ -0,0 +1,98 @@ + 70, + 'width' => 350, + 'flex-height' => true, + 'flex-width' => true, + ) ); + + // Register primary menu. + register_nav_menus( array( + 'primary' => __( 'Primary Menu', 'generatepress' ), + ) ); + + /** + * Set the content width to something large + * We set a more accurate width in generate_smart_content_width() + */ + global $content_width; + if ( ! isset( $content_width ) ) { + $content_width = 1200; /* pixels */ + } + + // This theme styles the visual editor to resemble the theme style. + add_editor_style( 'css/admin/editor-style.css' ); + } +} + +/** + * Get all necessary theme files + */ +$theme_dir = get_template_directory(); + +require $theme_dir . '/inc/theme-functions.php'; +require $theme_dir . '/inc/defaults.php'; +require $theme_dir . '/inc/class-css.php'; +require $theme_dir . '/inc/css-output.php'; +require $theme_dir . '/inc/general.php'; +require $theme_dir . '/inc/customizer.php'; +require $theme_dir . '/inc/markup.php'; +require $theme_dir . '/inc/typography.php'; +require $theme_dir . '/inc/plugin-compat.php'; +require $theme_dir . '/inc/block-editor.php'; +require $theme_dir . '/inc/migrate.php'; +require $theme_dir . '/inc/deprecated.php'; + +if ( is_admin() ) { + require $theme_dir . '/inc/meta-box.php'; + require $theme_dir . '/inc/dashboard.php'; +} + +/** + * Load our theme structure + */ +require $theme_dir . '/inc/structure/archives.php'; +require $theme_dir . '/inc/structure/comments.php'; +require $theme_dir . '/inc/structure/featured-images.php'; +require $theme_dir . '/inc/structure/footer.php'; +require $theme_dir . '/inc/structure/header.php'; +require $theme_dir . '/inc/structure/navigation.php'; +require $theme_dir . '/inc/structure/post-meta.php'; +require $theme_dir . '/inc/structure/sidebars.php'; diff --git a/wp-content/themes/generatepress/header.php b/wp-content/themes/generatepress/header.php new file mode 100644 index 0000000..9059538 --- /dev/null +++ b/wp-content/themes/generatepress/header.php @@ -0,0 +1,75 @@ + +> + + + + + + + > + + +
            + +
            + post_type ) { + $layout = generate_get_option( 'single_layout_setting' ); + } + } + + // Add in our default filter in case people have adjusted it. + $layout = apply_filters( 'generate_sidebar_layout', $layout ); + + if ( $meta ) { + $layout_meta = get_post_meta( get_the_ID(), '_generate-sidebar-layout-meta', true ); + + if ( $layout_meta ) { + $layout = $layout_meta; + } + } + + return apply_filters( 'generate_block_editor_sidebar_layout', $layout ); +} + +/** + * Check whether we're disabling the content title or not. + * We need this function as the post meta in generate_show_title() only runs + * on is_singular() + * + * @since 2.2 + */ +function generate_get_block_editor_show_content_title() { + $title = generate_show_title(); + + $disable_title = get_post_meta( get_the_ID(), '_generate-disable-headline', true ); + + if ( $disable_title ) { + $title = false; + } + + return apply_filters( 'generate_block_editor_show_content_title', $title ); +} + +/** + * Get the content width for this post. + * + * @since 2.2 + */ +function generate_get_block_editor_content_width() { + $container_width = generate_get_option( 'container_width' ); + + $content_width = $container_width; + + $right_sidebar_width = apply_filters( 'generate_right_sidebar_width', '25' ); + + $left_sidebar_width = apply_filters( 'generate_left_sidebar_width', '25' ); + + $layout = generate_get_block_editor_sidebar_layout(); + + if ( 'left-sidebar' == $layout ) { + $content_width = $container_width * ( ( 100 - $left_sidebar_width ) / 100 ); + } elseif ( 'right-sidebar' == $layout ) { + $content_width = $container_width * ( ( 100 - $right_sidebar_width ) / 100 ); + } elseif ( 'no-sidebar' == $layout ) { + $content_width = $container_width; + } else { + $content_width = $container_width * ( ( 100 - ( $left_sidebar_width + $right_sidebar_width ) ) / 100 ); + } + + return apply_filters( 'generate_block_editor_content_width', $content_width ); +} + +add_action( 'enqueue_block_editor_assets', 'generate_enqueue_google_fonts' ); +add_action( 'enqueue_block_editor_assets', 'generate_enqueue_backend_block_editor_assets' ); +/** + * Add CSS to the admin side of the block editor. + * + * @since 2.2 + */ +function generate_enqueue_backend_block_editor_assets() { + wp_enqueue_style( 'generate-block-editor-styles', get_template_directory_uri() . "/css/admin/block-editor.css", false, GENERATE_VERSION, 'all' ); + wp_enqueue_script( 'generate-block-editor-tinycolor', get_template_directory_uri() . "/js/admin/tinycolor.js", false, GENERATE_VERSION, true ); + wp_enqueue_script( 'generate-block-editor-scripts', get_template_directory_uri() . "/js/admin/block-editor.js", array( 'jquery', 'generate-block-editor-tinycolor' ), GENERATE_VERSION, true ); + + $show_editor_styles = apply_filters( 'generate_show_block_editor_styles', true ); + + if ( $show_editor_styles ) { + wp_add_inline_style( 'generate-block-editor-styles', generate_do_inline_block_editor_css() ); + } + + $color_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_color_defaults() + ); + + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + $text_color = generate_get_option( 'text_color' ); + + if ( $color_settings['content_text_color'] ) { + $text_color = $color_settings['content_text_color']; + } + + wp_localize_script( 'generate-block-editor-scripts', 'generate_block_editor', array( + 'global_sidebar_layout' => generate_get_block_editor_sidebar_layout( false ), + 'container_width' => generate_get_option( 'container_width' ), + 'right_sidebar_width' => apply_filters( 'generate_right_sidebar_width', '25' ), + 'left_sidebar_width' => apply_filters( 'generate_left_sidebar_width', '25' ), + 'content_padding_right' => absint( $spacing_settings['content_right'] ) . 'px', + 'content_padding_left' => absint( $spacing_settings['content_left'] ) . 'px', + 'content_title' => generate_get_block_editor_show_content_title() ? 'true' : 'false', + 'disable_content_title' => esc_html( 'Disable Content Title', 'generatepress' ), + 'show_content_title' => esc_html( 'Show Content Title', 'generatepress' ), + 'text_color' => $text_color, + 'show_editor_styles' => $show_editor_styles, + ) ); +} + +/** + * Write our CSS for the block editor. + * + * @since 2.2 + */ +function generate_do_inline_block_editor_css() { + $color_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_color_defaults() + ); + + $font_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_default_fonts() + ); + + $css = new GeneratePress_CSS; + + $content_width = generate_get_block_editor_content_width(); + + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + $content_width_calc = sprintf( + 'calc(%1$s - %2$s - %3$s)', + absint( $content_width ) . 'px', + absint( $spacing_settings['content_left'] ) . 'px', + absint( $spacing_settings['content_right'] ) . 'px' + ); + + $css->set_selector( 'body .wp-block, html body.gutenberg-editor-page .editor-post-title__block, html body.gutenberg-editor-page .editor-default-block-appender, html body.gutenberg-editor-page .editor-block-list__block' ); + + if ( 'true' === get_post_meta( get_the_ID(), '_generate-full-width-content', true ) ) { + $css->add_property( 'max-width', '100%' ); + } else { + $css->add_property( 'max-width', $content_width_calc ); + } + + $css->set_selector( 'html body.gutenberg-editor-page .block-editor-block-list__block[data-align="full"]' ); + $css->add_property( 'max-width', 'none' ); + + $css->set_selector( '.edit-post-visual-editor .block-editor-block-list__block[data-align=wide]' ); + $css->add_property( 'max-width', absint( $content_width ), false, 'px' ); + + if ( apply_filters( 'generate_do_group_inner_container_style', true ) ) { + $css->set_selector( '.wp-block-group__inner-container' ); + $css->add_property( 'max-width', absint( $content_width ), false, 'px' ); + $css->add_property( 'margin-left', 'auto' ); + $css->add_property( 'margin-right', 'auto' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['content_top'], $spacing_settings['content_right'], $spacing_settings['content_bottom'], $spacing_settings['content_left'] ) ); + } + + $css->set_selector( '.wp-block-button__link:not(.has-background)' ); + $css->add_property( 'color', esc_attr( $color_settings['form_button_text_color'] ) ); + $css->add_property( 'background-color', esc_attr( $color_settings['form_button_background_color'] ) ); + + $css->set_selector( '.wp-block-button__link:not(.has-background):active, .wp-block-button__link:not(.has-background):focus, .wp-block-button__link:not(.has-background):hover' ); + $css->add_property( 'color', esc_attr( $color_settings['form_button_text_color_hover'] ) ); + $css->add_property( 'background-color', esc_attr( $color_settings['form_button_background_color_hover'] ) ); + + $body_family = generate_get_font_family_css( 'font_body', 'generate_settings', generate_get_default_fonts() ); + $h1_family = generate_get_font_family_css( 'font_heading_1', 'generate_settings', generate_get_default_fonts() ); + $h2_family = generate_get_font_family_css( 'font_heading_2', 'generate_settings', generate_get_default_fonts() ); + $h3_family = generate_get_font_family_css( 'font_heading_3', 'generate_settings', generate_get_default_fonts() ); + $h4_family = generate_get_font_family_css( 'font_heading_4', 'generate_settings', generate_get_default_fonts() ); + $h5_family = generate_get_font_family_css( 'font_heading_5', 'generate_settings', generate_get_default_fonts() ); + $h6_family = generate_get_font_family_css( 'font_heading_6', 'generate_settings', generate_get_default_fonts() ); + $buttons_family = generate_get_font_family_css( 'font_buttons', 'generate_settings', generate_get_default_fonts() ); + + $css->set_selector( 'body.gutenberg-editor-page .block-editor-block-list__block, body .editor-styles-wrapper' ); + $css->add_property( 'font-family', $body_family ); + $css->add_property( 'font-size', absint( $font_settings['body_font_size'] ), false, 'px' ); + + if ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + $css->set_selector( '.content-title-visibility' ); + + if ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + $css->set_selector( 'body .editor-styles-wrapper, body .editor-styles-wrapper p, body .editor-styles-wrapper .mce-content-body' ); + $css->add_property( 'line-height', floatval( $font_settings['body_line_height'] ) ); + + $css->set_selector( 'body .editor-styles-wrapper h1, .wp-block-heading h1.editor-rich-text__tinymce, .editor-post-title__block .editor-post-title__input' ); + $css->add_property( 'font-family', 'inherit' === $h1_family || '' === $h1_family ? $body_family : $h1_family ); + $css->add_property( 'font-weight', esc_attr( $font_settings['heading_1_weight'] ) ); + $css->add_property( 'text-transform', esc_attr( $font_settings['heading_1_transform'] ) ); + $css->add_property( 'font-size', absint( $font_settings['heading_1_font_size'] ), false, 'px' ); + $css->add_property( 'line-height', floatval( $font_settings['heading_1_line_height'] ), false, 'em' ); + + if ( $color_settings['h1_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['h1_color'] ) ); + } elseif ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + if ( $color_settings['content_title_color'] ) { + $css->set_selector( '.editor-post-title__block .editor-post-title__input' ); + $css->add_property( 'color', esc_attr( $color_settings['content_title_color'] ) ); + } + + $css->set_selector( 'body .editor-styles-wrapper h2, .wp-block-heading h2.editor-rich-text__tinymce' ); + $css->add_property( 'font-family', $h2_family ); + $css->add_property( 'font-weight', esc_attr( $font_settings['heading_2_weight'] ) ); + $css->add_property( 'text-transform', esc_attr( $font_settings['heading_2_transform'] ) ); + $css->add_property( 'font-size', absint( $font_settings['heading_2_font_size'] ), false, 'px' ); + $css->add_property( 'line-height', floatval( $font_settings['heading_2_line_height'] ), false, 'em' ); + + if ( $color_settings['h2_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['h2_color'] ) ); + } elseif ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + $css->set_selector( 'body .editor-styles-wrapper h3, .wp-block-heading h3.editor-rich-text__tinymce' ); + $css->add_property( 'font-family', $h3_family ); + $css->add_property( 'font-weight', esc_attr( $font_settings['heading_3_weight'] ) ); + $css->add_property( 'text-transform', esc_attr( $font_settings['heading_3_transform'] ) ); + $css->add_property( 'font-size', absint( $font_settings['heading_3_font_size'] ), false, 'px' ); + $css->add_property( 'line-height', floatval( $font_settings['heading_3_line_height'] ), false, 'em' ); + + if ( $color_settings['h3_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['h3_color'] ) ); + } elseif ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + $css->set_selector( 'body .editor-styles-wrapper h4, .wp-block-heading h4.editor-rich-text__tinymce' ); + $css->add_property( 'font-family', $h4_family ); + $css->add_property( 'font-weight', esc_attr( $font_settings['heading_4_weight'] ) ); + $css->add_property( 'text-transform', esc_attr( $font_settings['heading_4_transform'] ) ); + + if ( '' !== $font_settings['heading_4_font_size'] ) { + $css->add_property( 'font-size', absint( $font_settings['heading_4_font_size'] ), false, 'px' ); + } else { + $css->add_property( 'font-size', 'inherit' ); + } + + if ( '' !== $font_settings['heading_4_line_height'] ) { + $css->add_property( 'line-height', floatval( $font_settings['heading_4_line_height'] ), false, 'em' ); + } + + if ( $color_settings['h4_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['h4_color'] ) ); + } elseif ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + $css->set_selector( 'body .editor-styles-wrapper h5, .wp-block-heading h5.editor-rich-text__tinymce' ); + $css->add_property( 'font-family', $h5_family ); + $css->add_property( 'font-weight', esc_attr( $font_settings['heading_5_weight'] ) ); + $css->add_property( 'text-transform', esc_attr( $font_settings['heading_5_transform'] ) ); + + if ( '' !== $font_settings['heading_5_font_size'] ) { + $css->add_property( 'font-size', absint( $font_settings['heading_5_font_size'] ), false, 'px' ); + } else { + $css->add_property( 'font-size', 'inherit' ); + } + + if ( '' !== $font_settings['heading_5_line_height'] ) { + $css->add_property( 'line-height', floatval( $font_settings['heading_5_line_height'] ), false, 'em' ); + } + + if ( $color_settings['h5_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['h5_color'] ) ); + } elseif ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + $css->set_selector( 'body .editor-styles-wrapper h6, .wp-block-heading h6.editor-rich-text__tinymce' ); + $css->add_property( 'font-family', $h6_family ); + $css->add_property( 'font-weight', esc_attr( $font_settings['heading_6_weight'] ) ); + $css->add_property( 'text-transform', esc_attr( $font_settings['heading_6_transform'] ) ); + + if ( '' !== $font_settings['heading_6_font_size'] ) { + $css->add_property( 'font-size', absint( $font_settings['heading_6_font_size'] ), false, 'px' ); + } else { + $css->add_property( 'font-size', 'inherit' ); + } + + if ( '' !== $font_settings['heading_6_line_height'] ) { + $css->add_property( 'line-height', floatval( $font_settings['heading_6_line_height'] ), false, 'em' ); + } + + if ( $color_settings['h6_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['h6_color'] ) ); + } elseif ( $color_settings['content_text_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_text_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'text_color' ) ) ); + } + + $css->set_selector( '.block-editor-block-list__layout .wp-block-button .wp-block-button__link' ); + $css->add_property( 'font-family', $buttons_family ); + $css->add_property( 'font-weight', esc_attr( $font_settings['buttons_font_weight'] ) ); + $css->add_property( 'text-transform', esc_attr( $font_settings['buttons_font_transform'] ) ); + + if ( '' !== $font_settings['buttons_font_size'] ) { + $css->add_property( 'font-size', absint( $font_settings['buttons_font_size'] ), false, 'px' ); + } + + $css->set_selector( 'body .editor-styles-wrapper' ); + $css->add_property( 'background-color', esc_attr( generate_get_option( 'background_color' ) ) ); + + if ( $color_settings['content_background_color'] ) { + $body_background = esc_attr( generate_get_option( 'background_color' ) ); + $content_background = esc_attr( $color_settings['content_background_color'] ); + $css->add_property( 'background', 'linear-gradient(' . $content_background . ',' . $content_background . '), linear-gradient(' . $body_background . ',' . $body_background . ')' ); + } + + $css->set_selector( '.block-editor-block-list__block a, .block-editor-block-list__block a:visited' ); + + if ( $color_settings['content_link_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_link_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'link_color' ) ) ); + } + + $css->set_selector( '.block-editor-block-list__block a:hover, .block-editor-block-list__block a:focus, .block-editor-block-list__block a:active' ); + + if ( $color_settings['content_link_hover_color'] ) { + $css->add_property( 'color', esc_attr( $color_settings['content_link_hover_color'] ) ); + } else { + $css->add_property( 'color', esc_attr( generate_get_option( 'link_color_hover' ) ) ); + } + + return $css->css_output(); +} diff --git a/wp-content/themes/generatepress/inc/class-css.php b/wp-content/themes/generatepress/inc/class-css.php new file mode 100644 index 0000000..e5b1c2a --- /dev/null +++ b/wp-content/themes/generatepress/inc/class-css.php @@ -0,0 +1,212 @@ +_selector !== '' ) { + $this->add_selector_rules_to_output(); + } + + $this->_selector = $selector; + return $this; + } + + /** + * Adds a css property with value to the css output + * + * @access public + * @since 1.0 + * + * @param string $property - the css property + * @param string $value - the value to be placed with the property + * @param string $og_default - check to see if the value matches the default + * @param string $unit - the unit for the value (px) + * @return $this + */ + public function add_property( $property, $value, $og_default = false, $unit = false ) { + // Add our unit to our value if it exists. + if ( $unit && '' !== $unit ) { + $value = $value . $unit; + if ( '' !== $og_default ) { + $og_default = $og_default . $unit; + } + } + + // If we don't have a value or our value is the same as our og default, bail. + if ( empty( $value ) || $og_default == $value ) { + return false; + } + + $this->_css .= $property . ':' . $value . ';'; + return $this; + } + + /** + * Sets a media query in the class + * + * @since 1.1 + * @param string $value + * @return $this + */ + public function start_media_query( $value ) { + // Add the current rules to the output. + $this->add_selector_rules_to_output(); + + // Add any previous media queries to the output. + if ( ! empty( $this->_media_query ) ) { + $this->add_media_query_rules_to_output(); + } + + // Set the new media query. + $this->_media_query = $value; + return $this; + } + + /** + * Stops using a media query. + * + * @see start_media_query() + * + * @since 1.1 + * @return $this + */ + public function stop_media_query() { + return $this->start_media_query( null ); + } + + /** + * Adds the current media query's rules to the class' output variable + * + * @since 1.1 + * @return $this + */ + private function add_media_query_rules_to_output() { + if ( ! empty( $this->_media_query_output ) ) { + $this->_output .= sprintf( '@media %1$s{%2$s}', $this->_media_query, $this->_media_query_output ); + + // Reset the media query output string. + $this->_media_query_output = ''; + } + + return $this; + } + + /** + * Adds the current selector rules to the output variable + * + * @access private + * @since 1.0 + * + * @return $this + */ + private function add_selector_rules_to_output() { + if ( ! empty( $this->_css ) ) { + $this->_selector_output = $this->_selector; + $selector_output = sprintf( '%1$s{%2$s}', $this->_selector_output, $this->_css ); + + // Add our CSS to the output. + if ( ! empty( $this->_media_query ) ) { + $this->_media_query_output .= $selector_output; + $this->_css = ''; + } else { + $this->_output .= $selector_output; + } + + // Reset the css. + $this->_css = ''; + } + + return $this; + } + + /** + * Returns the minified css in the $_output variable + * + * @access public + * @since 1.0 + * + * @return string + */ + public function css_output() { + // Add current selector's rules to output. + $this->add_selector_rules_to_output(); + + // Output minified css. + return $this->_output; + } + + } +} diff --git a/wp-content/themes/generatepress/inc/css-output.php b/wp-content/themes/generatepress/inc/css-output.php new file mode 100644 index 0000000..941aaef --- /dev/null +++ b/wp-content/themes/generatepress/inc/css-output.php @@ -0,0 +1,814 @@ + section using the Theme Customizer. + * + * @since 0.1 + */ + function generate_base_css() { + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_defaults() + ); + + $css = new GeneratePress_CSS; + + $css->set_selector( 'body' ); + $css->add_property( 'background-color', esc_attr( $generate_settings['background_color'] ) ); + $css->add_property( 'color', esc_attr( $generate_settings['text_color'] ) ); + + $css->set_selector( 'a, a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['link_color'] ) ); + + $css->set_selector( 'a:visited' )->add_property( 'color', esc_attr( $generate_settings['link_color_visited'] ) ); + + $css->set_selector( 'a:hover, a:focus, a:active' ); + $css->add_property( 'color', esc_attr( $generate_settings['link_color_hover'] ) ); + + $css->set_selector( 'body .grid-container' )->add_property( 'max-width', absint( $generate_settings['container_width'] ), false, 'px' ); + + if ( apply_filters( 'generate_do_group_inner_container_style', true ) ) { + $css->set_selector( '.wp-block-group__inner-container' ); + $css->add_property( 'max-width', absint( $generate_settings['container_width'] ), false, 'px' ); + $css->add_property( 'margin-left', 'auto' ); + $css->add_property( 'margin-right', 'auto' ); + } + + $nav_drop_point = generate_get_option( 'nav_drop_point' ); + $nav_location = generate_get_navigation_location(); + + if ( ( 'nav-float-right' === $nav_location || 'nav-float-left' === $nav_location ) && $nav_drop_point ) { + $media_query = sprintf( + '(max-width: %1$s) and %2$s', + absint( $nav_drop_point ) . 'px', + apply_filters( 'generate_not_mobile_menu_media_query', '(min-width: 769px)' ) + ); + + $css->start_media_query( $media_query ); + $css->set_selector( '.inside-header' ); + $css->add_property( 'display', '-ms-flexbox' ); + $css->add_property( 'display', 'flex' ); + + $css->add_property( '-ms-flex-direction', 'column' ); + $css->add_property( 'flex-direction', 'column' ); + + $css->add_property( '-ms-flex-align', 'center' ); + $css->add_property( 'align-items', 'center' ); + + $css->set_selector( '.site-logo, .site-branding' ); + $css->add_property( 'margin-bottom', '1.5em' ); + + $css->set_selector( '#site-navigation' ); + $css->add_property( 'margin', '0 auto' ); + + $css->set_selector( '.header-widget' ); + $css->add_property( 'margin-top', '1.5em' ); + + if ( 'nav-float-left' === generate_get_option( 'nav_position_setting' ) ) { + $css->set_selector( '.nav-float-left .site-logo,.nav-float-left .site-branding,.nav-float-left .header-widget' ); + $css->add_property( '-webkit-box-ordinal-group', 'initial' ); + $css->add_property( '-ms-flex-order', 'initial' ); + $css->add_property( 'order', 'initial' ); + } + $css->stop_media_query(); + } + + if ( generate_get_option( 'logo_width' ) ) { + $css->set_selector( '.site-header .header-image' ); + $css->add_property( 'width', absint( generate_get_option( 'logo_width' ) ), false, 'px' ); + } + + do_action( 'generate_base_css', $css ); + + return apply_filters( 'generate_base_css_output', $css->css_output() ); + } +} + +if ( ! function_exists( 'generate_advanced_css' ) ) { + /** + * Generate the CSS in the section using the Theme Customizer. + * + * @since 0.1 + */ + function generate_advanced_css() { + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_color_defaults() + ); + + $css = new GeneratePress_CSS; + + $css->set_selector( '.top-bar' ); + $css->add_property( 'background-color', esc_attr( $generate_settings['top_bar_background_color'] ) ); + $css->add_property( 'color', esc_attr( $generate_settings['top_bar_text_color'] ) ); + + $css->set_selector( '.top-bar a,.top-bar a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['top_bar_link_color'] ) ); + + $css->set_selector( '.top-bar a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['top_bar_link_color_hover'] ) ); + + $css->set_selector( '.site-header' ); + $css->add_property( 'background-color', esc_attr( $generate_settings['header_background_color'] ) ); + $css->add_property( 'color', esc_attr( $generate_settings['header_text_color'] ) ); + + $css->set_selector( '.site-header a,.site-header a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['header_link_color'] ) ); + + $css->set_selector( '.site-header a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['header_link_hover_color'] ) ); + + $css->set_selector( '.main-title a,.main-title a:hover,.main-title a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['site_title_color'] ) ); + + $css->set_selector( '.site-description' ); + $css->add_property( 'color', esc_attr( $generate_settings['site_tagline_color'] ) ); + + $css->set_selector( '.main-navigation,.main-navigation ul ul' ); + $css->add_property( 'background-color', esc_attr( $generate_settings['navigation_background_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul li a,.menu-toggle' ); + $css->add_property( 'color', esc_attr( $generate_settings['navigation_text_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul li:hover > a,.main-navigation .main-nav ul li:focus > a, .main-navigation .main-nav ul li.sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings['navigation_text_hover_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['navigation_background_hover_color'] ) ); + + $css->set_selector( 'button.menu-toggle:hover,button.menu-toggle:focus,.main-navigation .mobile-bar-items a,.main-navigation .mobile-bar-items a:hover,.main-navigation .mobile-bar-items a:focus' ); + $css->add_property( 'color', esc_attr( $generate_settings['navigation_text_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul li[class*="current-menu-"] > a' ); + $css->add_property( 'color', esc_attr( $generate_settings['navigation_text_current_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['navigation_background_current_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul li[class*="current-menu-"] > a:hover,.main-navigation .main-nav ul li[class*="current-menu-"].sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings['navigation_text_current_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['navigation_background_current_color'] ) ); + + $navigation_search_background = $generate_settings['navigation_background_hover_color']; + $navigation_search_text = $generate_settings['navigation_text_hover_color']; + + if ( '' !== $generate_settings['navigation_search_background_color'] ) { + $navigation_search_background = $generate_settings['navigation_search_background_color']; + } + + if ( '' !== $generate_settings['navigation_search_text_color'] ) { + $navigation_search_text = $generate_settings['navigation_search_text_color']; + } + + $css->set_selector( '.navigation-search input[type="search"],.navigation-search input[type="search"]:active, .navigation-search input[type="search"]:focus, .main-navigation .main-nav ul li.search-item.active > a' ); + $css->add_property( 'color', esc_attr( $navigation_search_text ) ); + $css->add_property( 'background-color', esc_attr( $navigation_search_background ) ); + + if ( '' !== $generate_settings['navigation_search_background_color'] ) { + $css->add_property( 'opacity', '1' ); + } + + $css->set_selector( '.main-navigation ul ul' ); + $css->add_property( 'background-color', esc_attr( $generate_settings['subnavigation_background_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul ul li a' ); + $css->add_property( 'color', esc_attr( $generate_settings['subnavigation_text_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul ul li:hover > a,.main-navigation .main-nav ul ul li:focus > a,.main-navigation .main-nav ul ul li.sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings['subnavigation_text_hover_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['subnavigation_background_hover_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul ul li[class*="current-menu-"] > a' ); + $css->add_property( 'color', esc_attr( $generate_settings['subnavigation_text_current_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['subnavigation_background_current_color'] ) ); + + $css->set_selector( '.main-navigation .main-nav ul ul li[class*="current-menu-"] > a:hover,.main-navigation .main-nav ul ul li[class*="current-menu-"].sfHover > a' ); + $css->add_property( 'color', esc_attr( $generate_settings['subnavigation_text_current_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['subnavigation_background_current_color'] ) ); + + $css->set_selector( '.separate-containers .inside-article, .separate-containers .comments-area, .separate-containers .page-header, .one-container .container, .separate-containers .paging-navigation, .inside-page-header' ); + $css->add_property( 'color', esc_attr( $generate_settings['content_text_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['content_background_color'] ) ); + + $css->set_selector( '.inside-article a,.inside-article a:visited,.paging-navigation a,.paging-navigation a:visited,.comments-area a,.comments-area a:visited,.page-header a,.page-header a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['content_link_color'] ) ); + + $css->set_selector( '.inside-article a:hover,.paging-navigation a:hover,.comments-area a:hover,.page-header a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['content_link_hover_color'] ) ); + + $css->set_selector( '.entry-header h1,.page-header h1' ); + $css->add_property( 'color', esc_attr( $generate_settings['content_title_color'] ) ); + + $css->set_selector( '.entry-title a,.entry-title a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['blog_post_title_color'] ) ); + + $css->set_selector( '.entry-title a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['blog_post_title_hover_color'] ) ); + + $css->set_selector( '.entry-meta' ); + $css->add_property( 'color', esc_attr( $generate_settings['entry_meta_text_color'] ) ); + + $css->set_selector( '.entry-meta a,.entry-meta a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['entry_meta_link_color'] ) ); + + $css->set_selector( '.entry-meta a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['entry_meta_link_color_hover'] ) ); + + $css->set_selector( 'h1' ); + $css->add_property( 'color', esc_attr( $generate_settings['h1_color'] ) ); + + $css->set_selector( 'h2' ); + $css->add_property( 'color', esc_attr( $generate_settings['h2_color'] ) ); + + $css->set_selector( 'h3' ); + $css->add_property( 'color', esc_attr( $generate_settings['h3_color'] ) ); + + $css->set_selector( 'h4' ); + $css->add_property( 'color', esc_attr( $generate_settings['h4_color'] ) ); + + $css->set_selector( 'h5' ); + $css->add_property( 'color', esc_attr( $generate_settings['h5_color'] ) ); + + $css->set_selector( 'h6' ); + $css->add_property( 'color', esc_attr( $generate_settings['h6_color'] ) ); + + $css->set_selector( '.sidebar .widget' ); + $css->add_property( 'color', esc_attr( $generate_settings['sidebar_widget_text_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['sidebar_widget_background_color'] ) ); + + $css->set_selector( '.sidebar .widget a,.sidebar .widget a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['sidebar_widget_link_color'] ) ); + + $css->set_selector( '.sidebar .widget a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['sidebar_widget_link_hover_color'] ) ); + + $css->set_selector( '.sidebar .widget .widget-title' ); + $css->add_property( 'color', esc_attr( $generate_settings['sidebar_widget_title_color'] ) ); + + $css->set_selector( '.footer-widgets' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_widget_text_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['footer_widget_background_color'] ) ); + + $css->set_selector( '.footer-widgets a,.footer-widgets a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_widget_link_color'] ) ); + + $css->set_selector( '.footer-widgets a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_widget_link_hover_color'] ) ); + + $css->set_selector( '.footer-widgets .widget-title' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_widget_title_color'] ) ); + + $css->set_selector( '.site-info' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_text_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['footer_background_color'] ) ); + + $css->set_selector( '.site-info a,.site-info a:visited' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_link_color'] ) ); + + $css->set_selector( '.site-info a:hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_link_hover_color'] ) ); + + $css->set_selector( '.footer-bar .widget_nav_menu .current-menu-item a' ); + $css->add_property( 'color', esc_attr( $generate_settings['footer_link_hover_color'] ) ); + + $css->set_selector( 'input[type="text"],input[type="email"],input[type="url"],input[type="password"],input[type="search"],input[type="tel"],input[type="number"],textarea,select' ); + $css->add_property( 'color', esc_attr( $generate_settings['form_text_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['form_background_color'] ) ); + $css->add_property( 'border-color', esc_attr( $generate_settings['form_border_color'] ) ); + + $css->set_selector( 'input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="number"]:focus,textarea:focus,select:focus' ); + $css->add_property( 'color', esc_attr( $generate_settings['form_text_color_focus'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['form_background_color_focus'] ) ); + $css->add_property( 'border-color', esc_attr( $generate_settings['form_border_color_focus'] ) ); + + $css->set_selector( 'button,html input[type="button"],input[type="reset"],input[type="submit"],a.button,a.button:visited,a.wp-block-button__link:not(.has-background)' ); + $css->add_property( 'color', esc_attr( $generate_settings['form_button_text_color'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['form_button_background_color'] ) ); + + $css->set_selector( 'button:hover,html input[type="button"]:hover,input[type="reset"]:hover,input[type="submit"]:hover,a.button:hover,button:focus,html input[type="button"]:focus,input[type="reset"]:focus,input[type="submit"]:focus,a.button:focus,a.wp-block-button__link:not(.has-background):active,a.wp-block-button__link:not(.has-background):focus,a.wp-block-button__link:not(.has-background):hover' ); + $css->add_property( 'color', esc_attr( $generate_settings['form_button_text_color_hover'] ) ); + $css->add_property( 'background-color', esc_attr( $generate_settings['form_button_background_color_hover'] ) ); + + $css->set_selector( '.generate-back-to-top,.generate-back-to-top:visited' ); + $css->add_property( 'background-color', esc_attr( $generate_settings['back_to_top_background_color'] ) ); + $css->add_property( 'color', esc_attr( $generate_settings['back_to_top_text_color'] ) ); + + $css->set_selector( '.generate-back-to-top:hover,.generate-back-to-top:focus' ); + $css->add_property( 'background-color', esc_attr( $generate_settings['back_to_top_background_color_hover'] ) ); + $css->add_property( 'color', esc_attr( $generate_settings['back_to_top_text_color_hover'] ) ); + + do_action( 'generate_colors_css', $css ); + + return apply_filters( 'generate_colors_css_output', $css->css_output() ); + } +} + +if ( ! function_exists( 'generate_font_css' ) ) { + /** + * Generate the CSS in the section using the Theme Customizer. + * + * @since 0.1 + */ + function generate_font_css() { + + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_default_fonts() + ); + + $og_defaults = generate_get_default_fonts( false ); + + $css = new GeneratePress_CSS; + + $subnav_font_size = $generate_settings['navigation_font_size'] >= 17 ? $generate_settings['navigation_font_size'] - 3 : $generate_settings['navigation_font_size'] - 1; + + $body_family = generate_get_font_family_css( 'font_body', 'generate_settings', generate_get_default_fonts() ); + $top_bar_family = generate_get_font_family_css( 'font_top_bar', 'generate_settings', generate_get_default_fonts() ); + $site_title_family = generate_get_font_family_css( 'font_site_title', 'generate_settings', generate_get_default_fonts() ); + $site_tagline_family = generate_get_font_family_css( 'font_site_tagline', 'generate_settings', generate_get_default_fonts() ); + $navigation_family = generate_get_font_family_css( 'font_navigation', 'generate_settings', generate_get_default_fonts() ); + $widget_family = generate_get_font_family_css( 'font_widget_title', 'generate_settings', generate_get_default_fonts() ); + $h1_family = generate_get_font_family_css( 'font_heading_1', 'generate_settings', generate_get_default_fonts() ); + $h2_family = generate_get_font_family_css( 'font_heading_2', 'generate_settings', generate_get_default_fonts() ); + $h3_family = generate_get_font_family_css( 'font_heading_3', 'generate_settings', generate_get_default_fonts() ); + $h4_family = generate_get_font_family_css( 'font_heading_4', 'generate_settings', generate_get_default_fonts() ); + $h5_family = generate_get_font_family_css( 'font_heading_5', 'generate_settings', generate_get_default_fonts() ); + $h6_family = generate_get_font_family_css( 'font_heading_6', 'generate_settings', generate_get_default_fonts() ); + $footer_family = generate_get_font_family_css( 'font_footer', 'generate_settings', generate_get_default_fonts() ); + $buttons_family = generate_get_font_family_css( 'font_buttons', 'generate_settings', generate_get_default_fonts() ); + + $css->set_selector( 'body, button, input, select, textarea' ); + $css->add_property( 'font-family', $body_family ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['body_font_weight'] ), $og_defaults['body_font_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['body_font_transform'] ), $og_defaults['body_font_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['body_font_size'] ), $og_defaults['body_font_size'], 'px' ); + + $css->set_selector( 'body' ); + $css->add_property( 'line-height', floatval( $generate_settings['body_line_height'] ), $og_defaults['body_line_height'] ); + + $css->set_selector( 'p' ); + $css->add_property( 'margin-bottom', floatval( $generate_settings['paragraph_margin'] ), $og_defaults['paragraph_margin'], 'em' ); + + $css->set_selector( '.entry-content > [class*="wp-block-"]:not(:last-child)' ); + $css->add_property( 'margin-bottom', floatval( $generate_settings['paragraph_margin'] ), false, 'em' ); + + $css->set_selector( '.top-bar' ); + $css->add_property( 'font-family', $og_defaults['font_top_bar'] !== $generate_settings['font_top_bar'] ? $top_bar_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['top_bar_font_weight'] ), $og_defaults['top_bar_font_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['top_bar_font_transform'] ), $og_defaults['top_bar_font_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['top_bar_font_size'] ), absint( $og_defaults['top_bar_font_size'] ), 'px' ); + + $css->set_selector( '.main-title' ); + $css->add_property( 'font-family', $og_defaults['font_site_title'] !== $generate_settings['font_site_title'] ? $site_title_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['site_title_font_weight'] ), $og_defaults['site_title_font_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['site_title_font_transform'] ), $og_defaults['site_title_font_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['site_title_font_size'] ), $og_defaults['site_title_font_size'], 'px' ); + + $css->set_selector( '.site-description' ); + $css->add_property( 'font-family', $og_defaults['font_site_tagline'] !== $generate_settings['font_site_tagline'] ? $site_tagline_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['site_tagline_font_weight'] ), $og_defaults['site_tagline_font_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['site_tagline_font_transform'] ), $og_defaults['site_tagline_font_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['site_tagline_font_size'] ), $og_defaults['site_tagline_font_size'], 'px' ); + + $css->set_selector( '.main-navigation a, .menu-toggle' ); + $css->add_property( 'font-family', $og_defaults['font_navigation'] !== $generate_settings['font_navigation'] ? $navigation_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['navigation_font_weight'] ), $og_defaults['navigation_font_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['navigation_font_transform'] ), $og_defaults['navigation_font_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['navigation_font_size'] ), $og_defaults['navigation_font_size'], 'px' ); + + $css->set_selector( '.main-navigation .main-nav ul ul li a' ); + $css->add_property( 'font-size', absint( $subnav_font_size ), false, 'px' ); + + $css->set_selector( '.widget-title' ); + $css->add_property( 'font-family', $og_defaults['font_widget_title'] !== $generate_settings['font_widget_title'] ? $widget_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['widget_title_font_weight'] ), $og_defaults['widget_title_font_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['widget_title_font_transform'] ), $og_defaults['widget_title_font_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['widget_title_font_size'] ), $og_defaults['widget_title_font_size'], 'px' ); + $css->add_property( 'margin-bottom', absint( $generate_settings['widget_title_separator'] ), absint( $og_defaults['widget_title_separator'] ), 'px' ); + + $css->set_selector( '.sidebar .widget, .footer-widgets .widget' ); + $css->add_property( 'font-size', absint( $generate_settings['widget_content_font_size'] ), $og_defaults['widget_content_font_size'], 'px' ); + + $css->set_selector( 'button:not(.menu-toggle),html input[type="button"],input[type="reset"],input[type="submit"],.button,.button:visited,.wp-block-button .wp-block-button__link' ); + $css->add_property( 'font-family', $og_defaults['font_buttons'] !== $generate_settings['font_buttons'] ? $buttons_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['buttons_font_weight'] ), $og_defaults['buttons_font_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['buttons_font_transform'] ), $og_defaults['buttons_font_transform'] ); + + if ( '' !== $generate_settings['buttons_font_size'] ) { + $css->add_property( 'font-size', absint( $generate_settings['buttons_font_size'] ), $og_defaults['buttons_font_size'], 'px' ); + } + + $css->set_selector( 'h1' ); + $css->add_property( 'font-family', $og_defaults['font_heading_1'] !== $generate_settings['font_heading_1'] ? $h1_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['heading_1_weight'] ), $og_defaults['heading_1_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['heading_1_transform'] ), $og_defaults['heading_1_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['heading_1_font_size'] ), $og_defaults['heading_1_font_size'], 'px' ); + $css->add_property( 'line-height', floatval( $generate_settings['heading_1_line_height'] ), $og_defaults['heading_1_line_height'], 'em' ); + $css->add_property( 'margin-bottom', floatval( $generate_settings['heading_1_margin_bottom'] ), $og_defaults['heading_1_margin_bottom'], 'px' ); + + $css->set_selector( 'h2' ); + $css->add_property( 'font-family', $og_defaults['font_heading_2'] !== $generate_settings['font_heading_2'] ? $h2_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['heading_2_weight'] ), $og_defaults['heading_2_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['heading_2_transform'] ), $og_defaults['heading_2_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['heading_2_font_size'] ), $og_defaults['heading_2_font_size'], 'px' ); + $css->add_property( 'line-height', floatval( $generate_settings['heading_2_line_height'] ), $og_defaults['heading_2_line_height'], 'em' ); + $css->add_property( 'margin-bottom', floatval( $generate_settings['heading_2_margin_bottom'] ), $og_defaults['heading_2_margin_bottom'], 'px' ); + + $css->set_selector( 'h3' ); + $css->add_property( 'font-family', $og_defaults['font_heading_3'] !== $generate_settings['font_heading_3'] ? $h3_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['heading_3_weight'] ), $og_defaults['heading_3_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['heading_3_transform'] ), $og_defaults['heading_3_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['heading_3_font_size'] ), $og_defaults['heading_3_font_size'], 'px' ); + $css->add_property( 'line-height', floatval( $generate_settings['heading_3_line_height'] ), $og_defaults['heading_3_line_height'], 'em' ); + $css->add_property( 'margin-bottom', floatval( $generate_settings['heading_3_margin_bottom'] ), $og_defaults['heading_3_margin_bottom'], 'px' ); + + $css->set_selector( 'h4' ); + $css->add_property( 'font-family', $og_defaults['font_heading_4'] !== $generate_settings['font_heading_4'] ? $h4_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['heading_4_weight'] ), $og_defaults['heading_4_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['heading_4_transform'] ), $og_defaults['heading_4_transform'] ); + + if ( '' !== $generate_settings['heading_4_font_size'] ) { + $css->add_property( 'font-size', absint( $generate_settings['heading_4_font_size'] ), $og_defaults['heading_4_font_size'], 'px' ); + } + + if ( '' !== $generate_settings['heading_4_line_height'] ) { + $css->add_property( 'line-height', floatval( $generate_settings['heading_4_line_height'] ), $og_defaults['heading_4_line_height'], 'em' ); + } + + $css->set_selector( 'h5' ); + $css->add_property( 'font-family', $og_defaults['font_heading_5'] !== $generate_settings['font_heading_5'] ? $h5_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['heading_5_weight'] ), $og_defaults['heading_5_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['heading_5_transform'] ), $og_defaults['heading_5_transform'] ); + + if ( '' !== $generate_settings['heading_5_font_size'] ) { + $css->add_property( 'font-size', absint( $generate_settings['heading_5_font_size'] ), $og_defaults['heading_5_font_size'], 'px' ); + } + + if ( '' !== $generate_settings['heading_5_line_height'] ) { + $css->add_property( 'line-height', floatval( $generate_settings['heading_5_line_height'] ), $og_defaults['heading_5_line_height'], 'em' ); + } + + $css->set_selector( 'h6' ); + $css->add_property( 'font-family', $og_defaults['font_heading_6'] !== $generate_settings['font_heading_6'] ? $h6_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['heading_6_weight'] ), $og_defaults['heading_6_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['heading_6_transform'] ), $og_defaults['heading_6_transform'] ); + + if ( '' !== $generate_settings['heading_6_font_size'] ) { + $css->add_property( 'font-size', absint( $generate_settings['heading_6_font_size'] ), $og_defaults['heading_6_font_size'], 'px' ); + } + + if ( '' !== $generate_settings['heading_6_line_height'] ) { + $css->add_property( 'line-height', floatval( $generate_settings['heading_6_line_height'] ), $og_defaults['heading_6_line_height'], 'em' ); + } + + $css->set_selector( '.site-info' ); + $css->add_property( 'font-family', $og_defaults['font_footer'] !== $generate_settings['font_footer'] ? $footer_family : null ); + $css->add_property( 'font-weight', esc_attr( $generate_settings['footer_weight'] ), $og_defaults['footer_weight'] ); + $css->add_property( 'text-transform', esc_attr( $generate_settings['footer_transform'] ), $og_defaults['footer_transform'] ); + $css->add_property( 'font-size', absint( $generate_settings['footer_font_size'] ), $og_defaults['footer_font_size'], 'px' ); + + $css->start_media_query( generate_get_media_query( 'mobile' ) ); + $mobile_site_title = ( isset( $generate_settings['mobile_site_title_font_size'] ) ) ? $generate_settings['mobile_site_title_font_size'] : '30'; + $css->set_selector( '.main-title' ); + $css->add_property( 'font-size', absint( $mobile_site_title ), false, 'px' ); + + $mobile_h1 = ( isset( $generate_settings['mobile_heading_1_font_size'] ) ) ? $generate_settings['mobile_heading_1_font_size'] : '30'; + $css->set_selector( 'h1' ); + $css->add_property( 'font-size', absint( $mobile_h1 ), false, 'px' ); + + $mobile_h2 = ( isset( $generate_settings['mobile_heading_2_font_size'] ) ) ? $generate_settings['mobile_heading_2_font_size'] : '25'; + $css->set_selector( 'h2' ); + $css->add_property( 'font-size', absint( $mobile_h2 ), false, 'px' ); + $css->stop_media_query(); + + do_action( 'generate_typography_css', $css ); + + return apply_filters( 'generate_typography_css_output', $css->css_output() ); + } +} + +if ( ! function_exists( 'generate_spacing_css' ) ) { + /** + * Write our dynamic CSS. + * + * @since 0.1 + */ + function generate_spacing_css() { + $spacing_settings = wp_parse_args( + get_option( 'generate_spacing_settings', array() ), + generate_spacing_get_defaults() + ); + + $og_defaults = generate_spacing_get_defaults( false ); + $sidebar_layout = generate_get_layout(); + + $css = new GeneratePress_CSS; + + $css->set_selector( '.inside-top-bar' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['top_bar_top'], $spacing_settings['top_bar_right'], $spacing_settings['top_bar_bottom'], $spacing_settings['top_bar_left'] ), generate_padding_css( $og_defaults['top_bar_top'], $og_defaults['top_bar_right'], $og_defaults['top_bar_bottom'], $og_defaults['top_bar_left'] ) ); + + $css->set_selector( '.inside-header' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['header_top'], $spacing_settings['header_right'], $spacing_settings['header_bottom'], $spacing_settings['header_left'] ), generate_padding_css( $og_defaults['header_top'], $og_defaults['header_right'], $og_defaults['header_bottom'], $og_defaults['header_left'] ) ); + + $css->set_selector( '.separate-containers .inside-article, .separate-containers .comments-area, .separate-containers .page-header, .separate-containers .paging-navigation, .one-container .site-content, .inside-page-header, .wp-block-group__inner-container' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['content_top'], $spacing_settings['content_right'], $spacing_settings['content_bottom'], $spacing_settings['content_left'] ), generate_padding_css( $og_defaults['content_top'], $og_defaults['content_right'], $og_defaults['content_bottom'], $og_defaults['content_left'] ) ); + + $content_padding = absint( $spacing_settings['content_right'] ) + absint( $spacing_settings['content_left'] ); + $css->set_selector( '.entry-content .alignwide, body:not(.no-sidebar) .entry-content .alignfull' ); + $css->add_property( 'margin-left', '-' . absint( $spacing_settings['content_left'] ) . 'px' ); + $css->add_property( 'width', 'calc(100% + ' . absint( $content_padding ) . 'px)' ); + $css->add_property( 'max-width', 'calc(100% + ' . absint( $content_padding ) . 'px)' ); + + if ( 'text' === generate_get_option( 'container_alignment' ) ) { + $css->set_selector( '.container.grid-container' ); + $css->add_property( 'max-width', generate_get_option( 'container_width' ) + $content_padding, false, 'px' ); + } + + $css->set_selector( '.one-container.right-sidebar .site-main,.one-container.both-right .site-main' ); + $css->add_property( 'margin-right', absint( $spacing_settings['content_right'] ), absint( $og_defaults['content_right'] ), 'px' ); + + $css->set_selector( '.one-container.left-sidebar .site-main,.one-container.both-left .site-main' ); + $css->add_property( 'margin-left', absint( $spacing_settings['content_left'] ), absint( $og_defaults['content_left'] ), 'px' ); + + $css->set_selector( '.one-container.both-sidebars .site-main' ); + $css->add_property( 'margin', generate_padding_css( '0', $spacing_settings['content_right'], '0', $spacing_settings['content_left'] ), generate_padding_css( '0', $og_defaults['content_right'], '0', $og_defaults['content_left'] ) ); + + $css->set_selector( '.separate-containers .widget, .separate-containers .site-main > *, .separate-containers .page-header, .widget-area .main-navigation' ); + $css->add_property( 'margin-bottom', absint( $spacing_settings['separator'] ), absint( $og_defaults['separator'] ), 'px' ); + + $css->set_selector( '.separate-containers .site-main' ); + $css->add_property( 'margin', absint( $spacing_settings['separator'] ), $og_defaults['separator'], 'px' ); + + $css->set_selector( '.both-right.separate-containers .inside-left-sidebar' ); + $css->add_property( 'margin-right', absint( $spacing_settings['separator'] / 2 ), absint( $og_defaults['separator'] / 2 ), 'px' ); + + $css->set_selector( '.both-right.separate-containers .inside-right-sidebar' ); + $css->add_property( 'margin-left', absint( $spacing_settings['separator'] / 2 ), absint( $og_defaults['separator'] / 2 ), 'px' ); + + $css->set_selector( '.both-left.separate-containers .inside-left-sidebar' ); + $css->add_property( 'margin-right', absint( $spacing_settings['separator'] / 2 ), absint( $og_defaults['separator'] / 2 ), 'px' ); + + $css->set_selector( '.both-left.separate-containers .inside-right-sidebar' ); + $css->add_property( 'margin-left', absint( $spacing_settings['separator'] / 2 ), absint( $og_defaults['separator'] / 2 ), 'px' ); + + $css->set_selector( '.separate-containers .page-header-image, .separate-containers .page-header-contained, .separate-containers .page-header-image-single, .separate-containers .page-header-content-single' ); + $css->add_property( 'margin-top', absint( $spacing_settings['separator'] ), absint( $og_defaults['separator'] ), 'px' ); + + $css->set_selector( '.separate-containers .inside-right-sidebar, .separate-containers .inside-left-sidebar' ); + $css->add_property( 'margin-top', absint( $spacing_settings['separator'] ), absint( $og_defaults['separator'] ), 'px' ); + $css->add_property( 'margin-bottom', absint( $spacing_settings['separator'] ), absint( $og_defaults['separator'] ), 'px' ); + + $css->set_selector( '.main-navigation .main-nav ul li a,.menu-toggle,.main-navigation .mobile-bar-items a' ); + $css->add_property( 'padding-left', absint( $spacing_settings['menu_item'] ), absint( $og_defaults['menu_item'] ), 'px' ); + $css->add_property( 'padding-right', absint( $spacing_settings['menu_item'] ), absint( $og_defaults['menu_item'] ), 'px' ); + $css->add_property( 'line-height', absint( $spacing_settings['menu_item_height'] ), absint( $og_defaults['menu_item_height'] ), 'px' ); + + $css->set_selector( '.main-navigation .main-nav ul ul li a' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['sub_menu_item_height'], $spacing_settings['menu_item'], $spacing_settings['sub_menu_item_height'], $spacing_settings['menu_item'] ), generate_padding_css( $og_defaults['sub_menu_item_height'], $og_defaults['menu_item'], $og_defaults['sub_menu_item_height'], $og_defaults['menu_item'] ) ); + + $css->set_selector( '.main-navigation ul ul' ); + $css->add_property( 'width', absint( $spacing_settings['sub_menu_width'] ), absint( $og_defaults['sub_menu_width'] ), 'px' ); + + $css->set_selector( '.navigation-search input' ); + $css->add_property( 'height', absint( $spacing_settings['menu_item_height'] ), absint( $og_defaults['menu_item_height'] ), 'px' ); + + $css->set_selector( '.rtl .menu-item-has-children .dropdown-menu-toggle' ); + $css->add_property( 'padding-left', absint( $spacing_settings['menu_item'] ), false, 'px' ); + + $css->set_selector( '.menu-item-has-children .dropdown-menu-toggle' ); + $css->add_property( 'padding-right', absint( $spacing_settings['menu_item'] ), absint( $og_defaults['menu_item'] ), 'px' ); + + $css->set_selector( '.menu-item-has-children ul .dropdown-menu-toggle' ); + $css->add_property( 'padding-top', absint( $spacing_settings['sub_menu_item_height'] ), absint( $og_defaults['sub_menu_item_height'] ), 'px' ); + $css->add_property( 'padding-bottom', absint( $spacing_settings['sub_menu_item_height'] ), absint( $og_defaults['sub_menu_item_height'] ), 'px' ); + $css->add_property( 'margin-top', '-' . absint( $spacing_settings['sub_menu_item_height'] ), '-' . absint( $og_defaults['sub_menu_item_height'] ), 'px' ); + + $css->set_selector( '.rtl .main-navigation .main-nav ul li.menu-item-has-children > a' ); + $css->add_property( 'padding-right', absint( $spacing_settings['menu_item'] ), false, 'px' ); + + $css->set_selector( '.widget-area .widget' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['widget_top'], $spacing_settings['widget_right'], $spacing_settings['widget_bottom'], $spacing_settings['widget_left'] ), generate_padding_css( $og_defaults['widget_top'], $og_defaults['widget_right'], $og_defaults['widget_bottom'], $og_defaults['widget_left'] ) ); + + $css->set_selector( '.footer-widgets' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['footer_widget_container_top'], $spacing_settings['footer_widget_container_right'], $spacing_settings['footer_widget_container_bottom'], $spacing_settings['footer_widget_container_left'] ), generate_padding_css( $og_defaults['footer_widget_container_top'], $og_defaults['footer_widget_container_right'], $og_defaults['footer_widget_container_bottom'], $og_defaults['footer_widget_container_left'] ) ); + + $css->set_selector( '.site-footer .footer-widgets-container .inner-padding' ); + $css->add_property( 'padding', generate_padding_css( '0', '0', '0', $spacing_settings['footer_widget_separator'] ), generate_padding_css( '0', '0', '0', $og_defaults['footer_widget_separator'] ) ); + + $css->set_selector( '.site-footer .footer-widgets-container .inside-footer-widgets' ); + $css->add_property( 'margin-left', '-' . absint( $spacing_settings['footer_widget_separator'] ), '-' . absint( $og_defaults['footer_widget_separator'] ), 'px' ); + + $css->set_selector( '.site-info' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['footer_top'], $spacing_settings['footer_right'], $spacing_settings['footer_bottom'], $spacing_settings['footer_left'] ), generate_padding_css( $og_defaults['footer_top'], $og_defaults['footer_right'], $og_defaults['footer_bottom'], $og_defaults['footer_left'] ) ); + + $css->start_media_query( generate_get_media_query( 'mobile' ) ); + $css->set_selector( '.separate-containers .inside-article, .separate-containers .comments-area, .separate-containers .page-header, .separate-containers .paging-navigation, .one-container .site-content, .inside-page-header, .wp-block-group__inner-container' ); + $css->add_property( 'padding', generate_padding_css( $spacing_settings['mobile_content_top'], $spacing_settings['mobile_content_right'], $spacing_settings['mobile_content_bottom'], $spacing_settings['mobile_content_left'] ) ); + + $mobile_content_padding = absint( $spacing_settings['mobile_content_right'] ) + absint( $spacing_settings['mobile_content_left'] ); + $css->set_selector( '.entry-content .alignwide, body:not(.no-sidebar) .entry-content .alignfull' ); + $css->add_property( 'margin-left', '-' . absint( $spacing_settings['mobile_content_left'] ) . 'px' ); + $css->add_property( 'width', 'calc(100% + ' . absint( $mobile_content_padding ) . 'px)' ); + $css->add_property( 'max-width', 'calc(100% + ' . absint( $mobile_content_padding ) . 'px)' ); + + if ( '' !== $spacing_settings['mobile_separator'] ) { + $css->set_selector( '.separate-containers .widget, .separate-containers .site-main > *, .separate-containers .page-header' ); + $css->add_property( 'margin-bottom', absint( $spacing_settings['mobile_separator'] ), false, 'px' ); + + $css->set_selector( '.separate-containers .site-main' ); + $css->add_property( 'margin', absint( $spacing_settings['mobile_separator'] ), false, 'px' ); + + $css->set_selector( '.separate-containers .page-header-image, .separate-containers .page-header-image-single' ); + $css->add_property( 'margin-top', absint( $spacing_settings['mobile_separator'] ), false, 'px' ); + + $css->set_selector( '.separate-containers .inside-right-sidebar, .separate-containers .inside-left-sidebar' ); + $css->add_property( 'margin-top', absint( $spacing_settings['mobile_separator'] ), false, 'px' ); + $css->add_property( 'margin-bottom', absint( $spacing_settings['mobile_separator'] ), false, 'px' ); + } + $css->stop_media_query(); + + // Add spacing back where dropdown arrow should be. + // Old versions of WP don't get nice things. + if ( version_compare( $GLOBALS['wp_version'], '4.4', '<' ) ) { + $css->set_selector( '.main-navigation .main-nav ul li.menu-item-has-children>a, .secondary-navigation .main-nav ul li.menu-item-has-children>a' ); + $css->add_property( 'padding-right', absint( $spacing_settings['menu_item'] ), absint( $og_defaults['menu_item'] ), 'px' ); + } + + $output = ''; + + $generate_settings = wp_parse_args( + get_option( 'generate_settings', array() ), + generate_get_color_defaults() + ); + + // Find out if the content background color and sidebar widget background color is the same. + $sidebar = strtoupper( $generate_settings['sidebar_widget_background_color'] ); + $content = strtoupper( $generate_settings['content_background_color'] ); + $colors_match = ( ( $sidebar == $content ) || '' == $sidebar ) ? true : false; + + // If they're all 40 (default), remove the padding when one container is set. + // This way, the user can still adjust the padding and it will work (unless they want 40px padding). + // We'll also remove the padding if there's no color difference between the widgets and content background color. + if ( ( '40' == $spacing_settings['widget_top'] && '40' == $spacing_settings['widget_right'] && '40' == $spacing_settings['widget_bottom'] && '40' == $spacing_settings['widget_left'] ) && $colors_match ) { + $output .= '.one-container .sidebar .widget{padding:0px;}'; + } + + do_action( 'generate_spacing_css', $css ); + + return apply_filters( 'generate_spacing_css_output', $css->css_output() . $output ); + } +} + +/** + * Generates any CSS that can't be cached (can change from page to page). + * + * @since 2.0 + */ +function generate_no_cache_dynamic_css() { + $css = new GeneratePress_CSS; + + if ( ! generate_show_title() ) { + $css->set_selector( '.page .entry-content' )->add_property( 'margin-top', '0px' ); + + if ( is_single() ) { + if ( ! apply_filters( 'generate_post_author', true ) && ! apply_filters( 'generate_post_date', true ) ) { + $css->set_selector( '.single .entry-content' )->add_property( 'margin-top', '0px' ); + } + } + } + + $css->start_media_query( generate_get_media_query( 'mobile-menu' ) ); + $css->set_selector( '.main-navigation .menu-toggle,.main-navigation .mobile-bar-items,.sidebar-nav-mobile:not(#sticky-placeholder)' ); + $css->add_property( 'display', 'block' ); + + $css->set_selector( '.main-navigation ul,.gen-sidebar-nav' ); + $css->add_property( 'display', 'none' ); + + $css->set_selector( '[class*="nav-float-"] .site-header .inside-header > *' ); + $css->add_property( 'float', 'none' ); + $css->add_property( 'clear', 'both' ); + $css->stop_media_query(); + + return $css->css_output(); +} + +add_action( 'wp_enqueue_scripts', 'generate_enqueue_dynamic_css', 50 ); +/** + * Enqueue our dynamic CSS. + * + * @since 2.0 + */ +function generate_enqueue_dynamic_css() { + if ( ! get_option( 'generate_dynamic_css_output', false ) || is_customize_preview() || apply_filters( 'generate_dynamic_css_skip_cache', false ) ) { + $css = generate_base_css() . generate_font_css() . generate_advanced_css() . generate_spacing_css(); + } else { + $css = get_option( 'generate_dynamic_css_output' ) . '/* End cached CSS */'; + } + + $css = $css . generate_no_cache_dynamic_css() . generate_do_icon_css(); + + wp_add_inline_style( 'generate-style', $css ); +} + +add_action( 'init', 'generate_set_dynamic_css_cache' ); +/** + * Sets our dynamic CSS cache if it doesn't exist. + * + * If the theme version changed, bust the cache. + * + * @since 2.0 + */ +function generate_set_dynamic_css_cache() { + if ( apply_filters( 'generate_dynamic_css_skip_cache', false ) ) { + return; + } + + $cached_css = get_option( 'generate_dynamic_css_output', false ); + $cached_version = get_option( 'generate_dynamic_css_cached_version', '' ); + + if ( ! $cached_css || $cached_version !== GENERATE_VERSION ) { + $css = generate_base_css() . generate_font_css() . generate_advanced_css() . generate_spacing_css(); + + update_option( 'generate_dynamic_css_output', $css ); + update_option( 'generate_dynamic_css_cached_version', GENERATE_VERSION ); + } +} + +add_action( 'customize_save_after', 'generate_update_dynamic_css_cache' ); +/** + * Update our CSS cache when done saving Customizer options. + * + * @since 2.0 + */ +function generate_update_dynamic_css_cache() { + if ( apply_filters( 'generate_dynamic_css_skip_cache', false ) ) { + return; + } + + $css = generate_base_css() . generate_font_css() . generate_advanced_css() . generate_spacing_css(); + update_option( 'generate_dynamic_css_output', $css ); +} + +/** + * Output CSS for the icon fonts. + * + * @since 2.3 + */ +function generate_do_icon_css() { + $output = false; + + if ( 'font' === generate_get_option( 'icons' ) ) { + $url = trailingslashit( get_template_directory_uri() ); + + $output = '@font-face { + font-family: "GeneratePress"; + src: url("' . $url . 'fonts/generatepress.eot"); + src: url("' . $url . 'fonts/generatepress.eot#iefix") format("embedded-opentype"), + url("' . $url . 'fonts/generatepress.woff2") format("woff2"), + url("' . $url . 'fonts/generatepress.woff") format("woff"), + url("' . $url . 'fonts/generatepress.ttf") format("truetype"), + url("' . $url . 'fonts/generatepress.svg#GeneratePress") format("svg"); + font-weight: normal; + font-style: normal; + }'; + + if ( defined( 'GENERATE_MENU_PLUS_VERSION' ) ) { + $output .= '.main-navigation .slideout-toggle a:before, + .slide-opened .slideout-overlay .slideout-exit:before { + font-family: GeneratePress; + } + + .slideout-navigation .dropdown-menu-toggle:before { + content: "\f107" !important; + } + + .slideout-navigation .sfHover > a .dropdown-menu-toggle:before { + content: "\f106" !important; + }'; + } + } + + if ( 'svg' === generate_get_option( 'icons' ) ) { + $output = 'button.menu-toggle:before, + .search-item a:before, + .dropdown-menu-toggle:before, + .cat-links:before, + .tags-links:before, + .comments-link:before, + .nav-previous .prev:before, + .nav-next .next:before, + .generate-back-to-top:before { + display: none; + }'; + } + + if ( $output ) { + return str_replace( array( "\r", "\n", "\t" ), '', $output ); + } +} diff --git a/wp-content/themes/generatepress/inc/customizer.php b/wp-content/themes/generatepress/inc/customizer.php new file mode 100644 index 0000000..2afdc83 --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer.php @@ -0,0 +1,1445 @@ +get_control( 'blogdescription' ) ) { + $wp_customize->get_control( 'blogdescription' )->priority = 3; + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + } + + if ( $wp_customize->get_control( 'blogname' ) ) { + $wp_customize->get_control( 'blogname' )->priority = 1; + $wp_customize->get_setting( 'blogname' )->transport = 'postMessage'; + } + + if ( $wp_customize->get_control( 'custom_logo' ) ) { + $wp_customize->get_setting( 'custom_logo' )->transport = 'refresh'; + } + + if ( method_exists( $wp_customize, 'register_control_type' ) ) { + $wp_customize->register_control_type( 'Generate_Customize_Misc_Control' ); + $wp_customize->register_control_type( 'Generate_Range_Slider_Control' ); + } + + if ( method_exists( $wp_customize, 'register_section_type' ) ) { + $wp_customize->register_section_type( 'GeneratePress_Upsell_Section' ); + } + + if ( isset( $wp_customize->selective_refresh ) ) { + $wp_customize->selective_refresh->add_partial( 'blogname', array( + 'selector' => '.main-title a', + 'render_callback' => 'generate_customize_partial_blogname', + ) ); + + $wp_customize->selective_refresh->add_partial( 'blogdescription', array( + 'selector' => '.site-description', + 'render_callback' => 'generate_customize_partial_blogdescription', + ) ); + } + + if ( ! defined( 'GP_PREMIUM_VERSION' ) ) { + $wp_customize->add_section( + new GeneratePress_Upsell_Section( $wp_customize, 'generatepress_upsell_section', + array( + 'pro_text' => __( 'Premium Modules Available', 'generatepress' ), + 'pro_url' => generate_get_premium_url( 'https://generatepress.com/premium' ), + 'capability' => 'edit_theme_options', + 'priority' => 0, + 'type' => 'gp-upsell-section', + ) + ) + ); + } + + $wp_customize->add_setting( + 'generate_settings[hide_title]', + array( + 'default' => $defaults['hide_title'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_checkbox', + ) + ); + + $wp_customize->add_control( + 'generate_settings[hide_title]', + array( + 'type' => 'checkbox', + 'label' => __( 'Hide site title', 'generatepress' ), + 'section' => 'title_tagline', + 'priority' => 2, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[hide_tagline]', + array( + 'default' => $defaults['hide_tagline'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_checkbox', + ) + ); + + $wp_customize->add_control( + 'generate_settings[hide_tagline]', + array( + 'type' => 'checkbox', + 'label' => __( 'Hide site tagline', 'generatepress' ), + 'section' => 'title_tagline', + 'priority' => 4, + ) + ); + + if ( ! function_exists( 'the_custom_logo' ) ) { + $wp_customize->add_setting( + 'generate_settings[logo]', + array( + 'default' => $defaults['logo'], + 'type' => 'option', + 'sanitize_callback' => 'esc_url_raw', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Image_Control( + $wp_customize, + 'generate_settings[logo]', + array( + 'label' => __( 'Logo', 'generatepress' ), + 'section' => 'title_tagline', + 'settings' => 'generate_settings[logo]', + ) + ) + ); + } + + $wp_customize->add_setting( + 'generate_settings[retina_logo]', + array( + 'default' => $defaults['retina_logo'], + 'type' => 'option', + 'sanitize_callback' => 'esc_url_raw', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Image_Control( + $wp_customize, + 'generate_settings[retina_logo]', + array( + 'label' => __( 'Retina Logo', 'generatepress' ), + 'section' => 'title_tagline', + 'settings' => 'generate_settings[retina_logo]', + 'active_callback' => 'generate_has_custom_logo_callback', + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[logo_width]', + array( + 'default' => $defaults['logo_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_empty_absint', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[logo_width]', + array( + 'label' => __( 'Logo Width', 'generatepress' ), + 'section' => 'title_tagline', + 'settings' => array( + 'desktop' => 'generate_settings[logo_width]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 30, + 'max' => 800, + 'step' => 10, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'active_callback' => 'generate_has_custom_logo_callback', + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[inline_logo_site_branding]', + array( + 'default' => $defaults['inline_logo_site_branding'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_checkbox', + ) + ); + + $wp_customize->add_control( + 'generate_settings[inline_logo_site_branding]', + array( + 'type' => 'checkbox', + 'label' => esc_html__( 'Place logo next to title', 'generatepress' ), + 'section' => 'title_tagline', + 'active_callback' => 'generate_has_logo_site_branding', + ) + ); + + $wp_customize->add_section( + 'body_section', + array( + 'title' => $wp_customize->get_panel( 'generate_colors_panel' ) ? __( 'Body', 'generatepress' ) : __( 'Colors', 'generatepress' ), + 'capability' => 'edit_theme_options', + 'priority' => 30, + 'panel' => $wp_customize->get_panel( 'generate_colors_panel' ) ? 'generate_colors_panel' : false, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[background_color]', array( + 'default' => $defaults['background_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'generate_settings[background_color]', + array( + 'label' => __( 'Background Color', 'generatepress' ), + 'section' => 'body_section', + 'settings' => 'generate_settings[background_color]', + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[text_color]', array( + 'default' => $defaults['text_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'generate_settings[text_color]', + array( + 'label' => __( 'Text Color', 'generatepress' ), + 'section' => 'body_section', + 'settings' => 'generate_settings[text_color]', + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[link_color]', array( + 'default' => $defaults['link_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'generate_settings[link_color]', + array( + 'label' => __( 'Link Color', 'generatepress' ), + 'section' => 'body_section', + 'settings' => 'generate_settings[link_color]', + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[link_color_hover]', array( + 'default' => $defaults['link_color_hover'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'generate_settings[link_color_hover]', + array( + 'label' => __( 'Link Color Hover', 'generatepress' ), + 'section' => 'body_section', + 'settings' => 'generate_settings[link_color_hover]', + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[link_color_visited]', array( + 'default' => $defaults['link_color_visited'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'refresh', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'generate_settings[link_color_visited]', + array( + 'label' => __( 'Link Color Visited', 'generatepress' ), + 'section' => 'body_section', + 'settings' => 'generate_settings[link_color_visited]', + ) + ) + ); + + $color_defaults = generate_get_color_defaults(); + + if ( ! $wp_customize->get_setting( 'generate_settings[blog_post_title_color]' ) ) { + $wp_customize->add_setting( + 'generate_settings[blog_post_title_color]', array( + 'default' => $color_defaults['blog_post_title_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'blog_post_title_color', + array( + 'label' => __( 'Blog Post Title', 'generatepress' ), + 'section' => $wp_customize->get_section( 'content_color_section' ) ? 'content_color_section' : 'body_section', + 'settings' => 'generate_settings[blog_post_title_color]', + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[blog_post_title_hover_color]', array( + 'default' => $color_defaults['blog_post_title_hover_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'blog_post_title_hover_color', + array( + 'label' => __( 'Blog Post Title Hover', 'generatepress' ), + 'section' => $wp_customize->get_section( 'content_color_section' ) ? 'content_color_section' : 'body_section', + 'settings' => 'generate_settings[blog_post_title_hover_color]', + ) + ) + ); + } + + $wp_customize->add_setting( + 'nav_color_presets', + array( + 'default' => 'current', + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_preset_layout', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'nav_color_presets', + array( + 'type' => 'select', + 'label' => __( 'Navigation Color Presets', 'generatepress' ), + 'section' => $wp_customize->get_section( 'navigation_color_section' ) ? 'navigation_color_section' : 'body_section', + 'priority' => $wp_customize->get_section( 'navigation_color_section' ) ? 0 : null, + 'choices' => array( + 'current' => __( 'Current', 'generatepress' ), + 'default' => __( 'Default', 'generatepress' ), + 'white' => __( 'White', 'generatepress' ), + 'grey' => __( 'Grey', 'generatepress' ), + 'red' => __( 'Red', 'generatepress' ), + 'green' => __( 'Green', 'generatepress' ), + 'blue' => __( 'Blue', 'generatepress' ), + ), + 'settings' => 'nav_color_presets', + ) + ); + + if ( ! $wp_customize->get_setting( 'generate_settings[navigation_background_color]' ) ) { + $wp_customize->add_setting( + 'generate_settings[navigation_background_color]', array( + 'default' => $color_defaults['navigation_background_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_rgba_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[navigation_text_color]', array( + 'default' => $color_defaults['navigation_text_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[navigation_background_hover_color]', + array( + 'default' => $color_defaults['navigation_background_hover_color'], + 'type' => 'option', + 'transport' => 'postMessage', + 'sanitize_callback' => 'generate_sanitize_rgba_color', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[navigation_text_hover_color]', + array( + 'default' => $color_defaults['navigation_text_hover_color'], + 'type' => 'option', + 'transport' => 'postMessage', + 'sanitize_callback' => 'generate_sanitize_hex_color', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[navigation_background_current_color]', + array( + 'default' => $color_defaults['navigation_background_current_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_rgba_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[navigation_text_current_color]', + array( + 'default' => $color_defaults['navigation_text_current_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[subnavigation_background_color]', + array( + 'default' => $color_defaults['subnavigation_background_color'], + 'type' => 'option', + 'transport' => 'postMessage', + 'sanitize_callback' => 'generate_sanitize_rgba_color', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[subnavigation_text_color]', array( + 'default' => $color_defaults['subnavigation_text_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[subnavigation_background_hover_color]', + array( + 'default' => $color_defaults['subnavigation_background_hover_color'], + 'type' => 'option', + 'transport' => 'postMessage', + 'sanitize_callback' => 'generate_sanitize_rgba_color', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[subnavigation_text_hover_color]', array( + 'default' => $color_defaults['subnavigation_text_hover_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[subnavigation_background_current_color]', + array( + 'default' => $color_defaults['subnavigation_background_current_color'], + 'type' => 'option', + 'transport' => 'postMessage', + 'sanitize_callback' => 'generate_sanitize_rgba_color', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[subnavigation_text_current_color]', array( + 'default' => $color_defaults['subnavigation_text_current_color'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + } + + if ( ! function_exists( 'generate_colors_customize_register' ) && ! defined( 'GP_PREMIUM_VERSION' ) ) { + $wp_customize->add_control( + new Generate_Customize_Misc_Control( + $wp_customize, + 'colors_get_addon_desc', + array( + 'section' => 'body_section', + 'type' => 'addon', + 'label' => __( 'Learn More', 'generatepress' ), + 'description' => __( 'More options are available for this section in our premium version.', 'generatepress' ), + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#colors', false ), + 'priority' => 30, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + } + + if ( class_exists( 'WP_Customize_Panel' ) ) { + if ( ! $wp_customize->get_panel( 'generate_layout_panel' ) ) { + $wp_customize->add_panel( 'generate_layout_panel', array( + 'priority' => 25, + 'title' => __( 'Layout', 'generatepress' ), + ) ); + } + } + + $wp_customize->add_section( + 'generate_layout_container', + array( + 'title' => __( 'Container', 'generatepress' ), + 'priority' => 10, + 'panel' => 'generate_layout_panel', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[container_width]', + array( + 'default' => $defaults['container_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_integer', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[container_width]', + array( + 'type' => 'generatepress-range-slider', + 'label' => __( 'Container Width', 'generatepress' ), + 'section' => 'generate_layout_container', + 'settings' => array( + 'desktop' => 'generate_settings[container_width]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 700, + 'max' => 2000, + 'step' => 5, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 0, + ) + ) + ); + + $wp_customize->add_section( + 'generate_top_bar', + array( + 'title' => __( 'Top Bar', 'generatepress' ), + 'priority' => 15, + 'panel' => 'generate_layout_panel', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[top_bar_width]', + array( + 'default' => $defaults['top_bar_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[top_bar_width]', + array( + 'type' => 'select', + 'label' => __( 'Top Bar Width', 'generatepress' ), + 'section' => 'generate_top_bar', + 'choices' => array( + 'full' => __( 'Full', 'generatepress' ), + 'contained' => __( 'Contained', 'generatepress' ), + ), + 'settings' => 'generate_settings[top_bar_width]', + 'priority' => 5, + 'active_callback' => 'generate_is_top_bar_active', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[top_bar_inner_width]', + array( + 'default' => $defaults['top_bar_inner_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[top_bar_inner_width]', + array( + 'type' => 'select', + 'label' => __( 'Top Bar Inner Width', 'generatepress' ), + 'section' => 'generate_top_bar', + 'choices' => array( + 'full' => __( 'Full', 'generatepress' ), + 'contained' => __( 'Contained', 'generatepress' ), + ), + 'settings' => 'generate_settings[top_bar_inner_width]', + 'priority' => 10, + 'active_callback' => 'generate_is_top_bar_active', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[top_bar_alignment]', + array( + 'default' => $defaults['top_bar_alignment'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[top_bar_alignment]', + array( + 'type' => 'select', + 'label' => __( 'Top Bar Alignment', 'generatepress' ), + 'section' => 'generate_top_bar', + 'choices' => array( + 'left' => __( 'Left', 'generatepress' ), + 'center' => __( 'Center', 'generatepress' ), + 'right' => __( 'Right', 'generatepress' ), + ), + 'settings' => 'generate_settings[top_bar_alignment]', + 'priority' => 15, + 'active_callback' => 'generate_is_top_bar_active', + ) + ); + + $wp_customize->add_section( + 'generate_layout_header', + array( + 'title' => __( 'Header', 'generatepress' ), + 'priority' => 20, + 'panel' => 'generate_layout_panel', + ) + ); + + $wp_customize->add_setting( + 'generate_header_helper', + array( + 'default' => 'current', + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_preset_layout', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_header_helper', + array( + 'type' => 'select', + 'label' => __( 'Header Presets', 'generatepress' ), + 'section' => 'generate_layout_header', + 'choices' => array( + 'current' => __( 'Current', 'generatepress' ), + 'default' => __( 'Default', 'generatepress' ), + 'nav-before-centered' => __( 'Navigation Before - Centered', 'generatepress' ), + 'nav-after-centered' => __( 'Navigation After - Centered', 'generatepress' ), + 'nav-right' => __( 'Navigation Right', 'generatepress' ), + 'nav-left' => __( 'Navigation Left', 'generatepress' ), + ), + 'settings' => 'generate_header_helper', + 'priority' => 4, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[header_layout_setting]', + array( + 'default' => $defaults['header_layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[header_layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Header Width', 'generatepress' ), + 'section' => 'generate_layout_header', + 'choices' => array( + 'fluid-header' => __( 'Full', 'generatepress' ), + 'contained-header' => __( 'Contained', 'generatepress' ), + ), + 'settings' => 'generate_settings[header_layout_setting]', + 'priority' => 5, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[header_inner_width]', + array( + 'default' => $defaults['header_inner_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[header_inner_width]', + array( + 'type' => 'select', + 'label' => __( 'Inner Header Width', 'generatepress' ), + 'section' => 'generate_layout_header', + 'choices' => array( + 'contained' => __( 'Contained', 'generatepress' ), + 'full-width' => __( 'Full', 'generatepress' ), + ), + 'settings' => 'generate_settings[header_inner_width]', + 'priority' => 6, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[header_alignment_setting]', + array( + 'default' => $defaults['header_alignment_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[header_alignment_setting]', + array( + 'type' => 'select', + 'label' => __( 'Header Alignment', 'generatepress' ), + 'section' => 'generate_layout_header', + 'choices' => array( + 'left' => __( 'Left', 'generatepress' ), + 'center' => __( 'Center', 'generatepress' ), + 'right' => __( 'Right', 'generatepress' ), + ), + 'settings' => 'generate_settings[header_alignment_setting]', + 'priority' => 10, + ) + ); + + $wp_customize->add_section( + 'generate_layout_navigation', + array( + 'title' => __( 'Primary Navigation', 'generatepress' ), + 'priority' => 30, + 'panel' => 'generate_layout_panel', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_layout_setting]', + array( + 'default' => $defaults['nav_layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[nav_layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Width', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'choices' => array( + 'fluid-nav' => __( 'Full', 'generatepress' ), + 'contained-nav' => __( 'Contained', 'generatepress' ), + ), + 'settings' => 'generate_settings[nav_layout_setting]', + 'priority' => 15, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_inner_width]', + array( + 'default' => $defaults['nav_inner_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[nav_inner_width]', + array( + 'type' => 'select', + 'label' => __( 'Inner Navigation Width', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'choices' => array( + 'contained' => __( 'Contained', 'generatepress' ), + 'full-width' => __( 'Full', 'generatepress' ), + ), + 'settings' => 'generate_settings[nav_inner_width]', + 'priority' => 16, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_alignment_setting]', + array( + 'default' => $defaults['nav_alignment_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[nav_alignment_setting]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Alignment', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'choices' => array( + 'left' => __( 'Left', 'generatepress' ), + 'center' => __( 'Center', 'generatepress' ), + 'right' => __( 'Right', 'generatepress' ), + ), + 'settings' => 'generate_settings[nav_alignment_setting]', + 'priority' => 20, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_position_setting]', + array( + 'default' => $defaults['nav_position_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => ( '' !== generate_get_option( 'nav_position_setting' ) ) ? 'postMessage' : 'refresh', + ) + ); + + $wp_customize->add_control( + 'generate_settings[nav_position_setting]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Location', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'choices' => array( + 'nav-below-header' => __( 'Below Header', 'generatepress' ), + 'nav-above-header' => __( 'Above Header', 'generatepress' ), + 'nav-float-right' => __( 'Float Right', 'generatepress' ), + 'nav-float-left' => __( 'Float Left', 'generatepress' ), + 'nav-left-sidebar' => __( 'Left Sidebar', 'generatepress' ), + 'nav-right-sidebar' => __( 'Right Sidebar', 'generatepress' ), + '' => __( 'No Navigation', 'generatepress' ), + ), + 'settings' => 'generate_settings[nav_position_setting]', + 'priority' => 22, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_drop_point]', + array( + 'default' => $defaults['nav_drop_point'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_empty_absint', + ) + ); + + $wp_customize->add_control( + new Generate_Range_Slider_Control( + $wp_customize, + 'generate_settings[nav_drop_point]', + array( + 'label' => __( 'Navigation Drop Point', 'generatepress' ), + 'sub_description' => __( 'The width when the navigation ceases to float and drops below your logo.', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'settings' => array( + 'desktop' => 'generate_settings[nav_drop_point]', + ), + 'choices' => array( + 'desktop' => array( + 'min' => 500, + 'max' => 2000, + 'step' => 10, + 'edit' => true, + 'unit' => 'px', + ), + ), + 'priority' => 22, + ) + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_dropdown_type]', + array( + 'default' => $defaults['nav_dropdown_type'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[nav_dropdown_type]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Dropdown', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'choices' => array( + 'hover' => __( 'Hover', 'generatepress' ), + 'click' => __( 'Click - Menu Item', 'generatepress' ), + 'click-arrow' => __( 'Click - Arrow', 'generatepress' ), + ), + 'settings' => 'generate_settings[nav_dropdown_type]', + 'priority' => 22, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_dropdown_direction]', + array( + 'default' => $defaults['nav_dropdown_direction'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[nav_dropdown_direction]', + array( + 'type' => 'select', + 'label' => __( 'Dropdown Direction', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'choices' => array( + 'right' => __( 'Right', 'generatepress' ), + 'left' => __( 'Left', 'generatepress' ), + ), + 'settings' => 'generate_settings[nav_dropdown_direction]', + 'priority' => 22, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[nav_search]', + array( + 'default' => $defaults['nav_search'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[nav_search]', + array( + 'type' => 'select', + 'label' => __( 'Navigation Search', 'generatepress' ), + 'section' => 'generate_layout_navigation', + 'choices' => array( + 'enable' => __( 'Enable', 'generatepress' ), + 'disable' => __( 'Disable', 'generatepress' ), + ), + 'settings' => 'generate_settings[nav_search]', + 'priority' => 23, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[content_layout_setting]', + array( + 'default' => $defaults['content_layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[content_layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Content Layout', 'generatepress' ), + 'section' => 'generate_layout_container', + 'choices' => array( + 'separate-containers' => __( 'Separate Containers', 'generatepress' ), + 'one-container' => __( 'One Container', 'generatepress' ), + ), + 'settings' => 'generate_settings[content_layout_setting]', + 'priority' => 25, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[container_alignment]', + array( + 'default' => $defaults['container_alignment'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[container_alignment]', + array( + 'type' => 'select', + 'label' => __( 'Container Alignment', 'generatepress' ), + 'section' => 'generate_layout_container', + 'choices' => array( + 'boxes' => __( 'Boxes', 'generatepress' ), + 'text' => __( 'Text', 'generatepress' ), + ), + 'settings' => 'generate_settings[container_alignment]', + 'priority' => 30, + ) + ); + + $wp_customize->add_section( + 'generate_layout_sidebars', + array( + 'title' => __( 'Sidebars', 'generatepress' ), + 'priority' => 40, + 'panel' => 'generate_layout_panel', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[layout_setting]', + array( + 'default' => $defaults['layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Sidebar Layout', 'generatepress' ), + 'section' => 'generate_layout_sidebars', + 'choices' => array( + 'left-sidebar' => __( 'Sidebar / Content', 'generatepress' ), + 'right-sidebar' => __( 'Content / Sidebar', 'generatepress' ), + 'no-sidebar' => __( 'Content (no sidebars)', 'generatepress' ), + 'both-sidebars' => __( 'Sidebar / Content / Sidebar', 'generatepress' ), + 'both-left' => __( 'Sidebar / Sidebar / Content', 'generatepress' ), + 'both-right' => __( 'Content / Sidebar / Sidebar', 'generatepress' ), + ), + 'settings' => 'generate_settings[layout_setting]', + 'priority' => 30, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[blog_layout_setting]', + array( + 'default' => $defaults['blog_layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[blog_layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Blog Sidebar Layout', 'generatepress' ), + 'section' => 'generate_layout_sidebars', + 'choices' => array( + 'left-sidebar' => __( 'Sidebar / Content', 'generatepress' ), + 'right-sidebar' => __( 'Content / Sidebar', 'generatepress' ), + 'no-sidebar' => __( 'Content (no sidebars)', 'generatepress' ), + 'both-sidebars' => __( 'Sidebar / Content / Sidebar', 'generatepress' ), + 'both-left' => __( 'Sidebar / Sidebar / Content', 'generatepress' ), + 'both-right' => __( 'Content / Sidebar / Sidebar', 'generatepress' ), + ), + 'settings' => 'generate_settings[blog_layout_setting]', + 'priority' => 35, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[single_layout_setting]', + array( + 'default' => $defaults['single_layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[single_layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Single Post Sidebar Layout', 'generatepress' ), + 'section' => 'generate_layout_sidebars', + 'choices' => array( + 'left-sidebar' => __( 'Sidebar / Content', 'generatepress' ), + 'right-sidebar' => __( 'Content / Sidebar', 'generatepress' ), + 'no-sidebar' => __( 'Content (no sidebars)', 'generatepress' ), + 'both-sidebars' => __( 'Sidebar / Content / Sidebar', 'generatepress' ), + 'both-left' => __( 'Sidebar / Sidebar / Content', 'generatepress' ), + 'both-right' => __( 'Content / Sidebar / Sidebar', 'generatepress' ), + ), + 'settings' => 'generate_settings[single_layout_setting]', + 'priority' => 36, + ) + ); + + $wp_customize->add_section( + 'generate_layout_footer', + array( + 'title' => __( 'Footer', 'generatepress' ), + 'priority' => 50, + 'panel' => 'generate_layout_panel', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[footer_layout_setting]', + array( + 'default' => $defaults['footer_layout_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[footer_layout_setting]', + array( + 'type' => 'select', + 'label' => __( 'Footer Width', 'generatepress' ), + 'section' => 'generate_layout_footer', + 'choices' => array( + 'fluid-footer' => __( 'Full', 'generatepress' ), + 'contained-footer' => __( 'Contained', 'generatepress' ), + ), + 'settings' => 'generate_settings[footer_layout_setting]', + 'priority' => 40, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[footer_inner_width]', + array( + 'default' => $defaults['footer_inner_width'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[footer_inner_width]', + array( + 'type' => 'select', + 'label' => __( 'Inner Footer Width', 'generatepress' ), + 'section' => 'generate_layout_footer', + 'choices' => array( + 'contained' => __( 'Contained', 'generatepress' ), + 'full-width' => __( 'Full', 'generatepress' ), + ), + 'settings' => 'generate_settings[footer_inner_width]', + 'priority' => 41, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[footer_widget_setting]', + array( + 'default' => $defaults['footer_widget_setting'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[footer_widget_setting]', + array( + 'type' => 'select', + 'label' => __( 'Footer Widgets', 'generatepress' ), + 'section' => 'generate_layout_footer', + 'choices' => array( + '0' => '0', + '1' => '1', + '2' => '2', + '3' => '3', + '4' => '4', + '5' => '5', + ), + 'settings' => 'generate_settings[footer_widget_setting]', + 'priority' => 45, + ) + ); + + $wp_customize->add_setting( + 'generate_settings[footer_bar_alignment]', + array( + 'default' => $defaults['footer_bar_alignment'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'generate_settings[footer_bar_alignment]', + array( + 'type' => 'select', + 'label' => __( 'Footer Bar Alignment', 'generatepress' ), + 'section' => 'generate_layout_footer', + 'choices' => array( + 'left' => __( 'Left','generatepress' ), + 'center' => __( 'Center','generatepress' ), + 'right' => __( 'Right','generatepress' ), + ), + 'settings' => 'generate_settings[footer_bar_alignment]', + 'priority' => 47, + 'active_callback' => 'generate_is_footer_bar_active', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[back_to_top]', + array( + 'default' => $defaults['back_to_top'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[back_to_top]', + array( + 'type' => 'select', + 'label' => __( 'Back to Top Button', 'generatepress' ), + 'section' => 'generate_layout_footer', + 'choices' => array( + 'enable' => __( 'Enable', 'generatepress' ), + '' => __( 'Disable', 'generatepress' ), + ), + 'settings' => 'generate_settings[back_to_top]', + 'priority' => 50, + ) + ); + + $wp_customize->add_section( + 'generate_blog_section', + array( + 'title' => __( 'Blog', 'generatepress' ), + 'priority' => 55, + 'panel' => 'generate_layout_panel', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[post_content]', + array( + 'default' => $defaults['post_content'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_blog_excerpt', + ) + ); + + $wp_customize->add_control( + 'blog_content_control', + array( + 'type' => 'select', + 'label' => __( 'Content Type', 'generatepress' ), + 'section' => 'generate_blog_section', + 'choices' => array( + 'full' => __( 'Full', 'generatepress' ), + 'excerpt' => __( 'Excerpt', 'generatepress' ), + ), + 'settings' => 'generate_settings[post_content]', + 'priority' => 10, + ) + ); + + if ( ! function_exists( 'generate_blog_customize_register' ) && ! defined( 'GP_PREMIUM_VERSION' ) ) { + $wp_customize->add_control( + new Generate_Customize_Misc_Control( + $wp_customize, + 'blog_get_addon_desc', + array( + 'section' => 'generate_blog_section', + 'type' => 'addon', + 'label' => __( 'Learn more', 'generatepress' ), + 'description' => __( 'More options are available for this section in our premium version.', 'generatepress' ), + 'url' => generate_get_premium_url( 'https://generatepress.com/premium/#blog', false ), + 'priority' => 30, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + } + + $wp_customize->add_section( + 'generate_general_section', + array( + 'title' => __( 'General', 'generatepress' ), + 'priority' => 99, + ) + ); + + if ( ! apply_filters( 'generate_fontawesome_essentials', false ) ) { + $wp_customize->add_setting( + 'generate_settings[font_awesome_essentials]', + array( + 'default' => $defaults['font_awesome_essentials'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_checkbox', + ) + ); + + $wp_customize->add_control( + 'generate_settings[font_awesome_essentials]', + array( + 'type' => 'checkbox', + 'label' => __( 'Load essential icons only', 'generatepress' ), + 'description' => __( 'Load essential Font Awesome icons instead of the full library.', 'generatepress' ), + 'section' => 'generate_general_section', + 'settings' => 'generate_settings[font_awesome_essentials]', + ) + ); + } + + $wp_customize->add_setting( + 'generate_settings[icons]', + array( + 'default' => $defaults['icons'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_choices', + ) + ); + + $wp_customize->add_control( + 'generate_settings[icons]', + array( + 'type' => 'select', + 'label' => __( 'Icon Type', 'generatepress' ), + 'section' => 'generate_general_section', + 'choices' => array( + 'svg' => __( 'SVG', 'generatepress' ), + 'font' => __( 'Font', 'generatepress' ), + ), + 'settings' => 'generate_settings[icons]', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[combine_css]', + array( + 'default' => $defaults['combine_css'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_checkbox', + ) + ); + + $wp_customize->add_control( + 'generate_settings[combine_css]', + array( + 'type' => 'checkbox', + 'label' => __( 'Combine CSS', 'generatepress' ), + 'description' => __( 'Reduce the number of CSS file requests and use a lite version of our grid system.', 'generatepress' ), + 'section' => 'generate_general_section', + ) + ); + + $wp_customize->add_setting( + 'generate_settings[dynamic_css_cache]', + array( + 'default' => $defaults['dynamic_css_cache'], + 'type' => 'option', + 'sanitize_callback' => 'generate_sanitize_checkbox', + ) + ); + + $wp_customize->add_control( + 'generate_settings[dynamic_css_cache]', + array( + 'type' => 'checkbox', + 'label' => __( 'Cache dynamic CSS', 'generatepress' ), + 'description' => __( 'Cache CSS generated by your options to boost performance.', 'generatepress' ), + 'section' => 'generate_general_section', + ) + ); + } +} diff --git a/wp-content/themes/generatepress/inc/customizer/controls/class-deprecated.php b/wp-content/themes/generatepress/inc/customizer/controls/class-deprecated.php new file mode 100644 index 0000000..28b474b --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/class-deprecated.php @@ -0,0 +1,230 @@ + wp_create_nonce( 'gp_customize_nonce' ) ) ); + } + + public function to_json() { + parent::to_json(); + + $number_of_fonts = apply_filters( 'generate_number_of_fonts', 200 ); + $this->json['link'] = $this->get_link(); + $this->json['value'] = $this->value(); + $this->json['default_fonts_title'] = __( 'Default fonts', 'generatepress' ); + $this->json['google_fonts_title'] = __( 'Google fonts', 'generatepress' ); + $this->json['description'] = __( 'Font family','generatepress' ); + $this->json['google_fonts'] = apply_filters( 'generate_typography_customize_list', generate_get_all_google_fonts( $number_of_fonts ) ); + $this->json['default_fonts'] = generate_typography_default_fonts(); + } + + public function content_template() { + ?> + + choices as $name => $choice ) { + $this->choices[ $name ] = $choice; + } + + $this->json['choices'] = $this->choices; + $this->json['link'] = $this->get_link(); + $this->json['value'] = $this->value(); + + } + + public function content_template() { + ?> + <# if ( ! data.choices ) + return; + #> + + json['link'] = $this->get_link(); + $this->json['value'] = $this->value(); + $this->json['id'] = $this->id; + } + + public function content_template() { + ?> + + + + + + json['choices'][ $device ]['min'] = ( isset( $this->choices[ $device ]['min'] ) ) ? $this->choices[ $device ]['min'] : '0'; + $this->json['choices'][ $device ]['max'] = ( isset( $this->choices[ $device ]['max'] ) ) ? $this->choices[ $device ]['max'] : '100'; + $this->json['choices'][ $device ]['step'] = ( isset( $this->choices[ $device ]['step'] ) ) ? $this->choices[ $device ]['step'] : '1'; + $this->json['choices'][ $device ]['edit'] = ( isset( $this->choices[ $device ]['edit'] ) ) ? $this->choices[ $device ]['edit'] : false; + $this->json['choices'][ $device ]['unit'] = ( isset( $this->choices[ $device ]['unit'] ) ) ? $this->choices[ $device ]['unit'] : false; + } + + foreach ( $this->settings as $setting_key => $setting_id ) { + $this->json[ $setting_key ] = array( + 'link' => $this->get_link( $setting_key ), + 'value' => $this->value( $setting_key ), + 'default' => isset( $setting_id->default ) ? $setting_id->default : '', + ); + } + + $this->json['desktop_label'] = __( 'Desktop','generatepress' ); + $this->json['tablet_label'] = __( 'Tablet','generatepress' ); + $this->json['mobile_label'] = __( 'Mobile','generatepress' ); + $this->json['reset_label'] = __( 'Reset','generatepress' ); + + $this->json['description'] = $this->description; + $this->json['sub_description'] = $this->sub_description; + } + + /** + * Enqueue control related scripts/styles. + * + * @access public + */ + public function enqueue() { + wp_enqueue_script( 'generatepress-range-slider', trailingslashit( get_template_directory_uri() ) . 'inc/customizer/controls/js/slider-control.js', array( 'jquery', 'customize-base', 'jquery-ui-slider' ), false, true ); + wp_enqueue_style( 'generatepress-range-slider-css', trailingslashit( get_template_directory_uri() ) . 'inc/customizer/controls/css/slider-customizer.css', null ); + } + + /** + * An Underscore (JS) template for this control's content (but not its container). + * + * Class variables for this control class are available in the `data` JS object; + * export custom variables by overriding {@see WP_Customize_Control::to_json()}. + * + * @see WP_Customize_Control::print_template() + * + * @access protected + */ + protected function content_template() { + ?> +
            +
            + <# if ( data.label || data.description ) { #> +
            + <# if ( data.label ) { #> + {{{ data.label }}} + <# } #> + + <# if ( data.description ) { #> +

            {{{ data.description }}}

            + <# } #> +
            + <# } #> + +
            + + <# if ( 'undefined' !== typeof ( data.desktop ) ) { #> + + <# } #> + + <# if ( 'undefined' !== typeof (data.tablet) ) { #> + + <# } #> + + <# if ( 'undefined' !== typeof (data.mobile) ) { #> + + <# } #> + + + +
            +
            + +
            + <# if ( 'undefined' !== typeof ( data.desktop ) ) { #> + + <# } #> + + <# if ( 'undefined' !== typeof ( data.tablet ) ) { #> + + <# } #> + + <# if ( 'undefined' !== typeof ( data.mobile ) ) { #> + + <# } #> +
            + + <# if ( data.sub_description ) { #> +

            {{{ data.sub_description }}}

            + <# } #> +
            + json['default_fonts_title'] = __( 'System fonts', 'generatepress' ); + $this->json['google_fonts_title'] = __( 'Google fonts', 'generatepress' ); + $this->json['default_fonts'] = generate_typography_default_fonts(); + $this->json['family_title'] = esc_html__( 'Font family', 'generatepress' ); + $this->json['weight_title'] = esc_html__( 'Font weight', 'generatepress' ); + $this->json['transform_title'] = esc_html__( 'Text transform', 'generatepress' ); + $this->json['category_title'] = ''; + $this->json['variant_title'] = esc_html__( 'Variants', 'generatepress' ); + + foreach ( $this->settings as $setting_key => $setting_id ) { + $this->json[ $setting_key ] = array( + 'link' => $this->get_link( $setting_key ), + 'value' => $this->value( $setting_key ), + 'default' => isset( $setting_id->default ) ? $setting_id->default : '', + 'id' => isset( $setting_id->id ) ? $setting_id->id : '' + ); + + if ( 'weight' === $setting_key ) { + $this->json[ $setting_key ]['choices'] = $this->get_font_weight_choices(); + } + + if ( 'transform' === $setting_key ) { + $this->json[ $setting_key ]['choices'] = $this->get_font_transform_choices(); + } + } + } + + public function content_template() { + ?> + <# if ( '' !== data.label ) { #> + {{ data.label }} + <# } #> + <# if ( 'undefined' !== typeof ( data.family ) ) { #> +
            + +
            + <# } #> + + <# if ( 'undefined' !== typeof ( data.variant ) ) { #> + <# + var id = data.family.value.split(' ').join('_').toLowerCase(); + var font_data = generatePressTypography.googleFonts[id]; + var variants = ''; + if ( typeof font_data !== 'undefined' ) { + variants = font_data.variants; + } + + if ( null === data.variant.value ) { + data.variant.value = data.variant.default; + } + #> +
            + +
            + <# } #> + + <# if ( 'undefined' !== typeof ( data.category ) ) { #> +
            + +
            + <# } #> + +
            + <# if ( 'undefined' !== typeof ( data.weight ) ) { #> +
            + +
            + <# } #> + + <# if ( 'undefined' !== typeof ( data.transform ) ) { #> +
            + +
            + <# } #> +
            + esc_html( 'normal' ), + 'bold' => esc_html( 'bold' ), + '100' => esc_html( '100' ), + '200' => esc_html( '200' ), + '300' => esc_html( '300' ), + '400' => esc_html( '400' ), + '500' => esc_html( '500' ), + '600' => esc_html( '600' ), + '700' => esc_html( '700' ), + '800' => esc_html( '800' ), + '900' => esc_html( '900' ), + ); + } + + public function get_font_transform_choices() { + return array( + 'none' => esc_html( 'none' ), + 'capitalize' => esc_html( 'capitalize' ), + 'uppercase' => esc_html( 'uppercase' ), + 'lowercase' => esc_html( 'lowercase' ), + ); + } + } +} diff --git a/wp-content/themes/generatepress/inc/customizer/controls/class-upsell-control.php b/wp-content/themes/generatepress/inc/customizer/controls/class-upsell-control.php new file mode 100644 index 0000000..f017bcc --- /dev/null +++ b/wp-content/themes/generatepress/inc/customizer/controls/class-upsell-control.php @@ -0,0 +1,43 @@ +json['url'] = esc_url( $this->url ); + } + + public function content_template() { + ?> +

            {{{ data.description }}}

            + +
            {{ data.label }} + + pro_text; + $json['pro_url'] = esc_url( $this->pro_url ); + $json['id'] = $this->id; + return $json; + } + + protected function render_template() { + ?> +